From 8e87ee720bdedbc75ae87923fa1032af0d62d5fe Mon Sep 17 00:00:00 2001 From: Luigi Rizzo Date: Sun, 17 Aug 2014 03:30:20 -0700 Subject: [PATCH 1/1] initial version, corresponding to ipfw3-2012 --- 020-mips-hz1000.patch | 11 + Makefile | 149 + Makefile.inc | 23 + Makefile.openwrt | 95 + NOTES | 220 ++ README | 275 ++ binary/README.txt | 27 + binary/cygwin1.dll | Bin 0 -> 2855706 bytes binary/ipfw.exe | Bin 0 -> 148202 bytes binary/ipfw.sys | Bin 0 -> 122240 bytes binary/netipfw.inf | 81 + binary/netipfw_m.inf | 56 + binary/testme.bat | 79 + binary/wget.exe | Bin 0 -> 401408 bytes binary64/ipfw.exe | Bin 0 -> 148202 bytes binary64/ipfw.sys | Bin 0 -> 155648 bytes configuration/README | 14 + configuration/change_rules.sh | 159 + configuration/change_rules_linux.sh | 12 + configuration/ipfw.conf | 29 + configuration/ipfw.rules | 12 + configuration/rc.firewall | 400 +++ glue.h | 589 +++ ipfw/Makefile | 128 + ipfw/add_rules | 27 + ipfw/dummynet.c | 1459 ++++++++ ipfw/expand_number.c | 100 + ipfw/glue.c | 852 +++++ ipfw/humanize_number.c | 153 + ipfw/include/alias.h | 71 + ipfw/include/net/if_dl.h | 82 + ipfw/include/net/pfvar.h | 32 + ipfw/include/timeconv.h | 14 + ipfw/ipfw.8 | 3476 ++++++++++++++++++ ipfw/ipfw2.c | 3994 +++++++++++++++++++++ ipfw/ipfw2.h | 292 ++ ipfw/ipv6.c | 501 +++ ipfw/main.c | 624 ++++ ipfw/qsort.c | 195 + ipfw/qsort_r.c | 8 + ipfw/rule_test.sh | 83 + ipfw/ws2_32.def | 120 + kipfw/Makefile | 367 ++ kipfw/bsd_compat.c | 568 +++ kipfw/debug.c | 67 + kipfw/ipfw2_mod.c | 955 +++++ kipfw/md_win.c | 636 ++++ kipfw/missing.h | 645 ++++ kipfw/mysetenv.sh | 129 + kipfw/netipfw.inf | 81 + kipfw/netipfw_m.inf | 56 + kipfw/sources | 20 + kipfw/win-passthru.diff | 251 ++ kipfw/winmissing.h | 228 ++ kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk | Bin 0 -> 100875 bytes modified_passthru/miniport.c | 1481 ++++++++ modified_passthru/passthru.c | 469 +++ modified_passthru/passthru.h | 500 +++ modified_passthru/precomp.h | 11 + modified_passthru/protocol.c | 1670 +++++++++ original_passthru/makefile | 22 + original_passthru/miniport.c | 1461 ++++++++ original_passthru/netsf.inf | 165 + original_passthru/netsf_m.inf | 93 + original_passthru/passthru.c | 458 +++ original_passthru/passthru.h | 477 +++ original_passthru/passthru.htm | 486 +++ original_passthru/passthru.rc | 41 + original_passthru/precomp.h | 11 + original_passthru/protocol.c | 1626 +++++++++ original_passthru/sources | 39 + planetlab/Makefile.planetlab | 181 + planetlab/check_planetlab_sync | 22 + planetlab/ipfw | 84 + planetlab/ipfw.8.gz | Bin 0 -> 26396 bytes planetlab/ipfw.cron | 3 + planetlab/ipfwroot.spec | 135 + planetlab/ipfwslice.spec | 94 + planetlab/netconfig | 14 + planetlab/planetlab-tags.mk | 6 + planetlab/planetlab.mk | 26 + planetlab/sample_hook | 34 + sys/net/if.h | 1 + sys/net/pfil.h | 121 + sys/net/radix.c | 1203 +++++++ sys/net/radix.h | 181 + sys/netgraph/ng_ipfw.h | 33 + sys/netinet/in_cksum.c | 146 + sys/netinet/ip.h | 49 + sys/netinet/ip6.h | 58 + sys/netinet/ip_dummynet.h | 263 ++ sys/netinet/ip_fw.h | 646 ++++ sys/netinet/ip_icmp.h | 17 + sys/netinet/ipfw/dn_heap.c | 588 +++ sys/netinet/ipfw/dn_heap.h | 191 + sys/netinet/ipfw/dn_sched.h | 206 ++ sys/netinet/ipfw/dn_sched_fifo.c | 120 + sys/netinet/ipfw/dn_sched_prio.c | 229 ++ sys/netinet/ipfw/dn_sched_qfq.c | 864 +++++ sys/netinet/ipfw/dn_sched_rr.c | 310 ++ sys/netinet/ipfw/dn_sched_wf2q.c | 378 ++ sys/netinet/ipfw/ip_dn_glue.c | 846 +++++ sys/netinet/ipfw/ip_dn_io.c | 962 +++++ sys/netinet/ipfw/ip_dn_private.h | 419 +++ sys/netinet/ipfw/ip_dummynet.c | 2396 ++++++++++++ sys/netinet/ipfw/ip_fw2.c | 2491 +++++++++++++ sys/netinet/ipfw/ip_fw_dynamic.c | 1241 +++++++ sys/netinet/ipfw/ip_fw_log.c | 449 +++ sys/netinet/ipfw/ip_fw_lookup.c | 304 ++ sys/netinet/ipfw/ip_fw_nat.c | 605 ++++ sys/netinet/ipfw/ip_fw_pfil.c | 415 +++ sys/netinet/ipfw/ip_fw_private.h | 301 ++ sys/netinet/ipfw/ip_fw_sockopt.c | 1343 +++++++ sys/netinet/ipfw/ip_fw_table.c | 286 ++ sys/netinet/tcp.h | 228 ++ sys/netinet/tcp_var.h | 4 + sys/netinet/udp.h | 67 + sys/sys/cdefs.h | 29 + sys/sys/kernel.h | 26 + sys/sys/malloc.h | 59 + sys/sys/mbuf.h | 267 ++ sys/sys/module.h | 41 + sys/sys/param.h | 11 + sys/sys/queue.h | 623 ++++ sys/sys/syslog.h | 7 + sys/sys/systm.h | 126 + sys/sys/taskqueue.h | 34 + tcc-0.9.25-bsd.zip | Bin 0 -> 771635 bytes tcc_glue.h | 232 ++ test/Makefile | 53 + test/basic_ipfw.sh | 72 + test/dn_test.h | 157 + test/dynrules.sh | 20 + test/interpolation.c | 335 ++ test/main.c | 636 ++++ test/memory_leak.sh | 26 + test/mylist.h | 49 + test/profile_bench1 | 26 + test/profile_bench2 | 7 + test/profile_bench3 | 5 + test/test_dn_heap.c | 162 + test/test_dn_sched.c | 89 + 142 files changed, 49107 insertions(+) create mode 100644 020-mips-hz1000.patch create mode 100644 Makefile create mode 100644 Makefile.inc create mode 100644 Makefile.openwrt create mode 100644 NOTES create mode 100644 README create mode 100644 binary/README.txt create mode 100644 binary/cygwin1.dll create mode 100644 binary/ipfw.exe create mode 100644 binary/ipfw.sys create mode 100644 binary/netipfw.inf create mode 100644 binary/netipfw_m.inf create mode 100644 binary/testme.bat create mode 100644 binary/wget.exe create mode 100755 binary64/ipfw.exe create mode 100755 binary64/ipfw.sys create mode 100644 configuration/README create mode 100755 configuration/change_rules.sh create mode 100755 configuration/change_rules_linux.sh create mode 100644 configuration/ipfw.conf create mode 100755 configuration/ipfw.rules create mode 100755 configuration/rc.firewall create mode 100644 glue.h create mode 100644 ipfw/Makefile create mode 100755 ipfw/add_rules create mode 100644 ipfw/dummynet.c create mode 100644 ipfw/expand_number.c create mode 100644 ipfw/glue.c create mode 100644 ipfw/humanize_number.c create mode 100644 ipfw/include/alias.h create mode 100644 ipfw/include/net/if_dl.h create mode 100644 ipfw/include/net/pfvar.h create mode 100644 ipfw/include/timeconv.h create mode 100644 ipfw/ipfw.8 create mode 100644 ipfw/ipfw2.c create mode 100644 ipfw/ipfw2.h create mode 100644 ipfw/ipv6.c create mode 100644 ipfw/main.c create mode 100644 ipfw/qsort.c create mode 100644 ipfw/qsort_r.c create mode 100755 ipfw/rule_test.sh create mode 100644 ipfw/ws2_32.def create mode 100644 kipfw/Makefile create mode 100644 kipfw/bsd_compat.c create mode 100644 kipfw/debug.c create mode 100644 kipfw/ipfw2_mod.c create mode 100644 kipfw/md_win.c create mode 100644 kipfw/missing.h create mode 100644 kipfw/mysetenv.sh create mode 100644 kipfw/netipfw.inf create mode 100644 kipfw/netipfw_m.inf create mode 100644 kipfw/sources create mode 100644 kipfw/win-passthru.diff create mode 100644 kipfw/winmissing.h create mode 100644 kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk create mode 100644 modified_passthru/miniport.c create mode 100644 modified_passthru/passthru.c create mode 100644 modified_passthru/passthru.h create mode 100644 modified_passthru/precomp.h create mode 100644 modified_passthru/protocol.c create mode 100644 original_passthru/makefile create mode 100644 original_passthru/miniport.c create mode 100644 original_passthru/netsf.inf create mode 100644 original_passthru/netsf_m.inf create mode 100644 original_passthru/passthru.c create mode 100644 original_passthru/passthru.h create mode 100644 original_passthru/passthru.htm create mode 100644 original_passthru/passthru.rc create mode 100644 original_passthru/precomp.h create mode 100644 original_passthru/protocol.c create mode 100644 original_passthru/sources create mode 100644 planetlab/Makefile.planetlab create mode 100755 planetlab/check_planetlab_sync create mode 100755 planetlab/ipfw create mode 100644 planetlab/ipfw.8.gz create mode 100644 planetlab/ipfw.cron create mode 100644 planetlab/ipfwroot.spec create mode 100644 planetlab/ipfwslice.spec create mode 100755 planetlab/netconfig create mode 100644 planetlab/planetlab-tags.mk create mode 100644 planetlab/planetlab.mk create mode 100755 planetlab/sample_hook create mode 100644 sys/net/if.h create mode 100644 sys/net/pfil.h create mode 100644 sys/net/radix.c create mode 100644 sys/net/radix.h create mode 100644 sys/netgraph/ng_ipfw.h create mode 100644 sys/netinet/in_cksum.c create mode 100644 sys/netinet/ip.h create mode 100644 sys/netinet/ip6.h create mode 100644 sys/netinet/ip_dummynet.h create mode 100644 sys/netinet/ip_fw.h create mode 100644 sys/netinet/ip_icmp.h create mode 100644 sys/netinet/ipfw/dn_heap.c create mode 100644 sys/netinet/ipfw/dn_heap.h create mode 100644 sys/netinet/ipfw/dn_sched.h create mode 100644 sys/netinet/ipfw/dn_sched_fifo.c create mode 100644 sys/netinet/ipfw/dn_sched_prio.c create mode 100644 sys/netinet/ipfw/dn_sched_qfq.c create mode 100644 sys/netinet/ipfw/dn_sched_rr.c create mode 100644 sys/netinet/ipfw/dn_sched_wf2q.c create mode 100644 sys/netinet/ipfw/ip_dn_glue.c create mode 100644 sys/netinet/ipfw/ip_dn_io.c create mode 100644 sys/netinet/ipfw/ip_dn_private.h create mode 100644 sys/netinet/ipfw/ip_dummynet.c create mode 100644 sys/netinet/ipfw/ip_fw2.c create mode 100644 sys/netinet/ipfw/ip_fw_dynamic.c create mode 100644 sys/netinet/ipfw/ip_fw_log.c create mode 100644 sys/netinet/ipfw/ip_fw_lookup.c create mode 100644 sys/netinet/ipfw/ip_fw_nat.c create mode 100644 sys/netinet/ipfw/ip_fw_pfil.c create mode 100644 sys/netinet/ipfw/ip_fw_private.h create mode 100644 sys/netinet/ipfw/ip_fw_sockopt.c create mode 100644 sys/netinet/ipfw/ip_fw_table.c create mode 100644 sys/netinet/tcp.h create mode 100644 sys/netinet/tcp_var.h create mode 100644 sys/netinet/udp.h create mode 100644 sys/sys/cdefs.h create mode 100644 sys/sys/kernel.h create mode 100644 sys/sys/malloc.h create mode 100644 sys/sys/mbuf.h create mode 100644 sys/sys/module.h create mode 100644 sys/sys/param.h create mode 100644 sys/sys/queue.h create mode 100644 sys/sys/syslog.h create mode 100644 sys/sys/systm.h create mode 100644 sys/sys/taskqueue.h create mode 100644 tcc-0.9.25-bsd.zip create mode 100644 tcc_glue.h create mode 100644 test/Makefile create mode 100755 test/basic_ipfw.sh create mode 100644 test/dn_test.h create mode 100644 test/dynrules.sh create mode 100644 test/interpolation.c create mode 100644 test/main.c create mode 100644 test/memory_leak.sh create mode 100644 test/mylist.h create mode 100644 test/profile_bench1 create mode 100644 test/profile_bench2 create mode 100644 test/profile_bench3 create mode 100644 test/test_dn_heap.c create mode 100644 test/test_dn_sched.c diff --git a/020-mips-hz1000.patch b/020-mips-hz1000.patch new file mode 100644 index 0000000..eb54ca2 --- /dev/null +++ b/020-mips-hz1000.patch @@ -0,0 +1,11 @@ +--- include/asm-mips/param_orig.h 2010-02-23 12:45:58.000000000 +0100 ++++ include/asm-mips/param.h 2010-02-23 12:00:31.000000000 +0100 +@@ -41,7 +41,7 @@ + counter is increasing. This value is independent from the external value + and can be changed in order to suit the hardware and application + requirements. */ +-# define HZ 100 ++# define HZ 1000 + # define hz_to_std(a) (a) + + #endif /* Not a DECstation */ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..508f1ae --- /dev/null +++ b/Makefile @@ -0,0 +1,149 @@ +# $Id: Makefile 11689 2012-08-12 21:07:34Z luigi $ +# +# Top level makefile for building ipfw/dummynet (kernel and userspace). +# You can run it manually or also under the Planetlab build. +# Planetlab wants also the 'install' target. +# +# To build on system with non standard Kernel sources or userland files, +# you should run this with +# +# make KERNELPATH=/path/to/linux-2.x.y.z USRDIR=/path/to/usr +# +# We assume that $(USRDIR) contains include/ and lib/ used to build userland. +# + +include Makefile.inc + +DATE ?= $(shell date +%Y%m%d) +SNAPSHOT_NAME=$(DATE)-ipfw3.tgz +BINDIST=$(DATE)-dummynet-linux.tgz +WINDIST=$(DATE)-dummynet-windows.zip + +DISTFILES= Makefile Makefile.inc README binary* ipfw kipfw *.h sys + +.PHONY: ipfw kipfw + +########################################### +# windows x86 and x64 specific variables # +########################################### +# DRIVE must be the hard drive letter where DDK is installed +# DDKDIR must be the path to the DDK root directory, without drive letter +# TARGETOS (x64 only) must be one of the following: +# wnet -> windows server 2003 +# wlh -> windows vista and windows server 2008 +# win7 -> windows 7 +# future version must be added here +DRIVE ?= C: +DDKDIR ?= /WinDDK/7600.16385.1 +DDK = $(DRIVE)$(DDKDIR) +TARGETOS=win7 + +export WIN64 +export DDK +export DRIVE +export DDKDIR + +_all: all + +clean distclean: + -@(cd ipfw && $(MAKE) $(@) ) + -@rm -rf kipfw-mod binary64/[A-hj-z]* + +all: kipfw ipfw + @# -- windows only +ifeq ($(OSARCH),Windows) # copy files +ifeq ($(WIN64),) + -@ cp ipfw/ipfw.exe kipfw-mod/$(OBJDIR)/ipfw.sys binary/ + -@ cp kipfw/*.inf binary/ +else + -@ cp binary/* kipfw/*.inf binary64/ + -@ cp ipfw/ipfw.exe kipfw-mod/objchk_win7_amd64/amd64/ipfw.sys binary64/ +endif # WIN64 +endif # Windows + +win64: + $(MAKE) WIN64=1 + +# kipfw-src prepares the sources for the kernel part. +# The windows files (passthru etc.) are modified version of the +# examples found in the $(DDK)/src/network/ndis/passthru/driver/ +# They can be re-created using the 'ndis-glue' target +# # We need a sed trick to remove newlines from the patchfile. + +ndis-glue: + -@mkdir -p kipfw-mod + cp $(DDK)/src/network/ndis/passthru/driver/*.[ch] kipfw-mod + cat kipfw/win-passthru.diff | sed "s/$$(printf '\r')//g" | (cd kipfw-mod; patch ) + +kipfw-src: + -@rm -rf kipfw-mod + -@mkdir -p kipfw-mod + -@cp -Rp kipfw/* kipfw-mod + -@cp `find sys -name \*.c` kipfw-mod + -@(cd kipfw-mod && $(MAKE) include_e) +ifeq ($(OSARCH),Windows) + make ndis-glue +endif + +snapshot: + $(MAKE) distclean + (tar cvzhf /tmp/$(SNAPSHOT_NAME) -s':^:ipfw3-2012/:' $(DISTFILES) ) + +bindist: + $(MAKE) clean + $(MAKE) all + tar cvzf /tmp/$(BINDIST) ipfw/ipfw ipfw/ipfw.8 kipfw-mod/ipfw_mod.ko + +windist: + $(MAKE) clean + -$(MAKE) all + -rm /tmp/$(WINDIST) + zip -r /tmp/$(WINDIST) binary -x \*.svn\* + + +ipfw: + @(cd ipfw && $(MAKE) $(@) ) + +kipfw: kipfw-src +ifeq ($(WIN64),) # linux or windows 32 bit + @(cd kipfw-mod && $(MAKE) $(@) ) +else #--- windows 64 bit, we use build.exe and nmake + rm -f kipfw-mod/Makefile + mkdir kipfw-mod/tmpbuild # check mysetenv.sh + bash kipfw/mysetenv.sh $(DRIVE) $(DDKDIR) $(TARGETOS) +endif + +openwrt_release: + # create a temporary directory + $(eval TMPDIR := $(shell mktemp -d -p /tmp/ ipfw3_openwrt_XXXXX)) + # create the source destination directory + $(eval IPFWDIR := ipfw3-$(DATE)) + $(eval DSTDIR := $(TMPDIR)/$(IPFWDIR)) + mkdir $(DSTDIR) + # copy the package, clean objects and svn info + cp -r ./ipfw ./kipfw-mod glue.h Makefile ./configuration README $(DSTDIR) + (cd $(DSTDIR); make -s distclean; find . -name .svn | xargs rm -rf) + (cd $(TMPDIR); tar czf $(IPFWDIR).tar.gz $(IPFWDIR)) + + # create the port files in /tmp/ipfw3-port + $(eval PORTDIR := $(TMPDIR)/ipfw3) + mkdir -p $(PORTDIR)/patches + # generate the Makefile, PKG_VERSION and PKG_MD5SUM + md5sum $(DSTDIR).tar.gz | cut -d ' ' -f 1 > $(TMPDIR)/md5sum + cat ./OPENWRT/Makefile | \ + sed s/PKG_VERSION:=/PKG_VERSION:=$(DATE)/ | \ + sed s/PKG_MD5SUM:=/PKG_MD5SUM:=`cat $(TMPDIR)/md5sum`/ \ + > $(PORTDIR)/Makefile + + @echo "" + @echo "The openwrt port is in $(TMPDIR)/ipfw3-port" + @echo "The source file should be copied to the public server:" + @echo "scp $(DSTDIR).tar.gz marta@info.iet.unipi.it:~marta/public_html/dummynet" + @echo "after this the temporary directory $(TMPDIR) can be removed." + +install: + +diff: + -@(diff -upr $(BSD_HEAD)/sbin/ipfw ipfw) + -@(diff -upr $(BSD_HEAD)/sys sys) + diff --git a/Makefile.inc b/Makefile.inc new file mode 100644 index 0000000..ffa14e9 --- /dev/null +++ b/Makefile.inc @@ -0,0 +1,23 @@ +# $Id$ +# GNU makefile header for ipfw/kipfw building +BSD_HEAD ?= ~/FreeBSD/head +OSARCH := $(shell uname) +OSARCH := $(findstring $(OSARCH),FreeBSD Linux Darwin) +ifeq ($(OSARCH),) + OSARCH := Windows +endif +OBJDIR=mia + +KSRC ?= /lib/modules/$(shell uname -r)/build +ifneq ($V,1) # no echo + MSG=@echo + HIDE=@ +else + MSG=@\# + HIDE= +endif + +.c.o: + $(MSG) " CC $<" + $(HIDE) $(CC) $(CFLAGS) -c $< -o $@ + diff --git a/Makefile.openwrt b/Makefile.openwrt new file mode 100644 index 0000000..3c7be80 --- /dev/null +++ b/Makefile.openwrt @@ -0,0 +1,95 @@ +# Makefile to build the package in openwrt. +# goes into package/ipfw3/Makefile +# +# Edit IPFW_DIR to point to the directory with the sources for ipfw + +IPFW_DIR := $(TOPDIR)/../ipfw3 + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=kmod-ipfw3 +PKG_RELEASE:=1 + +# MV is undefined +MV ?= mv + +include $(INCLUDE_DIR)/package.mk + +#Stuff depending on kernel version +ifeq ($(KERNEL),2.6) + +VERS:=2.6 +IPFW_MOD:=ipfw_mod.ko +IPFW_SRC_DIR:=M + +else + +VERS:=openwrt +CFLAGS_WRT:=-DSYSCTL_NODE -DEMULATE_SYSCTL +IPFW_MOD:=ipfw_mod.o +IPFW_SRC_DIR:=SUBDIRS + +endif + +# Description for the package. +# The names KernelPackage/ipfw3 must match the arguments to the +# call $(eval $(call KernelPackage,ipfw3)) used to build it + +define KernelPackage/ipfw3 + SUBMENU:=Other modules + TITLE:= IPFW and dummynet + # FILES is what makes up the module, both kernel and userland + # It must be in the KernelPackage section + FILES := $(PKG_BUILD_DIR)/dummynet2/$(IPFW_MOD) $(PKG_BUILD_DIR)/ipfw/ipfw + # AUTOLOAD:=$(call AutoLoad,80,ipfw_mod) +endef + +define KernelPackage/ipfw3/description + This package contains the ipfw and dummynet module +endef + +# Standard entries for the openwrt builds: Build/Prepare and Build/Compile +# Remember that commands must start with a tab + +# 'prepare' instructions for both kernel and userland +# We copy the entire subtree, then build include_e/ which +# contains empty headers used by the kernel sources. +define Build/Prepare + # $(warning Preparing ipfw sources) + mkdir -p $(PKG_BUILD_DIR) + $(CP) -Rp $(IPFW_DIR)/* $(PKG_BUILD_DIR)/ + (cd $(PKG_BUILD_DIR)/ipfw && $(MAKE) include_e ) + (cd $(PKG_BUILD_DIR)/dummynet2 && $(MAKE) include_e ) +endef + +define Build/Compile + # compile the kernel part for openwrt + $(MAKE) -C "$(LINUX_DIR)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + ARCH="$(LINUX_KARCH)" \ + $(IPFW_SRC_DIR)="$(PKG_BUILD_DIR)/dummynet2" \ + VER=$(VERS) modules + # compile the userland part for openwrt + $(MAKE) -C $(PKG_BUILD_DIR)/ipfw \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS) $(CFLAGS_WRT) -I./include_e -I./include -include ../glue.h -DNO_ALTQ -D__BSD_VISIBLE" \ + VER=$(VERS) all +endef + +define Package/ipfw3-userland + SECTION:=utils + CATEGORY:=Utilities + TITLE := /sbin/ipfw + DESCRIPTION := This is the control program for ipfw and dummynet +endef + +define Package/ipfw3-userland/install + $(INSTALL_DIR) $(1) /sbin +endef + +# XXX not entirely clear why the install entry for userland works, +# given that /sbin/ipfw is in KernelPackage/ipfw3 + +$(eval $(call Package,ipfw3-userland)) +$(eval $(call KernelPackage,ipfw3)) diff --git a/NOTES b/NOTES new file mode 100644 index 0000000..52bb5bf --- /dev/null +++ b/NOTES @@ -0,0 +1,220 @@ +# +# $Id: NOTES 6552 2010-06-15 11:24:59Z svn_panicucci $ +# + +--------------------------------------------------------------------- +--- DEVELOPER NOTES ------------------------------------------------ + +Both the client and the kernel code use almost unmodified sources +from FreeBSD (just a very small number of sections #ifdef'ed out +for features not relevant or not implemented). + +In both cases we provide two set of headers: + - one set is made of empty files, automatically generated, to replace + FreeBSD headers not available or conflicting on the ported platforms. + - one set is made of custom files, sometimes copied verbatim + from FreeBSD, sometimes containing only the minimal set of + macros/ struct/ prototypes required by the port. + +Additionally, we have a small set of .c files providing functions not +available in the port platforms, and hooks for the sockopt/packet +data. + + +TODO 20100205: ++ use an appropriate identifier instead of LINUX24 ++ find the discharging module hook, in order to force a queue flush ++ better matching on interface names (case insensitive etc ?) ++ match by interface address ++ verify path ++ send keepalives (20100301 marta: implemented) ++ pullup of data in external buffers ++ O_TAG ++ O_DIVERT ++ O_TEE ++ O_SETFIB ++ kmem_cache_alloc + +TODO (OpenWRT) 20090622 ++ add a module compilation for 2.6 + +TODO (FreeBSD, general) ++ New features related to the forthcoming IPv6 are missing, as the IPv6 +support for lookup tables that currently support IPv4 addresses only. +One of the goal of this project is to add the tables feature to the +IPv6 protocol. + ++ The current code implements rules listing requests as a single +request returning both static and dynamic rules as a whole block. This +operation requires a lock to be held for the time needed to get the +full list of rules, regardless of the requested rules. I propose to +break up the rule request in two parts, for static and dynamic rules, in +order to avoid to lock the whole struct for a subset of rules required. + ++ At last, due to improvement and contribution to the code, the tool +significantly grown over the time with new functionalities and features, +leaving the general view aside. An example of this will be the use of +dispatching table instead some very long switch case, making the resulting +code more readable and hopefully a faster execution. + ++ XXX can't find the ipfw_* indirection... + +DETAILED PORTING INFO + +--- ipfw (userland) on linux --- + +The port is relatively trivial. Communication with the kernel occurs +through a raw socket using [gs]etsockopt(), and all is needed is the +availability of ip_fw.h and ip_dummynet.h headers to describe the +relevant data structures. + +--- kernel ipfw on linux --- + +Sources are mostly unmodified, except for commenting out +unsupported features (tables, in-kernel nat...). +The port requires a rather large number of empty headers. +Other porting issues are in ipfw2_mod.c + +--- build as an Openwrt package + +------ WINDOWS PORT ------ + +We started from the wipfw port available at [WIPFW] , but +most of the port is done from scratch using the most recent +version of ipfw+dummynet from HEAD/RELENG_7 as of March 2009 + +# WIPFW: wipfw.sourceforge.net +#binary: +http://downloads.sourceforge.net/wipfw/wipfw-0.3.2b.zip?use_mirror=mesh +http://downloads.sourceforge.net/wipfw/wipfw-0.2.8-source.zip + +--- DEVELOPMENT TOOLS: + +At least initially, to build the code you need a pc with +windows installed and the [WINDDK] from the microsoft site. +Other tools like the new WDK should work as well. + +The 'standard' way used by WDK/WINDDK is to run a 'build' +script which in turn calls nmake and then the microsoft +compiler [CL] and linker [LINK]. See the documentation for +command line switches for these tools, they are similar but +not the same as the equivalent gcc switches. In particular, +a / is often used to replace - though both forms are accepted. + +The steps to do in order to launch the build environment follows: + + + download winddk from microsoft.com + + install + + run the Free Build Enviroment from: + + Start -> All Program -> WINDDK -> + [NT|XP|2000] -> Free Build Environment + + + change dir to .src and type `build' in command line + +For our purposes, however, it is much more convenient to use +cygwin [CYGWIN] and invoke CL and LINK using gmake + +A debugging tools is: + http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx +it simply display the kernel-mode debug output. +Use the DbgPrint() function, that is something similar to printk(). +Can be lauched with dbgview.exe. + +After a succesfully compilation and link, you can launch the program +in user space simply executing the binary file, while for the kernel +space you need to do the following steps: + +cp ipfw.sys /cygdrive/c/WINDOWS/system32/drivers/ +ipfw install_drv System32\DRIVERS\ip_fw.sys +net start ip_fw + + +======= +--- ARCHITECTURE --- + +The main part of the userland program mostly work as the +unix equivalent, the only issue is to provide empty +header files to replace those not available in Windows, +and include the winsock2 headers to access some network +related functions and headers. + +Communication with the kernel module does not use a raw IP socket +as in the unix version. Instead, we inherit the same method +used in ipfw -- a replacement for socket() creates a handle +to access the control structure, and setsockopt/getsockopt +replacements are also used to communicate with the kernel +side. This is implemented in win32.c + +In order to load the module and activate it, we also use +the same technique suggested in wipfw -- the main() is +extended (with a wrapper) so that it can handle additional +commands to install/control/deinstall the service and +call the appropriate actions. See svcmain.c for details. + +--- PORTING ISSUES: + +Most of the unix hierarchy of headers is not available so we +have to replicate them. + +gcc attributes are also not present. + +C99 types are not present, remapped in +Also, we don't have C99 initializers which sometimes gives trouble. + +--- USEFUL LINKS: + +[WIPFW] + http://wipfw.sourceforge.net/ + +[WINDDK] + http://www.microsoft.com/whdc/devtools/ddk/default.mspx + +[CL] + http://msdn.microsoft.com/en-us/library/610ecb4h.aspx + command line syntax + +[CYGWIN] + http://www.cygwin.com/setup.exe +Windows Driver Kit +http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx + +Debug Symbols for WinXP SP3 +http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx#d + +DbgView +http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx + +Cygwin +http://www.cygwin.com/ +(installazione pacchetti di default + categoria devel) + +Winrar (il WDK e' distribuito in un file .iso) +http://www.rarlab.com/download.htm + +puttycyg (terminale per cygwin) +http://code.google.com/p/puttycyg/ + +Tortoise SVN +http://tortoisesvn.net/downloads + +EditPlus +http://www.editplus.com/ + +--------------------------------------------------------------------- +--- OPEN ISSUES/TODO ------------------------------------------------ + +- Fix the build on OpenWRT for linux 2.6 + [Forum: https://forum.openwrt.org/viewtopic.php?id=24990] +- Compilation on 2.6 OpenWRT (target is MIPS Artheros 71xx) gives compilation + errors; [Send updates to: https://forum.openwrt.org/viewtopic.php?id=24990] +- Windows stack corruption [a tricky bug in dummynet] +- Windows ipv6 port [RE: Windows port of ipv6 in ipfw+dummynet] + +NOTE: +- To allow compilation on OpenWRT with kernel 2.6 only the Makefile.opewrt + is modified to guess the kernel version (2.4/2.6) +- ipfw3 Makefile is not modified. +- Also compile on bigendian, but not tested yet... +- Little changes in source code. + diff --git a/README b/README new file mode 100644 index 0000000..9791ea1 --- /dev/null +++ b/README @@ -0,0 +1,275 @@ +# +# $Id: README 11691 2012-08-12 21:32:37Z luigi $ +# + +This directory contains a port of ipfw and dummynet to Linux and Windows. +This version of ipfw and dummynet is called "ipfw3" as it is the +third major rewrite of the code. The source code here comes straight +from FreeBSD (roughly the version in HEAD as of February 2010), +plus some glue code and headers written from scratch. Unless +specified otherwise, all the code here is under a BSD license. + +Specific build instructions are below, and in general produce + + a kernel module, ipfw_mod.ko (ipfw.sys on windows) + a userland program, /sbin/ipfw (ipfw.exe on windows) + +which you need to install on your system. + +CREDITS: + Luigi Rizzo (main design and development) + Marta Carbone (Linux and Planetlab ports) + Riccardo Panicucci (modular scheduler support) + Francesco Magno (Windows port) + Fabio Checconi (the QFQ scheduler) + Funding from Universita` di Pisa (NETOS project), + European Commission (ONELAB2 project) + ACM SIGCOMM (Sigcomm Community Projects Award, April 2012) + +------ INSTALL/REMOVE INSTRUCTIONS ------ + +Linux + INSTALL: + # Do the following as root + insmod ./dummynet2/ipfw_mod.ko + cp ipfw/ipfw /usr/local/sbin + REMOVE: + rmmod ipfw_mod.ko + +OpenWRT + INSTALL: # use the correct name for your system + opkg install kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk #install + ls -l ls -l /lib/modules/2.4.35.4/ipfw* # check + insmod /lib/modules/2.4.35.4/ipfw_mod.o # load the module + /lib/modules/2.4.35.4/ipfw show # launch the userspace tool + REMOVE: + rmmod ipfw_mod.o # remove the module + +Windows: + A pre-built version is in binary/ and binary64/ directories. + + INSTALL THE NDIS DRIVER + - open the configuration panel for the network card in use + (right click on the icon on the SYSTRAY, or go to + Control Panel -> Network and select one card) + - click on Properties->Install->Service->Add + - click on 'Driver Disk' and select 'netipfw.inf' in this folder + - select 'ipfw+dummynet' which is the only service you should see + - click accept on the warnings for the installation of an unsigned + driver (roughly twice per existing network card) + + Now you are ready to use the emulator. To configure it, open a 'cmd' + window (REMEMBER to run it as Administrator) + and you can use the ipfw command from the command line. + Otherwise click on the 'TESTME.bat' which is a batch program that + runs various tests. + REMEMBER: you need to run ipfw as administrator. + + REMOVE: + - select a network card as above. + - click on Properties + - select 'ipfw+dummynet' + - click on 'Remove' + + +------ BUILD INSTRUCTIONS ------ + ++ Windows 32 bit and 64 bit (XP, Windows7) + + To build your own version of the package you need: + - cygwin, http://www.cygwin.com/ with base packages, make, + c compiler, possibly an editor and subversion. + This is used to build the userspace control program, ipfw.exe + + - Microsoft Windows Driver Kit Version 7.1.0, available from + http://www.microsoft.com/en-us/download/details.aspx?id=11800 + (ISO image, GRMWDK_EN_7600_1.ISO) + This is used to build the kernel module. + + - optionally, DbgView if you want to see diagnostics coming from + the kernel module. You can find it at + + http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx + + Check the Makefile in the root directory to make sure that the WDK is + installed in the place indicated by DRIVE and DDKDIR variables + (otherwise pass the correct values to the Makefile). + Open a shell from cygwin, move to this directory, and run "make" for + the 32-bit version, "make win64" for the 64 bit version. + This will produce in the binary/ or binary64/ directory the + following files: + ipfw.exe (you also need cygwin1.dll) + ipfw.sys (an NDIS intermediate filter driver) + netipfw.inf and netipfw_m.inf (installer files) + + Cross compilation of the userland side under FreeBSD is possible with + gmake TCC=`pwd`/tcc-0.9.25-bsd/win32 CC=`pwd`/tcc-0.9.25-bsd/win32/bin/wintcc + (wintcc is a custom version of tcc which produces Windows code) + + NOTE: the 64-bit version is compiled as a 32-bit executable for userspace, + with appropriate changes to produce 64-bit pointers. + The kernel module is built using the MSC 'build' utility instead + of 'make'. THE MODULE IS NOT SIGNED. + IMPORTANT: Windows 64-bit will not load unsigned kernel modules unless + you boot with 'F8' and disable checks for signed modules. + +***** Linux 2.6 and above ****** + + make [KSRC=/path/to/linux USRDIR=/path/to/usr] + + where the two variables are optional an point to the linux kernel + sources and the /usr directory. Defaults are USRDIR=/usr and + KSRC=/lib/modules/`uname -r`/build --- XXX check ? + + NOTE: make sure CONFIG_NETFILTER is enabled in the kernel + configuration file. You need the ncurses devel library, + that can be installed according your distro with: + apt-get install ncurses-dev # for debian based distro + yum -y install ncurses-dev # for fedora based distro + You can enable CONFIG_NETFILTER by doing: + + "(cd ${KSRC}; make menuconfig)" + + and enabling the option listed below: + + Networking ---> + Networking options ---> + [*] Network packet filtering framework (Netfilter) + + If you have not yet compiled your kernel source, you need to + prepare the build environment: + + (cd $(KSRC); make oldconfig; make prepare; make scripts) + +***** Linux 2.4.x ***** + + Almost as above, with an additional VER=2.4 + + make VER=2.4 KSRC=... + + For 2.4, if KSRC is not specified then we use + KSRC ?= /usr/src/`uname -r`/build + + You need to follow the same instruction for the 2.6 kernel, enabling + netfilter in the kernel options: + + Networking options ---> + [*] Network packet filtering (replaces ipchains) + +***** Openwrt package ***** + + (Tested with kamikaze_8.09.1 and Linux 2.4) + + + Download and extract the OpenWrt package, e.g. + + wget http://downloads.openwrt.org/kamikaze/8.09.1/kamikaze_8.09.1_source.tar.bz2 + tar xvjf kamikaze_8.09.1_source.tar.bz2 + + + move to the directory with the OpenWrt sources (the one that + contains Config.in, rules.mk ...) + + cd kamikaze_8.09.1 + + + Optional: Add support for 1ms resolution. + + By default OpenWRT kernel is compiled with HZ=100; this implies + that all timeouts are rounded to 10ms, too coarse for dummynet. + The file 020-mips-hz1000.patch contains a kernel patch to build + a kernel with HZ=1000 (i.e. 1ms resolution) as in Linux/FreeBSD. + To apply this patch, go in the kernel source directory and + patch the kernel + + cd build_dir/linux-brcm-2.4/linux-2.4.35.4 + cat $IPFW3_SOURCES/020-mips-hz1000.patch | patch -p0 + + where IPFW3_SOURCES contains the ipfw3 source code. + Now, the next kernel recompilation will use the right HZ value + + + Optional: to be sure that the tools are working, make a first + build as follows: + + - run "make menuconfig" and set the correct target device, + drivers, and so on; + - run "make" to do the build + + + Add ipfw3 to the openwrt package, as follows: + + - copy the code from this directory to the place used for the build: + + cp -Rp /path_to_ipfw3 ../ipfw3; + + If you want, you can fetch a newer version from the web + (cd ..; rm -rf ipfw3; \ + wget http://info.iet.unipi.it/~luigi/dummynet/ipfw3-latest.tgz;\ + tar xvzf ipfw3-latest.tgz) + + - run the following commands: + (mkdir package/ipfw3; \ + cp ../ipfw3/Makefile.openwrt package/ipfw3/Makefile) + + to create the package/ipfw3 directory in the OpenWrt source + directory, and copy Makefile.openwrt to package/ipfw3/Makefile ; + + - if necessary, edit package/ipfw3/Makefile and set IPFW_DIR to point to + the directory ipfw3, which contains the sources; + + - run "make menuconfig" and select kmod-ipfw3 as a module in + Kernel Modules -> Other modules -> kmod-ipfw3 + + - run "make" to build the package, "make V=99" for verbose build. + + - to modify the code, assuming you are in directory "kamikaze_8.09.1" + + (cd ../ipfw3 && vi ...the files you are interested in ) + rm -rf build_dir/linux-brcm-2.4/kmod-ipfw3 + make package/ipfw3/compile V=99 + + The resulting package is located in bin/packages/mipsel/kmod-ipfw3*, + upload the file and install on the target system, as follows: + + opkg install kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk #install + ls -l ls -l /lib/modules/2.4.35.4/ipfw* # check + insmod /lib/modules/2.4.35.4/ipfw_mod.o # load the module + /lib/modules/2.4.35.4/ipfw show # launch the userspace tool + rmmod ipfw_mod.o # remove the module + +***** PLANETLAB BUILD (within a slice) ***** +These instruction can be used by PlanetLab developers to compile +the dummynet module on a node. To install the module on the node +users need root access in root context. PlanetLab users that want +to use the dummynet package should ask to PlanetLab support for +nodes with dummynet emulation capabilities. + + Follow the instructions below. You can just cut&paste + + # install the various tools if not available + sudo yum -y install subversion rpm-build rpm-devel m4 redhat-rpm-config make gcc + # new build installation requires the gnupg package + sudo yum -y install gnupg + # the linux kernel and the ipfw source can be fetched by git + sudo yum -y install git + + # create and move to a work directory + mkdir -p test + # extract a planetlab distribution to directory XYZ + (cd test; git clone git://git.onelab.eu/build ./XYZ) + # download the specfiles and do some patching. + # Results are into SPEC/ (takes 5 minutes) + (cd test/XYZ; make stage1=true PLDISTRO=onelab) + # Building the slice code is fast, the root code takes longer + # as it needs to rebuild the whole kernel + (cd test/XYZ; sudo make ipfwslice PLDISTRO=onelab) + (cd test/XYZ; sudo make ipfwroot PLDISTRO=onelab) + + The kernel dependency phase is a bit time consuming, but does not + need to be redone if we are changing the ipfw sources only. + To clean up the code do + (cd test/XYZ; sudo make ipfwroot-clean ipfwslice-clean) + then after you have updated the repository again + (cd test/XYZ; sudo make ipfwslice ipfwroot) + +--- References +[1] https://svn.planet-lab.org/wiki/VserverCentos +[2] http://wiki.linux-vserver.org/Installation_on_CentOS +[3] http://mirror.centos.org/centos/5/isos/ +[4] More information are in /build/README* files diff --git a/binary/README.txt b/binary/README.txt new file mode 100644 index 0000000..0212277 --- /dev/null +++ b/binary/README.txt @@ -0,0 +1,27 @@ +This directory contains the binaries to install and use IPFW and +DUMMYNET on a Windows Machine. The kernel part is an NDIS module, +whereas the user interface is a command line program. + +1. INSTALL THE NDIS DRIVER + +- open the configuration panel for the network card in use + (either right click on the icon on the SYSTRAY, or go to + Control Panel -> Network and select one card) + +- click on Properties->Install->Service->Add +- click on 'Driver Disk' and select 'netipfw.inf' in this folder +- select 'ipfw+dummynet' which is the only service you should see +- click accept on the warnings for the installation of an unknown + driver (roughly twice per existing network card) + +Now you are ready to use the emulator. To configure it, open a 'cmd' +window and you can use the ipfw command from the command line. +Otherwise click on the 'TESTME.bat' which is a batch program that +runs various tests. + +2. UNINSTALL THE DRIVER + +- select a network card as above. +- click on Properties +- select 'ipfw+dummynet' +- click on 'Remove' diff --git a/binary/cygwin1.dll b/binary/cygwin1.dll new file mode 100644 index 0000000000000000000000000000000000000000..317c51e3519ffc61f4a6d71b70515990d07c392b GIT binary patch literal 2855706 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�uw9Yvqv81oET&`ZII(cc0j|AyAITrnS_Vn{=-AD6Gn zLimi)ZkjWS=}`ZpXe~P^L~WSg%q?WvS1vhz9rjtfxqL=3;}2pX^fp=F2iOpV>{|RL zj~tKSXq&Mifb_a#!ylliyPyflIVx%s>YkC`8tPYXc>>6WKv2fGjF zM7vpP&*fhNaL(sAB2=+~m*3(#97&H5u)T zmr9^UPh2HnIQbkuyiD*;>y+YcavWhZ_At~-;%)2Ru}UMv4$IXWi6m`=tH$oPGYh*?@mcJh%nB-@eu=j~1CXp6X>3hLfWoLO(}YEj+^KY<$2t%$OvB zNP*uW9gXqnTIHnxCCDi=-<{>PtBDGeO7=D}my4;_@M%6{d;bsWKLdGomU0yFv@inO zIKI;!Z!%B&?zk=fpW(gQHf}1Vj?FXcD6tfBqt-U_X{DJz+VFM8r*)2`L&HbqZAImR z{pRpl$P-ro2^|<8?tSOjl(Q6P>Xvb|Dmw(^>P^L<`J%fP)XFE=9%lE4{Ht_fra(BK z?ls<9vmxe|^#NiqL~?%`8>{Fe(7cA-F&4~EF!c%gXv4X8JjyTZH9Yxetl^H6yv%I5u`k4N zaHb!Hoo5V(fLv~`p51(})w|~;FU!1+lX)z91L#I&uX>w7(|O%luZ2Z#Sv znQZ`$diXLBn`~8_PxC}Q2Nj0r@3fokwOTHw-s?E(IKj)z>o4~(Vw{6*>*(6~moDzH zUCQj^C6IDM7Ofv&f>S0{g{VwsO!FmXbrWJ-aiy^SIQpQeQ$+3~vRZI2ZvcCyeSf$S z-pLyf$YX>%cnk&}BeYAsLHmA?ZSIj5{ymqvC{cc)tiSKrxi^01E;y5DK!fN`(AMwnduIDDBP_|C=lGWF}@7^^tmi}Xk3Rq3zEzu7UMT?iKb2)-UO zhT?b?Zt3YZ!do-4ZARmj;BE7`_krMo3$*V3a{M-=#qK`L(KkbH+cid#)T`|w(n%-l z|A0#~b-`=5={sco7kPYnd^u#18u;OD0bf__7Kd?PvzVj64{uBQ_h6wOq%pV2@l%mH zyQz%$f4^d0d7n5nDQ>60c+Xe_VZ`V*zZ>6UiI{qOc(VRWO#cEui06l=`g4QSIwg$r zg4`{R!dNEEg1g}o3&)}yKS7>^82+O_u?VY<^Ro0t7{ka%LQ>4%ooY*}0z6u$1Tl*| zER66Llo)?1g!C<79A9_*-*^G>=R)@`Ddy~ZMYzC1;w%X)Np%Q6TuYWZQJ5FnMc@I2 z#Ty*`-CB5Dm@C&8BbyfB$iZeT*y@twSBWP}j{gsNqZ{4k+6#J|^Iz8gh%GT%L3r!e zyuj@InqpPO9P}=uNsb?l=pcw8n2**yNWEX{K0>{RPuz+v1-VT0^c}YKf~{8cVWTOH zJ48`_<>BU#^~GYF5!}0~BuUoSf!z-6G>Q{6;U8yN5<#FZ8q$-<1B{G%p099RHpwEPE*s!FH}~ zhQ5l|ER2O^qc~rgF!wZb1BQU}Q#%<`M5#8N`?Rl|eB&zA%NGJzLn}&Zz zySe?>#f($6E}E`e*2!+?S5g{=jDOZrG-WdoOGOj-1_mOP1egHf)mI|GZpox&zk-#*F96(_H1ul+&!h_DZM zZAq+h`1(ME*-p^v$&FRW*;9y@$Uj3i20-ey6Z|Zg)H*#5uhfV=rYEDUO{ z#8~D1^!39+#ws7c`#@rra9$!EQDp+3@7hXcBfuU=AUXjLmdDT(6fl<9F!SG*#a~20 zB2|e?thYYarGdtXzyl%jykUw@bZF>$cRH+ULb!h!_5$5IRrjhP6es;f?Rb8XEcp3wH#k z2%j;6EU{!M%1eWHX4T^`scZkBx_p5rbphc^x*g{w7)IfJdXD3*ppF2tc!aZp9RCen zE1nrJN;oXY@hSw0Eb`izeT7CU}@J&>~86b8xDHfrwbWjrLxg;mPTF^8-3w8v@-WT>`Fk zxWLD60%t+Un2@S+O_CX@J+Cz^HFPBTyvnUZyezHJeSDQ3!hFyZQwhD}XeZDD50^akv2F8K3hS$eW~J0LA8CFl%#hARl3Me}>!3@< zQgmY^aK)N=@l`V8^vK0)9UGAn?ie0UKMYTLDP56_cqW^e?muWW`SvYOz{}E&P>auH zV)traO6hax{*cOt2(Y-bQ(gq|vT_N%_!f^#3DP(3gK45S*#T~(x#jQEo(x8X-3To8~G z;G!Ep#b|SQfrCH29hZssfVlp)5^iy_z6>#KG%;u+(=TR!=Ey5r?~y28ll_qE0CIJDR39H;5lj#3;{!yUbpPxJq=rfV@VzsW z9EgYD!$;pE$3RwD$1kAJs{bq~6geKg5#H#JW}vx>FD>CRe1tI0~stT?;&WM@xARe$tQaF`GIu(50HF(JnS(` zw!+%L$tM$PjH z^5*F;jqob7{bg3d9pK5{M^Uwkn=rn8#BK z;h+h}!KQv;zM;HNmAR!Ec87+v+ z`PH^!_R@_0Lt)C$lX7)aVkzcB-lle5@06qzlrUy~BGCoeMvM9MG5z3kDuP-?{Gj>W zieAem!qsqX0JgFDlmxIk{zs(0M~slO4hNOKjY{YA{lq`x9vi;Em(tr05bUkQqj*YD z=(B(&!qvqSrY)Wj$1R=?U7HrMHaP|>ANsgFgDQq_1vN{BaG_xo5GfxBqzwfQNT(bPknRCUuc~c!%3{f|IGKOv$rEBZ^MDfa2vG0^KI1(e zEy;oC|5M-`gl}f^n?DJQxZ8onMMM7!EQBE_r+?5WpEsN*5Jd==M}5b<+la7_T2?lU zu?4ev1MWlRx7i}bcT zFXTtyj0o+rE-gXoi9FM2*8F#-$)-3WcK%&hHai!cERqN3R~7#2**oSwwfT^$VqyBb zMmVi|l70BwKQYkDG70!|&(B$w@4(Kt6#+~%(u=FUaiEu_kvu#PzaZS6m1F8`h&+tV6}y0 z6*I!ykhZb5LvNEqyX7UJ9di73$c{VY_#FJ-CC8CGdVSgR$42wQ=sW%&>fSy+it73wzng55&9X472{zQAL9aAus#%Se z)S%mBqbO0M2}%VmsdkHPZ2jmg(tZMLIy*MgaWxgRwqgs_T3V?^MS`HRc`ysMRfta@ zwvA|Y)(whclMo)}_j;c@v%7(a^waM@KVL7&?CzcWaPGP1o_p>&?-SZmd05U3FW$vM zJ2Yxnn}I%PGs>Qv(iG1zo|-}iv3QRE$tiGZF;!D;+<+qXf!<bka9`zLi6zA}2nd(qkb_Bng{@5q8&+mEXgQ>%SVJ_UH@@(J4EcBR*8tdKo%J4Z0ZP*A&eJr0bqqW`^Ka{jOo*{#d2og8B`k;Gq6Xbz!S9155(hp}# z917=;6T&zw=2M zXB{%hc@!Cv4V)dd?nG_c8ZcTk161&MJNIMPIA(n3Dw{UGU76iWAgVymrY+K#FIt7w znLJQLBeZH@d_}BxHpO;0GuOz?dSw37Q<@TO6t5typImZyQj_wo zgWyTq^@3<=xaE|5#y0*P zMzmc<{;%CEyts!+k%{QQ69f*YQ<^H|~#Y!QN=06bWL+nsY=Oe8l?{1cX? z8WAW{0|nNT7!QFf=Idl^KHqmSW;ouYQ>>OfX;xx6BZx<|H zm!e<(MtzPaQH24B{?J4?X(F85c>eNymN^=Gd#GZ?; zmSbgJji)=DzCLwO&eBiPX1^Vs{kD)OR=~dP^}YAi97^Qz>jU6Jyt^Fr;hHr8FB!-e z9c&& zM&NIx;~JKoN+9?8Ggwk$cGsgq!Or_PIs~`@X(rzlWfS+KfIUFpuK$CGyJD>+;^b_7 zPN9%$7Zb3$q<$6rk?>({PrXbC3Ec0NpizhkXJR7Ea$-J^_UDTC^=#uWo17rg$gto? zy&(DwF48TQimUh_80tZLM%5LmrWSY3^%~FOPlXeZg+WIbI zSuAlkNkgnvYRkU)sqF^g!pd81 z^)$NpwYa**{_xC7a;aZy4?|s-dO|j7RNbq_@B}4REwwBadV?#j;#DyT&)F}D=q2rb zu%F)GiL2O8segcxQJ34Fgurg$9=#y0dhKsj@OWG;u|FgJRK45!6jy#mT{M5gj>?B=U#NH9K2fNJF5fO2G5yvii9jl@Zp~+j2@vU!@kaI2 zBy(E_K|TMuMNNr?gQQrb4wzrHqJfS_#ad^&Sz;3Ex?xB1=eEX%oVo<@6t#}d$5YiU zrkfd!m)HuC_GPVz#5*}b7#$FX^bQF$59q&(|D6M7S^?<& z+AWnul6rU;R|B*U?=@anoyQUb!|6L66?v76H*4+2Elm}-s&R&Y6IcH`Ra$<-_728z z{NR5u#Jdi=S@J=fN_47+@eS1gL*aN;$BPfUnQ`Wkou!%>{!OTZrkPSD-qQAJ#3ug- zxi|aqJeGJ0tIP6-MpqLK+&n-P%fKHZKQiH;lKAt!qt9C@{Ji`20Y9&mEQ#6*4#Mjz zcsZ_?pX1QF^yhd5KCR;=__Ky1x45yZJcZXIsrRH128AzXJ1(KMMqVCm&G97U7fuGQcY!d*rj>Z6<%;at5JF4(>EfVH&bJDf**ZofO?_ z?SVnGJJ_CS?&%jt5!V#Y(XQc2;i|Tcvv*%Cb5_dvqP=IWXISQ2(B5nkc1pseQcxUgnV60Pae?)|xr; zaN@4DRJ?$K)=Bl?k4;l=}lo%DT4ErP2~r5FJX&f zPJl1!B~Rk^qSF|&854VgG3T2$b0%)gz)GnDL)yJ0 zgsK29?6Jgc_&6qP+py>*_}8w>c>H1sSA=DBBOhm|R}b(q@g#Vs=v=X+uuvFYPP~T0 z5So~5#GsIjx!VxG9!G=r!DBO%m{s}Q>$+zX) zK!FHHqW37Ub)DRZP9rgQUP{b)1$MP9=BO8E~F>6f@VM^4q2!@P*j(9yO_+I)#ed=2v@Nr(u^ z=BTI*niL?4cI*dWP+n-J)UlkJ32GHZYqRv_qM2)*`f^eAwJu#q`Ji^KC+Q_% zb_gKg9YJ5KwqTjXcL)$xd=MD8u=?rRhe8QAQ?m|(k7WuEz z6OG(8v`y*pD*YGZz9F-HtKHKw+dY-)%^#yx!A}`&cjj-WMmu-sdb~6y0@k$dck}>v?kuaizz^?Gbig?c@HE7I!=wMJg7*8`2EME3*JkpI1fpKZ5M0g{%2AZIK67w02i zcYv3QN51oB?y?K!U`QN;DDM`<>o{lDJ18iA8f|Y?21+PyLT}{Un(woBR&cw{sc5`- zsBcOmcTQ>K#XC7Kx9KPvELM6-xX9dr1f?9Q!FBa6?_?3Et2f^RUK&jooa%~mDB>4JulF->Zs;6#eQy7XQ_`Vxw=4YK!J{fY z0`IAT&I3Rg`)w<%;#r}ar1d$Fp}XFV0JY2;K9yOl3?Bp%2Czi!Jip}WDNQyd@}wsw zS3NxiJ~>q4bt=J*C{g_MlqO`G@9w1*9MpF5f%NTWd;13XQH_#U9_$7>;wpYVlM+MA zkP8&_qV#wY|2tn|`p@g>m(csYj43^yQSVo2^LT|mkNY*5PnXsQcwn%`>6Oov*6&sN z9Z^J)*W@Vuhw`_z)#TW!YORi!WIkQ#sp{4Xr1g8FvkKb+#LI*mqZM=WnsQWECarJC zQTiQ@n6mp&epg$AU5UI2fo!^hUeoQ_coAJx^5yh#17g$;oj75yn`Jgj{E6T>>b;(= zKMlA{G~5owBihJ;E{Ee06bv{|A-@pfb`BJPZ|t$u>DhRx-f#UC8|YrCGpA=$QPa#- zF~C0o*JFQy6~U{Ahj&s~ecVqFBuY;O;Anu62x~IH!^kZwHMA0IXeXaK_Ruc)7-6Z{ z!xb?fgtk3BykP-)ADZC9!c5US3Ir6~mM9o-=2Z&$;aP6qy5EalKXe#_Ed*9DU{dBSgZ)P2}fFnxOD+YETAT()u=}r-~(c;)x?J$r-eC|2uvYmtkGYhdVp2oEk#p=; zGZ@`w^0GZ{hO#!kVFSFIAj)e>uj{YAuU<+{u(^cJzc(dR{WpC_j& zW%qf}0Q|`DcBn^hs8jnwn~X;X3m8Q$VL6gMUT(Ax7TBw@h;G#bbS6k~Fu}X7mGD3T7b03kSEbGx|}IbI+Jd;Va@o-O&c%G zVazyjm1QSMz_Bia{-gLyA|hQ0{wI{H?Ns%Ap++5>bKZUWRt36)hWhXFZJQ^I&w3;I0x!`yfuknX(`(bUo1^`)1ZwLhA zHH8iqubBzcyJer(YKrw5zt%8MtC?d=t;AbZqIi|oP@&aK*K4M0HRYIyqPgAZ&poDo%XrpmfjOxF>jyKkB5@=yh6v!}?i=p3#2vEVF*G)MRyVNtL>F$#iM` zmz208JmQvr(B@SV4khMLK5~Rd#)tl{4ldalzStdlP5H>7#2vlNEq+%Am%iAp-+(1^ z-B|%%r3Ls*ty441W!Tdy1AJ!aYHj$e2z5ps)B?ON6xIX0uC)i_h3j9JhxM}YN+L`7 z$kFR}xRqE|0-gc-4NUt)GxX*3uBZ_2Cu4deufu>~d~$RF10m4JVR@)aJ_ZP^X!fJDiWN9K)#kmHJR_< zX1x!K0lI?CZuI+7`uz&LAK~*ccJ z462>)mm@=~N9+u_Ly%~tn(fplMR1!G zt;GgsbneTwoAOkAKA9opjGPbLEKx6vcf@>&YzVDjJLUR)RT&5j`ngMP(xC&G_dy@Z z?D>MzCO1VJIc2aQv=uAr!s_uDJ^w4oVy?y(ov8GD(C2}4aDUuuFPL7N!#>6Y#Oxa>4f8RQ=B8#zSOPC+#q;^Cd zui&KD?a+?IZn?MLg*@#U}O*$)0j)_%q`cw8km zQN%X%xYAQfnzUXc&&q3e@29!Qbt34Xi{a~H+^s#JQ+K;EP-e-f(GVd!a>c$n|0G(c zo*!BawX*Q&b-Up`H!~hN%QjdZg)O7>ltJ4fE$_(oKqBnp|FqgGIga*bqP_Dn+M`M+ z$dlMY=_yO;KS#DlH(3E*xZP@R<#DvP<6Sp1y3ai3_&lF8KKPBIy_c-^`j4Z%1!%7! zqdlsG;a_`v06ZF#o_2d(R(t+0eewJa?{+ie-D&CZjnUrc%^!}F7~c|me8Y5-GG0NwchRaVpe-4Cx0=&82@xL`vf5jD9PPQ#-o7*btMNT<&);#h_uxO=%uxQj_8zt8ulS4S zuN3VS{CDj=Y|r0uw722!*#G!{Mb8K9`8$sGW}?0G{=4?>wde0R+S~Cq_P^8rtMRqj z^C!;#$6W6V&|bs;tv!2x|JYLYOHTP>ei`0{{qMB&_^1+cclpBgj_d`HX9#`AdXI_2 z`Z34XhW75rXpbsk_}6albN6??%o*bc|}Of|3fHV&jR7!s$&u)ut6c zWe@2(Ye*%>L7AI(x|wlRM)hO#1@=o&-qulO{|EIuQUAxMrpG!~_vNX!0Ye-Pa2mlB zH~a?;J+#BkjJq-#qDtsIlz276P-fk)Dg$Ms%)f;h#wDc0NX+^qmDV|Qn(@_)ipN;B zY5YobJ7IOZf8rOfnfKmwv*gNPyTGc0VK!xmbg5hAIb?XdMy~-I$+^D4)!xu_J=-^! zE>;8+>UVbI!0uFrv*k(nJo#Pv4B%(ugm(%MbsjoT+pF|&9Ea2N4t>qI<`jE!D4%TR zsVez5t#c#GvrfkJv(ccNX7ZU7UMI%;sWsk}$1&c|-f**|9&CrbOBtxs=kc5M7Cv9E z;|ufvZ$^;8e3-DdO83AiP1*0zkgTyviohubL_oaEnMzL`*^Rt59&6P37hj)ZxU%b= zmEEC1-yXG3YvfgO6TA~Q?{p%~Qm?#3KL-h%qIJB=ygve?UNf&!_bfS28zN^-c$9-RuaC2BT?RCeS>Yk;q;x#ynzOlo}G$Y*^y~c^U^{?p#=(IL$ zK47<^8Ob+C2_P6TK)oljg+%W^4hg&dbvH9s726Z0{LPGKQ9ZcsWSWuqAIrx2GwT>_ zRqFgX8gX)1k&P+O9)vHI=dL5lv}cq#v;lVbjPr_^uQI)b2lN1+iMTo$^AwZr!M&I= z?2sa_V1``yVLFchJ-Xc(D}ez=X`>b$T-| z*6(!cd0H8-+$UYRPl?0U?sEK_qRw(Ikl3_+p}*^m+^=WB5QwSL8+kFjlJKoo$jx@- zgH{GS^nHLAfe*g&rW1}8Md^M-opE2EZ5XxKCmtGv9WepO1FMbe;Md^Nzcf|@iK&9- zE^9)a?+H4FOC~oN6B7ln7bUW+d3nI1Iex^|%&rWYYaL=B1yQktwty zv!#2U!c2_^^o}rx=s!oyqpneaq2C2Khq&K^Hnn1%!1|0ks> zMU^o8OO#6dR)mbXEYq)Z6)Jaf^wMyDAXs4u#e?BK5Dql(a#V)rF1#Q$9p?i3?fD|R zk)u4L#j3=8S?OFv@U5IMxhdG*y3xM9lvH09V}n2WhJ&#ZNqrSKnbo&tNs+A%Cc^NN zUBPxeixvqy+afVZMUEo`09b0R^Q1iL`22~Jn~ba9FJSG|jij~-kV46y9Ql3(&ab{* ziC{Wjth#vIyH0=G(=-eQIW+&L|S=x@JQz!G0V{Emp{*#tSK5u=`|I4!}Q8+cbu*_lxm-} zd9rZXRa55BYAS5kgF;=#c2V37aM*_FB>!tl!EI;tIhn6djmclu8!EI*_A5NPb3oAy-K{v?@vtYs`qv4msik}x>f#^st>qK`W-uW9fyx2?$nFa zt)Z_fBWBz$+VP7C_fzBYS<(wo_6os8g;*iruMtx&u)eoB4EJT^RYd&PqRIR=eI2Jn zZ}WJwzJdc>NNeG;{v3zerZw|L`WjA(#9>G1Ds4F52wmngeS6fwP|yu`Wtj5gizy#K?a@Zk|p|Q5;Qpg5EEanF8_SHf8S5yd~V54gW zC#GsX;-V6|N~yTVdu$hu0d!IMwu7B=w0 z`vG3BH}b~tEN2PzTEdqgEa(iXHuFVFPmAz}(re0meP`8_A364E@ky`K_$hiVb;_}c z359$tf?Bz?)(b(eO1*`kv#yuN(lNf%yUaYwdxeZ|~vWtc75pIYu?uKH2u z1z+sCYa8?yUJQ>*y_pxOX6Te;t$ux}w7z&8WXQ{qAzyBrmjf`y%D6mDzr37;nSOg& zj2Q*wRIe@McT{SbDZEckhDr zkby4aS|F6f#uVvyR*Y1SyJRpOGm8piiyQ!&#@*uJceVzm$tYORY2{C zp6H?NvyB<7G*Y((Pz-V6xs?I9XbsT{S+mN9lHiFLZ|trQ5NA5-a@!@>HwiaL_Ef zu#uPD4!7hoX?<4JczJ<7k5{#2E8Xzps=}50G$TcADe|&d1DEy&_@$78ML!UvM#3W+ zH%R`&W03sOUN=jOKr=fvdN-%6p~LYAJ>a%Bx}5(R(8EMCeFc3_C^{x`Tt(=|DtD*= z9fLzl%z<-z0J{Vrk}#LyCmc*ej}_M~~*JYKKQ zTpQNW51BXWEqspBGY{UL(0}SM0pzdg*Iw3IctCqoYvwa`jJQ{w))@mzE>xh{@ixY669=-M5C zRvduk>t~oM1gc^Khfk@k`OGh~U>K1COBv1zeUEU{Nv3JVTr^?%%2_+$*krgDL#ORk zEdesm@Bc=mkc)!t(oey6z;_v^4Ce;hCG`bR@8|XO z3#Ik-W_Vy}ArYBlCE% zax*VJs0R=sQYLmL=$HM-%T=8D^%45NEw>>x^?5v?$>h!I*ILM? z{)@3}CfB9b#{bY3aEWv1MF9uem7i30JG2|Q(tkLAo3bUVb9a`~e*llJwo9B4<~r&} z-Oa*VR$6}vQO6w~aZ73o*aftrjqh5jej*TSp2aGA9<3<59r;P6|FCu=*Z!is>&V}M zcHX6Sb|_n1YG2zWPI-A`YlwC&Y%q}CZ(EER%V12~BlrE7nud*kYs1c;Me0(PE|^CZk2^xK6i}z3uA~ECCb@zld9u|!`O7_H{aIh z(LQQkZQ%oDes8x5qynK;*|X&dkGLdtK47J0Cvj1wx*~uP4Q-NVIM2$w>>fqwY^C=H6)Ecj?t! z{s>YEN-?i0%)qWaot)Mi zd6ib<0dPlb27&(FQ7A=J#uz^NrO3~$$C!Xyx4Ta2YcV%A9WYI)qsC6y7}RQ9@`cj+ zniRD7L5p(zlP5QkQkf3;z(F%}QGDxpIP-Hd6Ik~{KEwkedddL%0HbHFUOA#=WHU070)p=M~>c60j)yx^{MKrutyKb|8%cLf;$LqE0 zaA^D9R+6e;)5p(*UAcAxh4|LYvyidWt#Y=qB}=RAi7KS(*T(cqo$*>cGp%-u)Y0IC z6Sp6kmV%u|uF{{U4ChF9A$nE&M0qD$Qa^x|yasmq@K7%+VN7-^v%Fd8luJCjqz(n6 z2r9!NDRNjmfJCRA0PSYvf#S@ak8r#?nW|I^b?1qI346z!bOjb`c3v9G(5PHhT>M zCZe-9z-D2b{uk&>Wx(Q-+8#yPrN#YOQsie@41IDkCi9_QfNIFa_(eV`vs?GTXoqt(BHt|v;2Ioj8GzU& z(b^3uy47(Yu(<%lcEuW-#!hY|w`S1oM&L^j-2x7qZt+@BlUdUxsW2KOUbpqN%z>3{6UeMBUfv2F-6`j_&hj!=!j%7Q&XFP=X)dwJLcAhH zUWWPRf9J$&*TSZzn5MRPjXbIK6|%4`Ubz{62W!{lO0|nuYKzy3>Q2pOY^ZiQ7G~(W z!J6B$uWJITf&k*RG`FNrM;SZT1RGVOviw(`T>1+Ci8QEg0Bhac^0w z&&Jv+!Mwv&JitBEGh_yCF!kE^ju71BV*lHYbXMw%bRl|9K}(BQ!qSbJS~6=AwWrPp zwkkHa!_D;CmG&waO%JQucy}&qHO~Vm{8BOD@|{wLSNA)E+dq^#`hrSJ{o#2bJ9V3I z=CDr*cUdS$mIyrNDdFYyZe~1tXadu^R;|3FsL475(RnC2k?aloH@0Qj=CW^np9qd6 z1%C-iU7gO3B}H&Qo4~Qq8dKscxH0McFqZ^eP@BD0>R7zi*QeF4QMS005Aw7ckG6QN z6e)#XV`eSM*YQh{R^!(`eLk87p7+vP&u3lu&gb&84(BK zNvl9EhR%)HS4H^2vhN|NgA%STda;1TYiU@>-3A=n)&bnqDO&(Taq+Xz zq?FxzwHi;f+7+*MT^YRN+PL2%f9DS5a5?WAvK;rjZolQ*p=fncZ?%*4R_91s?HYaY z8ec4qMb3ip>fAYO-{bLW@{rfBSfelYYCm#5D`S95DBA_e!&chqwH3l#-mR_U=!o`) z_8dn(TJ05W4M)~EeRUn&0`^Gi^^nh&`xAT|2D|d4$lplGUPfV;h@uqALR$Dpkyla4 zxM(9U(RP?u10qKKHsnGtZj+@*F(NDWLy3xPl_C=mHbXfB_4{xGUD+i?kX%O_fk6k= zXO_V2G)i3QWNa|N%bk+?H-{Aul~Px4%4W>C=)eS~PbALE!V-@&{F^F+-JY&3l1`tg z4eNp`x}b?JD548`wDv$l>TX}{kUc}aptUP-~x6al~1OyA}d4yT!64SUo(Zlvw?gn1M|KVVhgx8SZ|>C<383?H@MUAMc0%!Q_lXOM^q{mcaYMA1}FF_{-7C z3h=_s|3S6u*1DPTn~ZAH%QNwHY|Rr1tmwX*r!bb-0~pfr^o2%WnApUv5(~yGaUR&# zdWA}S1Pvg-%fnJ+2jFY>p^D4`rz0LOz{^XdNCyi1*m}V)MShRZCt1IHrN}Sv`6=sn zmlXLaJ`WOqAs&6OD@*>0vO9kh{AWU3dy8x@1~Ru$xIRMB?Q0L;E@gMVoUi;PEBPko zi;8Z9j5MwuRo*&<3jA$&+|gl8uc^bzeHp^Gz7R%I$Pp_@4gg5{bhvo^5>LxuE<+JW z1AraQe$QB3A~7X)s?xvLIPviUrq6ya+QQFMKG<4q9!8~X z6IfLRdid=rsTAi!+s=UZ#ObxLD!9yRAhakwAyGkgi(y~m^~C@IVYkrf*a{$sm)aW8 z0vYzk9?+PBkS~EY2ZbMMAgOOQ%7XVJ!S9|emNaIk(e)A?%Td}^$+rB-%`74$uM#t+ z{*E!W){$rct7q#Cb&#Zu+-bHGZENbtC81ESuOCIy&{VA}UQGd*R)u83 zea5Z>Rq~7aT=*w9$eO%2gO`-)Op08I9;aC8DFHOJ)zsen^ogPE(QljrR*J7KK%itM zAKeUR$K&9m#3DNBq~d`Zl!2La5mHmH#^h_G^`_dVHPlP$#>|cU3NR$yGS~YF5kUS5 zs3}AQZh~672#K$d8xM^$O(+%d8X}|8GjndYKC2E}9nL&fEdgs`Jx>d(-nUixa1>`x zw3ZSq{e(i_fmT4+>rNCFf^Y`(hRq0@A16asRZ>f*9E|)J*EMi5wPIq6j#0r9s{%q& zr}K`s!{T}|ZizDTkSn8YZyZl})>EK1!++MGw1P&n+QRtrL-GdT~{;oyU_Q08j+)gNJbrC#ebb;>&qy}mvHfL9u? zGEkf>CWsWgN38&FdL2}8ml_M5vkD+8YHaB)QHU^AAbtRrh@zXGMp0)bKE`bpMfyeT z$Ee(IoLwhjO{QeVNzZUJqIdQVzZkvEe$&IXqpA7oIt2 z#{ET)qd|Z1+KaQB;(l^((&li>3&!~HnS&`0$Fo!9^K7#^xzg$+R6ZD3ZQi=+4{p}l zgTBq}HV!{s09rerI+1AXiUKLe$&HJi!O0ee36E_SL^04O?&PpW8IQ{VN%5+&M=%sg zJr5^xC+|3Ma+C3!f54k~)O`=|#lrKQF{z{88J_Qo#r^Z?Jkq-R;=@6$-l=VuI_h1) z&V(z@04Ean!)(Xw-(A7Z4_(UcPulA9qxJLS)uJoaA|Sk)ipHzOt=&t??!9q8*<0d% zoZFa%hGUU1?iT^`e&JFke2P*YMwY*ka4GYHcr5NGJczho$WuSwbkbce}Uttm!On2aOrj!G6`pUJqp z4RFsXM|2E1?lL>}@bBC#ac0J~YC0bF2r^WJ8VMSvTmTS-Jei{*tR0!0z7TzZ8+(pm zn3rSOELuaB?5hieXt4bkmK`?D=UdEJfgc)_PzI zEo?l!MKEcqhL2FgFEeULM-E$My1Hh4OT4Gzz z^^ub)A_~C7Eon&F(66-N{H3tZ1~|o7 zr>g(we^C8WRR6t<>eJ*(AmcIN4RuGu%`mhK6vY)h&_YJ|BP71qSZv8EHWnMzOzbvR zP7Hfrx3|URw>p`HRi+Ghm0^dbv^W@>B;bJ3{DkwLK975~9R^}}0Odj;WIa!({G|zh z21R7>yW>u8xV?3fC|Kbwh{0IViwSi!$)C=qOCTzWO-nf7%WM zj#4Q&v&cFzKjHWN^1I1jr0(NK`CCcrW!^|GSFe!ERhY;XlOpT00Ddh+o`9_NdwqQf z=V!*|o`YCyrP^>LCPk*E4k?5esCx%%a$F)92kzs~!&>kH_*C5`pQyC(Qb+Ll1x(H} zivCc*v=@~_w@S;quI3s|(nSe`Uj`Ns27Q!Wq7mdLb?E4lPTygNstVj@M%-ahh)_ zvKI5O>jiuYJ!<=J>>a~9tjog$cA$k3xO8=a^##$%*QfizU&g)Nf?nbfCP2=-boT{w zMI-0N#6QyPp(j9q#g+=r1M;?L!77M-+Sv976ebr0f2+cvH zPf{1Bt+kl)D#xTj<^97-Z+7A)VV|XviEC5#$nXdi$yRzD3BL$t@e~$LZlZD!hUhug zSZ1$>R=D9M>e}DzG(uz0HvtN**xgfe0Bec7rpSke|1#pvngL*D75{u9mdn&eNOvRA{nu>ma zp17b_r=!8&3wjBTNwcYuj2$#FZmerbEjtJY9+(no+Vwg@Iw!vTkx;Op1eR%a#15lq zKxbd!&SyOK5D}Co5VV6Ky+Br0L>s2gf|T`wGGYTB$O;XzX6Klj@?{UXnNhJjy(v>A z4FB58J5q~8Q~~bUdki8u9&)opaXR_>^9yW&B}Kl49OVJ-dEglDcmB%F5*HjWO=IZm z9+t9azJ8sEnTCzAj+fcuT~g13$WbErSLS7yn2*JT!=Z?<`C!bv55I4MAl9=hWnQKg zbLkS9mkA*YeJR?)tCBZa@(Fe|>Hex<&Zi!@ecrAN zJLOw3iE2##j=oH^B+PZCmLwPW_DEd{t<|M9+W>Pv_+0_hXYnI7TxFn887Y?T`XNBP zMTf%w0v@g_aVyMg1b9Y)(cP7MrJo{Y$Wc{{OrF%I>~^+xK`T}pcqpXxCjObB&7EQR z`^TDdrKgURQnG|nyqV2Z%tb5K>lZ8bm`wHAgKn05nC$;F6Fcit|hr46Au~Zn?Zk0R;V-{M&LC5i-$=OqNkL` z8NSW>b>Ap`%f?Hkm^h4>@NabmrL|>vTaC#lLyf8am6K5hRmE;cAWx<~;z#;QSo%_U zxJCNJzaE;@gad%uCr_{tD=q#HDl^&-O=@z;mxwmw0)H2MPif0)O#U%?5c?&15U0M0 z5~F%T`opR%hbA>qbc^xxSKQ*GaosjITZKNTu~7J!?VN~q=KRvh#%jgt`6&N8h5YmD z$p5{b{NEe3W(wyiu|e;iyqWU2tFh3RMO+5OqRYHqZ{dx4Gda_DueurN*a2Q;U0w;) z-TJGqm(*WF zV9~7lw(3M_h&aN}pY2jwcrkVX0O^-X_fl$z=p7JbaO7{~WoHF=(aDXx*tb=`2-{8N zb}XS5_fltNe4!JENeY605%E7I0J4n+a!3K9oaKWPn6J;V39NYnbs|V7O<<0o^KU0 z?V`jlZTqY~0UrI}7C4$Y0=)DDU@z41BHz{v>v-AXCECceu4r8?^To76?&~u~)*`XC z6XCeOy)bv-1m$CgXgB#f@E!%#M)1b8E;{WLa=~w%Yu!wv@ugW8r<51%F}YUKv=}Am zNtgH%+s0o1{#^2{N&C^!>xN1YpbK)dVnWT;Ub4 zvfuIkhp@5)A`5U?fXD)3cAU*hA&=6-0q0Hf$L336R1WasDEx|?+)(CQ{J7*Ye0=*` zHYfJV#INIiWAUIoP50_EorrR6C`Ss1SykGs3M<4`Ybb>r{OH$$GPySv!eLajPW~av z0DRrKUdKyxXt2V~_A(AXz&h@vOSh2FyH6K3Hg<+k5Mj!)^_e&BgMAG)b`cMNC?v$P z%+WVNghb0OqCHYbJ>U;NAb<&8h7_c4qgB)O0B_VDM|lK%U|$7azp`(FB`!r>Hhgb@ zml+*IBPUK|@L`Ew3f65VDe$BMxhVGxf=Q~!X99)4Rc~f&z~*kjET>qPA`@1Zf5W|ZQaO1%b}VW{?+y- z&Nod{e2)W+&FEv)wdYIo@)RMG^$#`+qadV{Wp{LDALMWvR#zJqV=4~8A$bgu)WNZ{3eE+{pGoD>Kt)yuz zEhAlDTBWg>|D$<@f-@|u(_=TJ8-dD`xZ<0IjMOq@d_a(|6S*TiOj=(}xg)l;Rg3$U z40~A#j`%4*eZMTjK|dy6srEfffhym(>50=J1&$PRgh4ESXK8Izl|+UHh1C`4@WHR5lP^|$b5`aQO4h4|k41M%0hMErGK%p|7O_N-bd zK4VV_L+7sDvg%QK^{=Z|)8B2Y*3jSAR;{JKJB-ifx!7Rsdydel_MCipJCy9n+88`=t3ROVk(-rq|;BNg0O{2&C4t8)0xm1<00 z5v_d=i1K(PlaI znOvLY(r1=xvpo9DGHsSupINTWD%59IXtRp+nbWmd#rn)DZB~gs)343qx<8=Ia+PZ} zr50`p?1WK7bijLnMCPtvP){M*u{PmsHrVAvz=6jJM;|<74R$#~6P0ncfhKf|(i5Of zwOyIzarg!;nH6$DLITMe)#%yq8Hb}V+{fqfLQST4nPLc?qN&#Idal@AGY$NUbO@c~ zGmxLY!DPqA1_X?+J7aQ_@x0#>T*1H75kg9_+IMFgA_;DvKAQe4spxTjpi9+CJk&VK+G z@x@9DZ_btO&(_fwnag^MfL1`Y2m(m{p74c`izUFzD{EYGeYBCEYJo<8NOZm18{nsk zfFdV1zAR$lzoO6d5_rk0yL}C0x}S1C%`DCgDEHKT^wE;?rE|MnnfW}h$HZ%dgGCMQ zB%lzKJeJ*LRL?FHX)uv_<+&QC6zEc74yhxi7!GCF)UxFqaZq*gN2gA1GQRi1K{$q5 z{37Dp=5c>Cz|Yp4pcXY^+;JF2VnnV)+q29O6R1}c`{9D{K&RR#UpK?Sa+rR*SDsk8 zS3V)KH8g$(V>xVt$xJ5I?u{x)In*2A=U_HzyyySvu-SSTzst9TTlm>5UNZ;r3fMBv z357%?S!8Qyso=XX7zn43A8K8lA9{nzNVa@4wJP5*!(=&3zIMi8{JBcBMLlOG35l21 z9JbC=@fx~0#Xo`?IqkUO{fVF!p8sO*PR);tb?>WGB z@4*EQdgsN5Of%fV&tZ>%FroAG+q|ML_K>UB*h7{gl%^wN#MWIc?u#q}A-l3J^O9Al zt@UMurfRo&lWQ{djSSkP$&yF(2#uo`)tG$dzHULNj|7E22)2&2F*(~8>y|oVx5VH& zogLuL?qItwHu^l@pbShG^Q_nLfVBQ6WjTzs{S5!wie6=8Yv}7x?uMsMZbHr{tfqsO ze2krUw0xX%7d(gpyiDntJ{N1r`|qifo02_{7u4Q7ZslIG6E}T1E$@@UwiH61&qq${tv&<3)BJBP!g4Oqqg&vqb>Xs_|ZHTBQ49@{J(rnNmj`pBmJb{Q&S}U5?eHNDyTfrhFrLp~23G+Ksy95hMGkTV3uPYY_xT2LGu6IJkLoc_gs!MK8I zCmnHr9E{@v*%u4O6;xf1a_CEuRSRkD8>*Ot8S9r8Am*Z+Ip8@Kz=pVvSK!k+J`R&nF)ld_o_TQa@%fTIy{6YwWmczNrAZ2E));~n4D^B{}he4tfv zvmG8EzL>R5BSo}mhnf@ZwDzD^w12i9`1UN+yNMheZkolIyfn2pqy2xFW^$u&hX}o| z=S2ZNfmTRUTF%SR-$vn1_E(R{N-7kmm+rxgd7(IwXMTjr`ud{IaMY<(?vN)0l|=&% z`FzDFtlSa$R6EHROI!gqIh-v;hM;60c1o%P$(_NtyU(a?e>AxnjF05t)& zyY-N1;_ep7TIm<5qkV*Urft|sldqj*$*G`rWtJ2{q_@sgp6fy>bEoQYSMw=Kd2$Hq_5ikZSG0N@_6lLh?PbhuZP_5ZW^>UuiHCRwOhy zu@-uDds8V$9|kJy2zBFYS^?WQlx?@&keAXkFOd6oi{C_k= zbuz$XvLy91c%s-tQ_p}5{NO+WzqW5YKXtZy=iC%Ogyx8@gy&ONQ%1FJ;BOR(-*B3Q zrnJ!F2miTg7X)A`*|yp<7sCaCc42ucqio{olWB`}GHp(uOqXZW2QJS%nf{~2%@Tm( z^zBLfiSRId7+~a7gl<;BmX*d!q@|pJmspC^J~Y!7?lOLNkX)HgIBNaDIS+Pw%UQ3G za@vxURdIswE69FbqPJr%2dkY~@|P@I4f=`=1WP-YkS>b5fu{s8D?h+n0Neu576NQp zzxo;><{Rlx`?W|emW=F@B0xogcz;!ULwVP)9B@q9rMzD<^s4f%Q#tIIG&uBz@_rVs zc$D2<>HaS5O&}KsTR$*a{sF0DfBwGK-4shb;?PDW4Jx~xc)_WJ*CrNKrLX#us)-rSlr3~_La#^#_b9yR!r!#7vUCx{Aq=o_3>Br z8mjtAMpgN!iq4E*u$jH}8B~(cwPK@!1h5UZ){B<#&bU1PlA03UH>CkDNVk_%n7pkW z0rq%tMre29JfLiV9)y|b!zxe_AQRLGkvpX!oeU+4_RQnz%H5GvS9YZLk+lvff*6ui zeoNBF$}?o>x_hgT0^9_(`^In=<$glW6P zQje@!kEtFF---MmFQk<)s)TUr>@8i-hR+IlDPcO4mm#pMUFcbwbyp$;c_?gb*FtY{ zd=-9+iQ8}&0At?9CVZPLqi?UrjjgbE(Iu#p8&7^jj6k6*Lc6hbnP5DOliRwR*#Vkzd;DFLGeXQYobkwKR>#(Evuwy z$%&&49p8NDFfi_nJ%_F4(zgj3G29T> zr*&$^w7obVbPk^ip99=7o)_TL&kFGA(w_soDjIMA&JRCSNq_E*daS1xqt2|#PU+rk z2V5-Z{A8x2YX8g$vDnBjQ1@sFsV$lX1_)|(z;GS zE@|_gXy8l-^yND4#Si6}yOgF>$2~^j0jNrX>XI;4C<#Z3EwK+KZUz+3r&327R!l;r z_;u@(_6Bj8_EO@KLojHxqX_Z1H5&;p9C85{# zJ|t~!&%$mhTtYq4<}ky@0LQkLnxO!98GWS87R?=P54X=R={&k)k?4&Nt>$psC2ej) zlbT!F+>XX@b)$JnPsaJCMOwdHz@Uo@FM@88xs1!MXmzaW{5zYa^)ZvH{?f@!?RpzL zXIl3s2{tr39*K()hpFtZks^=M#|8B994YdGCvBuJwOpJ%<4Y|wm+xr9{N^9Hu`!Rj z>Y@qJig~pCJtR%;$99Q~J-F}q*xucx%_L-}QJLg(^p3Aj^fmfFrn*&c!ySWE`$kY} zhlnK)G5SS(2N?_Hk@OwwLLRe04nM`*sD*OaWLi{JHh>7Zl8S^E(EwjyiN4g`4x47AZv!qxHsVf2U`vy+V85kYk2QOaTiq;ygcnCr1S5dG zj;2L#2ki)U(57zma#QUCc2|HSSp=x)GF}B{#>e(s;SGr4VN#^o#o#M&CMJt43jyx> zSm@@?GX!Og;nUoV5OiS=qf3qO3m71i)LIv;G~fjw1;n%mh%F*Ng|KSj%{X7Q_M(F+ zod;8ZqaSToEy9pZ7tf^k{OQgDs|iu7GEkUNap=j!S5fm390Gb&93%~bIKtWq?cuAj zXnmeEvrFk8CQ57_G0nuk4hsGL3*^k--v{ss&S>PcuKxsMQDah|Q=>;|^L>zPnFmn{ zXAW=={yMh7-!yXpSbZ~I8#K+te02I4wU2dV&a588Ny)fkZY)KmzT!*GA`XcGUSI{HBP$j}4h-qHBMOzP_0LGmu2T59>Qakdw&QI;Gl|)xPNMrc~Q& z12G!kMjcD`k4-Ig*d{`T__Edpi7%-9LWGfmYZRik^8KUUA~USLxIp9WLpyE3=QN(e z8;9+7$TdUEYsMQ`$-wz{8WEJ_$M#RKhyl*mOV@uD+_)%dnqr4h;*QD}uqjJXBHFRl z!N(G&nK*ICG~;)@<`lM-ESk({I&I1&XUWl$9k4* zvmU)H0h}079n3N0wcdLdaQGaAye*y?Aqt6N_%9JKO|$o|x8Tp1m`=|->A8%achEC1 z@5L+F_!1|;5GVRIpCz)>pGp|1`POfKmH@b|^@*{>PC72p7?pl0sNMB8juqXa44(5? z;+gcPY(_D5!8rYv!zhNp`s82O3xTD zOI%3L7%)qm10_bln8XA8%#-I{d;xS0oEgu)i6w3v99u}t|7>i|hYb1x&JV$$K&ndO zhM}=*&$4Q__q)-13_)HQ7ws|4#KzCYuAp<@D7H^6d+eEw0*%%&EAALsGoudS{ zErc>!HMXH}@8`7EV6`^Ji)hi(^E`%*O7cE4&DQ-N(U}4#`=zs6_Ycq~T+_7f--Bm$ z?LJFk4VUIHmgw7umjG}sMPRmW-TxsK)9hkh()vC}pVkhylf1_`~60hqc5rO4U% zE-ee9jeMRRZ;Iuo|H6QX!>v}zl(zd;%LJ!~QHwHAX#660P;B&Z`U?LAR>F<^{K7TOaC8p?;jsUb@h+WCX=v<3wM=hV;eNus|JlqENUo01G@>RQDX_1)?h&~ zr8QMrH;N@{;>g)UC_1!e?p6Xt}?*;gB!rHu)4g*M0(xq&4}E5&y?T{I+c3f19SW$h-Yrl}}3A2V10?B`b&7 z>*=`Mz6rurW2TVaq)Gd49>3tpJrgG^knno2#CZr8mzBjRXWztb$IPXOl?2x(emLbt zcJ)4rXVkfSQr9@x-Qw5~o%`vcHXc<_{WzywM0E0P;AJ5f3emzfnD|tj&q7Cnm3gi< ziJX`|O2;(tGGl0jneY;`2033!@ zU#6geVmQg2*H)<657F-_qKPpOY2QS-*_rtW99L8wD&^3Cg2CssBXsHzMYJVv3nM zGK9C(WS@sRe1y7g#vfMua{A1MkWm;6(m}UB{1zG0tYqsWn=b{1jgZm59G~|5FiRkO z+9d2RUbg&b^t6z5Th2+v+g9@Kn4N1p1xs66Hq@mbtWZzn{E2h@;quZ2^3WKS9hmYE zf;#VcJmZ>hZr7%+r>6!J9!xH%@ZF2$gL4sqD0_57$8g@AMrkm|ppX3RqPP#0atGtF_>PeyTE(M(h& z>%HS|0mD5G2I@a4z{i2#dR4qw)yyneZa45r9V56nJ>yc8M8rN;`%*@rpSI{|{Pv~e zGyG<*L|A`jn~;vo^Uo$g21VJGDr;Fb3hRg06>8qx!@l3q#;Z`wlr5(`p9x+$MRE~a z_B0y4AADx@i5<*J;(uA0qLOV0J9mfJhAzn#j4cC1TD0*>vBUd`%BK(_COv}B#Eyyk zr_mGdD}hqCAt%jQz?XSzaI@5(h`4MyvNlp#J@DjDVTD2|IJO*_Threke+X^0KaIU; zin14jV{&bZeqKRrbwpP%S_rLkDEcUCDe3t~Un7>Ecpm%#?(qH(ifgDRUiK0E%MOAH zrK1A{`$!$=+^6z4#5vUgq|-|YcZ$Yk+ZcZVpGx%|E^_&(&^8S<`^q(twKw-3FgUheg1YU=}q z3p+%xC&1WpuS;m|O34m*!ttNb(tl)H%2E&Wx>nP|H%-S(X!?|(*f zv?Hr`qeEm#Lnl8j7!NE&kTE9P7y$IA61}`RumR!$sdfa};7&ZGUg8HSd}KY zXhhp`XV;CkDJz%sf+70JQr zrC}Dwgezs;I|aU|IInC!SnMnbF>CrED(vP~{$#v1Ws4HRlmvz7;GHIuc%;b%GJ-QI z-#T*k4q#c5S3CeiT=+5ZH2!R9$j=r{bjndVOWvDXsBQknm|%a6MSR~|JLLO>x@s!=hEBkAWRLFQc#5Rn9kM#PizCegLb^QAD zQ?mAZ$N{<6^Bbh_f4g-<7Du*C3VHX#vX>c}l1WEhA+ye&pj3w!7f^HHNN*3~)n)xn zc!gT{B>S%DffUvkTb(?R!U;q4I<+~hX8#&(3$mUjPGcMA6;9cesM}PurFcQb_Wm(O zvS`ZR6PMUgqbp?fweDvdYQ~w##OLe=KDjfecSZ<;YO>K&LaGn)fl#W<>@O>}8*k+% zE_8I^OrB)x|D(%iy?`cqbG|?VY6rX=$S2n`Zq&W%rpa`ZNJtGd{j}zl9RpR^lpdfe zfMP3!n}~HBc}&H#Vm+UP4_hdUp)pGb#HoQdkUj=njZJ2@IB#_IT`0Gp{)H|}a?_n= z14k(0ygqTEsFBeu#(e#NEgxvh2iWofwtQ|!54xoAu~zC^6zsFY>bmx@(<6Mf=hm8>ONUnW*jVN<)lT&$wXrgr@#v5HEY z+VzvgDvs^JuCElUI3i2!`YN%Czd)a=#VQWSlwBPcCVvH=DElnxau7j)`?r$p2M@y; zSi;@opG9^Vqm4KDi3xTCpKsUkg<=&)>QYC(i4`1`0~?VAwj zqooLwj~BCm>b6%<<0uy0Y;55tK#(zWEG$vR7CtVdX(upi1ZE#&3rFslN@l@VXs_bn zioxz^qENPpI|sW%i7`eeVE;MdW#g?#@E^r*s$arv;|glI**F+xChDCx8wX37xmS$_ zooKd_iGubwL(Hs)n<~zih{>>a=vnE1yx=Yg%=LQK&`p0+b7uz)&s(`y8D=BKUL#J6 z5>w*k-2kBOP)=geG=S_9vo`+|1y<-l*O!M%FqH33Mu5)O4|p6~piXLy`|jx~)>K`E z3s8SWlh+{Yk^AiF=|+qJy??{XbW`qE_8+G;uS7SOJn#FCNh}#CV>M69xR5*H+>%^} z=q7VKEIPoa|2~(Fm4KU|fZ1?JnDh@b7lFaaqAeQuBC*r{5rBA8y4f77kKrps(6T-qWtFu|G1b7fQ zkQRFtt-NNj3BbaNBo-Y)B^Eubr0av^LId{O%oFl1@Wx*jx)^F{5OU=P%oMYg~vQx$_w{b}sUIQa(k)6SW&z(}6f zF^t8|VlPdT@4ZG>sgvMK(&o=P9)?N(F})DX262Wc-E;)Nh1gD3(f8h!aK_5>O*7Je zH8dMTQD&_OJZ0^hU_jHD`919MtE8~%V7h6{U$zJ94#W ztCPR1E7ZKDIBh9fpE9d{-_zoQQ{R5J8n%3?! zlYtet2F2vOPHI~Lt^lM+rXr3-IuPMI9q_Z_$NnjBF98r!f8i&rH0B3hH3aek}! zP$pv@vv#0i`J|MbYP^g+W0ZLC_QHD&c$}02kOJOE*;TNHhh?TcN2%x8qzzQ_Yp*EO zyq(}p8Sk07FED~eobcBvUWpY*#YM1n8rtkaiZ7K4qlH?A+yyk}A1@5vN8wnQ%UY<~E{ITIE*^`{9O zIVW>>pH`?D{ylaBuVc%H!2Jh1>v)^$0oJK8d=Fdx8?0~nn9hdmhk6G;0^W?7Ck^@j zV0SLF#=?HV|PJP&})^X$z@21byI-iRD zYwV3=MibqNf=YgfF4W01ZG=!oBnVZyYug{CAWCK;OJ;i=zq8$&f57*Ru2MC!Z{K?R zO}%OZ_V&YDE_r|R+tOM!S@t=FUjHe_Yda{p@yTOwer(AE&LErBf_Mvkv?}xgg7-Ofg_tGve-{@{PylOB_XM=vHk<3xUCK=k{%lj}w zF@(yYZgppzw}~NR&!tAPy)(}5%98xv8;5I=cNR12%@2Lw z{peBO_b!0%PY#ts1d3SvXZwHU_5b*?)Oi22B|=)=X|r(@2=eMC$`HDV&0v<=41Rg8Lot%n2Rc5TXsY#E*6 zCcyExHe^2r165)X+i(gt@c&&ij!-x+B6>##%VDfVK;2`^UsGe=bN;DPttA4>9{XTzu6@*^mOs)NrNz9yr@QdEiln;9i7*n;BfllG22Edlr z!3vc)Q^QcsfX3Ox7X@Q(d^nOm3BP0X)QMd|&aT@v=YE_!WftXf_xcUvG`3+Jk`cBa zJe4g+z0&rBW0*M$ki7I$joy%Yum{r$dm`WHMMCBIq%Ie6_x2Z+8BW^w@KWOo?pvko z!E8f5+pxpAe1~zcfGvLsLfh!U<$AjlpRq&GKSpn;zgP0}=jBd+lH9H{!cIgu z4VUi_4MwlSQ7y0Bssk)AtsPtJikC~_DXj)YnGm+rAY9cd#iuWs- zd3mm;Ro%$U9=umFa|GXC%&a{)8XEw!bZjO3DpFF#`TQWiP1y^95i%Rbnjr;&G1Bxn zseO1VBfmJ?Ff6KgX9F*H-}pHuqCuv?{S&m5;p)U}o^@8}QD=^QIxRh~4-35#R4zkqchzHFHsD zLG$wQySyFGB?*xL7|qN60jNpyb_s{WnF(hH~kSg=-k4nU^u`GI!?-NwAYCOP!X$9wST zN50>&m2h4q+@1TBx&oc*B@dO>OO9?$d2B=x(EG=P%(xG3ClaC$M+cfCZ|8F#@5{L# zfz80nA@8)bWnS)g$U@x{@t)eC)+dEC;WR%f`ziM*gfwxY3e6KIpSUNK&?21P1y%9QsLpNDe&th|hhXO(dGOlmW@t97d7v(?Go zyw@KqUJx>RO0T>A>s#HkuNbe1l>6A_vINy(Kmm2`-bgKl1AoI)K_wGk@!EW)6+jIO z`18I?3bp?KBF>BR$ev?ddDA6@n)~qOvirz`U*Q%`?Yq&i~Yp`2M4( zVX0a8h}Y)g@(Bx4R^y0|upupFHKjkzPk&mdK8cjrpRyLEzi&~WdM$*9YAGw3{%J@0 z6Y9mwrh)X6pQ_TIkby^j2TUM+Qk=5(zI>dZnE54~&mN}^GxJOddpRm6r*w`GY4`51 zDi$Uz6c1qLyE65~F>ksoa}(;KG80;b*!Ae~*ybOf@B9Ay4~btRTL3ul3zy|DJKpWdHXvyk4q*DRv<-Zd@s{`8u~^#0tM1ikmMjd@GT0br?liFWnL z+|9WxU$bchWNsk>KfksxdD`jDXK>MU>R^Z6doT^z# z;*~q}6ViL2-XzVCO7I4i5<(av2=`z)pjsQG9p2HWU^XAAh5B6vZ1{JusDCcqHe2^x6x*DmZlzx%T~}2VJn%K>F%#h_w=sX(LFtb1W#CY7WaJ+8?V_v z1OFHUy0x2Gv#{iEf<3Bc4=(tUrj~2#y8d6gt82$=w4e5GQ5{X^FD!T4YsUw6z(iRf zFusS?8t38CqnuU_Oew??zzn(lAC34ZJa+VWG3BJvxf?@=b3u*(Oe7tM=iqxv*p7jG za=!M6dkv}u$a+IrS=Ybt-5~4wtN0|dt|$8XH%a{%`Lx`B#(>mI%vQoz3NNj73|gza zZfnJEwt-|g*y;~z+=U&t?_V^`vQ6+?=X78p1}{z(-P z0;a_VQj?Ea0XFNR;H2|ycPKtyCK?;nzYsI8_kI5{I+kA-zbCXGZze2 z=SN%V81^Ro&cQ|}b}vRc#IpPguc&iE9b0Y1V0AUVXg8oQS9iZ}%=7 zuj-Sdey@0Wu6S;?*lG+k$vh>n9Rs^3uIv%L;;&OCG(?LRII&_u`DWNMScSkgvm;jW zp0W1N(R%;iq<)xdxAqt_BOxQ1htrl*TZHVF^OEj+zZs|5bCS)*_ww@+)9e{~s+N!e zqE@$OL`8SUUTwdobqs6sVVZ-_vdfKh)<%MPX)$`5ki+!r^S0VEbjtY0O!S0u{4sMp zJ|Zb2GvNsowZQ}I%cGm1or<9wNE0B;RD&{0HKiXuu z^ybU=QHFxHiwZF+v7^6-#!pY`U%UCM$d>t==9SL$B2m-Rf0bR+<6OBzHW=N1Fqe26 zNjgN$jx``JL=k38MEJRQ?;6VeX7Zum{qA>QS$EETL_Af)*}LFKVt6#vYLfQ3%5HKRK( z;E_N5YMdtds|?D=R;V8@iMtMwlUr3o!ZJR+q7Rk-S}zmtiCyj&kaVqA?6>EAkkLZa z6=!{NwfDpG!D>C4&?}PLx6*=oy)f(dN-^&PdtOAe4%w|? zan~WS>kO?>)287MGyeuR&(=`u6?RP&CCX)fJ@TrA-GR$7r3og6MiH>%8BL3le4tf~ zgnW~^%f9RT?N{m1{+$5}pXu)YUM3F+Jf0~He=Cxsn!`R$UqeGEs!%)m{0oWCBNd9@ z_Z)@aSA3~ZbMH9nGdyg0sv|O)2{b4?0QDE3Dtwv;oP!6Plzu>kpUR@8-rLPO zQE}Ctu3LU;y2L-pq$QylGyd_9)bwH~;Hl}7^`=wB-PCl-`ok!2*v=PsM#UT?- zdl@EES0pky@|k=R%DW%5dKO%&W{=Zh=%9IfY{ z(Cy+Qx-EvpGstm>U}uUE3V3RkY_}L<6KvHZmHTMvzvo*~^NPE35>dgP^NN`B3MTX6 zJH~0E=JhoX-d4OIrJ+^3=5_gjNavpVtwPQ6CB<3iZ*akMT@8KIyox)c75=}UT<_H* z)BS)0FqEKP0H}{G=U7XyU{ayxesFuR%qw=Ma;O;%f4!3-^9hqpEb?)#u&3+dN>WJ| zUqH+bxXeu#=$iMO!t1F{>9EG9bdEl`zk>RF<(~e&BkCzf5 zj+ftm2<4lxbL7z98MJeJJt#aB_!q=qje)THM(p423E}Hd9~Sw&ijeUrC~s>=m08vQ z5t2ps6Bg#jUmfwSWFl|MZIQNjF!Jkz$IcONpa}^KZ5?oGKEU*A)ukjL$^DcFaI`sO zExO?noPmmw`sF?ZpG2!Q&HZp9PBR~<17<4DIe_6vK6kXE+FGq34F|=tJ(^MK=4tAf zwxrz7otCR<4<^1eEuv`;N-Vlv^8ro`)259_M%@A3xoPOS>*sA<>D)8~rEFd>KDP0S zLbfp$W*bi|-XYZ{Y;h0=_}^*Djk1kh%~N)=jqkCUz0IQL&1O;ax>NJInCIdNOQ|1` zDx|S{E#KIxt0!-*8V@}`{bZ#-KL(d&|L$~sOz5*9aGO0Zyrv#LmlGSdoxH$U+L9+~ z)`~gnn2FHRL1TJI(@Le*_+&_nY88X28srnxoLHl%S&yzvnvzdZHQxgt&RLhL=^+^r zYf9CSp%*E4U>>sPtQ9po90OQ6QS%q4rYBVc=!GWcykO6H7^wk~KK?Wb-7kUKfq(~x z^bZ0_E%1$ zm5cum>^Q?`n)bz-$XKmfYllv5*Szi)y%k2m1H0yRG~PTlJ*^**hRrs_79&w21eUQU zR24eeuNdrj3mBD-6v(BB^soL;W&9}`JFQ=;YFHKJ*Qq|$_e)ERb zRCOeA(`~TL*XmktZ61>qxSCV7`HkB957Er0YGsk_nuk$iUCB;RFhe>qL-$@scABou zQ1CZBc;SQv?(~0-_!QIZAu*29N{j*E)}xscY_OK5%&gz*D7AK+H==MW)gfx*4M?+% z^x9DNX~s*qd(AZI7iqoOwvoHt+MZb8)=eI-*$?60juie0PPZ9!@e6iNZ|saL!FQ>qz~n@KdoO(wJgW zaf+4TKQX)1o(tnPiB0U9lv@m?j%IUv?jq=Av&)=Se63t?VfQTRW)ap99Hh2M;8*rX zQ$k-QK33$4m~NZ$uGtY03)?1#WSG(|Vo^pBJ?S$ev;K;y=)qvr;nb;Zq}*ycci)+u zPX+uEUp1yd3WZW8L2DsK9Eq|`nFO)L>*VBt9mbxV<7%5y5>JblFbQt!EFyquLBlK7W9!2XbvT5A~S}y}*IB{AQr9ta0 zCyJOg<1je0*H6Cea^TDJu5?jt0gyK8CLX(SlIFzWz-E+%}bPW3?l$M^G&>1 zIjka6E|S~YgO}3#C?)xpGpTNBrDO=PgJfx%SrY#V-avCYcmH}pKFV?t5(5CxHGm8X$;g$nTaBbgSCr8N{Nz5puyFH zwTnw_jagej(m0=F*ES&wALa)k5BhU-3Pb4uM3`jf!$ZI)l{ihsIT!`+MM}2_B%zKi z8eDb;c7}Xopg2p;;``PwNv?_WI#F9>&n|it8wIQ)v~W7QBk+N|{Qg7DsWF z4Zyk^>^51jQtij1`#lN$p{kX&jd;wz&d8JYeMgZsn7G6~#oB%M zsTI3bdrtfx5o0TbZgj{#PCcbB~>7(H#h!(cn=|I~i>pd&d zM6SMwNJ&|Sl3)J#n%#Ul^0Stb^xnF%V*nKm!~>kdK(>l?oKEuVIK?Wi=hgUi3y%Za zyP+NF4U?{JCKEGdzTd4dPE9qoHqs(1;cm;5g{XOe)@*sVE$_Bv%N;#<9zaD>zflo7 z!H&pGh)-y*K^aSCPSn%tAKAK?`IC^Q9eC zCN(M}fbh}sZEQbS^h7I@R=xU&rLH~>WIjR^;FSf5Psx2qeTy&kP| z2#UOgW1oaPf{p-rR0e*5W}>v*Z&%R1A)YdpwnUhT%{9<;3!&*UYXW-yHtU34#BSr| zNH)o=lW70-kYX%Q?XBZ+Gww0RV2>t(fHFi7X1xaw-b&+nT`X->cBRCb8s#oNx z(*o=dFN^@kP;T|LjuHDk11f6?cQ2ky#rqNvlWEp?K9t28NSBz^lmGV^!}AV9t7V;M z$PI)l+rws&_4L7*l#K&eYZ5k&Lzj%;AqgqBKnTe!)UuEu^em{aV{(+xBmpY##&+VE z6x?;>ZbK7{t0A|}0~^u?a~FsfYurr65V>99m8G|(q#B8r%zz}dG)HQUN--)2<4ZkL z-3}dBeZ(f9KGG3XwhtEweLQl#sI@YkI$4B5CaT;2=UkHN-u6tqfYZPmDw5)5Ix+QP z$3V&J-Z-Dmf_(&OW@a>E{BazikOF{CP;p*IM<@iV-E^Dw{zIuahlv9UL}S);Ijba< z6Fgioh((QKR3>9dH+2e;SYm-ZLR}N^D=iH7;LZ`B(t3VulF4*{#^lW6WUh1fKPTpc zlyt(8lmcEyU59W3PtS;f*0IKOzLXsO2=_)U$ulk;X&zhsY1X$@ie$0Rq4MR$!-U5$ z2HLFcqKUUq#plK1CDFzc;(5`+m#_`%D48YeJP5s-Bt@1We;r@S<$w9wXreZ-#afr; zXqwA!4D5NSEVDfwFYTsup5TPtLIv3}`^8|4Rkxm#ZVL(E-CZ|i+5!$MMQAK)tN)Sg ziGvE+z{3ay1(N{`msS$f1qU~uLn0Y#_E*@1kp*@B)HWV(n~i*{KlmQTm5Zn^frBi( z$=F>S6pzYk9M)|#4q=*U{H~yJ(ZxEkRx6SoB9;eZ^HG1Enq+1Qds>`V+YLOP=ldbe z=+maW%vPY@^*!M!y=>X9aYbfpQzIgeIE)R%Cr80B^uRFIAeC@+O_s0^s-@JQ4GNTr z-r#ibWyOi?to*cH?Lno(C#QW(#ULGi_U8+s50CETr=ZYvXO9PbexRr#X>Df$87j&A zu=#&-ZAF0eto1fcls7%h2rAl-f-lbA(Smm)%Sv0Z6FS;q`_{mF%zce{*lFD9mm z^P-iXp@G}bK*!;<2dMQ7w|;(x4`HxLY4|HmCTF3$z<0(o<#<+nhR5kA7i#@KYhF1u z!K<0kb{OVcv`0p4(Y5&jlqn%I%}<{VNc87JzEAZF<9sqD1cuMKkbKVMm;;V=ZK$<; zEPQP$vM$*E-Cxf2eZp3uB(2d?hCI26GlK(T>nZLHU(bv-+wn%%W>3r43#1NIEvMm_ z(=wsBP;oc9txZ5g{{r?ph>NEHhSeZ%sagu&z zN)Hy#OHKGoS(@-!s&}pP+*sBVPV`Whi*$_|6zTzDeov>Ec~mb35O|xR4$iK+5#EbjS-ZPB65~g7xt!hW7f2g_`#b zI(5l|MSA|~sH9(lH^L4nw!#Vt%cC)p$Cf{(X;k0oj)3Hh5Tm?A} z4W1C(>1swlJR`kPye0*9xv}RXV+5gF<%zm18XUWwZwBowIqj%522o#p8>&u~_dg`M zHn*o&`or7RO7Gu3YE_WziSwfQihkOspx>{G3N`n>>oRkCqyW278V_zyKmCH>>Es6w zmW?scBATd{)nbw03q>1Wq?CXQ*G3Z+&TWl2%H}5uq4kDDs`Yx*Y(TX+8vA?-8ENB- zjGh+qf2n~n>x&^xbN}_VOb2O$)$lja8b;qN*#J*#ER}u@RO^%O5$JqStf7I$c^$Sw zV1VFnGPdOiBw~@?jX19->mw2lkj53~ja0%DZaWz2bngD`i{OLsw8@&56y2>%9IQxo zd8eA&nRPboFiTr>X5svTdI96`?z7H(-}j#kg|s9IZE5odK-D;jLcIrNSA+CYL&TBTN+#wSBOzu^zv|3|m@0)yiU48BPPP2XjF4N`eDG>oxY~cJ0j%wzJ?g z3thNihdk**b)%DQidi6?Q;XCKcg!$GLWyrvrx1vOEQ9}@9jN?Ws>ht}lI3R?0b~|p z5QrgFyqBb$E$L=Us@ale9X+6Jw+?eLVZ)Qm{4xUA+jw~{yYCvDuqiko#H=`;`p&fh zA!z8S9Dr0)8vgcAP|wS)css3=+ELK{N|h%L@MN5hPd>xnI$rC z9{rKE$fTczoE$jYAyDGK&kt)>vh{a%Zm-Fa+AyR0JFDmmdj+)sT@wvZ5@0CDvtbWb zsary&VZ@xt`=4TFBaFS7ljqS+hSK(qm$7FAsd`PB;v+X@@^$n*ojM=PeEe1BV-S~; zGC4Aa;+3Y9vxU z5r~X4&ks{BoTr#|!-(&@C(RwF8I_Hj&=`xmREAQuCkbh7XXe9LLz(75*9@77v~}eD zpeOX4mwti{T>*s&QFZ$&T}SF$2Y` zXF-ijq5#gmd~r=!U2JqkQZs0iw2>g@8eMcF@50{7u6?pp)x>!b zDyx6mc1*Oh^pNk%1Oh)ruJI%F`6#fWLo=a_YoKz)>&iM@ekBlwU+yk?N zb)U+iMl}3&_sk})Vb;6IU|*AoQXl=eH$KBKe-u0^{Ll#@hO!Rg#o0Vya;uX>5~LMq-x0Ol&T@?RH}w7 zQz@Od|M2t$ZuI(m&7QLbu!k9Wh|Hi~GOH0Hay2@@HpEZztD0J;rsXus#=A4W63iDx z_oZ?Oc}a*kcqG>r=WAk@qo4;>=O?-<`owwd4;PbucQPIr0Ys0yfRgnP(5Z8` z{C~!2Deb(LTW;>H))iMgN{E-CAVOjLb@?AB-72Kusp9UI6F-r3p}fyPy2@__qyxz+ zcBctQINOM$h!Ti(`EX|rXf(&|Hn;Ejg!dOAe!*#ce_}*)<;ohE6c!0NbN3J@et;|{7d*l%O z8Ib3+y5hWOhmxzGrmO466l&gVvXJ(P)rjU|8+T5m4|csCq7TjD%D*>@D|gureiv81 z;{6>4-74(4h4>=nc(mI zSm0Wv#1hAgsP{u;FZ?XCyZuPCD)L^Vg9koC2d~R3)ZAM1=S1{JZ2;7ghQHqML3ArA zD1?x0?3zd)>=}AUei+4iV$Lg`0X;J~UnBnlB3D}MYN*oXR0cJLJR?zN0@#vLfba2P z0KSnCtqM7$bl&s6rn!g5(6_Z=W=3&3lt^&*P4%_T%&+BVW5C_2X`c)Le{dmCpYZ0h z&Rqnp(e20JKJJb4sUd{`&nEG?94KUFI&)jDs49e>B+k9@I27f)e{ z-Pk%#b5@fZyoNT3HKk9VjFeqbXAZz!5g1~OWCTooahI++tKq^Yx4w8;)MypSY-fIL zSlm*SK`cm<9r6?;PKHwzC-SGsp*bU@X<=qkM6~*03YG$j$=60@#y^NMIy@?bdIO&% zt}n^LA2SnW2eXjr?QMLj#;iH;(8?2?IKZs=aCP^zi2VecQTwy}x%E6Z=kkDuQdzc+ zw4#BG{6nD5p?!e|*_7pS2MK9!jU@t}PYa#?w*4 zn9eO_=Db{TJXbRdE6CV3Nz|5lPvA&&yMh-YRk}p*m#h?XqZ#ru^EOf}a6bRHWE}=s@QM?Z=u+u18gJN8Pl z{u8N$?g@oXP8xf{ApJUQrAu-6oZPNpM03VU6WBcP@>pQ=oECC|RcFj#lmQ-9h$KYdc%rWj@W!bK!xj;_m8*?Eh8hKOvlf20F6ueT-tOMf{i@cTjH} z$4X!|ELC7ij&6#ew zzH|u1ef6kk$^ZyLSCMuxiqmO)ab7g;GxT@fNP*_gstL$6ibyChebfgOeTD}dI$WT+ zZ^e)L060=b*XBCpL?&0*eUFUz65o6bf{`Fe6v~A-;o?HgzPkwN$o>qF#;MlsyNfG! zJMn)8D6QRN!M*y_Q``1A%L9~Fuly36`q1DBQ{-a8?Yl9d&dy+{WyJf zdr|QM>{bS>c+H}=NCri&EIy=ZVs5eBUV;y`CHDPbezwuTle_jt3wDUwQrjSm|NW51 zsoGh{1}}|+Ilg!!8TxuweKf*M(rdqcd~sy zlH%G1Wf88e6mzR=1F41W`w4DVTV0V9bK^!&6qzf?o{~ihyAt&LYd+E27|LZPECTp$ z`55}n!wEA`jFi7;j(9eWxTYMv@BlbZfT%uM<%9$v+k{$fa$+dmsyoX-DJ+({%OaYy zj6htoD-o41Eq0XSc+zDN&Az(CnO$uRgpa!#`A!;{c`xp4KpO#?CX6;>jkp`R_FDMDjyE(dtTC$s zio&pV$7#T2Cca?b(qbIW5iNW^Gl3#A+W35(nS6|rgK@qv#H@vRn$|(1r}0`ZVw;FXp_S4} zMD8a<0mZUlgmUg4{AoZ2^B@|IMaM!S5IKM%H~$DVQ&Qwt;IFxj#<0)K-{PXZQJH7U z{sG7`b~~b|Vo~UGmkoB+vzl)EL<*++5e0jZzVdwnheP7w07MQ8P0ZRZ^Up zffiX5U=iks|s3q9)v~p;JY7*YK%gM@3(kds1lV z_Th`XoLMgUxvbq72} zTj)l69XWHnZ>jiq`8@fQ!LIt&1g)AP?#|AE(d0xjTcp@Vt$9i}yLTpJ!nHcU`oB}4 zeF~mgMcyQ59sQSW6QtYAx%*Teb|A6|o{ctWH5uEZf<7GR0(zQR&6u5Yx1CVD0G_o* zEK9)P<#J}$!%%KbDs}}}xk+d`IvU9O3JULu05H6S$yb0rCJ(X=I`S503n3~M4G}m4 zwXHNevOpHrO~d3zbacNMK_RU3EePi{c(WuE-~y;6h2gaEXi8pyS4t*Rr;iz|S#c0@ zp}rr5E5m}`OwZ(2QlwZXjIYKP3P%dveKy-59eY(@WaeTd_4_h2mr>Hc)^Y7y_-{2$ z`x-MBg3zi*I(L7OJ3gTMfNsa4-o@}dkZ@H@&ddjp(e1~`-|xgqDz?*BA1f9*SM4aV zFJ_m4O;WL_zedyC|5!}|);kft4w_I=#}|5WAR;^NUg+oMGjvN?~e z(dFE|A~)bXYnk+mr2|eIVB@Re?j~9(5v-IOVUnXEc;Coi)tH6SYVvzf?l768wzG{p zChp9=`s2%C1uX~f+gNtBki_#xGb`XTcqtBrS@89dJTOYYyID-D$_9~FFTIg)$Uvp& z{B|S{xjgB>o_jGt7t&HY3&KYz!?)ip(7d-WNaTA&yaaAmVMgz$(|#cGkG%O|+&qXX z-IB*nW7Y%62T1ga8dpRw^Hv;A|60f_WFG9_GddrGQt&$l4uL(ZOOA^bGwY{V>dKa6 zIrt|A^N4|!wiH+|x94zPRt(W4%z7HKVwS!c#_Y%ONACa4VjX`4a$*JFgOU&%!@2dk z9c#k(|3GP+iJr5L18XZxzAcAVGF@+SKq?%QZ^3U;ybj<7v4X#(-e15^t2k_TDS4ri zK1p;yF7>};J|cNGeS4IXvNYhxAe;v^C0$tO?=cWlJ}Az)ifw~nL0{BF;nVpzX|kW+pF+t?TC^ZcwOYu4g) zTgBb)f0W_yPPII;JCxm-=l)fod8pe#{Ykg`-?aOZy}}r1`xv^rg)hm%>WEbKnT#+Z zz{5BO9aQ5yT#+=Ew&aT{&SZs8H+(n`rst?_z}!A!L*+sS0+|oqRg)2v+xY}{dax8{}(HRr>_ehO1R2U4K|LkKKy!KXN%kCAH(csrARkkaov-fY=ga?JHW0gEq{Z^2|kvejn7h;!x?L%iAxUj zLN!SQ3D1}XMa=!>1sNMsHhkGeYiOyB&oX-Iwo>FeO-WenPa~z>_<0npo@zZc*uyM{ z8!>d`{e!W^(L|xKw9!`w-i+1Jf#X1i3_!e$X2i4w=r^F6-k5u7dx?P$U@|OpeN|w1wbnj1G;A% z$OHY0gME0hVjV5Z(Mimx4CgoPE6_Y&89IraabEOWIG#|D?o+sqIU4vz#sSxQ5!m9E zk&!@0X#JYIe^M}IFu!6ml9q9A84fmSd{5-7M|3u8-*>lo1@PUtMVXeRznhwi^P0V{`iO{U07%7mqlux!MIR6|We=GVZz6KJw9S8I?v{D=-a1caLkLYIR zpCRosOoTiF%(S3A#2PE!4uGnNx{IuhCJ+kW1S^c43(X@dS_M!Kr;ay?;b2R(HTP%V zSGEPw-Fn%eL8g<|TkHnjM3uiv(hb-RyhOZ9T)K+REux6qnizH;`X#l1N^jk*`2fEr zs;#$Mi^YzkNcwIa`zKm;jYAa5SJM9ydi<+3nzk8#JQD{yc;Di@3~SLz@Uq@GZ@>s! zt1_|X|AmGiEB_;qa_XR;J^N3*RX{zbq=|a#JQRZuU zkmVD(MB=;*7wbbdpLNN352u}ov6wp(s?MhEVeRuF1aHo+ZaHsC&ANl@fV4Y}- zG=W;OV{q0Gz?ket$N&p}?kphpP&hpcPnFg;;ibt&ZxYrM=T2t}p&onV{2b`f2(6^u z_J=hQLbD!($L%WJnVvH(^z=`svgM~D)qZW*u1A&Za-%z^V_5!>4>0P%5oWf5y-u>P z(g95!5v%ARDprts&&&tVV7+b!&Pk!bl=7g;EM(VlfFFdVRUTrUHo{J0Q&yBB5Vm{Q z1rd-{l`O^8IO~GoH(n5-{GDKEs;K3xr;~pwE(>d=;(QUBN^>YA59Ss;L1DLTJPg#1 zO#Au4ha^=+mkhl9HIgX;48yE9b7AV~=mC96D?BoW?kLmiw#q6I=b%Ebxe4QylaNjS zjY&Jz{8)kz6pV(bP%`Qb6( ztRPVp9-wpg(f2V33YsP8a{A1ERJOw%_s|_U{h)n(^S|$*4c+@(kS{=>f^!LX69-19 z;;Tn>_2fYsocw~4Zq;fdrXxt4PE=$ZN}oic?#{ghnwJBY$&j}@*l%o;goB;7OyDlD zidM2(u!@h!Mu)E8h^)A&^(Ob`iNPkUpe-3hzIP4DvL<6I#92W3B_J*|C~2&6pZ*tF z27-ymDgzEPu-B@Th#-iiTJ6Vbz{kX&{qxlV&HEb8N!z;IQvuj}{IKtD{#F1tbMOA~ zh$^`7o5Q|O*R<}bNP6Sa{@dn`8}&;^vX{6*x4J+2kOH}_(=$M()Vh(B+v+gM1fs z-NmwEMXL3`#ZZ4=HgVMU=As6Vl}u3HF=l=rGmb;p&)@ZZkzyNS`r{ykDB-6)W$byU zGp4)ue=y=BwiZ9K)!kit^;8T97R}i6PQeb#?~Lg(!>btbQ0r6acgNaa+i8E@_dd;& zIfTs2I~H{)zZDg@ZQ*c}L_~z6V792^lM#Oo zIw1O-mX1901^JCAb%ZWq9=!e5u+MPoEKq-gu(FUf6<6UuZNWRqiILT6j{%r&i($rJdk&m z2M4{3o_crl7(`D!_@f|t3P^xJ-$p!I6Rju2hhZ8Qf(!zFqGt!IIV##tX67(uIH}f+ zJ&~#~GZ7(@9(Xl^2CZb`y8yaCZNwoguzia<%C$mvZ`3Gv8u%+>HSkK-i9knr3$YZy%TR~F!SYhp2_QbkW#`h=lz<_1e|CH^L|vxx zg}MgTF&txMQ;1--`j*TK^bhk3m`)s8>v$A*iv%wbZRD(jGY>^kA`_-a%Y;^yF{}kg z%feR*s8On=vl2O&`hQ7jL;4?p7?oh262v&CXQU--Mo{fgX4Hzx`8;x7yc;v8PI(jz z!oeF={G965F}I$Dy9+e;>eGY0kvf>l%0?h_mvn9ZW;&hTd-sj_beVUMwgh>8?HHg9 zxrw(?upM+1d%fJ9w@8V!MXJQ>NO7^NF->)%j#n9ba;b9g(F3mKbG<|=5D?NQnR-xdN*AErFj#sC2j^wWH!AnTsReRsfvJ6wYgFrBy zpahd*$YTnoXI?7M+zk@~!IUkNq%|6)Z8G|(jMwU&-7$b{M2H;%j5$TsRq%3thC(xs z{vuSZr7YMdXw7z~th#g@7OWREdaEJ*>El&*dS%s}l=X1>qD)PlZRzjIf_N>fJpE}> z`V-Qu(W7KB5V6Z`DnnHms1Q~%@f8^tb%nDUVP9gG``pq(V5qu~TckB&TXb$)4fPUx znKc5Cv*%U+Eh9q5+Ws=FbcskbN${yH;}$k~~*jjXzJUO1Xj z7rc4x8{mN=E4ie4kYdEccFi_>&R<$9jA4x}UyOMtl7$jQwgW1{y-;Kv)S0;(+U3rI zE@oYZGb7~8l2`N6$gnLsA;V-zyTq9!F^X%)X-4vNgp>V##|f~#oMpVVpH_brcfZv> zPHSJ{pP$I@)y_APq2`o!-g#Nm+*_TaiQx9>+og#DFa;#R(=#CzJGfF|hv`19fYfr%YIYfO`?=7qN|b-J#o$0h((S6S1r;@#tZ3MX^aO17SYEz7P)BnZ+>yW9U0zd$W5v-%SA z<q8Il>k@SX&y}glZIVd<-IeC&g-3VqL!MW zlb2uy>DfUCW&59!B0obloMTYr+)Iffk`xumVB<9Z6`W5g5JhrcCHR$Aug+kJF%k8u%@}U4;08W>+MU6&STaZ*aMfIs4?>}?wDOvk?h#3 z`97-UoQIhqwHP*yD@$|wZx?O6%o^-9a}WU(V&*L9pl#g|yQMoSE)ln&c5@Zh9dKYv z-#P&sewCOVF6b69otZxbTf=cSzw{lp@gyf!l-)gWLtiAQm_ zU0-CMZM}W>dF`9g4UL&+>6Fx@jhFS0Yu`eh(`1zgBN>|Fw)Lam#`nS@W}ZX9KzWRd z5qC8sarb5fjEQaT%zH=t{`<&2luhj3SVU*mebA{|c)7EMBSCh`q&G-7y9RSxCCby) zYs7jEj!&5!)plv;G&zj>cnOoEu#sKUBuq{f35MKh57ObSs!H#SMVNVhPS)hMUhADc zf~s(sO(%ZBP;RY`n(RME2$hCU56~xJa#VJ8CRsTclP&S|D;^e6>s-%bk^}zSRv)yT~rytXy{+q zfh(zmak)s@_foJCAxCug_&Y~$tZd^r=OId65(#*;)v#b z396;Z0YX+eDc4DPL%}wqZ0l`2leAms?z~s9?G#&ZuT`)d^Nx6-tNGm-GMV_3qA;q|sn4p1>B;tV9foksrR)k#OU!0Vl{ zi1&2>+%{h+S^p;=`F^vp8F4FG@4fgk#LRm?@_noaT0+c3Hck6pTw?zSC75X)Q8GC- z-y!cfJUY(HJC+cNg)K)~qkzN#c|D-hX}|ev#{g*+--X4m8X)mhoL6EB>^~rhv^ZeB z%`6Plo>A(oqD-K$4XiC?*3FQjea6y=##VK&trjmat3HoRXVrE{M3iU~30?-&22}=; z3YiQojdLWlL7$50No~9+uw<(1vRt)60>sbJ^psD_*QkI*C9@utZAfRO&hdj=@Hd)7 zXPxxsv;-VXral{<^}i#Dqbr8UY-jxtIV56{PuZHcbAkDrd+Off2TBOJUz!}gujmACU5CE}%Abhog;jO3aKFqv6U(;-6ZD&7Nh-n_|KhEe4 zO}&^o$ZF@r50K`Ed7|CBoV!=<0?i|4GVxNcc`@zx!8zs^|D=r_1e1M1jADY(wzhIB0jAO7TS})0J~ujNu$+_Tr~u zotf)EMlkc`x|k96iqJ)A@3d!^rj~*A@B;5yCLp+btC@umB0IsGocinSSygs*rM%OT*qfz_izaED^gJ@o8|jl3=pGquX~v z#Kr|23o4zg_YE0j+hi}EZ!bZ-O!_DB9bMcR_G)oK1FyDaHSqLc6GtB`Mm0*F{@cN( zUZBAOPm7^JdIo(C#D#S&_P@BS74gTv;(Bb4Ft||+p0{?`_i;02EGZ8tlsFxqwjzs3 zF+PpOr*Zg{OJI&iU^}_7^q<~up^6~?RUL2gUd`l#B8eB0^*4>ZITGrUK6Y&ctsBT> zzTxr+GaKapvmmHp{%etf7~v||u()^mFl0Rj%EYSSbiC`4qcu;!(K5j+5tZB3N24WY zSVHp6;v)onwu5cByFin^kYGGma?PpfMdzW89=LRJ;Fw%RP6Dz6r;_ zC~<-@q_-ZA4Nxfwcj#!Ipp|jnB*IRuO zglt$vE41-y%BTR5U@wQB>R#RN`%1LOd6R5UHJ0ODjI+r~#b4Qe44e?KmxPG!6vK07 zuBP=ar*i}t1TI);NP!F1gC$@36P-ApA806}MEK~MW(^!UP6!nri0JR{#55Osjgp6| zi3)HNXI7olz?Xcg$vSCg_GEpCpJ-Wt%+xF_d4X1zD$ z`)k9@T8kY40)x&wG%N62yH9#DoL@}W#Wi8?TqF~R;$}|4;=V1Mk@V~bdk-PkWCf0{ z)uJ0KzyDPDPtu!#kqS*&8eu>9J){$9CstqLcsp{EwLS5-Kw;_s8xFa_0k@*h@*#e~ zWNcM83>!z2)}s_cwcp}A9cfvewua~iITL|%nwBu?q)~m(HEP>0QfyH?}8IhO3mNgTV zSZ={jIE~!VVvOV@K5vZZ%=#+6Oz>(I&%~C)mJejGcd5F(;~u5k$A(CTzT?dsCM7?; zo8iEWg|z88PzXxd#NOp}q(15*x_Qt?YKBU0=pb;C5(L$}(`6fXkm1m7FIuK)hMO~` zn^|vu==(ChK3KYe3V3<&G-h^v==;6P=@fI+Cm#Gz4wCB7jG7a~C4H)uw(i-Z%t;9X zj-*#sxnl{s40)W5ho4{M`xzvBDtGPiK*k59sZ(U`#7kl1DIO!Z-!aGnL)T#BDV@XD z=Puk1T8F#b96>D|iLa;RKxOWW8_5CkdHa4m&gyH0bCYnk|0O+HB{HQq{OJ+9frqW_ zce9FQ^U8KTryb_0ZLJ@^kNS_ZZKUvw^N85l<(=vj9lvwf>bv`k#=em3FWV4C_{xUH zkkQrNS=>1*WF&KpVZZgw>ty}P295%8;Ze7rjN7IDXY32LSBKiwP4B*+E|eM6t32xS zOONvW&RL<(V%3g^m;<6GSUNlY0Qu0>_KuY3t)~vg@^V^>Qbu3}OBsP_j3`u*#06|M z_Vi+#e#1s>)AjJXJ}5&m!VlJDpbKPyRmk`&9xKrLf11wUWDL|%9Xyl{XyR2WZb8<< z8#3O?J;V18`C|dA8pZb|+&$soh;R5I$xv8>l9j4Y#V1(x+@FO4$Dp`CObYZK3--vP=Az!}?*9IG?Fod;$dWLLKUci%{RHk5 zIiK!h-yg40?G_}gHr~v4AF;<%G*Ihe)jZvuFe~0hfB`_3FdRcEnLm?A7*xBDLpsAs~T=$#7hT=U9c zJ=<~4MeP3~?p>gxs;>X>GnpaGz`z|sw6O+_^=d&-8O4?;Y9KQaYhqCnKnX$$M63b% z${j=vn0V(R=X)590*V&vvn^G=UuZ>MVmpD50jn*drPNoc^>N2Q#aDCbMDLp zVv67OU+d3WBsceQ9{cRG&wlTsn8$*a7ZO&^3rADDRHqG`vG1sQilRif;zk}22?Z5v ze}B~RXKL{)&n+4M;7sYn#OQqFDI=SMe*xIq4SZ z?c&|Mv~ba%RI_c{6h2~p*N+}lLzP;*@p3ssXki_UdTyhSwJmevnal%)jrF?zvYRm@ z*K8@=mM={%%Jp9~I9gvff@SErVhp#!i`n@;{vW^J4#|YR?-EZcAl4JFy2z_J5nW9uDAP7&Bxy^Oi_#)n$k1tr%Tj2q|F5Rvm zDXR5=0FzX&7nm)D+r>3S!S-0l>$2j;-mVQ5ze4TYv#IT62R;IENn;9!jwx8+`2y>4 zeNikFaHYxiaq(RVvniuRh8Moww)QAAg&uHRycHYa?_lt-JzfB86YhZVy&5M!sJRj> z7Xro%Ia>2Tp|f|h!pI^c1$}I_8+8z=HXzUB2;Dwo?a`E=Ay{z(3KQP}0p5cCGiZ zwvEnyVAD?M$#@J+%<7?u#p`{N-)%}TcEa~E2OHY>Sr2WDK^x~oPt2a|rip=4gY0kU zp^4NBK9>AMI*9v?9$wsw7n@--MV$%w=aiE_8#o~73xWUEF8)R>AD0umuD5pe>&-{p zwR~)U{<^mI&wQ>&+xUgH_Kn&^Nq{kJ?VoFrzqFQ*^YgJ@QHZESkJ;h{e+1UZipR$F z*2ZpY?r>{sLwW!|yjeHR_?71VxXf>K9RFbqQ;v)N2i0^~)(U3x5$+d!EMdZ;MrehC zEZ{dys?S(X;qQj3(+K&%&}WHyy$+?TVs-ij6g6v5(nQqnCL;uD9V@Lh@;}iLjJC0m z>bFe8t?WO=Q3~tkI}`#MBPj2RjL=NyTX|B=BYw?^hsl+{_c80BsMgE1<#B=GVyJbh zz#{Q$Rl$Q3Cj{Han+JxG%yJ*m+oPZp1HOiS?miF{m(5GTm4*_f(wnZdkRNK^-zygC zjkDXMKJy^{HI<6SjWf(vm$|*jU8jf4PJd)`;wqY=*)mKz87L|6&(0#K!DpWn_x{eu zj{B^swn@St^)aWRJ|@-1d;zN@#A^IBDFe?k7(lId;}kmPjxR0A_iAfDv*NJ@y|t@5 znp19V?P04uwy3u@_ON&f({1i_o2^%xAH|WE%z_^9C4j|B8MlagbSq{2ELN{y0o5`& z**f(F3w8S#0viZxD4K;)jbc(w1{Qc~9IG4bi~!ced!4}jDD>58oiz*fsE8fxS`pJT zzj=QSzWecWN1^p1LTl_5%P=^&-D%MQI3@4WnHKF0xx)lZ)K~)&HW;-q0Uz=Nmyx!1 z_&bgJiAFW<2+(jCSp?vJDf2=MbMW;#s(Vmi#S^3Hq%&?7D}fc(+r|{Jl5nC4bJo^2 z5lH6sw%*ppzSn%zt*w2-+7r96w>I_-u@Zo6KH@gFU1`1_7xM~-&MV;8c^BL$Ci!{L zdfTWGll|J-y+bE?U2pIk{F86mZtaPU>8*|3-F(EYtwm_!TDX(CfbCh2WP>r!^;p2` zynHl1mHNcVMKR+Hm+Bz$gtm4szfL|?`2t4qYJE7OoVlTc0*n-Q`>m95s)O3Yg`tmt z$;oUPg*NqJF?f4}>YB8fJ-U7BVeCrHLfscZXFTqf_~c#KQPa2w2a;fXGh81jQne`l z@*$ixRP5b;ch6B2?J)Y89XXL-#O5>m^lSUF8BgH^J%3e@G5h%#lGJL}-N!pq;uUO) zAIc;Xf%s2|VD%_{EczcGvv2vbpGxkV$e~71@&ozDRs6I6eTM|f7Q65hqyERo$T<%p zhnO3%+9S8~Qor*0pvvzKx{}K$lAvRhi1LGsbTXsdx5mfp?O$X@NsTc4491ht{6Mw@ z;Uro~FI@){p&+mV(JsQwrbhSpw; zD;zqmV8LYbh~JpzEOGQcLe2%1Dr&;-A44nQZRiGm-#qUF=RO0h{;z(%`XlsBv zU=hBk&t3%0`V)!TT9k@nmC*s+buZoZIRuFj$WBJ`kw;wP75M|Hnpl6TC3cO+^>jkI=a!?Z{5j$kS!qZC%D4nTS1CF25qmF!?6p zR~#zq_^^%48Uw_FY~DM7{(*zvz<49+>+#>;*u(d`f2+QSL#>js;Ey1A@{z)zG;brU zJ;t4&S8bQzd?@pa30^VDKje+#qxXz;OKu4{NAh+1jXwRE>n1OxfG>}wQbYb>oaTBL ze|>ZWlq<5WxLzMgUe!h}G}=Qt%$7o8Fx&x(w^8i~w6n+?Ott+zm}>j$@%R;TaI0D$ zr){XzD>aK!SrU%Gt@B|qtm&g}OZr zRtW-Xa)aYv=`{9G4~;GOjZe)yO~T;n0y^_+_1XThCvv}|F^1hhB4iJ(NqEfHp#8PtNSwy97aN=mRDAohhR)LoGy`QC0;?!Wg zeVaSdtKrh?4J2JDKc4Fj#vAT(T^;$L;jWyr$a@WUxyvH^8t(E=jO=N+%QrgmYQtT9 zCPZ2r?&=$k#KliMX3}r%TC~Akr;k9k#MsaM=C=IeN`1uqr@5hz;&1Uk!?lNm`>)$_ zYnxp4`bcd-89y{?looU12yak`=IXL4=J^Wr`$?)C1V9}_hd%>S2LCJ_e zYFOy1(X7j9Fgb>1T})T*8qLB0MV&s9zrp_^41JWj!>iE480@6bi96_V^@-^5gJ1cW z>w;i>$c5%h=pDgJi%H4ltZy=1dx!qCSOYgVs^H0ua)Sx{?p zgS^`Yqy8EQ#}!`?#}y@kMY;|{Tpld>0{X(E+dIjqtt~k%hq0mH=RCP|q-XfNZGK1p z+g_@>rNgkZH!O;!_mG>Oeem(4C{W_z2{indgD8ea1e3pn-i+S}Y4;!%JCxekkAf^6 z(yh|3Je-jtf`(~t`37?^`lb7$eEl@|B&rUO`b?#hdso4~NNSq95S6E&@v$T&VGZg2 zgFU=>Cte&149(O-?HZpGR0?g?O^+<)&}V$iKJ}9fvqnKanF_|q2agX=RAr0vQ7R5B z;mP!}<7pqW*CjK(P$LXKWfag*$3H?zKpouxfL0}>4^|8lmd37o+Q*U<)&(B%Giq$e z>&2gI;pXJuj>-D7YGr^kC+a(%%-RY>e3ji~;M3ot?{LI9UajkBQn~((h>Vm*87pqo zBNV{UJ@z6JI)PbM+(1D}ux`lk0wD#(RFif8#u-4E-o>n=l}a9T|F@WRjHi4o-Jc(w z0iodrDOFY;K{MwGbsQ4M20~DX>gbmyzj6X*@%1N6F!zan#Gsg zkkx_nfdk?5@$%WAQi_Rrpof>)6DRN;sB`t7_>Nt_^hsY_&?_mw!2hF~yk#Zat96f9 z>_{M^Z|lMso{zi^D$lnPQ|0@PF#q+383CjT^B^6Ja#elSL9Z-mIg=m$OGk?mc_PiD zb{WdKbGi&=AcP9IU6?Itq2l-scl6NVA0L+;wrxzyr#V;t9MJ|Nm>O3 z;R8EbO5Il6xLb_XtzCu@3z7bjsuaWR1`LnVH-nF{BerxHKVAzt4q8a~Q4ztw?r?OG zzo?VctJxtgmHJ@KLOxLp;-J)JAQDt*u~hKaniW~9$ajSRl2RC66fK)~LKS%gXI=Jy zj~ndHkH70+|9$I;gEhutzbS<*GN2Db@UTj%N7iK)l4nd&H>5ZJ7Ze0MjH1|fMX10p zwNa?sW1-hXd)tEX=pHS4US}$0?Sdu}5raxlPTM0-)Yr}PTkYRXUswAt;uDY4*EN0B zNm{(`pszdskH_olZoRatzV7Iq|3P2(lqzTWr{(fxWc86 zX6x(52CQ8tr>|T29Y#4Aqa2tu%9GUBv7dLLj@|3)(#P9X-5+nyuk50)lll>a$xk9P zMV($LMneCeR>>M?CR?G!PwQhmz{zL7M)d+Rs=!EbFnl9XQk{kLNiN4xC33MS z^(QGzbG&EBVc{Pb%O8mETwg)tGjwmN(hKe7B-cfXj2N#u+OM%{_wDaS7I^p(A8UIC z`&TJ$)adqf$kA!mm!N{id}c7<-ggE{LxdNKX}CF$V}9N z@nbY51}sq=`A@UPt2CuuF!lY1p%j7BP0J|KIZ1tfr5cd9)JjD@NaTRN2II~<6c3~F zyPlub!SQ^G^)UDpcm|I52>(D4a;1_CGI1CAa~P%B8BS@dM)1F&u7WHqn&y-ziDl&1 zM%3CbDE^i-q~xatEvbDTS?r_*N`6NWRvdOUXkWEHjFflvRIh;y4Wd+c5}+V7Os%$N zX*hg66o6>YeLxAHJ8%wP|BqD4I>?`g_n*9}0NL>ATG0U$Zceat@iRt6v$K{@#e;sZ&mM)o%(V1`#?z>3Ev_14C2 zSC;ugSmyH+W5^_z^-LP*tzCSK*SJVLN}ST$#$fR%xCd!=TX3GZ!Ot(U-Zp|_vR7N% zI`jswYdgOYrm+Nk#aUtuQ9no*%7!LCi2Oxc+sem~4K3pj2I5%qNoOkI_IltIdZPPb z<8~zTH2GvDESYp2zvyq&M0ypygEPxn4liR=aU76xA=kBOPOUEj^mb zbeiqF(*4~uzkFPO(8B7D#A{rvZP?MYQ#o{} z!;NbCac4jGpo=KV@`ogOL8(gYCZ97` zD?dYfH0x7@*JTLfxn9sX%sfc)rpn7e)D3RJL}L*ymZod}o5^*kMN#lZl%ZHpAu7wk zA2!!HOgkJ__FITgxXCA#?2V~hg7bQ?5XQMoGv7k}CYhE=vj!nVG1u%U(xUCTjA;+- zMu1+2SBrih83j55TJ*hK5&^8&5yVA_t%50@OJ+^v&qy&^547Kya^c#7eO~ooAhsiL zk5uaT=VXog_!Dp013r>RfTKVJH>%|p>b9V`h2#MhpPnB1)so?(_k;B2>&nb0i#6=5CeyD1nD7ujq ze*F7XiYhmT1jccgb%#;HY6>a`#vv2fxCJ}`b(3kkcy4kq)sIe3_F^hxs=GDoMm3wK z5UA4~1CZPG@E@Y)L#fYlgDL5lpWKO1>!!w3AK<&S8Zp*s&_%3k)mOW<=qt() z=Iq?7zfP|sf(bL^j#xNnFTAi%V&$j6%IATrr9=XX!=ne?6bH_pgxr3Uu5IlP-IUh1sNDn-663hAKfBRVS z_Y#z8NL<;`)BbcI@!P-2LEl7HFphqd<`CXN*E%UI_t++AU{=6xV zi48R3g#BSt9+NQo)~001bxNU+re11tnz}3)ce3NvHf^bJF}7(^#h@DdcbBQ`iEaC3 zn)Y!eTTrT0K3#TMCmu+EqTb^Jd6eH@E?LQzsp&Uw!J8W#{~i9}c=JHMnBvWRIt!l? z?9Br-wuukqF+RmBrhH=_@a#$seylTHucpe3PvRdo9w0DI>4-hP1eTh}H+(OS128c+ zJ}Og2C&KR_&x(C%HBtP8g*Q>$hPT=iR(7WNp{y0nJ~X;NktE z>I426-)Fy@>`YlH!{=<^CUL5@C-RxxTOjxr(d2GXsPhoRJ$rU}xG z>0vE%@CvSv=@5xg*GlV6K{t3bq0z_MRydz6#Yw@`>-**JE@=0|MjuN~PeES5t3^G$ z`b~q6B}ZoYGx857P8i>Kpd7+q#E(<)kfR7io*PO`b(33)%uwkitldYP{H$-vtCCjh zHC(k?f0n=gawL_aygIPT5(X6N_CtSA#nh2q)5Ap5H&mJk{Bq3tKyjMbz`GnfO3+PO%xn>(Tt`|O&{XmaeQb6vnJ6F1VeImcA?a9$NmW5d4(KQ+d>4{Y*=O$} z=TXfvQmIs%p56kzau~CZ?a0ugOrZ@zbcv}}+&G2y=aM{@IUY z9Ym&7xj}{3+GP}+u&)D4XrSp4{SCC>kh23N7vtbKYA}-;da6R+C%f4eS1$6&4ZQ_k z&34npohfG)T9m4odvyD;`<&Cf%X~mxATi>VJMfA-a}MIzPtRpIJh3kU#AT7J44o>u zugiR*59csOInRRa&glQz!{{3q`j~V@PNO@3ne;;jCfo&h6SS+`%-L10uDdGvE670q zX%D(uX%DjG9a3USS3|i~odycJJsxJS*ZX7<7n)Ntj#p{@ORlvk`!b%lLtEEil58P zgzV}L9!3`^rx)JCV!e5{k0pPaIexY174Ejub_ZTJONUo48@88_R`=8$BW67U)rqnV(qm?MU%{e77F{1J#x!WV&xCqPn%ln~C7mGoNthh0f>YyFcngc(v_C(GL zzFpfSDpz`}J;q?3ubbOl_RBnv$=4C_d{m44!~SH^(UjQ|;2o21n!3Ho-0s5do%S1x zj;7i^2LDT4)`^8APelTvDqq|O+H1zoKnm>VB6-N-Gt}IF$UKt6!&|lJb9j2hrA3kI z%-Rzfzz@mVK;FwXg2P@^>@1^&+Pe15afd2X{hvR8F-c_6=Olz6NguV?TVRPEfts`U z5y;t^DWI$Bod{EkP81;xBUK+$31g~Wg~SF_A#$R4Fv&l)n-Kb5@4aZNfYT@B{@#nm%MT>!_x-7C@TUvvm+FoBx^6bTIPla;GmC>)(j=e^WdF zbQ($x@~ZX0Jv_Wygm;?<0z>|E+Fl-B=bo}|U}Qb%f9)F^@`#-OqBE7+!gCngR4{H( zjXiLfDuqSZo5WM4Urrx3KUXnl`^QVk$u&;-D^=3(E-dVf`97BX7YNXqyn~t)Ra;{f zAEcI1wVLn;v{MM+=K_F^zp<0Q0vu+;$BZ>RLuin2k3FlXM&`zl2aB@*!9S((z^WX^ zo~mm;wrpS0l0Y%-ShsLLo7;Sn^;R3Q-@QQOA{>_#50hyR?ZoOSIiyU#Q8cwp66sZyW;sU3x)c%k^1Mo1;MPay_bWQRVLP!)!`H zbwp3DptFvOLBEs@vLGN7)hV6ndVK-ry_8xNTlG3LPE7gXkB}5mTiXGG_AEVjeQg~C zP0NC(7DaFXKhzp#t|eg?5}cMN!o&jB@~RvP-6Z*qRzj4)rL#zsK`tniX43+ZD<(ju z@;|F~5}P0coVp97%$w)yy4*Kqcp#%ht~-pd6w6GjiI(@BM9Z6Q_W^ILgJNQS*BO2R z@0v3IaTt@q6@`mD?17>eWLOZcq32^K(eo9z`xJITmojzA_9kR#1;hRh+A7z}g-cxL zQD~W*f#GB@;=67sPl>ZlYZob`L$X>eiV~4(Dv>M1wfRA{rBECOTN(L`GS4xp(Oz+# zKO0ub$E7_qm?Db5r8JGkTh8r-g@hv5=gT?Cubs8R3{Q5c`u!Jdf0Ff7cojHY3mg16 zWO~!qmf@_f)YhKrLJmD7zO6odF0!m4y&&BisjYpTSL)*q|5KFf<6N((hbY;F^o^ss z%qoG9IJIGx(-y%<7j#|PLJ_6C)D6~>S3p#5T!e>I%*FV@%F3ORd=S-dQP)n=l-N0) z;EHK#RCk;=Z@D@B^e=j63I)k;J(`Z+ME)#U@4Hgf`yNO2zU%c#jYp^ELB%-P#n}8w zjYntEUyw9$?O}$u@#wTX#v&DIk_uTz-qfObpbm=(rymCWeA4w~gl?Y#Ti|g$ zlYXj8Yv=dS+8c9xOe`jyL+=xdQH!fQ!99mJ;4#uPK%oT945act3-aXRZ21$)&mQpD z_SsGuq@pZ=%K9A+-P}yFQQ%UgUJ$F)5ptbA^c1D;_R!lIcXnvYUCyx(g=47FO5@XIiqMaRooGgqWveY{mr}hYcw`_tq zu=58Fe84Jpm|QMk~U*lmMy^1uPNKZ1@AyE;;oSaC!$-udx){NJ&He* zI@vgPM@QI`9U|wkZlcRqcSHcgqy_~V1Wa43` zAx=ug!p@~w*gAcd$W0&>Ht<7=ONfYd#B!A@7@mKqPN!szi{@j{`Bt27*P;tEl--zu zDsUnolS5YOqtXqI;&nP4?se5rp@6$pf#}VvB^n!Qg7K=1t0lnaIAl${6{+DU)D|JP zSxIi1>^~WKjQ397q2dQAKmK;}K)ncp32~}Av^P+i8>3%)1B~DiZOz>mxOD2!>uKCxwbd4tb8=jB&q!(QAv(#>`PKRAO!6 zn(GE3e+`ip+u6|FAl#pB@j=|55v$Z^DMOV%?XnGjE>%?X1q>pj&%*it9Am8bdB9qW zeg*J{^pYX1u8>{_Rz(KDbb+_IvNM$$vaNV8|C?6U>5Sj{3)-yIOWd;lA{@o@rE@Xa zn2;ZS!!lamm(ZN6qkS7(m+CYNtm=?XS^a>jgu2X@dg7P>C=_2BlCV;m^*V&ikY1PE ztMqf&+?xOz1*($)(dt<~7Ax0h#6tQkidPBg{^UN8viY(wBcX{PfH-yP(`-7DbbmXJ zgy($+906t^sq|$6c%m(ZkDc~_264SyA4a%x?>=~`W#xkqA$^9~ahfsI?3ierYj&J& zoVBG5b|Vs5E*R7a@RTRutDZ`OFr?3F5VXOt+Q>8CAZQuXqFbnMk;%`>$wh^Td()63 z;CdXWw)B8_*WZi?Q6LeP%q?BwfC8ZP!*qM`&VCsEx1d1ePAorU6sk@cX33+Zzg4&u zDYW1JA4dt5$iZQoVECErCz-_px)sv%p^^iERC}XGA^wS4A8Y%y`F`gT!pgQN#)p_Y zXj~o6V=-3Sd%fagy4i6z)TRR&v}o0F!)b?uII1#}d)|q~j-kefI36q4D;=~#DwD2y zuz$}5O$X5#M-eLZ`Zy(ypwMic9ts|$Vl9W=^?J#`Iz1#wPrd&hPjTY*T;4j=NM~?~ z+=@-T5$wFI#Tkg9=p~YA!CeII%!Rr=gKBwd)&nwGA>rH^z`4_abNO2k8!vHg%lA7| z$@?I=5b%si3e~6@4&^kfqvYTtpj}Y$7dVIggL{B!ubDpVv=K=ZG7QF(A7`9{wCHE5 z{CH1`(lR4!QR4E0G>$+Jr)X_gysQ~f1Y zwVTugq;3rKm;8($289e8@UMA_4bYar!BbRuvlFjZWF{cXIp;V0fDG5&vaRFN+Khhb z!AF0LR)6YASoO!Gebw5fMRRa7><{hC1Ufh!q%1@6GOm`^@3;AQNWF6d7U zhICJdoQ&7BDGT0HXZlzyhEGuKQPox%^0j!L|o0}DH{D96qHIcB_shu6o#s9{C=FQQG-Mu0KJMQK4Ii~=vLd4GMEo z-d#1-rzQk=CSf$B`Uabke<&EY56nE85>;M)FAxk_K^aS~0^X#zeG*9^PMDDlpO84_ zY=(TP1n72t`51Fc#sZsZUyJ^aOfHb$wYAP3X4QI=k0s~BX7T^MeAVaYim*byLUKy; z%3hL5b~uLryP!2zL8$0k1g(Eh`8Gkzo_=#4Gdp_m-qNvxtOe~Qyh=^Afp8mfTnpCl#aFH z5u}(M3?BJn@GBR9Ul}5`7hz~G`s6uonybO@QvfNNmu46Io#vGzi`9}wX4%u9>5l!B z$z+fK-C6v-a42<{(UD4vKTWcYJu;(t)o^CZ{`#66#@gbrN@xC&zvCo$IWF|`DPNLT zaEFKl8dHmEJq-r(PD=0BLfvlK2rt}h$Hw`TFO!30rJbh>k~%F>n88XO+#KlgQ|)0f6^N;x1NC93v`ig!rC9ESBU z05=Ly#gYk6%_ofF6Gp^lcEAY~z}=>R8}A0VRX6xp5(T=u`U79P?nHm!6a9Ua zS1+7{iRb9nRXE{Z{XJMn$?rF#KLh;6n+F0StlS^q@9fd-%9*{OG$Zf2aku2Lr=~qq zP}6Ho5wRU4l8(^rD{skT2{*VDm4Dql;5{792Qv~mH&N;zgLT-)=XulVV2E2$Fd=?6 zQR>G@+0$EH?YU`xjfg)sWhcCp3w1kpJ60$hXZX3Tlfvmf-`2jhoZ zQ7CT4I?5Bo`*k*`8993&Dk}kARbv4ugud)ehhZ=78tD*~%#B0sa+AI~&_b3ig4Xu{v6iP|O+{(xVF5|@~= zR4==jy?1$MO51pqroYd~eSt|O`Btv=$DSA+t zm5h9``u_038=Fz|pva#z8h|Ap43M_I0Nf9 z81l~h7=cvLR_eykkY3^rQQ1Su8+mlw`yy%I%9XrFba4_j;6($Frl2Ety#T&z041$R z9_mb`>iZPe>!UQY5ZxO3s3EOM=5iFCAXL0;<5^lTzigV-4&J^DV*PP_kiAU3cHR<^LI$#;$`!xP% z2h)TP+K?cQ`_+7I(<}d*Jb7UDDD0} z_>i#6!6`H8a`zW*UQS6bOJYE;N_{vAenA(QMl}>vQ$7SJ=-LIvp!beR1B`=eGDj28 zPU#;rsCMqp6sn0zeYm!yH-=QNmn)R(&+~Ox2e6KqAUL!?`ul!l+jZ0n2W!v(q1q?F z)!g777vZZ!wYI=L-r|IIFV(t0^a;`=9KR1K|3H18%TR36#G4W-Lppe_1DRO4H*a)PBu6QG7jNEz_*{vz zpL){Iv7d1Mk@MzUB5`6B)yos>^(aK65>Jj6eU~;iSi8$z%!RDC@UqXLOC*!O+(Va> zGrFiu0XEIL(#_c6R<9pE`SAHX+zQra6WAJ*dL+h28O4lVo507IAGvu*p9ZVPzCY78 zMdoq5Jqy1z>s9EgLwcpmebj*C1Z)HNHc}&dblW!#YmGG8OWe>#LAzX=rL!S&k)2zjd!~m%e)!pp5?#;=}71Cr6bJe17cTV=jp#?^O zdP8P>g&!p+L9k|A>tps$S9CYzjCWZS*(rpHye43vS1AIh+9ziS(v7IR7J+L~dn$<} zu4;l^3F@`qVSFtWK4!07o*7?;doWw(5(g&hsdT!u=v7@7mDouvDmG#g-iyb98+eE; zt(a3^xtF@k$(c_{g^wj?N$Na1y$L>XA)+lIS!o9mkYyD?Lvn^*C^gS%zj?W+YTAvAEpFlK+eP z$oSy&9_Cn$H=!qX*!=X~AXY04#(y9=hBDu_bTa^_XMZ`eT9FH+x!;u>A<@5ym*=uXagdFN2zt}d74GBru`ps5OgyR8|hO{PVxx` zgyp;WD^9UBQBN6cw~H6h8{ZvF@mE}j1{^8=o2nW~OpCS@-edQ?QrxQDi!}IcacYCu zJ!z91C^K@USwH#N1EtXNFDu@u-B%1%Si3sklgLG&Eu9CR=dIX$rrn3E>J+>t<-e?H zA_F~%5hroJ=s!`xHICs)_2=*(;5-6PAzzYYR1jN$f93(C&n!YZFkY<}ifTII0i2P% zP9H3Cm1|b235SN2T2OG=-Tp-b#RdE=en?#7Nv%L7VJmLf0-vL)dR-TF61J%CQ7O||_|$^){t(ui2KUXbvBWH7VUV|Jo4AY5F)vsCIuyj%yuN=94K zBCle|rAES|m+w5S#y;b8iqoUAIUapD>?4yakEVDl)n+OyjDPH@Nt6)}&u`LsSph$k zC?id$ZB`zo8YqrZ;_N9$k;WSoqVQj^gF&I`(QR=ZNS#N7P_h)cdmX|e>+L!ANy^_g z1z%Gf5$FsF%Ha<%M^T!Owr;MJG3I{Sy#wIh*5THo2(g9SezCLBdzTy(=o0vR`tR0ard|O$FhR-}m9AJ}>oT;+w?XUU3x#*NuX^eARxwf>eLk1Y#3CJoYNazJiJtD1GpFzo5H` z@O~1>D3hO8&{rzmfXANGFKdv|)!UHTpN?e06O!d zL$bkG7+Os-!~=E#Wzg-N>D+c_cV$8IC}J3Icklp{?*L;weFwL&QcvVTag`@|7Wf~z zo{LB4F>$xEp5YVM(^*Nddnk{V!|bR1C$1!p%mncbvH)k%?VlxbX(N@%eN^V9w0>p& z9L5^>gnT}s5T{~ygLel0m>;l}1J|r_9JN*ZV?XuCh2u1N5u-({dWW#b(9_T>*F9aJ zx1(>?LRl#sme#jIFAJ4U$r?oD!DK5ud`mrUICmf)e@1>x>-Tt7i@4s;!&`X;DuY?C zL1tPB;tSFqd9fc0?n#7Bp_nLho5ws-bo(J0ybQ@OekMYDU_5rGt1WLyzDwIs>2}3N^fu$J=pLh>;mC!NWUI$j-Q|A7Zq1by%Y$)V@y=#! z_Cy$5JhO*ieKZxT+6mgx0G3zQz2nWim6&upF6$szgUJ`7h0iV66ewZLo^)j%+l0V` zSfxJHeE$%y+QeVyZ}892QcSgk7w=IGJb<}}H;IZCF*n~F?RVit_~1ba`^v_C6t6>Z zGYjJ~o0Z2*Q+O2vWf zGqEwW180xI4s^%L_3vQ^#`!Ce0c~fS+g(d?v<+@^n=2YO@<&}5IcRQowdPbi_aX;c za|pRq%8cDAWk$jSWJ=RUUhx6#v{=QVMEFfQzq{^5`*MU7Zx`V&9WLjcTo5o%Fiwfl z#guP$IhDUvy)I=;(nSNX#bL)$I)wZNUQlbfU#(?!nW3gDebVf-v9dEIN(U zEsYx^3AMpy)$0XLJ+2M~kD_jHyWt9%KL5DlFWdQ{b5f}Ts9HWiN~w-lJMw4NLtUPw z>L39EQUVPrr00)R4vMNr|3B3TrggI-otLX}32LU1BKz%VW|jkJmiQTr(J9);|#+ajPD|S zLVMWnj(qN*9hLN>^FO5LpC&oAz_e;2BmU9yxA#f;y9+Azy4=U?LuO{G)Cj{*^yGl! zEc?~0cQVOqXf%YMfIQs~>G^5}PHF(rQ9jo86y^6(`IoS|i-6~QXrO*m-vzVdq&6d9}@X14$T@=W9>06j!DPpjAkRXhriBSo4-Dj|4j;_{FNb} zpZ2wqXm>W-XC7a^x~-oyw5WgMw?Jqy4-`=G6}P?S%A+an1{v93J*WnU#igHn8MN1Y zTl0}Kw>KVuBNkt;KM5kYUSER0R_WM4F_engsy~Z6Yjo83Lr|$YrDy!QFP+v~@w-sx z3H$xm`ap9RAc}8GcV)Y`8E+| z_K_=&rg#_y9nxvLCa>y8ot=r!-s1b3kDMvw7=;|Tki!&mn2jx%leEWzz8L!Om=sX4 z)u9s~Nj|6}bo=pN$!UD`E6O_Lhu0IfZ>Rk2nU0ZCttNNY5GS5E#7)1DL##)GYKYyW z>29h*Hlkqr_~6^-fl;wKeK1_1zlV>8>Go~-9nuS*vIiE_pzH`_aRB`E^0VsINX4SWv?vhqmoo`q{qBY#GH5@gro*l>4di09CkI zPpayeq0i#gdOhDtDr>%m&`GS(VXX$ZFL+jhd-1ab?#inqn8%gL-{oQXdu&Ml4k4~!xd2(2K-Hg^uZDNTUXAoMM|ezs4{P-QXx2^hNhQMvpJpUGbSdLiK=Bs_$KM`H^>rr_tu@1#c$ z?~K*!7dnau^J9dlqzeNjJURwvZyT$0pW2e!h>zYas@@zL-g$b}t9bp%#V!n7sxC-4 z_1ITkl1Eq#-F^16?R+n!bo<9Y%A-we=#=rO%WL7SwpV_h*2WUsSx?$nfE~@)!!o0~ z8o}wyVq?#B9y5pZ($^Kcxwx>~l3!<;|5^k@pwLRFk6 zMA*+q0y#0;E~- z4jlA49@vst#^$r&+rf5q+9;n>%^Ixq`C#SH^KtO816SoCQ3E{=gMcz}?Vz|JSVbtH zre7C`l^+MOOD_6$h~1)~*##C7(mcG5SFN`v0;W~#yM;!cSlq zE_-${+&%rGBF=L})jD3T7mAAYL>>S;<#sG8wqmak3_Uuu4ECFC$HPwQPaM8;?oD(Q zc%S^alp(VD&VoyPEcrY%N%Omh8`;_<{i&Krx!vACz4V{>&9C#d`>F2LT?H@SfD>zC zzO}~~WF}A1qAwA%(B>&_Hf}KEuHxOde?{*&%*l^q6tgZ%)Ku&FPF;u>)KH7+M2yi107`@m>~PFzw8U? zdj|HvkSF@WTv~@?Iiy$Hz8||0RJlWoK1@MUIxN)4V@X{lJbE6s*sUQVE0=p1BTv@F zpe^M(@`ZbLV+wxVP9?pt^H#eO*4x?=8+*Sk*e*&v!Cm4M@^>hw!lwws9xFon*uyjE zx)ODOWytne(#AN1p;8}tc!mx}d@K}=aD9+ej*Q0B9_s}epNI629r}?Q0U#k#=(GZ! zqBKAI<%=Kdg%`@vt=!X&>x94kra?8@n%#YxKk1{Cycl31jyp9P&(SWgP(A|t!Mpo2 zR{{#<$PGB1gO|9GJ^^Rh(0aXExcCvf;zvhQVmaLduy_tdIH{BK*=7AG^bWgg#^ZgF z1g@o?cQhY4ldy%>-?crt6*{}hEJ)|;_6pm9blXz&{o)9>v!-_OC2~EDSGrrrXU5Pv z^6dzKPcNQFPhLU!n4I&b5Zca=ep#$)zq$Vq!t%mR_5-W>vRK7_EcFMg;BB^q=y)u@ zr1^bMY)rtOb3Ww`x(uI$Wm-QV0Wz#g9u~*3T_lG9()I*2*{6WCS$lZZaxFR#VVqNz zrpe(-Ne;npvP2k6CR4Eii7;4FmI#9ZW#VE{>J@i;#CT$48XjKBhTwQ4qI=qrTV6pj z5FSGgxy`sd{7?4^{NWrqp$qbuE4+FWo(-s4bIUdP^wx9;!PJ`5mg^P1g5tAc_{ptV z&@ivSPg>S|-TwM~NsBRt^jG00RnyNN{^*v!&|o}zY}5dplXl{KbiQ&x)hcuQa5KEl zC90MeSFO|TMWD5)S|!3OMa3G3W|%6)epIcd^cmqNL2@Cis3!%Y>RHFge*IKBv;3lJ z3C30Pk(Y@*!2ppS|uu0@$gDfwbB7W`>;H0QJm(3u`c8NL&NJ%mnTeibF!hsA0w5BI{RN5 zM$mH{(#QvqOfEQ{O9N_Q%bJLY+9_xJ2%qfUHNxw~QlGVij5JxsV z^EPbJBHSeAP7`Bii6(FcV!=3GsJlMnRSmo%YKy!3GEvnaDx%O=feck)js2KHNQsQl zwfSK$qpI21#D&ua)z}Rmc)=QpDXU%Eg=^@PCHyV>)u1|{mvrUY2S3oykwdVf!%=ka z*X?&!_GKa*6;%z6iq4UpzsH-mT!1LPty7Vo^8I5eIFzT>HB@w5OjB z#b2~-v(w&Wv9M|L^>pTb@jNArf`5y1*goVm3r3*rH;I!b1j$!nIak`N1ydy#(cOUd z40EDhq+&|i%f@fP9?QtbONT=~w$DMe)vUu>xIwhFe`SlxM6VtC`6}pVcqcab%PWti zQug>q`m$KnPM)vFUPO$U{WNY=?8HJ^b-3~1BYoLsxR%DMR>QfsKRNdX7>~3#u~F87 zW2w|rm(~obNfW{K#2Lv5DQ=>yq6!63?M6x|Kre;tLw-5yPR2f|&5-u43;(7Rm zhS$ZyFryJ7L9W5nqN9M}ivAhuR(9zy$K z75lXf*bs8>B4Z(n6qCQO6Dsd*Kz1Qy1@Y*15%pDw^PryxIT|h-aK~w}2!aY^69)O3 z5%Fu=2n177ooCLpK{Y5$?a}RJM_?9+>=dP**xZ1&u_S=I6))qi@q0c(fgNA>!Lgz8 z#@TP@_GjEeTpt=z9^mJ8^kdpaQj0W98&p&Kx~*-D$JU1_IB&~|66 zVmAzUk<}-3joj!kjghH1hp^(K;&j)2vb)~rrGi~dS4on}3Q z!Nmy7Rr>_ZscWDwAPu`})&b$n)nC$^=KAr7^jza<(8;wE%-rVXD==YhA<9(5aBc01 zcoCM}4AzI@ND&JA0;p-KO*0d&;+OHVwirATUi>v|a%BZ#LO@)b-`I)}Su1WJsk>JY z_L~Wp1RjqOAYqydH(}Z@lpn)+DCmAy(3$aGz$idZTk}dEoTg$0z}1}Wqc*-@0~{%> zgV%oVT?c|{eD_TQhZBAW{e1Q#=|kX2Zb2~@Wls;2@A+TpS#Xbez@zXzG8Du!YtgaF zXFSxGsa2*WcFr)IijQMlLmvkn6E6Oi{rmHdrjQYO1@7=%QUO5j@#uEnCF#Sl?NJ$^ zn{dsp`T1>$(Vp9jX5W$+?VWSm?L~>v{-U#gR+ktZxNZ8a^Ae-;i;CvdBt{p^p4q2Q z>*zw6fzNC%%%+YmnQHGnvLqAMeCHj4On4aO?=DJX4MpA44#~tpiV69mETHyC@^7#@ zXPvJjumvUffSKjfxts_Z_n{5pz`J|6&{BJxc)840VIu#$Dd|F$~$?#2JlzJ(}VygG<0{}fcsM2$C9Tay)4!%Rt5LUe1+($l;O%AR_o~5 z&T7%Z#3HZ^2PmAxzrKg>wx11W((Ls}K63;|KH~jiA-$fj(vgOhuh)^6Q>@qFImEZ> z$j!;u=m=^6psx8@A4tK_W{IsjDSvk!{#b0)L2{4Z2yG&Fx>*B;+6Ug zx;2Y;@JhXouEz>&&hjm!$oS^mqww*nrrMwN`V4K&-}^MT_2Ib)!XUL6yxgmGKQas9 z=n74TaNpUd`O`kmyNIeUCrvcU-PgfCj@RojCI&LEz@5>{p`x#*gg8*n(D6{M7upZs z+Mfvt524^80U;zH8e0H0r4;NM&oyxZ>GtblhCWv5eOp8NSe$_r0FnslP-)^f(!k+& zmn=jM;{s0LLU%578r9Yw!(^2;X`J}^;#4GIOYylah+a$$Gf68 z@woQy&LNe4HSZ0H5+0onm*6m7*(`w?OIpZLe|rKmqypT%&xy>tw@`3$+#9 z#0ynT{G*q#1|(S>g#;W?9Ugx`{M$ueAQJ{T^YJK|KX@ze(4N*dyvd`| z{?WmglLbV3nlGiTLh(eyVo_2UVWme(=wh^X&3j&SK(>;~jIZ-2!$FxSRO0nKh63nT zM?c2wBST1#PIL4R4O8#&kX|0?rvxp{dTsz?_OEK)Y}F*b?GiZrk9&O8r0X9K?*1+Q z(5yNS%kl}J^-~` zFOqLAhX4Szr<^QbuA`&}U!_0kMpR>zzLHmGfYqdXXhPmQmF^{E$ApVf9cA|5W0{ER ztK5veGh-0)->%Qxg|AJgyoS5#D#DD@W6FF$_O zCQ1XBLb-s*JNv8i&;k4nt?wfiTzMwGm%05%jc!8*vlHpt(TC-2(l@M2-?om)+pucc zk7jO9khigk?Rzt~hsZ8r|F&<<+!p<*ONdQ&W#)Eee;L(-JX^Q)#j=zR=z~-&W=J3A zN?t_gF=nzUK-d7>AcWyji3CxJ1W{V~*j7Rp5=s?1b-|pN)U0+zF4FNxlu@hq{|n|g znmLEZCk34JjX$*5$I`c>x5(RsEN1$) zwOigMWU0&C9wKiOvQ#;@jed#TB4gh4)-n$~q!S*AHJ3QgHLJ>>!J0ENx6km)M7Gv0 z&AQkJtjWznnqx?@p9#%4+t1jl8~N*vpEFj(u77;hjn_RMe5LVy{G~;aN(T5fv_E6P zw>QI-%l9cfN)x3&K5_G)8i#B~iMjysK&L=NPaq(QD1d-~DD+2E!W|t4RZa! z&4X&dgxFv0_JXtoh+Z)k8Es%D85wpdl=gc+cRITdqMvUeFksk ztLXU`zitib!@(X*b!m?@YY%N3`MPl)z5Yjc?VuXoN^eYM+C$s4N16w}uKi(``L*k` zJ?8taB?$0S!BzphJ50By?e>CZ&9L^wLcM^b)3oT9eUw5+dz$}^Z)<#?X^ipLcyse7 z-o}5z9gSD(2H)PC^qBwB%p)37B~_? zhKKY@ZSj+R8H2A}Ln5lTfNTLC>vfcl)}H23x&UEr;H&hNkRF!mC@{^JQ-y7M0(pz-~b#@IRd5z7xWCvi5+Rd`Z_6)D#T+ZC~XOf09PQrK75RwULPWsJ%YLU}k!eW`tF8ZZ`c^7ec&~W;&1|OY0>+kO03prNHF*> z!dV>Bz4)zihkDl64yv&?&{v6E9Grp8lHQeLw*(lwS@vs&nyYOPwY(=~z*H0wQiorCK(dF{pZ z5qTZJb?;pCiwJYgI#phm;QDNN-GJ-i@*3f9)|KiyhiO*1x(07G6&0vMdOgV4ET9iC z(I_~aAPQ$)(3iSlCFoLJH!#iG;Fb58OS69FT<2)ke>vA4%~}LLm74RTIp)=@7k%op zfMz|Ceq2P4i!_U=9$1NHwe~?YkhbKn@TLR~Y0-O;)VZFdl7{&Uu+ti}r`ub-n)OIO z#tv`8F4L^L)pY=~Q`Z>&fBWS-80KTnwMVnoIoDpzYH_ZMH0w?0xSz9GAr!wQ}_GXV}ZS>=TSF_&ji;I9}eMT2WO`6r4o|R};K3z0u)(>&9!=+hc z=psk6rqhK-v#v`wT-d(Dt63I32x!*Le#RO;M0->FWHABt`rMT9eGy7i%7dV3ASBQ1 z0wF;?3(R5LySwEqRlG-NC`jeNj#`k5(=YO@QQi
WV$KZ>Csc$(bhmsk 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

fJ?-+n?;N9rU* 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 z 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

Yp0p+o<@Rc%{{5Fr?6RxPzaaFA;ap5Y=xAK zl;bD8nJL!>FEBW(xOnlR_D510;_R3Ud?WLUYcQ^O?W(>m=B2Vk>;_O+pfbZ%qqg&8 z)$2cL+%%r7dhwI1Mh(n5+$OszE%ZnqAdAAx^~pXRk=GI_g3#&}GZ*P4@JkoDhqC_` z&?;Mt=BTL5tbYMscR9dkb%2JS*q`+JD)D-OlF7r_U-IIYDXHlCPxJrtJeCR(7lbqA zKTYM7WR#0Sd0#EmIXboo`IP)=UMRuC1&16lYp8@r3q)rWX22`GI%EMlE}5rVM?v>b zDW5_+mMPgSgI}g(w-o*?N_Gpv(){0~5}wX~5&pgzB|M$~yzyD4gtru)cDR~lrLF_b zy*0zKM)HyN-=*-H0#m<}8W^Q|OZ+AfOEU9n7TLnOasA>P1=hLn2dC0UNtVHE8hjDF zWH~R+fv3_*hBSU5--0xu*R_e8JJ5vxX6ejEv$@-CnVXkSh*HRlb&7>LYuJ)Es}5^t z?xvd11h=`@m*x@K52OOtEssP5^(MylpR@YUvHq1CJEpadfAi;C`ni7v&wk(wCe_GQ zJruok%#TDjC4!|kjKs^ExIy72F@9kW(-$6|SEb=&SWc13+AeB(i*$=pJbd`r83vWA-?iSKDN2aCx_U7fbsY|>^9)ol_5U~~tY5Z3DNDQj}%Db9(*y1W;G8##qE+vecb&K)=+DaQ8A!Pf4e6tic-dQzTwe_-~^ zZZW2LyV2>GJN;tZwmInb_Zm$T+tooj+^mMM*aM36wRh?iY$eH8SY8v!!K?Bq%!?P8y1!y zq_Fh@=Of2lYe5n!WUhLMaj*ZG$eP0P{Gnv6yrjj7{M07*CB>b zuE6GT>E~3vUjGrA;&a=r!=mxe<~LAq=IXL|{4;nmO+C9RSUyQf^;GJ{sON{ow;#I0 zKq}~+;heJp(srYI`O1wK=4sn8qMxPd@&pF@ojn&GdviMl%I^EjZ+(%d8@TWh4mbgXQji6qZ4A^f6Mh#Wp$Pl4{t&b^Wn&yhF%bcr@-K0d>R`g z5scv{t8Ub)E%=2<;?;|_Y6>R|^5GziSD~xd6F2^k5bUj?sxLRfzmyP=`Nw zm@}G$)QngF=BF)kGMKsZ@1cA5bxV&m)+XAvuzIOEOKk-POrDu=ne4H?|*RH z95CfMq#Y;|7)DLnzG&?1bnjW_3j?#$GFw)w(QjGpZpowpo#$$BISqgIn}(JS# zmKYFPl8zSelO8UUDV9L#oik~5&m*7PDvi4BO_$M?ONLqm*DBx)%t#Xku~FT}8I1ha z(?#g@E94joTn<0L?Rm4)?e8@w4L8UO?-D+*iS#)%)hE*YGRY3h9ie=)7sN&+lEOcG zK}@4p__j)B8z#!AwYzk}gfVc)Daop_wbOX9yFakZ7XU*_Zq?TM&1%cQFyn!-D*3G~ z8gQsp@5v%2%P?v%rz*#HZdY?v6e^;@2zk=~nN7bf*V7>qUWj)nvP3+;?BWUhf#Yx7eMD_q`xWxGV_y8Wg3 zgXNiEm!dzr*AXPwF#UAQ?)h-|osP9zbad?c^6UEbRin1u zY_1y2<{o?i1{+7NAKQn*-*5!8gUI!LPV1D;7JkjE@$)d^N0$6x%D#Hd$?uJ>;7vJL zU4fY`N5CrH<4D*%Rqjxxi`7pg;meVW-&l2jqk8#jYN+3p`D=AeuHJC9*d4Zb z@ldb|6+5LE#k9yuBYvg|rSuFzf5588tsyXYInA} zKV+FN{MA)D3qI=@^!Hwzd{-v(B4y8stcqt!nGu~T@6$bB+E`a3m z{bL^H0Oj}`AdkoRRa3QMPyJrP6!!ymO1`Y`vmO&{MDsXd5j$n~*)I9sIi$OQg577g z)s6pq^b3D2EoQPlYqB2M1b~%*F6*%Stj|u#-wJNV-)BvA8$M#3d2Ek7vS5zIEM@_V z*nP#l>5F7QW*!?unCVSUcj4_ra-lKT?@~Sv!L*s9a&_5|x#a1E&58XHw#yFLD}>I< z6G9NFk-*_$4<~U^Cdg{fbIwATnKH*Pgqf-FyU*v2OT* zVTY;fup_3;ciKORn1pv8M(Hn(*u1r?%X1r z3lC3Yao=IVwopn!!V^!@yakvl}`~j@MQ(4Bc=CSnf^FL;!_c? zu))r)Lh0A<7}()JhB0P)WauaVyh4?=xaW?1xPe!NYsaZL0#Suh(!?@!8`j9|CVa*y z%6CQf-vkmksCqsK5;NkJd?;0MjWjugt8lxq+geVGZ_GW;Pn>sv)mr5qR%@NosYe13Y%9b-A{PiMW#9)nn!b+~G$fHWp(_13DBJsr@8o zzDRO5eas>;a^oaA%^t2@%^q)DCqkZX<1)}9F^f;>@5l{pmWH4~m?FYy-sZpNMN7Uf_?aIGCt;*SDSHcP8SV|Kmq^|L_9;mO{Glj~?OHM7q6q zp5vp5IQEWnJUG0-A1T0o$>9ZlUd6#S&X>ON2>+qO3%tS@`;$VQ|JvaN4n##e zP`}HSbNt5-FYw10V}Dvm_aCct#kjvSBknVWx}e;zzx^ElFA8xe-dm3moID z%l+)Xe1!kEs($}(q1=C{+WY?$;(oQzHstr}zj%cI_mlndhmT~o@@IvduM$LKu5eL~ zx8`d~jfFV^@|o~BPMisv&4$movhmVfW|psJ%u?Wa{KdlbU37Lvcqse_S-w7k&E-8T zssB>mLlIuBrq&Stimif~F+{f#3`*jXXnSe(){wS7zYre=I7*T*_z6rn5gPG#+*O)en$-9 znf@k=0u~)(EO3g&|6r(H0;@xs$EIIwUiyhXAtCLoe-Zxe4#12eMFCsn^_N&2kgKtm z&Z470CP(H;Dj3_?KF7ax`yBs2x6biDHqY^&-a5zMr~b-(-onDE=^iyvri2G@!^2`0 zvP2wU6|o<{jiq<8PX7{$I_~Q? z&+-2zmb5M6KzF`+^Bn)hiMTH{&hgJp1;tTw7l&R|XgE!Cd|23Ahw~l-M<~jbm6R=;pdXE3zMBFE?p5y;lAr9?${=Mh; zA5PR|@9H`Je;3lBexI<;@js0vO|8q_d+r>sB;~ri`qDYRlH`3wZM%Aoe`_Mo0UGuz z*U$04G6DOgE9Vx{)Wx9XGi5zCtSTaoalgRxNQvMe9nPSxl>RF4b}Yu$5%*FNOQcl> z-HV#x+Q|Dujhi?J%%Z>b^g0XuE&Yg)4n)0Pc+rg{-HM4ai(y{*!_2Dg!sE-squ*(G zm&<20ew5_98G0-~0xX7Kegx3)>UTE%Pi@JL0I??oSWqlVeb@$|U)XhI%ELH&B^V#L zl4t*$Cl~mizI?X7|GAL%e?Pgv0sDUx;)?nF(a8mxgP;sp_3~As6t03?$o>Jv3~O+@ z6HB73BE|I0%3zn$KD4d4L(BC=a-)c~dHB;)x&9Y<5r2Lv*Z*SN+h38q2*lAkH=ex) zf$suyZJ&ehbjH}Lc~LWi9{(x)^WmpG&YXj^$G?FB857I=$*_WL5 zx*K@uxF|-=(o7R)*{6A@jp;cRpT_f9sjTwxbNm}0JIBBFv2*-4KX#7)^2g5cpHuJu z;K$DK>m`#JZ}6_5Ra zIF(QF;n;PIP(k$AX%%prXN4?bxjPp>7N7 z1Xhmfu&gh~@yq4Dw52aH8D93&vEjw&Q7@w2T~yCFuV<7$st%o5=PRi1mCICX)wPS8 zAUpT0o9unp3xshY;7(Tq;Rr15gFn7QK%DMyE+kZ#zq>WK*XWs- znjZYd#>}{U>UpAF+LdTk^`vYx$o;8CQcPO{L;DCGVPk#IY|Fa*z zz|Z|e-Y-kqznJ(~UcaRakS<^SPSYQGTc?Q+#uz6pF)526o2GhumGY;e6Fl5iTvZN{ z9FYh+5spzkd06soSplqkOKGIGf5bi4F%s!`LZRx4d$J))xuE_EJ_;g;MX7Z#**3B~Xr zP2g4`;Xb56Yjo9@jHMoN{XL5>0_~<=;=Rm`z0O97XhTD1EqvP)?Uw0IPGuB5xB084%z$;TxUA3`dYad9&i8od+&7 zFW(F2Ycav2QQ&IuB{2VFs6#jvRPvI4+J|~%th}{(XxV(*2 z4W(rpLE9k>=DmJ{Ui!ilwu~yDYh?M#y({rndcqd&k#G#*I>0TuK)}7Y4sX-Yv|j_q zR6alr2NOcVz_|GYkU}`DZ&|*4XnBE+-A>q%fBWEXJSS^bjhT+Ja6>#y44V_)Gx%)rg`G$%C8^KTZbSKw{R zbA_MekUC`s%2Zxt;G_f^i|9y1tg$7}Vs+!d^|jHVLM$AD2lfL@5#6T3SA~NIxP*xn z4O7mjrmPy{nw@Qszb@D(H5^zx6^7%+VGxrY8`&Y*b-GO;q0;M*WuZZs)cRe^e4)9s z-*4YF8?9DvziUdkqt=4a?o-gl)=9&}A(zWsQN|6` zSDD{g?bmy5oCse}O@_%s8O$snUlk*uT!m>WZsGVXGtRwi{FfQ$J_GzXaB7Qe$S za28pYgPgp~x6_lSkY=XVS{{yLE;GAm#DYimp_Rp0AjoPv-Olzj+GSxT{!Z*ni>j~~ zUhPi{GML@|tOB%9fV7yG#S(a0THXXal`pA}*)=#z`HSEe;@26@Kj?p`FG2;%!df?T z-C4`lAuCRTh>t{ZNmS1>v1FXk31tkFP0k`SnM2<{9Qi}SL*?)pO9gbJHI*R`G?K9* z{o$BXX=oBoq#;XUiuWSD<2PX1dM3lWD_b=amHnGc+6l#KRFHVk5h{ zRf|{i+lR7fZ8A_<@*MN%LCi$NW5JZce8zt4qvtvP_CI=_-~8x#{(G;=cM|c*LjjS% zM*;$`fn4(A| z*DH)f40pfO3(^CC`--5qAO!6hv-}Jk2^c0br0GOHOhjZHq_IIPv<=3-@H6N6-}%gW z{;|)T=RfqB^Stw!^St)S^ZZYK_B{WcpFPiC``PpS7e0NSfBMts`Ct9?d0zkYdHx@M z>OB9BpPl`;qQ3o)pFGch`jhAR-}vNte)7rl{LUxO^S}J*^ZXm1I?vzu)Or5*KPB_O z_L=kiyFYWDC!adc|4ph3j9bzHZX%S|KgfSEjP*JWZV%?04bB4AueXB!F6~2kHI`Bk zGuPi7{><`?+46tc7xS$X=Jd-H9i7)<2?uL&(CsVJN9D{Hakw=6oc>+9LuKscyvV7j z**mKYD0fVkL8LW5ZPE_yxwuwR#b2XFPHbb-@WfIois@$VdpbNYMb4m^#Xr{ zek$cR10Lr=U4Kj;GK@OWNa|N=V=1@kuvGRmXFrB;0oQ7XOB1W#L_VMt`%u{A!7fWQ zKF!jNPq7bShaeeDo|f`4){R3RYrqw{xU+sU%Ln&()^F;PP>+KV@!+x)N%k~8#bqHd zOQ_ed?HFSoCn7U0VT__64Z*7mqVSOWU?Cpz$f(+ke0tCcG)hA$r~)~M9VK>0@G?_% z*ki_HY~`KI>~1l$yTjP{6c)GEZ_09=HA6?}KGN^9t!oC4M%0IiU0Yqhi36+a7`0V> zdlciJA-rP!YaAw_z>+}*{9Ca;hOSe*b)40NJmkjiT>4ti|LOHD%VN>;#&F}y5{{cF z@z{*c$dVK%C7spRw6LV8u~ZJaeg`9q(9pvD>RF}e1QWs(^ly@!T4UF**WK9CSfuZW zScG2_K!u>opFPghyWuDb=Pq%};A0`-Y5Zob1+IT6;GGD(!3A~{sIo+V%*x*Op^;A)@$B%>pWsISAb;_dHDbRibwJCUvMM;eVTzX2cqSaWn zsN5f}pTNZ?L69bRr$Yov!4ga&FquM1aqtzu;2XnAe>H@Wqa?5> zk&JU=W0-ng&PP^PwbU~22{NruvNR)heOnmSdxRV$tVs-R$Xmx6F6(!kR4h3O&?lFY zpzx-$Iu-`JwI+vRj6B)>`y2OB)BEZsbG5%th_Np7S+^5UHBFChp%f{)C*1(Zr)*E~ z$n{538X_~W_fs~35nCo(>!3;bS#(@yN z#_)?5FRFZiQfe_#3xS;78?@x0Tf zCEL%8fsepTLB@M0dqQ?5ox`i?B~s5IoGaGl$mP0CcHk#b;He21Go+IOWw;Q_rif7u z*Kd-0v0#jvT3Pvp^w|`elX_2x2btduS`7=BK%xnwR)u8yV5HosWprOo0algkKPk#U zayqS$+_khPV2v|u2>S$<2GDoFb&7_*kOQPyqem+VEQ+tD@;ijwvLmN3kJ8~g4Y6VK zbaa>$@|R7*ilkQ05_(JiLNRL|MG%?h`O1$n_d@@mm1@bBtd^SA)l$9?3Tb10j1?K% zVzF~bmuqtR%gm4rttb5#lF&$3%~+j`)E6hA)SkmS&h11*FmDA13$jYggj`2RZ84NU za}K+GaPSdfCsqvB8R21j9EvCoe4dC57n&r+q!jY5oV0>B2p$M&wxW|X$Y^#GhY(Up z=!qi{C4-{ z0j?XRq&90A#qS6XVKkG=1x+h#;CSNnrSazpm8}$d|8N>DQA$ zZ9;g*{TotwK&5FXAPPg^Bu3qUwMI5bJu;b%Bt#Snuj_{-P>Ld$d}@ywpA=}`V$k$! znZJM~LpHbU;;$%!k)g~#D#DS2oVj$f4&tp=e2YQUnan@pYWVr}2hC$iWS-H78h)z&3jLN0-%|J` z!*>Sw#VU+*>#wK(5)SNKc-8(T;2HdM|EmmWN5t2QYcsAtW$;t{R}8<(V!`#N41VtT z`P!FOb_<{+PG8pkCDSK^pWFV$(`PySV)V`6=d~Z;!27jwv$HS-r}0J|{NxxY4ncVd zo$^&VE9m~6zt0>(93RZK4zr+rx}H*-#3C|o#xkeNpB^8bffES(Fi^ZNg{ZWv(H24V zCZa7r`%49br)ToJC&M?*9}bO8A`cul$_xe02)ccxaa57@Gbo?{?ycZ&&Mkk50*kKy z)cnuduxR$@_)#9;40y@vlfzH%KUp60H=hDL?g!;$PzH!I-!l%omo72bsI!J?pgs*FFXSk0#|+IyOubZ-^@mhmU6z*78~Bi>m)?^V$4pTd90 z>s}F2P+vR&-fa7o36tDH3fwS|O_aW{Q+T_`Ke1loH5^Bt4I7>p91EvmYeOo1k<0+` zh8EZ@!I6kO9@e!5!xa{Xo|}*=!1roh^0!t;1$hH;=Zz3!L*^-M{dHDlm)UddL_J+$ zH`og_LfXUMgjb513(qUk-=9vR6ub*xP=%p2N_j*wJ(O{^P)4~lSqEA2^mAUf>kMZ> zT`1{{*HDnGOyOK^)T*g;H8FMY_J-gT$dAoP@I>^)I7ozK1dw|Q+;6=3D1Y+iqx@?( zALXCF`6xfS`6$18^HJV#h&A&5YX7D|BPdU>>>eiu#hM|RWJ;VchB5Z!kmKSOC68e~ zg_KG*82d*be3XCU{-gXm??1|a^QA}mUwi3M{>A%`@@mi6G-wQKS`Ub#s7qDUno(^@ z;jN4%GKc;NhC@pp@$&U`1cOhdR|$X}e&*Fs3TK>OwEdwLStZl~Q_pWoAbTXT;EDZpM z(4y%^crvu4Aw8gG@u^g779_k(T-UO9yrVv~RdxPXGI@%3eaPnFY8$Y#bIpUw`l3P8 z#!5(e+~S@`nZ*|LerJ$%S&*DY54!n>uIK1?;y6<+=++58<`0CtSCjD~!CmnK2r3Rd z0kKT!-VG#q%5$~v#^7n@yxlN@#_5B4&QX@_mt0*fF-anBKM+yXoRJ>!L)mZ}?`_T12 z+*2w8AxtZB$3jM=KoH?}2Tz0*AC3(k2_7rPDO#x~cPKpyflp1b?nz4b2V$rjgb*fq zxU3Vd8HeuZkRG%f<+pZS4StN1o= zS8&H+8bMu8dU`T!*epONHM^be{@^K=k|jXmH+#4nlL+b$5n-E?h(bJU)KB*Rx^WOB z3GRjxOA}qSWvz!caJ?vhhsjyGCUmLE{5BgAv07g`MI{2XPFi-Q4h8AFXga4@wK_(Kv|X z;wwP%`?WOmg~U2TM(u~_0L7s4j^`25leB%Re5By?T~{FB>QPo8f29iKy!iDiOn?_p z`Od(NI6c6ykc!u-#0UZ6{>vHYNCUEX#kT$^}dQd}urU!+4Mmo^>lm@~=voxng zZfYAF8&X;!HBtfdcVEB2KlOTUpWt6%e>+k&p{-0-O5WccM!|!6JzMlWo%l9Se)6^XGlJJ2XMkfjvmnvaJ4?aD{`{?*!o~(;8;r3p|LsS4_*0Ma!B0KP z_kQY8zWq~=a>V_kzb$_ehxg}yO8yz@cdy%Tzp(S7)$I0qW^)e)mUFAO{e)m zrHcfK_G5$l&{#_05k>*?@qs%^gETJYxp9%aYBLQF$2<_hCj5bz$|FlWBP=UFp4B2% zHp1=hF3FMZf8gRvWE^~EcspZXyude@$9(e2#@J(Qg}sB~1Upgw%@Ai$oWndOuTdfH zI>p&6VA7Hq;%-x1%xororXudXii58w1jL13yud@{;Yr8+^)FuFuw8Y;7(34%V?X)D z3%u-Y4PN68DIa)WgO{jX@*M^5P~;Mwt+5UEX@dIz`vAM2<^7dH+&=5Druz0S_U-Hs zzj%Ru+4(eX89(rs2Ppy^H z!`keH4E`PLTiNHRoO@Xu`uTS#&SqOIraR3m>>cb6-ax;~{<+Hn=CPEGnP5M}82c{v z-Hd$+-;o0S-DZ2_!%MYaecNF7**4o@U3QB#*beKlF6&aSF!lud9`^n(zNlE!qg`w&w|j72mOzJ1DeW@W5GI0A(_k6gG< z_q=U(pRA|_EM?f=LLSG*&Lz@Zv$oqU3sl5mt?H$hs$RNEnZ@<0m)5H>YX;-c6SPrX z5{WILh-hW7D8Fe;8yO`*Z4LLYSFxeOpnrCVeoJYsQ54b%8diqENT(LX(lAE4%6$2r zl}+hJLM9`^o%G>Ab%9g?QJ_A?*RD!yF`a;vT8DI@72B{>iPgO?_m={cJSxfM-zr=q zog2=$zs(JRFEy#O^^Bm^xh8*R-{Mj5QjIa532mQ_V%I@`%}}!heBSlfu9kDix`0lb z#k$7&P&sm)D>tmUKICQoQU}4(4J`s+yGo}-`*ak>bey9TVR-C}qOeZHXi8cDyvJX@Lfu+b_B8)O6os7Je$*bm?alm7oWS|%zsc2jpiH?NI0Ls9i$z^uV zngQ=@xB?d|J!$fzq4RYNo*2gwbjGz$wrXh9#+=Ak;51&fCdMk;HFvFMcXziv$PXJP z?7Q(WuNb}Q+R=+@8}VZ1ts-%z~tO=6R<*#UH{4k zC~T`5S7Wx*vi5rBPPfrw^~YD<+O^{_2p;gz#rmPt4-Y{Vf|LePu54O(?m@&OSHxKH z>R=o}Sr1%uokD7~5W9$0#ZGsy-#1(A#&ve>Dq}By`2s)v@&*3GU!J{B%;Ek?vF=cw zlVQUG2Pq=Am7)`!CD$YcO>-o$6E9=#s1G>HoQ|m5hYy#(G&hia2Jkc(?y;RjsVAVZ z#p+dut?gEw4f_95)nUmixUMCck%JE+!|~e~^R-jEIpN=-eVEbj_e}ia+pM??6X|rC zS?R&~0K<@2I0sOZAyrzKCpejkhuITn#6b81;(@zJYXs5XX~5thKyFR;zVg@ zsaTq3Qe0+sy1V9XVW!Ovz@0P5*C=CIh@QcCqtmv2sHwx0N`^b#xSfm=C@NG8O_DWb zv9^^&?zo0^NU=mqLB{Jm)0lLd5vh-9a&bDM&MM?0qsL-Q4ldOPE#a3Hy-33vXsF4L zk&t;(PLm&H8?*ALdtmEE*D4FrtcLMqHGUG_WsNxGHnC)s!437L<;Nt{sFRDH+C7LQ zj^ou8w(mdip>!9U)*|(hqoT%uWmgy^^9+bN4{tM`?~oUA26GR%w-|b_VCKh ziS|#(W-!iY9Tn53m?Pyex5W+#a`soGMP4>LWIM_?FjI5U@nh^Kjt7^hY+EE9ksJrn zgFPPcaa_;U1dGEvoveFjg~0+j+-JacP2!Q3V^3L9y(5Zl@K*4h5J!K%OD<{(p0HM+ zcj*LU?)qf3MPee`b$vI&wnmzy*tu4+ySvcV4~B$d-8(E|ME6G`4!olcvamE6p~15h z#JlEWN&ZC4RrU?fI2lUGq}2i@TcCb^SVqp8RkC^dTCa3IhMoJ$3X@(yg81cBkQY|? zV&zF9#$ggu8sIP3klc?MwyYpcCb$oEmH%YJoOlrgE=erpfnu6Tu!Q5X3LJ0bFE%S$DbU)`)G+$hXv$&$kXg)G9M5STWAb|*4` zeL&wyg1W9H3?=2YqjFV?DHAmUNVNjbw8ADi1-d8CwDeZG@h#zqql=o*-Sk0oFKg_e zsT->lWMv~slR`cgbd0$lAB$*(B|%_}xqnKWVi#_WG1i90tpNA5heHt=NEjamQL@5l zsARok# zrq-Koe`t_(nKT9oP3($Y9^Q4uad)UU&)Q)fq#KS|^xz4<4z55j9M-EZtU+)AYq9hV zXjI2FgE<|mWXyF#*_z&yuttq?r_&*_H!h!`NM9V|B4MK61CK5is&}oIKIWlCp1h6P z(Afkf84QP;Rk$D%{w6pbZ?S#3@t6~1rBE=czlkd6MKaaIE!g;TK_?W_=ax34p8rI5 zEKZK{)ky&55~)pgTvIt16d@hGqe|+S6by$(wMBedpF9c(7L%1ja6BRK%Eo4wlMi>} zK%54?L$}om*Cj}`4OOVE8f;9hlEYW1$0`{cmLF?axS{hfCUb%1kv33gT~&32qja@Z zHdcr=3k07G!ZXNN@{~FYaQ&o5EimjTP3o5-mF+Y-c3ETY9Jw*%xNzVunO%BJpebY5 zGcH4X=nfOPX74uktgZG7X3H44N5WUaH{E+m_C~8a4YHb8XUYl!2N9D6=1?&+#$qhF zA3485TCqi?C7%L^D3h&UL6^_~)eYD4#E5&iaL&gf5z!h+ug!MnZexd)(<;wPiuRqV zzrv$KH93KL0@76oq=m0yi_?|HHJiJ`A;jj@7jit?f)LsO%Ld!Y6t-b~Rr7*qIP*l; z2^%>&f3MfR+ZdRos+8svjon$H%5(7SrS$}Nl*Cm!Vm@Pm_Zq!UyR$vH7MdpzPfHmk zp7t8srq$^-noYCcS3?fFH&Pv-AmLrqBjvUgp^C#O^CYa&!&Z8c--|ewP1a{WI;&H&^{E|8o7o34aTax1hgF^Gxff$?WAes&JW5 za0Wf8`*#*RZS6BN$kA29PxPOv0rsFbf&2>p%UiT+kYs!qPnUsg>_K}!h7HWObG^&Q?D1uV13}puWL+&Y50tYJ_9t%{qL6Q zkmsSRtXBC_-yxv?%dim8&~byhp^)ti=^tp`k)3!(P5R2)Bn2+WD>fCmbdV0ol84=j9-?HvBas+2u);Qt>i!y_hTceJJdqtGrM8XZQDh&L>obl=xUB*@ZXA!| zS5!5}@hCZ^4>04iAa}}emD(En&RO%GTUp9O4}_dPh%1VYOLJx68UXk+@bBja&7Y9{ zChIU!y0%+YoYFD69D@V#^4!ZKYJHRAT@X$YvRDr6y($tKUfReQiHXtmAa z$Tps-#?P!7PMpvay9BP)5g7@9xkrl%hH*)>S1}Yx0aMm1NMS!ofTL<3!aqH7G1iT0 z{0ww3BU@(h|FQS>L6RKTec%HzyW-C7ELSus5s)}4LTF%SIWs%E`0gbZ=;^MRX>3pT zpu1-W3oKa5>8j~2Om$VGs(L zDHI}oia04Gn-cX!$>!bSgCFqOp^M*pS=H4&-Mb3{@;`UAJDpXT`Ch*Kewq35J%}P8 z2^Q@2R9n^^VGF{Y%C;9H$Y_usEDn7@o@6m}JW5|!eo@Gic_krlL2Lh+C$n1EFq^d+ zM7ME>@FWBlI77n_^CB^EJdiV+NX~$V6Z17thPRVSiAiDYxIXSP5-ONqZd@QP+ZS@t ziy%q6J-X13!V5dDFE5_ELpPQmUd8~=x)^DRY_6MTcqHowWgA_nF^cq!{B5l*015|C zvw9H#=?p37^qrKKf0@2l9|cPy@=4?Sr-cw_m&cY0q1oeX_X$9RNWP#=BakSX zI-iZ$Wb?_0C{3=ABA>ea3pp@^h2&6+Z99gHaf9k~NL9`qB-vJGPpKdJp!~gGzkgYO zC;tEZgQwKr`QRy4pgbV>mwPOFt^Cod>)Wet7{y{Cd0Qk~iMCQ1X_$cuyJ!|rq9P3- zU9V#ip7SDOE>-X_raU%SrV3Q=MlRn8Al33n_2U3-Uxi1a3%qsIhVEywgNXRW?MQz{ zY(I$lE-YHa9OMV6Ov0U{(6#l+`IF0Xg8t-1?n^9H1sfO+?eD6X{CGE_sJpWpk&izo zR=pm%QSij0k1kW+-lbO5T5PFS$Dye2A0SfScMo?X>hAAG)N%oJfS=ZGG!SsIgGdxB zf*Zg#MwHJV_e-aN2zKF5Q9wF_ ztT2Q}de+{$U~CuH3-$AfJ6c(?F2uyZGUgUfZRwgRo7e+mC8bB{A2S&Z6^^d5lqER^ zucs4Sq11EtBm~Uw9)mwN^^XO&oqf0EJTR<)^jP5}{5J$&q+qfIGNQh8v}ENG{ykGa z`l<}i4UQj&M{`m^Yd!f_}d^ne{Uw0@j4 zXWwzC#{PR=(AN9;2NcmIvgjeY#520cS;M!(r}d9!d~bJ#e}l^8>l6K5QanRNJQkbe z^DOC+LnT_LB5e|}gl~c8C(J+*O93S3{gD2h6xN_V?U2v1v>R-r7<1cr-#FMKC+<+M z*Q3aTR`6UuuPvZVVq}HCUBq1=DELn#1#DyS%76>_h~M|T4_zUw#RCdpOFe>+{y-3e zk3)04Y3Sg>ezSxNdy(r2AnRm}jNBnkEavQZnClTe zj3Z=K8k_niCQip-W~dBNHWq{-qUq_)Aa;DVX}40Tl?tip#t#`rMIAxSl%b7XHJlK= z&e#lteb;uv{Ir3S?dfCpOEZT(de5KFe}&JF0cwj-TdM>93<{qJO&)co zP1B5zGmNKEE!`H+_&8$y0fNamz%k~MWdhC#!K>9_=Fe!9Yt~k269!kSb+chMSuH(^ zC}~(AoR5qI;Y55AhXn^D4ogWd@G+RY>!YVcDqwu99?MnhQo{0JUwKdF4rx{45>w&66lUC9n?0oCg@9DcE$VWu}zAyQ5YdMAP@PPtuC%#|S+M27ov z_y-(LxW9A6%|i3a^CMww+ei>Z^CCb1Wpw?es7?$<%hhwvu zGG;Y(qy+<)6D2RAJ7hp)LcRDuoC(M<@@!m&v(D8eRisNr=ZDus84xjEBS1-=Cf0mX z-$W8k1c97TS`+0Bnodg|R+W$jtK5YBQq&DvM}{EOrEWK9TgO7=hF|8UH-^VP?Shfl zEtUoMbT4N1I(g4#leu<+s#`xbW5;SBrS~VICpw-Kss6}xj-GPEIliZs=A|382SjJH zaxCCb#9z4;EHCjtid#ME!(4=&mZ(sA+vhILN4K59%-VpV(kLP-=)=lg)pfliZcs>; zD}2cQ9T7F1ZZ8P2y@H~E44>;u^W(bhLozV6vC1NUj8D13q);{R7qQ#9?}QM?ycHI} z2t~t0=yOCZ?Cu7Bf&`^d4bnq96-7bIRX8W+bLJ#Z+_QA%M3j<0dNT4uLL%f8S$I;$ z@=&4-(UIf}gA*h>KyUIs91}PiM-f)+vK*B2ONUK#@KSwDiFI5*jxa0--o9Lbje}O; z;aYUE-Bifjx6|@VC|B6kbdpur7vD9@_ME@`u37aT&lA1x?pgJ~gG5ijX1*}(-KgD3%x}#PYyrr; zbROd{VvplHljrU3|AW4_vwxb&AI7;ff5SPG3}Gxu=uRHM4?;70q{(UQSgw2U4D#)X!Zc_aHZdHJu;SKM8T z!Qy~thwLh6A-RYPO4w2nTk)I|M^3qAXQ1uG?k;GF=CnIOCq(w)^(W9OTlJu*l#L)c zQRGB(R(aDZlnR?ovu?qbpb69UILBtC7E)%J^5NMk(|AX=$;UU;3_Q<+41Y(E@?_vM zhVMq|M$9*Pj?ed~l8Kt9o%JA!Wo-9?V6QK_&7nddiKRt7lR4-XV=t;MOHaxnBu!PS zN%wZmQw+k!Kg0P$YvUHeU}@VM&fn0JfoH~t0cCI*2Y#$006t--CMP=ij3bl2=GG=- zIhHsP&tr}+V;w3?c+Qb)bmN;AKY$sAw>pm3bA~LKF!>`tnwS)Rz+4C!=xD=R8=NsF zMKiG=fSWQDX@jes>-%otgB;%Z(C^p;k=J})R;z4;K?spU56f>t_6WU?#E*Q7wkJh*~&3Tts9I!#1ph-ik0rikcnB03A%%0|H~ zSDSTy*{*F>N-LFG@v8RUtk>2syz*zEQa1~w>-=7=H5*B^lG$it7_OVoa@a;=txq2Si*{zx`DUvi{qXQe!UZt>7L`# zxYgXFI~~Yy#^j&9hx0xdC?-6zzitC|Zomt6mGAZ*NQNBQj6T0$pjVj9A)E|90tiDl zte16Oax)=meozFOf!5oX7O#e~LpPT`)Xnoc2&(k6I^_rcvanh<=KMh3=ZXH?Z=F^D ze?rqq;&Hy!57}51Zyx*Jgc6>WUI4_&Jt-!+`Bge$v5*sIBDR!`o*e{lJdPt`?nvUb! zNgN}&!l@f-CI~Ek5-mGfCVrEa0ITJSd7dv!TM;jxS+88SbO+*v6ANIDL7U*UJ>F6R_7DI+--|t=6RPW=fQK zAx>aWUb=3$RzuWpwy*|)>66JHLeXY2X+xG>upFZz!F3DX5YH1|IHgYfn^WrM7fz`! zf8mt+qc5CN@cX=W;fL@4UH^Ud3#Zh_zi^888~CXd%cUom4|B^8A5xK`aFHmYkTu2} zQAi%YK_|@9P>keL|CL30x^)z~p65b*#v(rTS5zRPBmQ?C@?F%W9aT(%PPnOntYHfe3;(nA+7;p1wZR?2ISP`OcCeEji8 zo>;s{#m$SC9=S+c&DF)n2mX%@UNgRr4ty^@Gh<=FAuU3%K-hXIjETU3VyTb?&rs)@yNF0d+u#989e zh^R#`(H@^xhO8y(fQXD!v{`7bQ;}CKJVxPQr`1t@TifBmm2H?GiDdjqW>oM{l1wrl zqx(V)ixXR3%e5^&zSmKPR#!WbwNfD8x2iSr1N=rIe4@}QHt@S);t`um8qMn|3o)a6t*C?KEO zJd#z3AY_L^pdDJID%Ds@4-|}!dqP1JE^+}aqJTz5#tqh|6@`l^wvn(pkD76NvH1+e zI`w2kZPGKa+44$vvGhDqOs`OPC=Vqrm;Nh@ThCK}q|CNBEO|b2&#d}|duG+I-7~9x zTs>;2yYUkcr)qMY~ z>fAf4{Cj8B58pehe&pU+^|SZRs!!iLtNz8kv+CFGomGEu@2vXLy_5Mf;lIJZ9PWl) znRpYvbYzh}_5uI>cJ^m=`UkCu(?39(qA-Z{?hL+@t%8vU=|^$c3Op~{UxuCIh8F%(Ds?s=T}aB@f6W#PKm3c7#UWtScT`Md{$^D zEpOnvPDfNFKlR(8>+kZ&WzHsGy?Q&2wQ`-~-Z!-}h4|UjKRET|)DS#kYsLxqn-p^z zS(xGYUF-P`p$&O+$Q+7`+=0_d;CCD@YB(DO+G$%W7#ES!hv_1{Z|dQx64{($je-;k z;fu7KQhSy5(y$%hS}AdiUpe(#r~dJ&Up@5$r=$f4-p`!+)l*Xcl!<{d{?$_i=yH{I z0;?$X(|ONm2|f3oY<@fM3E$Ir57Be)d4=7bfZ;=HwNCu2=Uh;1Q%Sec^Q=)5enN?S z?;QE)E-hshO87M!@+&A>3OHNJDmSSWcC4+!XerA#Fm`C2pli~h9hM0qo_~($;$1l2 zX+>7?c}^WQk?kFjgbgsiu)fJwv}0{n1nV>O(y_X4?OXLNY8_c?D~!#hGR4#!!ss$4 z$T|_($|_yum=_t}Xvr=QwItiI3ew{TV}kU04v|8!9c#su-_)bH4v!Lhmj>RIEqGV9 zbi93Q;~LqoSSw9(JgX=@;(xpQr|!;{2WseF-u*LoOD#$2j%Tga$?>hi8vkzLcV(O7 zChg4et)h%)@WEJ_w0FlJE`wy;%Em#e%erOgG<}q@<6G-jxlf697}S*GTV+#zC1dcY z; zDPYtYM=Qn$(3?=h5ISYoLuDMFKVRTJo2574`i0D)&ob%Icxc!u#9pAyGQ7U zyGK^FLT!bX3hGA32o8}{+BO<`+j#{8p*T;g9jEQsj(j$?Gw}7$5cpT4=nu`U(-;Sn zGWiUDwfB)oN1=-#1alh3uF*D!mW2^ATPsZpsKfI7xZ?o%x{hO&D~t#5zkedBbznwI z_=D7^%g5FMU4Izi;xR$1m`)P1%*-F8w7=rN<|p$wO4gSta~A2EqGXoqJNcMnZk zI4RU(mb;Li@G?D{=2bDw%cSU4{q9Cqxj}A>F5$*#()=rp$?XHV#*X|ZWtPm`QVZ?@ z+Q3W7dS;V8N^?5?^}l-JuU@2&QLtQE{uurC@~4);hf6rhp!!!!99~*3Ew3+sj6Sve zspZdb96*rvC)!iin)IBDT<&{xl@94S`oGR4)JQo2CvyM!)PHZ!x+*jM2c{lB#_N6C z)T2YZ-kxWzNlQ*fwF0R$$9rAtDt5q-mb5bDQ~0|VblJ?)Q<>iOq8_7OWZxr}XwK7h zGO0m%I^uWm8Uf{b6`LoY--z~j659)`tAo|UyMH~~&Px9pU!{NjxnI8j*NOImJ>93~ z=!sJoPJJw;F)8u6QyZtAIQ2A#Nc%&`Udo5xcWjlgI_GQ@LY_sp8FCSuoqaB40res&t^;RC;01Mo&ASrKX>+%XNi8|>~Ed@ z+}Xjm7h9DkdHYu78g&&9S>3j^u}0la2!0Rs|J_r?p_bEi!Dt{vTIgMO(OrK+zc$nt z2W=GXH)*+d-G#oqM|a%?&Ea_O?pYhcC1$z*;rT6Dr3~h{hq-*7oO)!6sOu#&z=@gr zXI5vVl%?gKn7K5wF>`4~+5qVoaK#_{F4l(d{wq`WO=W8cIrzs@zc3}R((}8#Iz*qw zS|_68Ew4%e`wm)NH?lT_-^6H$y1CAyQj=V=NwMsHH?}sK)IG8`2IK8_rTrR|0N*{S z&v%`>aPHi>{JC@I?md@3M|97*#ODL&md`zYj>uQO)!f!gImVD3&w#N@8)>~X=)-qm zjGelBQNQ~;yzyp7m~Y@zE95&?b(4J0Ds1C-#gtzeJAIF%;8%NuU_1RNfRpAy#%rRW zh4l^S02cw;vSlCe`akGeS4|4I%!6pq8Xq3&FThb8S;zJi+C)!To6@#`d+p@h$>Urf zc)p}{&YdisES@ZJ-(NfV%*p@tBy^MatU{G~9@a*^$SSN3#>8>>go{it_F`*Aa*6%6 zYz}*|wb_(kDXuWE>NUZgtbr3OVL!<``bd^<3Hw+Wh6h$%RwQU8vbG?KxD28ehKR^U zdGK#`EQ=geGM6Cc;v~JO6JZ{VT&r?bLVtWlQkAb?nvpdz(T~r3cIG!`h<<72^E3a` z3{m9T*tm)ItcHd}eg6^ttD(IAQM&Gw^<>hf>OfpI)qYJ)yb2+pBF&N!BY{S%HyzxAEZ)_&-5gL0G z^Y1=Z4*V-M9PL{TlcED;Bc(IjCO|v5I*%#?+7GPe^AvMkBK&Wj{)N-Oby}bV%YSqF zmrwuJ>0dtmxzjS{kd8x{5TcmbP+$P;i8D#rB<1z~)aS&RN6yThDV!mC|CuXi9^kjQ zZ8c>l@Rz6l$y9F2oEmM37>ie?VAtDfuBYit56wj%;;-V_>9gx+iArZbbawr0@)f&S z1K_twvD@a4J*%nrmSl%R#$ZtVpXuM~5mxiXr09T0)&ERb!x6>2@``!s8;4l&!@h;X zde`C*Q+UjE702jXzdQ8=&m~Jd-?CqNjDqyC>pO>z=qtR#)~A=DZMBWvBjI<1zai@H zp88|U$L>p!avPus5{KhcSGY*sk ze*77(LBv4Jg8=Jq&&cEN_-#1TQrdJvERfc_) zVP9p~R~hzIhJBS`UuD==8TM6%eT`vXW7yXi_BDomjbUG7*w+~LHHLkSVP9j|*BSP8 zhJBr3UuW3Y8TNICeVt)nXV}*n_H~ARgJIub*f$vV4TgP#Vc%fbHyHK}hJAx!-(c9U zGVE6w_Nxs0Rfhd4!+w=vzsj&*W!SGW>{l7~YYh7}hW#4DevM(j#;{*w*sn3{*BJI| z4Er^P{W`;bongPuuwQ4`uQTk|8TRW8`*nu>I>UaQVZXt!-(c8pFzh!N_8ScQ4Tk*& z!+wKdzrnEIVAwYq_DzO;lVRUv*f$yWO@@7wVc%rfHyQTLlW(3xE51(gN73SUxGy;L zrw+cPpGaGj9)R|b)}O%Ss7vo|=g6i%b;kK2_ByTX=4gXX)^pULe{+O*dYQVxI(#L!#A+O1va?A1{c`i0vlXl`~7R64Zpw!7ueuRSqL_K0~=gmg9~hMfekLO z{W#NxUtog^Y;b`Mu9U7|!#A+O1va?A1{c`6&w@7m0vlXlg9~hMfekKbg9~hMfekLO z!3DOvnKt|a8(d(63v6(K4KA?31va?A1{c`i0^1(bhF@TV3v6(K4KA?31va?A1{c`i z0vlXldy#3wFR;M{Hn_kB7uete8(d(63v6(K4epB&rJ)=tJujfm%N&87Iq3oDLC0qY zo4Fz3i4gZzcoxQBl35~)8$RVBAEb{<{+J^$8ZXi#^zgAUNal#2KD$Iee|CxCF;4(i z=*nq6aF8!NKX>+*&VKSN=D@#q_J2P6xwD9$}e^>ao$iF52HTidyf7keToqx;cE>nSF3k+Le*aE{A7`DK$1%@p!Y=L1547{D$3|nN_BEyy#w#2X{ zhAlB{iD63&TVmJ}!r! zu&WHa%CM^pyUMVu47kPZjurmKnCpuw{lVGi;e*%M4p)*z&pZIcdK(+oi9utemuV@z3_X zqz_DPrD*AFeu{QaU#9ly%hWl2ncUNt>7~<`Y47x9@=jl-?&-_qpT0~1$B~$b+dhrh z?bC?gJ`ITWX~48k1FC%*aP8B8Y@Y^fhhaMm+hN!a!*&?9!>}EO?J#VIVLJ@#GOWw6 zF2lME>oTm%ur9;84C^wi%djso>`M&$62rd4urD#}OAPxG!@k6@FEQ*(47aPJ>oKgyuw91jGHjP&yA0c9 z*e=6%8Me!?U54#4tk1AM!}<*CGpx_BKEwJ9>ocs+us*{E3>z?Pz_0hdpUWz6j|e@V}Syewv%Q8?I;U8c)an7TH#HudCGZR#>zo~ll* zOkJ6JXzI$;Wx6=^$kfwQk4!zLL-SLYrmjt`=&zNjr>B;uF6pl|j+=a4o_c)hDIHSa zkmT!<##zvzk4{~gx|HGsT!ATgYHE23=UbQQp{b{*ic=4Be4Z4c-v?$GY<)Ee!qcp0 z6n8cECkeENjFs%BH>s5*!1$B~87q}$KI(6b>(-z%tV<^-5gV;W5 z5@{5Jjx+iUu8y^xIIDj^>uwOGZevxu@$+`&ds#l$i4URG)q=S#C!B-EQ?8-(2Aq~O z7J=L2xAwSZ#y`LhyAGT{_U_*uq6EB`!e=Dzha`xTkGDixT7G|x=u`c`?K>^wp)Aa& z@Vg0uF=aRcGV~<+iMq~G2)iQ$Xw z1P!e?Wr2<79_yxy=z#Z;*)n=A%AXfY&R##i08L6!9!hpEM4e-noy9CPn+rSm@Q#>> zisK`inbx=HvNm-ka&pUL@-snq^HWdVAgaczQ8Do2Fz{Gs?`ositXOMi)2f@Bg?huZ zHf!Z-Gox~?$F@ii`Jz_ignODF`bc!t^<01N3SRjZt#O6QetcM|UcD;?xuiiz$A(-# z^yDRGzo3_R$@BLpu1>3|>a^OePOImt)9O3)_kUNNR&Hb{eW4cmS`B4rY;xhU8jJcW zkjUz#6YpBjVa3F_+`4EMA|uz}QHQT-id`Ck*$IO^$6wqktuBnjVH+`Je>Vub3M!K( zrUB*031S8+xuMgFgYXC-5(*ht9`7~zOKhM_RGszaMenvB+n&efcW4EO|ZCi&1wqJ@t-?RM(W1|&xd;QokRtt@$RopHay@0PREg8n9=fHGw z=&(+;xZ_69CdyR3_k1B~yNyTj|J1H~1XVoxZClE@rT<>UUT5BF}1%B-MeFuy6cY1EeAcMKR zbzqBHVcd0!prI=c-4<>g_n^8sirm1DjDwEb>KLKp!@5@pGWwNcgUd2Wl_CDW-yA3Jo% z!z5ov`Fuh8KwG+3(-SFTnz(BXa)2bGpz9=RvoKsnfiD`7S+gEgl0%XCfgQ#D-Q9ei zO#+AtJg_dzzAS)`^8;w6+uSaR>T@66$%B@Ffks%-<_^{G+)uJ96pSY`5TokS(WjtJ zeSmW`MijOvpU)!9=K;gj;0OL3@4I2(^L6@t6}qfFPHc4=_xXVxM7yr%==AS1;(q8yY}Sp3 z1ns{xZ5YMCkNRHBTD!sgJ{TG8K9uaEp>%`L0gcM_B17%KnyFBTVvL{^)G#`6+{<6M zFc>@Z>tesX=sWQRHoCmjiM!r+^XnpDq0$AGH}9xSk|H=>IxdWfd(kx6ZYWCf*`Qgg zgYU$S0Baj$FKA&9Bi@TwS_k$LHz|fo`rw1P#)AT|D-clP_yQ$6FbTm$1Gx^;39Ru*i7@C5@(9xNBS^4Wat zAPD@L-*(VdWw=C)8$?Uap+kh6xh*koD7=)~89b?d;^TF5gh+lHQ9%%3uoSn>Ju#;)tz)-G=P0d}xH(Hb0B zy*GM}))OImqXxcESH~AeHJ`4X371EQ^;5}Q5C@rwMyJ9UlLaLh{6Qh2{4^CZKgB_2 zQn@{Rvc7QqeG8Y$Q+U0Ox?Mh`{$UFpr82Vk8YXq@lcYadl2BFym0WjRv?vHYyk%8h zytVxYE=`QH*^Fegf1pk1dYD|LLr;>wWGKrb*6KwDYRJYsph&aeS_iu@;+hI+8c~0D z*FEI$^9#nVXls99VXzRjLHPWgMx$A1ZZ$0Ei0`>J&&AH68*3fEi!eXT zYO)Vp-wqDM0+IAnOtuHEKLo`(w~NZ-6`6VH#@a@xf!GU-xfR$BK$~o3Ma51MCE+u2 zCbj5@+SFs|{CC*iP7l@x#NJM7^cj4Fd1!Q&nMfC#yBT68Y*)C@i@%JThk+JR<;zB= zl9EaaMwga+B0h|uyUxDyVE<_Z7}PPxD$z9^hTVsOaj4DihgjY5>e34WZA7-E`jL|+ z*b9Re@GM?QNErCo2fDaX*L|!VjLmY%GM_6q&CK;Xow`-&@Wx#;- zGkoaOhq4hnZ8g0%HyTf`PJ(LER>4!Yl5GLI zFAGPkEm#Xz$R@B`R?qD@+A@HV>v1{lVt>~*S{)Y+)i&59Dwiso_L+M46i5_q#g|a=2i`ttB5(M?3hV!2P$H<@Mu4*S}bShVaeblx!x5lcUmy_VSE@Rz?$zkT##@i5n+t@4@ zYa3Q^qf{wZP1+9K*x7V@PHo=_J=N?K?oHh(Kj;4`F#}cX6YB=5+3#-#%gJPL6W^CNiNXHUdEkViFSXiCTt{n{}Gd3>U zyBLl(HlD`Wu@gP}w?Sz5vzLIE**Te9+ zo73u<|9e{f&dq7{Bd<=Yi?2zL9HSk&rUo-DCKc?A1iP@i9)w5C!2(*;^rb^4CKtWo zjP@rq=X!S-o!IoLF10A1cl>@Aiu^DrI1#ViZpmI@#<8+1ApQ=lo~sw%;J@C^`jYkU zSaM5XS;@D*Dhg7njzpY-e$-1k(VI#boeOBPo_aU_OtnN)-2)vL5%KpXafOHHr0n z=Xv6u1D05Cn6(aC5!9U?fFCnDY9Gfi*m%{ZX(+Y-asj!zkh3rB+7|{?Z4*sfh&x zW<$Y;@sP*^a>~Yu-%dX|k~i7tF>J?o9Xl6MX4YkBKFLkMt6PuJyq0Z|7c+?NCIAfJI{8N23A;`$cUl z2Y#2b06kH+FaE9%b8*>?5&aCtpKsni#2t*U7>1c@5Rx6yd3;VohV9{vC3xgXj;4So z9hHDDpNCb!cz-vV)9z5Z$#V;M7k0)*Y*Fa(WbkD6Pe+m$ZecJ~f+&m#!`lgCs$}TV z_+_{rpMupei(B<_^LloxR-5F@xQrs%zt9^Z=`c9)xkdTd{oWvVFnB+%h1~*vHxB!( zBspV*{MZiDt>Bft??zeZfid&6SQGdpXtWHy$Z_^E1f+oaN#Mt{FIIugo7@F~X)TNjX$)cR-kkY~c8~s@MF`Ks=iH|$7v5udk7Vc|m7!$gK8DzqiMC5eA z!)@!sIyn%+NiCn9@=0xkEg)As)L<`YX?i*r;UxLxz8i|=TaK>$7F((2!?yGsa%oy5 z8u+X&^_AolENeM(43|BPjss));$x3Jwluv83j9dp_8AG75V_9IQClX3Iy!+ z;q;}fO-kn?8I@t04~toz9`KQ#Y*8+{kc;@7w)--4z&q}~lgDunY`tTF?Ae!%4)}O% z;dEbSJ?_UMz>XzHNKy`9UC&s~1(aL9_~>)F<;M^4C*yh4>5`l&CKi{4hnCGaiPL?# z@AMrVt?NXQYCA^OFLJu7*9k(lc{S;I)}K{4M19_$RegU}!S2Ej__GTBu)FZz`;&EV z;$i-dx0Lx!e*{06pxA06jIv?KFOiqBt_6&K_OrAfF3|ri( zhPGcB3G=K-tNXIm@`A{j>%PoPW3s<)4JucHMmE=n$K6z*E_S<4)N@)eU*yM}?QTDI z4q2q)PFOU~ziu>X!r9$pDX`(>lTkR6`lLtanb(U)!wE!g+hGmjwzu*^`!BE$lejPBKazj(MS3BB1rE`8|51dv{{@`i#b3ZJ9N!a)N@E}g&_f}ote5){T zC;rnvd|LhD4@sJicHa)Zw+j2&A3Ux8?hl?;qOo0`>Q;pswRLJVpCc20wI-R>XQ@!U zN-JiCcngMB8nmNYdr?od99nNutahlf3Tqx<8t7V+_MMOg4i^!$x=PrjTHJLUn~G55 z8iuZFJBzZErACb!WhzxnDitqMsd$M>#fPX=e3+_*tJJt&C9}Cg#X^Nt@bQRuci!#*mCozRW;sOR+~LB)&} zb&h%+$Jfqc*Y*1mQgj2GcKe>U7{vihQ>&;$QQ*0DKcZKhFrdJ9C_V@X8;1_<2K|tB z-F=55_mCn?MC5=7@=*h=zzcj#?ykIfP82Od%1mlqr?a&u~jYTrpBaM2@WT??&#=pCh`q|J^2C3%S~@58ZU*RvfenH9)HQQcg# zmJf4>{8FuL6q?0#3Y|7i1?Lj6Ch*Q(6}LJZYo$=yEHug0+;Hf$`<}vyR}Ur(VWt&G z&0?)mDKyPA9<+_a7)RT1JO|QtIvN|$N|0gVRjt?wjh3gPNTQgHVqw#yIMjl++zV0k z#@vm0iPG3wshevl8pL2(HwViHY4Q?rrH)RmD={+WUNByq=ecJ`d01;mi9piZgzhkG zx^^5`=7I3%a2%jA8P&Mpl|pHyo)Q!~JtuZ~g5`s%%+?2AFq2^Eex`NfAN*nQ=>I$LZ-%jx#wBV#V=@63rJBj zS_;C^9h`vq_Zf?e#!=8Wc7wie8_L+}w>fVxlzn&IB;N$x9=b>>P#vP4*&uF)>DxLh? zpgK9!CYK_LDWoI1K^vr~rFH9KakE4vGHI0xv_%!Z4Tf6_$KkdpVttM`pp93#9*$xH zL-tvWJ?98=ey*$`L#ORVad<>UKGQg0J-$Q@s?jPnX`2dEXWI*#Y*k~IT=G~0YL^tX z$)QbB6tk|`;TRR26VR|31`w+#cU9Zjgfu0ydfVJSxrS1~$6RkxJbMauzO)piN6%r9Ku2hD58LNDW)5=t#u>^bii0pOJOGM zx0;8>RuXc|waVG2z z@g8&AiNij&9kjV}K&LVikdKdI)!O3|KHjD8v)s2~JG)D4^*dU^jyKW$GiOxt_qj7? z)c-4VhsWgn2{4MRv-?{+O~^Kz--P2;zInFFuMGVF1CF zeORDF@<+ywVl&hp!6O#2&eG*m4}( z8Q81W1-0iKaS`Mq3c_2XuCco1t>2z;z6o~ zx-6OEz_p!S+#Al>6t=o{9`z5Sw0suGD{}Fc3txGo;CTk_4@H$uf+jfdosiOaTxvsING<|Nv@m8t{0mIM65k#f z9vb+WFutV^k3TKtkI3{c@K&`SvynfEC)ISjHDs+*k@-fsB~rO()tv}GEa zkZk%4;KPuur11@sedQ%+GJCjZK5+lZGw;3s{`=qi-uEU52Jo=8iQFZCw@X=`A$Y47 zx&dS;Av}SZOm?jW6HK@b!quUKPij9GIziXD&wnv3If%Hc% z(ieetRm;<6OY6py{E0wApM7KGNA$)#t2)T%bCJB{Y`nI^pxlg#&gF8884C2HcMSnEnxS%-h+!Z<^3Ch_K>I;;WslA7 zG$*?JzgcjG*TV;&J7q4-JfP>NTNVV;$KhJbyEAyXzB0IjQgMBVtT%C~U)Jq3_Ui%Ss#qRc;wg%0f z$>!%0bmy>H?zs_v2<^Gup2dZOnS$?g)7B#O4y?A*3L+zSD3@m^%!rks9r#<36K)%G zx$Ol5en6$fj z!h(T}xew3dB&(u}ohp&4^NyqwayvsNoCwRv-axAac9{$=^oK67Rt-75twgZiSBaEv z0{yrH8{~3Eys27ys*NVnqs2vI$7!Q8xi%}nSX^ABYLM*lM-+E^k}tXTk&6HVl@LP^ zIxXEBfSEU_7qJBFAE>(>CR3n+R)e=|y^5^+s-+cf-yjWpw{N=LiJMiK>|iQxp&C7~w4( zZt-x!qY#7zI!@@uSbs|OjTQG0c%4^VN{w9mfd$@%wRjMW_?~4H9gL@d_wNJ@b&}89 z&Q8A#Iv_$mnDORiJ%XYfdNS~D85WP#tX(y$)@HqYtz0qJ%!U*O%1o%vWQ!qINOIpv=c-u1MqGlIz>c~i8xI}XNU-LNsvc^e84#(`c@*s zBI$1s(ff$#{Y3O_MD*=MbPo}IClP&+h-Qfhlihtp^xZ=xBhQ5VWo8e_rikGT=H29x z`px#@w^qq4Keg|K?yerpjuj~8fI(A1{A^QYcr?#Uw7FzMc&IKCPjM55Y#5&B4V_qu zB>^0RP2XQ&>)$+KMNYWygvUUUN|NI6qsvb&YiA}sY1+DLCTsjLvOM6Q-VXoI{lhuL zm7Lh}W6KV@GV6{IkQ72vdJH$jH6#@`ECHJ9(_+r+Q)BVsq73OMEKCk^9a}c5j7GU+ zJSoHKXar%EBm&V#s82pybjNuKPFH%ohqJFwpm6qd<*$Rc>o{J|3Hh?C=yj6q0vQeG zWbQU{hx5$%KtV`7_GJBDXnDe!LVc2L7g+5M^e7!TcA@3WMXr5u9uv@n@E~;CuCKgX z#fe<|(yhXk-F1DAAUw)gI*y{)=_XiK-7tz*L&qt!WO}^)UDWaPOWr3v1L5nE*(lb_ zo6TDNykS8O;VAGOE3%VzRVWtCM#I`DG_Gd4(m2^|?hq|$#@xTOFn8)`QSOymt&%}C z_TlkC@6XIxg zOlmBI&^CNVU7!}VDB!*ukA*@yO={83*igZVI4$0X6+UQO$p{`;p>wFlBLplMMtoWh zyIR=q9aokp55-n^BnF_y#Rh)ZcEf2rN)B;wk}K!m;~)~+2QWAp?(!M=acY2n7-vJD zFynk(LRx$t9gR&5@T2twJFqzU7wQIk-s7kRe6}6p93Nxqt#WuA2Bn9#2us}9FCUkZ zlnZEU(H`|D)DCb%k^$u{HWnx2YEXwcWn0e;<6;6|i7kuwsXaD^&{d#5+bzBo?b&t! zYt3j^XbnEs?yd7(Wc#*|9DrqL^d^^fZ_x))2I!|~b$6Q2Ew;T3iG{tfIYn6@59r+m zrsUQ%Bag5fjFyNpgxk)XU`#4+j0J#1Ua#@_O8=Jazf4`~>3)mSlo4?pcB!judtD=s z0=BK|jfFs-n-sEy2+Gpd(6**hMk=(o$^8p;0m%?pryrk+&^6i*x48xH>HZ8##p5{i1enYX1-XjQBTyM&f@=yUgdd zj(GL<%`70RHAsdt@3iK`H5}j`-xty>l4t>)uy@39`dX_@svhJW-@{}TBj9p#QK48d za)%4XNTL(={|5U;N&d7p5*#aK1-Y`ySVw}SoQi=DG0b{TGibFg7FOzgry z_nwhEl+7jH0JS1}%+dpbE7%_8(CoV7Hm7p^L?<7%Nua+j)%Yh`zIiuQ?w{h;6ZTSB zAV^gF-0}hcDA$Wp@h7>2oA8mm(VuXU#~;9B#RUszG1%sHmFJ%$_($O1BP=88LcB8-t70@lpxQwk z__%pSyPd@=IO7tsp?p{C+PHppS_4+@jHI(Y?@V1)&{L zmk;#15n3oTzgVGzDRRls8^m0xZrfKLKyVM)o{;IJ13n-lz1x*2<RLL{TJhQhgm-I|h@K%2l(~rlu#%&^Hy_;fp}jHo!rR-{BH-bF2adV`>9T$d zNpaU}kH^elTnUlW4InI#B{k@YmU!UP@Ae33fSFi{Qoh}wC-oLN-JSk!MrHCHwjYfK zMyK|iqg3=*&iZs9wEYak&iGB_c5d}d+D#ZI;qVU2YsHX*II#IhZ{h<38$&9Guv!$r ztoXsi6WTj0-&;O6(jELNDc(7?sYW~W5}${}d}|CEaqtHVaZqHL=($Oa$p|}$9T(n7 zy1~1La(;w8R@`4(p(@p=!V)D{sX;f`CLMl-P z8AhU<*!9~>$Mgh0nA?63{63`PM&pXEvTfn77ZO!4kf%9NJ}k5_T!*=(^I#rX);5W! zRmN!D595L$(?DB(SM{#B&Owb;7eg?q2n8wY%C|lK1P2X+9W05EV8>NO&<>3hx!w@= zRNKViEo=4vfBwJl;4A{SL2>?u-FUe8#R(=(B5{8g`}l*NXbhc~gmit|yy7U2<9 zlv?@Q?YM7A?>sAPwCnX z*mV#4JuB*TBa8KBThOMBnR(I_M`I!KMm0{AscUmzY%VObhdw$`@_lm6=X3^q&VaSq z>F4rtam=#Hq@!&j#5IDoWF?dmfL16bznLSeRh**{@rsuxhj=W*)Gz? zvhYI*C8hwq2Lsg(`8|nflAR3NqJ20C%DQ=P|-_{HJy<}^O(|l+9B5&xSI}Uc>(hTVS z;kH??Uvl$Ljzrw{zM3FZnR)K8e@=Y3f4XgKM`C8u-8XXEI5fhZQv~6>-GFZ=>BxgZ zOO`{Erw|Pym77>_VKC|FX~j!Y5-;5YNz2ELx(*B`9H(z^%hA>v zA^LAm__2ZjJi38}4wF=HTBZ-k1x-X)o)nnvxFB9?BRS3lei^x}%$P7jXr?YlUlTl& z9-aSWu(=)LWBJc&vo-oWF3zzn3Ez&OCldJ65mVQ0dSzBllC=KC@eklfhgJSQc7b?2 zR!lU;+<8=quk`v}`^_V>^Yh}2PaXO&w4n-?TrjY3i^S9<>S>_(K7`%}9zesO6=C0H zF#h`NhxMHb+qm>`hyj!B5wPZUE9&nc3hsLGtr5OMrOl$MmZ)LPMOd?8_{`b!3x=m6 zoGtLBEQaNa3*rZ**LQvl@EVrJs<)>I-tLmzB>4Qj3>F%C=#;Msf&&MA-?SiLm)uF}yIy7E$1PI3$BACYa_NgO2zdXaJMO78^C8!!{FkUEhs5 z1FJ#9v|Zo>!Gy*^WG-q}o1W$y94%KG7?maCpo7J|y#U?<8EJfaMm_TLGwSz#Zbtp- zr)QM&b2I9x&&;Ua&(A;uTNesGkakP;Vkj2U^@OveKI_E5iI`yrtoYuT!ycnP{>9vn z!p`WA(Q27=?O=bK+bWE33^jUyrdq3{nt_=oCS9+vn-RI~L@&D!;c6&B;}Zc`^LWSQ z<%Rpgqz=2x`nHxnl;doq_rdfwiyT;UP_mZ<<2BseEvr#pE7mqPwyNe(#A8T;aAM@7 z48Z0}DP>A%!Eocqf=qx-X#4#h^TBMdM$XgG>p%}I8?ojrCbj%v*JuZ*a&@4NaF(Y} zK@&?QY2V`EKnrg%qEy8`Bf>#0&~Q4cwYQX^f~XqA>5zaJk=ur`XBZ1zG6tj%QX}a% zNn|UDt^0D4gOs`j1EzSB;?MTpo~-we<%jG5_fHRkFg(&WU^O-wvr++oo)co2cWiQC z$C~?F@@CW>#m2_@Sbo9i9`QjcnkuTPd&Eq-d}2(GIzb4PDKHs>U5HHIfPjYaA-2|p zgLQ5)u)~#Ms*_WEW+iPMAUykUi4SFj&8#uiM7zH^qaOIp8TDhoF{9RhL);U;F{A$e zZ_cQ{^_w&5K!@q+C^;2o+S4&c_iJ7M&_*bR!BDYmcuP9LXnY}x$&~>a@u3xnqYtMD z=>?b^(^3qcC&p)vU~P;=1=1FfGm~=Q-BhTLiH$NF$YK!&B8WCD47Wa+Y$bOrssY`6 zVlzySc<|+sJ57k&J{EJ(ca?l>uWr-^)-aGxYBz)%fHt9#^`u6#T&Y-vVzYeBe9AD^ zgM$ZciJ5n@!(GS9Je_+=+*VY0x6N(PAZ)NW999|K^J$p2CG00;VdOgf!_J#09_pU zyku02;0(^u7*2Pwk(y*yzT>p^n65bx^zv;=N0+bWfUF=KkYsBF3wi;S++}1&+~MY= z$-3n;2OVegP-Ai6vem41sJb*qKK02Xk5GFN?uPS?U2CVmOZ3PWXVh>1yBQUHaYlXW z4*n4Lc7Nud%&33)#ToV9KfHb11lPy@SmJ*1k7v|R{)xPQUb`Rv!x`27qdUiS-xp^X zPl9`#yQkAb*cZMuqwdXo|0A8&`j-Z2{>YbRR9=_WfAz%~^^14#H!j^#zsjG?s9*o$ zjJoG7l+_PtTL0{iXVlN?GWtKY`(OXzjPl=NSpm-|UD@xu{%jEbyI-17AIil4`kzWz zEmKy1=Swqcpl{3I+atJ(6B6X_#WI^{F_jym0kv8C7BsJa>Oah=fAr@w>d*hfjQZeT z-u@49Z}<1aU(TqlznoD&`TTlx z*k26r{pw%Ls2|p80q02_b|!=4`oEu1pZ&^=`X_%eqkictGwOf1gFnQ*-QOp_GNXR< zD>LecH16BQNBGGv5Ac3WzrUj4fAh;T>gBh93+dapiT^?-y#AFLRnC0BOXux;-SLhLr31(~MKjnT8K~W1mCekl_IWFWU?u&@cX$uE zrw)9qHc^@uOqV7*L0J!07EKV?*T+<8;FCsf>4`^{mm_R2?We$6Z)vd~vf*5q*Ty1k zV5BD(Eln3$zqE*aWBtGH7~9&sv+9ZIT^yhCf&~of(lpd$vV|V5(N@>y>b(yGlU7eB zih8jcE!ehEteb_VX|2@F!qvid;kvb2uWeY*)K<`rF#TGp*JI6ZSOkgk9nQ}7JZT+- z4Zf`l1IuzHT_|MLFQ9F(qQw$HFV`o>!QH=IQar;$pu{4IF4fF?>>8^RQUJEE6=1YH<-UnW)KtC4mFj+SB5v=|&j5_hFeM z68Uy)#*BNwbgBJ(o)6fDR}9%J2(nqPmlD}i>$l6F0$vlF-CNcvWs;TmVL>GAH$G?b z2vZ5I$h>dPN#*mmu_S+swDet{+aG-BC!2$w6LwTDvSb9DT-dIUbwzgPd~y!ou70&F zed+i)nY2vwVG4%?#4yp>}3y<$52ItWi2n`d&$dCuj`|h&cCGxTHmpt;J%G91F6;;87kAk zHW$&{XmSU>jrA0UMHuSlD-;>OL`T04+1{}D^k93#k|7swC9~12*RJDrqjrtG8s+EN zVNk7bLVWpBpshg#GVOz&sc66)Uv{V|jMVtY0^)rH0vPlxtN)dUmVKaX6^9X|ktTFEq@Rt83K~CwIM3tW|3D z;yT-C*xs;)Q8dj7F*(`3=8?`z(wGc*UaWdxw=t!u3TNM z!GjB@T$Dn9JDlgL`CPM9St~Xxh}_t$)hcGa(JVBjmQWMrrn!N@4YSbLs+-AY$*h>o z^y}JH^Ln$Egh65b;EStWYG@5DKwcYWbG_EQYI3Vt%YJYbmFk7HgzRE%1NJ#m?D#A; z%hffIB{i~HYjEL?^)$J9H*4D_7iqD!dA(F<762_J|4ePGUM+ADREvXVT`guBcC}b6 zREkNnt`^tJ&8FGlHdQUAO|V+bR?V8pg{$keTI9-1dPuccS=nkfYiLm18dHxgZZPR* zX{A!ETm`k&Vto`udn6!9cm`x+6hwO@AW3)%a@D-PTCPjhuA0{q@~)cK1q8JVYD#9I zl)N{tH!@M>OJbu}X@JJ{Mi%C(dA(AQWXjcYvs5lrYFwo_#wcX^Wcr0(!%43K2Gg-ZyKTLI(mGX2mRWmEkKP%d9rddKre9&>)%>9t1WTYb&+qvOZ=> zMvx>%rQB$aL|JKaMJ6#y70Hf9DTJ;_;iaCF3hEfVy)C_+KQvDOANqsf?j*L(eT6rE;?@)du8+MzJ6x=tilG zv7=BIYdZqDW;QvI1Zl%e8%wEP+gvSIOrDuI_0_uBSO@jo0=77Hj2rmeEHq?3D^^UY z%&lsP2iv+?Et&PzT79Fy5b|BXOb0JUud`jOls8vug*p#S7-ok&csv>M(an6w4};N= zN1<`GxFTs)3mba6z+_fjDXtgF+&FdD8G_>xw`y*07Alx$C6oMG9vW74xJ+YA`Ctg& zG^^X?YTAC~lN(C`lT*0{{w>Em)NaDpCeJcmq)YS=Jxq_#qx2X(PEWArkQUjzin{%C z*Ufj`y!+qKd-HGHeBaIY-~6_l z-+uE0H}AQ5@6GSH`JFdEcyspVcil8@eu(b7`Q3Cs<>&!=kmhKf&foknEzlw@-MlfD zzWmM0^pTrS(v_P}-F%t~v_eH~VQ7uksZ7t%RjSYi-xk=UXQ|Fw@3-h0ZPRmfot~!` z=mxz=A0>;vXDGLA*2DA??U6@a@+qJmz5M^O_a<;rR$l|~K~obIblfvxurM@1P(c`B zo@ZD@luZ^9wZSyy!u%idH@dgs^)zaz7a2Ini@ZL_i^L~Ub!60_KF&UvW^H$R8MZt22=E<%v0)nP|VdP01^%v5~g zLLfaMo=*1BnwW^Mj5H1P)kLRJ@3YEyezPJ*>cXVbtzS8632hn#nwWcPpP@2TF zBy`S*WADtgcp54rg(jVmoIeba}a zeNcv!d}>-sUv$YzNRH`;AE{Ys_{vOA3*qk`_)f!VKJ+8TydpCsAkzTypTfW*gAEe6 z!ZlQRZ7HG*v59DX&f&(i08-U8( zbP!!+<=4B@^?9fOj;WGms&%4?4kc~d^o5j_2cj(~OPn%vfTn<03K^>%NH?BPr;jC1 zZ?q{Bx~JgYfR5@1f^-y7pw}t!*boIfN)8ZXGTIErBGj^pdouJqT(6V7l>s(evC?2P z7ug(9n477{MjbI5zA3ARnAA+l)Tg9MogBLYKsj0{w|)%|u6>tAqDl}A7QK!uUc-$~ z$tC*hgrIkLUqRNM$T;ESBeaOiwAA<6IS6BLw zD^*PY_=ZX!@}P?8AGcTfkj58$2+IB4Q|UumU+^I)|F@#jhbS-j5R?P_U8N5Rz2HMo z9`H|^!H0AJ zfM=?F$j=vi2+APtUgbmXUhp9(i#QzX<0AW>e$j`_x#&YsKCw{cL)u>SAxLNAt9(e{ zMIVBvb}3apB!+*#bJ2%B$EYp;Fot$CLXacA*yl9CtHO^&m3q(7@gJ(GLX*Z)SBvmL*HEOXQ#e<0y74 zQ~)T%0?WcArqF{1x=ZKO2V-^1uu6IS{jE9qrm;qcko_RY`JwoSydQAyk)4{llO<0{ z2$gMxU#Q_gCN^KvHsH9hgqMi$-rCbtXC%rkkAXypgCK~ecTG|HKI*HClli4NTv6s{ zG2~EbgE}s$AGr!87~E&)UZTGgryGTv4lYJg@aM2QaX?DJeXcmCx56kYtI`ZX^v0io zqHD6v$xVotaNVN>%5v`uDbRz)NkUC{{^`gh=Fm-9qf*%!3gR9`7i0=U7G{*zLmm0a zjw{}!$U=-Y*z%RcNOkz|G~C4TPnQ%JN=f0&b1<%Z@b-_c$jmmUxuu8WhKuCVle@4> zI7~V{0%$|MdC179#4HR}oq^st(^0-r41fhUp~gQ4#T_;C;stb<3q5b6 zEyV-r3|6zr%Crd9U78F_aiGltg*u_AfhG4XLagGFmJ*|d)! zNHN5SR7ln!HcK(L2AYh4Ie0I+7R(NxM*v(Ke<)2TG8Pz&lyVZ}0H@kaaJGcF?BeM- za{Y(Tjf<_wl5NGKV~VK^ASwrp+8HyHQ;!z2b3G_1Hv*NC8FYBbQ?fB@eqmvdQfX## z8Xbp@((wp$#)C(e4Jvdr=x7%*nv7JAl=GgKu8Y#&Is!TS5Vts3#3cZYG3HOBxP)LS znUTd%7LnaVqr$#qt~_vUXX@f6*}B}#HIrcZ;RSnk5{t?)kchat#44kd1y;R&6oV<2 z#RB*4-JDl4D8f1^Qw^)ZN^G`br#IpvKM$7FrqQvHULd5BEGTHq(J^3Bx19V!lg?3s zzz}4%pl&p-GT7fFrHJgG=-7pyjiW?Yl;@0wNyc={3Yf$O2f@cNv>&}|t)r5Oah#D$ z)0N^oMktq<$+o@)Mb`Z2qTF1)#p*VU#Fh=+b^0-GCKZnJZiJNywq%zoyU`Bo6naTH z7ifpTP>wdGYArcdAJ-?HuthCusGM|;nyHhDm1v;fBH9@i>xkFTw?D(zMA)^bQGEz}{DqP8+ZdIiG zHj|RhDFggSS43`Iv}ge4I9y=*Adwcwa)ib>J>yxfBLvjw077p2xCKyc^`& zEJa3{7k75LBKLyiO2sT%xy&SrViHEWZy3dLEl0p+Ty@Y+A) zRu5FywC6E@ysJR(1~G-}R!ARfu;t`qtyxf{ks$}=c2Gq}Ao-z&dp2#Y6{Igc&t^)g z*j|^b?i$CSiUSo_G82ShsAe5$#6?fJh7!~>EVnxXjzIB<{PHdG>d-!wuD8i1h*Wiw z60hi4g5>&|sAONJt_hO=Vw_Z_k&Fub?b40i6R0CD%{G={VJyihU^$^SFD9B&pPP%S zug1`e5ZFKYSdKMnvgnnP4hf~63dk*zq84>?iCRP%YV^D@l{t*_2^*f#C%1LM6|1@E zqH--7rCoK_i@X~Dop`m>QMrp;XFbp{xJV-3C=r7W^Nc$!U2jtw4LN!`_0~D=nbUbm zvVN>GGb1UL+9++|irR`$KNKYx*k5dc>LMFum!~Wd+%9!6Zl%mj$m7>daxv(r9aaBG zX&|n-211p-JQ&LVE(SAQaWIZnGvrepQAxG*Nui{X6zB^XkOdmL-a`G)u780J`=h^H zV-BUx7*lSdPgFxmn4d!wxRLqG|FuPMeG`Kp5r!hO-?S1 zPoqnB;~&9cAHE|WU#HUTFi9Oh(ZQ&2pR0?Hr8VU zx|fO9sE`{Om7+58zR+Uj6#@>p#X#gBqsc zpO{8}(>(tFvf&jjasILVydD2nk zyAH|b4k71UNw(frGYo?0h);#12e@=WE-&2?zeW&;d(F6Ve8=<)M;T2BoUBNaEOHb@ zuG5b}vF!3#PJ{8yHY?(!*1|bx^NB?!0gFqPK?KWJ1f&C($nO zamTJ*TsoH4IYD>c`I4sdVZB_F(3)~{!+NnyF(1cjAgmWFi9A3ZhL)c%MWkg0rAboU zZjLXv6)2Cd8)L9?F67#=W%y{-+bG>+D$^utM{A1tFbHS`petU98*4CX4OU!Pq1-I3 z)uuC;SQXLc!gU;_D>a5E8lU^s(Y}v14yuP^dydJN>)Hf0v#Vtge!e7iX?~f7)@#P0 zjzm1vk#sxMk>nrhNG2ZYh-yjs{X-@|*m=CbE*W;_3dmPbr{xIy@8PhMz^(JeD8 z6Q3sS{810yM3P`N2?V#5AjRi9iZnhey}>j_pCe&;okr`DfIPkn6mIiIBSmK$rT;eg zj`+CGI!2!TUjyF>Ki#OUoj={P(bDk?w~*;zCb?PJwz6c!y=t~Q?Huyx-Zi!%-|2Qi zEHvn+Wu96~fYzed8*5xLVF<`~&RyasXE1ha?x{7}WZj$BxFd|4QwpgsJ844gW*T8I z(mq>c#cdv~&7>V+Fv_x#NT`cK8V0hi$lR0FD6LjU-_aGBdpO)3LD8jl_W%5OgvpqT z#}QnyM>^#;k?lXJoCk39eEZMCF$p7eoB`JvKY-<&VJOt6rcFpp?b$<{(zkDPLOgR#%+|)Fq@~5hWJHC~ zp1}<2WG-*&OULp@8RRoL*wmNmR&)1$RNTK}kbmQloAi+<DBd?!b|U( z;Xvf|FTHuYV4nC$;idefbaJ>qDj>&jl3i*~j3*hl=}7S(bInIePs+FETY^i9@38ZB zmBOQ4ol)DtBW<2D-LO*#qq_FPN8(hydycAD* z*G&IEwM*&Me7j4}K}Ye-9G6LaIE;-?({#{v_|O+yw;#*)I0uK4*drboF_a6evJ#!4ctkv+s(Y%MV5 zY4Zw9BS?WY2rvEVtyZl;hkB95j$nY{RcTo|m@5O2dH_IQO+sR3TAb2PnQPY4W5`0i z)k^a8TIC3nEngYz=cfdSfnvzxvLt}t$7Jx~@gR?(^dBc_4wANZlvEfks^%#`4&c;; zSfziFN{N^BQ8|fGpJU@Pm?QmlYVd?KeIBleEmUMvI^}H4qGNuV-fXfkNlwgR6fHcJ z-%M+KRG}5y01aIqjbZh}CN;7tS~s?hE=eBZK(N5L`^V>hsD)n3#s8{QOpwbM;yM)5 zRl1w`5su%k@n!PB-A}1p427Q~h-;3{NgGm8{Hq6#(LcGVW8Om#KW#ZE*Nk!wv!hpC z7qI2%EXYU015k^TMZlJmi>K(0&^#1MjC8mG7*NS0m0)FZeC0U43LIa9k`j{X;m{zw z{Y81h@k|!MvY`e^o@6(AIh}ju$-T^7q`by;lkytZP0DLrHz}`i-RjN@R|P0~m0m7p z*~{2boB;7aob|$C=mbu0vzqmKT>$;n;^l1q#b(ccVg826&~npkXw&kg%%2$NhIgLc zCg1-?RV6eX-2awNX4t~VCY8`J<)q>6*F=ONM7cv5Y1zgPY-FO;?7tvS3a`cLt@Vu*jw#$IoZYl6o(6 zQ>nB}sJM$Td!^2#x1!{~BBM@kvD%PVBQ-50CN4c)o8C{878i^BxB79<;33{$NzX~w zEqX2*Z>+)CvxiK|9Ze9G;~?>LhUcMC0tAa;)fWTo+3XUNrqri&7vn(VJc>y#w8*_p9Nkhm#V zCtwoaE-M3zU_j1ooBK*imk@(v8?7inoftMf^8Y&EFE--gi4ix`kmK`FDc6kq?}Wvz z9KFTLz;_RLt@P>s*Pq0x)i(->!RUfm@_7`;4_O$7#kFP7%5j$B5XO-NeY(RFRvCzG z1qLfF@LlQ^QOiMhP#af4E*mUSIX3-5Y|`eKim-j?0BJ#e#a4sKD08LEUP=~;F6n_d z`)83=ujD$^^g0HQJWppxAO_B0qUGuN!Mw`x+)}dUfBAfot$(_|~Fj7K* zdrppumFgN?{Uv8vNQv33wo+SG)&Ta3CRRgET^ma7Fhxq3vLs3sV>RUAgq+Q>7#}0H zQCEh$=z=3U{g9JKe>1Qqrs&DElVX{XH@B8Y5v>lr4!XKjjhQRhK^f)}Y3lAD91=Dd z8Dywnmw$F&kpV`zoZVjqVLcpg#%QU`Z-!J7oiv+}E89Q{uu7y6(4v>B#fqrmCqO)N4t<4(Sxd-gz2$16h zoA|pqH;{~b_}TH945&IvUswG}>O22D1^4-5*OEu(#gvzfLqyldj%?h}dCnCg4?Cx?s~O8=w;IAmPXu{1i+3Un9F zXwuSAQfe!AMh+j}8_*ifQn_UXre$@74Gph9Cgz&MsZy~4LyKsr9cv+Gv)&@fJ(l)_ zco1h}vEp!atL=@0q?>|J{FOrU`l+?>tdS@W<~Bp_=g3V;TAByB+NFBp-n5Qfn$HoR z&Do^bXmi9xi<_9tj4@bjMWlf4LP+IQN$Tye@LiPwUAyqgb)qLtkDpz-0#w7u>ks$l z_#)Z?T%CY%BgZ=lE)>O`qc6}>LGy0fOm1lYT8V=PtDWODE7GHZm-Z)JOjGNtP1&49(b`#db4z0jGkzuArM0(3-<8+x6C&Z7C$jjf4lh{P-~ znauR&mHVj^5=aY*%eLurYyeq((^I5byc}>EjIRzTWCrTOHrT9s8?)j?GTej1`49D% zZk7?0F2MHaa3j4)vMX!u$JI1WT|!bMr%N|nCL#7xO+)UDe8}NY$ek!|A`Nmv%r=-P z^lmjiyBdu9cjjLh-&uV!%It&ywR>PAF=#LXwQAWt#{g!L#*>=H8QiM3VNfYNAClQ9 z$ugjdn55jeRwieBw%(R2U$PqVXcyypoGes_SPkQhpI0k?3i%_oKXLvzilR0P$r+`$ zs8muxYE_my_$hrb*t8>vq*)VF!;qaFTI^Z!v?Fms<}8G6Y(GO@ek`%+k(EG+7fy6z z6HQ}fE?_g+P{9sf4xo#lI(i!I860?1u8tH3;KnuzZjDdM@PAgP@(=EzV~acliR#yR z#MOASbmx;6h~H=97ddk|%RFBl;*M~RsSxP}^-xlUiQ~X#$Qgx~-MT4b5>sLZq-#^- z(omBqzpF&`nPTcR$SA$Vs4sBZDL&wqh9d-3I>2pMga4?WJz7d!0=gQ+FQy;Ns<&D6 zRylssC}w@mqlh@h|GWK{<)8N-<)4_69FLDO-(b;OwMHxM@>)#=MOd{GM>HLlB(#@l zKdUvxt!Q+6MFIokilnbh2x?S#csC3Q#hUR4Y8sBdbOpC<8=|hwQk) z`q%OpYtZQ_dmYQjjiKksW?SL7x~Q_vR;1mhNLRWvFIbF&1+yVcY%EL5&Xa*k&sZvKEjr zdMzn1jM3v&Vt=#q0EV9T8;rO!Oh;Wh3#)lNgF=l_*1cZG51{<5d`f4s@NI2Z6=1X! zGB}b=N`%n~7^OWnTd`F|7bWyFfG)QvqOv6b-crU*FFxgFILhxS)S;R>Iwd8M>nr{{ z^jDTYE4Y?cQGnZAyRhj1g_bqepOH7(|C}fwRSTOYIG8i}iK_#XI41(qGv;N{k1>tX zvwL^0{rm6IuS`gXI7owJ&_EKPb}Grm!5b;tYUa0p>8ti_Q#bq8R6ZCBk0PuovRk?&-zt_!`y>k@`aouN1Sm28fMaPjGuzZDWw;!~2- zqO#%iI(bHqY_Hnb0+5FSLGaYFu5|M(rXn*yyxzvR zak*j%hlGf%07R%bK>bQ46f2P>onwQ4I^vHcC&`_}A?d#PKol+|!*P@iQAc=3J~~G} z$u>!eUmbD$v*LH%hwY#FFxHu z?gHt_sSuNmLKn6ER<4kZ-?^>;r{wz1oSHdh8gb5 zphw-ryss;J1P2EP0hhLDRYrt%j|lIcq^IIhkalo>4ZSW1k~0FCA_vs}X)scS9yt9# z3%cbn`A&G(6X#o8I|EZT<90U0^eIrUI*qciXR}Vw35LP2PS9x>G8J?6HcV9uPJ!tp zK0w{G$AB&lIbv}=khQ)J^q?AXsG<80c-eSFQLajbv>jFS1Q5I*ChNNrgI6u{ciTrl z&a9_0ODKsQL98h90S~QhBxjUlMcz>de=48%avoG=q<@y0{;+Cv(e%pLRB=MfNSm9Q zru1>FX>3?8EiPEJ5F@8apdg#rjoP3osB%-DVitXXNbSh5XGl${yizU#^xg$An%X;URKAVm3%X z2G??D5cUY`A@||O_BvuCZlIvd#)e#j-lF39x@1>~>@2+RS&CK4p7NAAoUCVBin+QI zR-5v0s0|6#p-A)*uf(d9l9H4ZGj4iV-ZDmS>7G+y&>L+yC-n;`wB{A)jmQMpxwFy_c>=qD(=9SeiB1K2 zBMN#knovLT=pwzy#H8nifYP57l|(s*XRNM1ymo7 zl-3B7uK4eyWYL=oiY16B3lfqPcK})RIeNnwy{>Mcj3yOobCr(rbAgZA&M>#sH0eOP4KEYe@Z8Bj z?^U1+j*VL8ECsTeTpX|;fBM$pey8vXT*$KM9#K;4cKqOx6t2 zBqaWMzW-Kg4#<>6#y~QL7%1lw(EIbqyZVoo(^&+%{wT8OaRKNAK|&qg?kJ86^Owf< zv4#T5r%J_o)2l5gU(6YuPv6)$?{KCk?{rB)=RfRjtkc&~=DJoLPJ{Cw);F~hgsMU^ zN-x>|EQOkJUF`v`R@{51q>*C3*2WL8XmtaY=&tfvP@ep-W7i=rgVHoZ=(H|nSeeddfi zz*NAl(;cW_TAK-HUwF9*KXJZ-;!w>vi_QWLJJqvE_h;FOyq<lc zCJpjF`%!2Y7@Kj=?}G5oA5*_+V!g`kcZ8qy-8)Trc6?-`VXb<0UOqLlbpN&Svl^MX z{k2FI?~W9{T*@Dy1oIRD>;gbZd5e>s&Z<72CtPYa=IH?wJ`n~+RV>MEwpuVM6L%hr zTQ5{khxtz@Y!jMgqB$mXFBsV^_N%4kZ$CJl7I^w|q3~_nmp4|e6-Kvt>fx@@TZA2# z7A{(}Xs-~Sb47j9J3)AU;RNBN_g=x!`?HXIzfL{B@@~~L-*0KpQ{H=pQ{H>au^wu| z^qpa5WcJAcQK6$|MHz!OMfoQv)Ss?gsrFmix^&caW7Hcjz8e+(>e;A+2NKo9MvPeR zXy`ZBlytqd_IhjWzXb1#OS~>F`9tWnr-%RP*Upz4PpvCFweF6vz7Ri-V;u}wb=y-& zZS=Kp{ncLOr`8=5jHlMArTSv<;obvnUYK-y-7b9A1{B9H-Yz?rpZnBnOUDW+?Y}!Uu0qUrQIa`Et%7G>Ov`2;O+c(@3zxhr`T08%9c;%!JUUaK$Lw1hP zv2|!x#++HglRpj|we89r!8bIga(HLE@bQKBPYlahBlI*~nt!eTzl5jG{@N~Ay;*27 zXfQtI!?wM>>*|uH>^HtSm!(h35Z8Qq;L@;`d17v-fElY3b>b___Mh_%P7ym-uF^c_ z<1Y@kZaUYd*LfjS*KD|=*9>9A+qPeCT>YYaLH~ZQUX6c3?Dj>!UzY_86IYG#(F z5c1oJD5=gTH|n_c*#%3ZE8h-}d0F2nCaa`4y3@4)&H5!F!h$7!k#9{ITRKtrM)Zw4 z5#40!@tD1X{bEi1PQ>J_XdH7W^j%HSw(HxQJXI2_(fP(+T&j#2(EL@+(RUMt`AhsF z6)&#c`f<#am_ze?<2FBtkIQarj~)HX(wOY8ZfI(k9dQ4OqB)~y&i*hkIPh5Wgct4l zac0^ROGdAD^oy^rAKu2*(w2{jEDpUIaj}%Yqoj1CewY2*?QOosk30a*P*uRHIFKt#bIz;HRa)Yq>O4e5ylV1osXkH%f(X2xC z(yYg$+@&SKiScs_O>}OKZ$^GfP^D919w{uuO>BuSxV7ij@R!;1i_IonbV%{3UFOf| z3>qAt*myNE7>ZG9Dx?1iG1b*mssT!>M+WCYad0l2@=h2cxnazaAyABRM{0!+$%Wz& zH{p#?j2kDl!W(m;*ytL*fEQST-@QGzhQG{CZ~W8p(=rs8@Vx{T`Y1UG ztp1U<3ljcFct(e@%wMFw46$kIpA^@(3GeS3SJC+G?ZWB$``^^{-7S1M?$wSvM;{Qf z7j%04>4a~D$L_whXwjk*!UCEA#&_V;0c>lA*Chht5#rUSE4$J>-kQ}`ol^0n+P|kt z-R0FBwSU5V^}z!N)HMF^X*-}~$`00cCFKD3w@KdxraX#DQdwEqZco8@X46=lpP;xB z!~ubaL3f6JZu~5I+}PFWEp&f@f9C?AqJj}Lam1gJYHDXam)dz|as!gjs7miq2e3 z5c=dTW4_du*!&)KR2);k|(&htJE!0N3;n%@dizB2rz@ci@T zWbMJ~@dCxipwd2T8UC028|4Iy*YlKj0)>+qiFP6EY}|9DTgPafARb9{OQKg2os#I2 zM9(BTCebgR5vN&ldbJYqm8Oj}3+WZoDx_mbzmRqz-IDOf6`vaO{&|7BUnu{^ujiDB zC+dm(E%o1W)=nQpGQ3EzWBG9%5LCLkCx?xi8tq8omg*ScyytgExaZecoOnVZ-t%iO zjvwhOPCU^`-2A{_yyw?NRQ2s9jvv`w92OrUPCU^=Ts*3mxcNb-cxrBM@t$9V*x@Uc zsOlRj4*5Px96wSJ6DNz}uy~DF&^%h4cp_SSd1;KecvP(TS+6*8^Mg2X|E|8`sk!mu zrNRBgdwvPx^gBx-HrWXGyR?QQSoxr?}ZJZMfa=VIb;qL`WC|B$zjlV|1;1xWj(x?D?s2y zEo^$G2!6S=8=@v$hg%ViV1C+cxHsw|_^#H%W~Pl&+vm%QDbCR_lR zC(X0rX!xwM3wKwP?pXa*>3hHWsXtF!T#_<*zItBk{q2`{+*OYqxV25e)jRQ3#agoEC9R# z0E++s333bo%)>j_0Pqk12I9IF06qnP(*Up;0CwU!8UWS<01oh&w+hc^sU&`YZvfy7 z0HBV-1VC+W02cuO^${W*^8o<$^I`g^o9`00ujX)n%ooB{05A;z@PH0s$8<1%EaMCS zxPW6D?so$~X8`yL_uv3vGKU`r;@1G+I3JX;p3?dEO&%B1!8mgOpp@5V0N1&SIstEU zovS#x!t$dI#)SZYIuWnp*&ym*M<9r$6KzzY;F&?(}H4gU{F4yjD09tQYCTzD)0N^aIW5kE&0pL6U zpdLolLy7mX5wB))7*H135&*!x7#y$>7OdCrai+>~2RF>H%(&h_{J{tD8DZUrcLo7q z1pw?tJ|O`3nZt}!=4B3hiT7S1CN{J;#D?~MeA&#P8FxCdKD%sYP>+yTo(3pEG)JwF z4*HS&UHs>N*t|m~-dNDfqgh37(qx_L)0JJZiiL0Y26gY%{kt9=u7-zsG)s+mY1ZSB zI4|K%hlbKE=XeBk?@k(@`CD4gMoH^h8WYaYxBzF$Yp!plb+WXsmC}>OducvZ@nM<8 z&^uRsebhHQHKm)?-A?;|IdV`7VL@qGn}V&mg4#*9=sbxTvj>}p0^oY2WON9wcYEWS zmzRg`yWx6QTCZS!iJL=udR_c6G;{6jaMC2K53dKDlQomlt6}&&72hS;6>6Ct4^Zmc z>hj``Q@*O`qO|8!wVzP0h1q_8U(!M2$Yu5@-GQ(sGrz(nb}<9EyjMY@i%IsbZ6^)seks+Sb09iz?OL1tyE)4Ot}ZXCmH+9T3!6?Io-FDDCJ(DuI8Pkjv25<` zA?wBPyJPNdIIvCBRW;e&@xanL^M7IGzfAT21D;m*jV*kDo3&)7ZN%KPE^7-QAceZc1 z|Nd*@)Oo${zqv+VXa0rtp1IKG+p%TQKF=qNs9s$jv*PL55n;E=fBX2$E5FV5vDeRe zdgu8Oo$cP0bHAK=x^b=iv$N;S(}#zNb6>3Tdaof7-)VF)`h`lfSbcY$s(xgS*tlIp z?Ap}8I`fxIw};i$)#Yo1zu-=V&Tnp>P1Og#oX5OypAemTf)j(+?VuV2g82){3GMef@@#UH;2d~;z+oap=D`JYc^>%}vEcc)JLPFE}c zEB%d;Vn~;@w@0d5+ok?0 z^&6@GNq8*v2MMnv{FLaN)ZS9POYJAsgH)dqTvGX@ef7e3qEo+X_Osxm(`@~HNH}h- zJl31qA^!Y%2^HkQ4-z@hL zKHRovTGjozd_GuGF3n?oEA}rser}DhXRTm}I=8d*=%>kjvLI9a`LJ)SA3r>-9`()| zWzxkb+4(n?i%;|=F2UGCwA|B z&8(Qs$BCL|Ug-_)Sez@w0dK z`@Fh(Zt1KJGwlY?)~}p#~-ssx6Gd&yW_h}aeMS_`u;k+OdE!j_n73z+#3>~JycxBif25}Us3x)d z3OxHRd9!)^%3V*zY*RdlThOCPzoR~}3E4f95)79<-cx+}gTU(QH=pAH>1U#^!upP@<0f^1aowUj02ZC^R0|H<49wOM;i5Y#jPl*ze)7l~efM zNJ;thJDr5DJHHim$*=nto9eCT5&8R+FhkdM5qtrC{xI`1amwbMZ@tjuXK{1exof%|y(I=V8ES1b#Pv-lZ{9Ey_sd*ORL++xE-p(FJ@OiM z2)p;HcyC?9tk?@*iLEz(v|-hUW#Yi+P4$CI-l`Q(GC#ie`Nw|uyQn7|@f-Skb*V7> z^XIF!jPVw`99jNuzquN*ce`#$Gq(>Ce^IY^b#8pWTInoq*z1D?y++i2e7#Z6rbXgY z$9ktu96C?D5E8U(((yTB`jw!Gg*UQm#goj<*vvnUUYMw!-fT=+bakm<|6=Z)^*8E? zx=%(=={+$({Q1=>ZC9)g5g%@~eUvbuRjqV>xO{AOsVP)E*6mKK1!-FG#HppnzJI(> z{A5PEljBD{C(a+3d~@|CWvzHM&2LD^giYnQiu0Df78h(E^Yyv(iY+hNTib4nl~3=s zk6c`#uUKALYkc_S;Ly{{yXnOCGrq4F@miU<@cH$t-p&F|`^7I<(*N++4EwzO*l)6) z*0fvsk(c34i(2FB!X+O(5p#E4>D4LO`!W9kpV!}a{z;{M)y9tt3V+YFr&vP_yKHaR z-~IT(th4za*2;fPiy_r(24;v6wwQFg>&T{+g;`bNfUt>&9~*E= zd~8Ye{UFntTJcl%%>DM0!=YsvSH2i{N!V0geWG5^ZDxi2WSi%g%;;khKhZ=nLqS(cLw4Z;67saFBt0SME zoFk5^>QMQ@@s@U}ze@c^>VFa*OZ`E@D+xcP@l|SXsotgblj=dLPYEumd;oU3k6n9w zW$U67P4@M@yKaBJc=&MFPouh3Pue@{vrzTI z8A8w7Z%!*w?9bWBm(W zdbz7`?UN*-nf`S_8oyop&$XzFN7FUS8Xk(d@~kE9c>1llZX?e{{}QB&3mw)xKKFyN z_&F=C^%Z*N2Ub^Kje2U;331=M-$$>{_lVsU_*iVFZ(;Q66Juka>i==v3;w^ym3VB4 zZT7E}kWZ_xMpb@2L5v&UG`j1P>!K${Mn@-gZ4$kZtcW>#YFg}-wa>>EEI1s!BDu0> zo4Z$|>~FLcxBM$cqj}{OP12C1;^j%7Y8JhIH+py9{Fv{CUW%S~tN|ZizbSpC+qA9I z&qwW0Jrl8OdRWx%-g>{7wsUUA9p6%~-{Ljh6J9Utl+bVg+&w*B622lu%H)uKPcFs!gilLC_AvP?(>js)$fL`yBi&mU9~t8+jsh% zPUZE7?_B%j;GMm@etB0F`Cf8V$o78f!&B!6Ub=lOKhp#yXo5hDYZMdH}V+KTPt zOZdmvucCBsT3T06+Wxx#=Lu^vBs}7HkKt)pJcqthuXU>Af6q@rZuu$5Z+;50(oaF^ zbyAQPPb)|gf8w52&}ZD!3i?R>NZR*iaL{w0Y{pB&*5CJU4|#>m`B4zc2IYJ|;+Al0 zvsXdkm%W7RPXv~~`f!jCd)9pR%>8jf%k`l@t=PLnSQ`H8o@Z~J7H)pKtxEkMRJeS` zy14mrjnH~;>!5F^jSxm&er?nHzB7e)G{;_#p0i2_e|h`mr>FEPzp#Q_ZTeH9@Lj75 zYpa8d!sR=jZ&l{b7aH%}^~y8nwh6v(&HixT?$j;Ov$t>A*uGqdyU_N>%jF-@Yx7A=_kWWRTWTQ`0wTfBLjko|tkl({F43gaICIc(01{lcDAlg{StSSyHA*M4+s z(`oh4Pc-{ZPD&7pjt1E-wp}1R^V7WpS3GtJKm73Rf_6_-3bs#ojQBY24?GtY0hWmD z%pBlc%zI7V-7uv5$gz`&oAL$-no94N_m{*7>%tE&eBYzLFf3>l-N)!d_c6W}43qZG zJA3#fwi~4fjX!<1d`{jR;pxU6e|(XAP)MC|F?LMCRl!u+{>ZTSTSE17FvmwcCy>Jx zS(}H96lP6KKc4x;CgID})N}XVtrC83_w0xMjXcD~q;%VNAJrGr?!FvtGv8Gw{nGr( zLZf?=7S2k2Qh>!9U)r@! z6h_Tof8hJi^MnZ*^FQm<@(tm0@8vrZmmPJS2bTpX$ff`VSr?!nMF9%3BS1mI0u)5` zEPJ{?tDw)&XBG58yuz~(CqBUd37?t{y{z8eX0tGA!bcHfZmw4~s@&ZtKB-~U^BZre zZ(aB@VrFnN)uJ}7`aHZJ5ZQXjjHqYsEZdlOJ6H8^?C3sGy%$7A`n6T3J$XLl;KAEb zdDRWVzY4vsIwzitJpV&$_4otJ)kB^hrWT%hFRJvr-@}goIzW|CzA)109jxA25iaxz zT;tM~RXdJt`X*|qYFNW3RS%k`s@VR}%BYT0j;ohW|F(DDTX_*5WGq%qu6Lu4$F-ND zin>LH$IbXTyw|!0s$IsYKCKt6h|GQBBOFW0pN||GIj(4=dd-0GLZxbxa1%NSr;erd z`OZhx*LSV$>Vp&i}KKH>hF*NMF6NbN^+A{WAA?(@fEq;5L9p&{)=hhSUpF(`W zGc7cUCCazer=H0OJu&n&9lM-{@?qi5FNUY4Va4H?OAn~J0Lh5;H~j24XOz~HxL1Y& zVt;z>c9SnMa9pKnQ?zxS%Yk!0k8T;m)#SMT0h9L$`cr!s^nc-?;GyaG$#B~dA*u7+ zff%p)Qxh_x3H5uTIZOFgQo_dwzk3XAb*8(z>_L6i4~=*K%K2a3ij>ZICEh{l966$3 zMN=|NS@xgp7Y6e^)8Or_5|HL1e;~jQhmWv3H1^iKPS`k2&*D~Y5X>K44#T=Y{yfBC zR!=1ZqOYf`GkX-M8!VfnUSD`h{q~~vj3+02jId<;yJ1+y$d%zek#_(rA@m&l<+Ae7 zy7wTdk=jjws!8!sHEFlw&E_NJJ#C*w`cC)^&*Ev=ZKc;HvTwAPluPHf65pgXefX*U zMZc9TpWl1QtjVne5B-fB-^a!X0rdy%?NnGO^giBj#!cOu!uW@HPPA1xI={N}GbajSE%(0clrhkH(C2@7TzFP!Z>O?aqT+hNlOp9(n?LGav`<&Qj( z$OozY;+^$zHHLJMjbT)u51&~Z`O>V%)icsh^d4`2BYb1;sS*87m#KVvw}?E_ z?71jjzi4Q=WaCf;bFHy0Q?5@$l9{E&?K5m~_~yH_#t z9wFNhYw7nHHLaHf`#!GLT~BSQeWn?@P|nU)xj68*(6=Zn2f?OM-Aj7j2L*ZVfYTgcYIt*T6}^g8B)_BCN(5D1X43XLVMBg9*~ic4q-ilAtp7vcQ1%eh!2I4 z1V)))d_F+)NeWUiQ9*+78K)rj3G7YyJ99j<1Ak)}>DgNB{GN{A#R~F~%wG!ksP}(G z{!pwS(3D8($h8Zap_<$_9ev=e94RnzT}k&zGTq^U-IDuU-H=mUt+hm zBYdI(#dZY=*rFgK?Fur~t{{na1&OjNNRVAYeC-O-+^!%Vb_Kant{`X27365Sg6u3; zkagt>@^QI>EG%d7Un*CS@#P9Kira^kD@angf~d*t1^tExF0xE6NmPQJI3w=HVukDM-Pe#F5AUC%&KiZ_e+Zfcbx7 z8p#|F5dWk{;BLWX3gTC$Ac`^tsb8ibH%k@dmr^I5{7)=TO_+}V4}ll!c6X_QY$#>* z{7I>Tyj`jwb4nFtVyS`@mMX~er3#W#svu$wm_texq*JMav@BJS$4V9CcivB>vYxMD zm)!r8_jg+qWY6DBZ{y#L|DVA9e{ueI^~?Xt_WFE_f_$(=LEhM+ATRwl)yt&+rhNV@ z>+S#2{=YsX$AQuRKz-={fi&bW{crr1=2gA7D2N7z5E#Gm>rHkz{yqG08yQ2l?t&v{ z;N0b3odSMpKe)(1SU>W>=3qwqujlcdOFesbAixqJ38r<-M{=>mw1k-5v z_Si3Q{#UqP-CP0Pli;J(cDQ)+_qzbCpLjX|;4z4ZN*xR&7fhoq#V}YG0G{5^yd?y5h2S30GZezYAtD=wJ)a9E3)p7DD|6vB zo*bdaQG>IG)3`I?Wg2tEN|x*CGgt=XR(3VA_z_Vo>UgY$H{XWU zYhiP#9d@}!s9`)HC>T^C#Kl8$Dr8TEX)|7gS+iex9o||5?|%TxKKghieEK=8S_5lK z?XY841)TT+egq|S5g|SS3T9EZ>qnTb0wknD<`8&}=yQ!=E`q7A&VxluU}pu~y${f@ zKP08Xput1nx#2KtHoP(qGy8f2l-akz&OL}q)qqvhx*ZHDfw@cIrU$wdm|)6OczX$4 z{1v&Jn|eVDC4`7Da5xkg!CV4szx&|~TxbsMl`yshR;*lw4Cqhxg+epfO5oG2u)6|I z0<=*=MhUz$4;Fpg0D8v3fK7!a{vT( zhlofJ;vgY;ILum%Eb&3X@ceK%cL{z4@DB#PsRZ6!0?Svx7pq_$)(q_01BWWGZccY^ z0FC^hO9+I9L!<`Yd>5PT?tQ3k0D&R!>JnIg4Xf*GK)&^tE8qb@)8_E32-*=~oC0qx zfvau7w-d~o^YT5Y29NsCpb>aBg-#+^r@`6^IB^4R-J@{y9S##`z?#Ew0w6$y=vZ1= z!(q($68LiU*XuSyseRii_|XnOU&C7s%T~dz{m8x^7>u=k0-#|_Xxq^ju{|stBGn>j zVj#9Jto{~3j7o*M^I`WjxQDa??l*__exTC8kX$I+2D|sc;cwu(lkfvTlV;F40927t z0@nI-C2&{7HeI{~Dgb4Y0 zp>2EUIUFVego=4sAkZr z4Ls=s5q&@{LTumukeY^mAFTlUHaPhMZ3@6Zy~41I8O?~~D^|j`9kBlpR5yoiAyGnf z-z;tMgo#sT)0+;x7;ior%~k~&zEwfYTNR{atAfnisvt|YD#)s>3S!@?AQf8`oo*@xliQa;iz>6=z?ANd>T)c)C1L`+~4nDqqhsQM}L}IZr2LqDdsW81J1>OQXcJJ8_hrXkP`0ROloxx!|puSrY z9I1xrc<46(k_IwrTtt(uNsYI_&fTzgKOC$$gGpb-YZWerreBjpM?x%1dk|z%YMqk{ zqo*P0b&%^a*tQGy?1O_9-<_|-%5WH#z6%LQghry434@TD=j4KE988&p6(c9;a_K~cpe_`SVL&s6rSk<1Cml8Z4f+9;Pr*@|cTg-drS&0P|qI9nR80z(;B0XAAvDr66X2_>-Y6#Qg| zE03c3oZ@R@9Q0n0==}r0LArA=q-8*EK8#}IzuLo;BG9)!nROU#aL=lOTd_fMA;I(ON?seDU ze|O!;@j!Q3L9`rq247Z?f&3d`lHB`WR*;y>3KA&`EBU#5U%H|o=dZBx)_hB4{mD(3 z?`3XBt|-VpnH}S8zoH;pt|-XYGWRd8D9Fb=uO(L$WRc8I%4_}=1)0Oc%#iulgl&?{ zZwwEQX-MHrGXMN53PNOdDa;U=o0PxgC)sPhGi7n=`j*o8Pv153{JVBJoDxjQR}>`v zitD^vGM}LmV*vQPKEN0C0lwt+1N?okKENUV{r^|<-T%PyZ;-)sn}6S^4{%TBKA}Fq z#QFe}WNtN0=nVzQzxu!DskqKymEIEUHSIw+6plv<^S|x=%zshaDF0%*?QbYZEB;{J zHM^l84Qs@$zOEp*uPexP-Y)-@b$s!c z{*CyO`Q8`c#D5S^GF83+7iz@6T*LlX&3!lVY^DO!SiJ>orXth=4Wz(WR0yQNoKIjx z0Wpq(9HY%r06IgS!3KF2V$KH^!)!4aZD1}k=Gee$COLXwDU4%5QNDy%OJeqFN#=RA zBwu;8Buf5#FZ-6wDc2K4!+8NktI0LS?g z;)Qqz(8~)z!$n0@&;Yu*C~tj~Bo}FMxL50PVd2Liy9%8|V|^ z4fGl94KUdopu`(shBv?q-T*Ip1I+UVc*`4LkvG5=Z-8C=32Y7!+#H|>f5Msr^llCi z!Jom+0kWF|3~vEY-2y<{l0AyH0Ik{r^k@svt1UoUTY&Vo0G74@*0um&wFUUPEx`J= z0HtjKcJXI#TYzud0{qCIChY*4wFCHsKg#w1o!SFD(;gt8JwOlsM6?I!(;lGh69Da= zV1i}pcL3<|6qXb!2pYb0p1PUUIE~9k3G0A=KT;r z`4Hf#hXB?5xl;{ruNwP<2h{iUfCio((9qKZntFPGx2Fe$dwPKC|6%VGzi37m|?QeUeB>(4Zthg*gE#`X@le z-~?bu0&tR!;R!%a0+6p`d;(CM08G>|IRQ8=0hp>|dIB&b0hpTr%u4_k=y)yxDnbcR z(V74i2NIy-#RRB$IRPqONq~yi5}@LDiBQ3bP_Z`=DxOG$il-8RXA*(G=?Eo4#mkAn ztBJttI^Il#iYpDkO$K0_0r-;v_=^E})BrqY0G=`c2}v4^Nx&IN!0&Vzols$Rs&^vM z*QxqKF~A9VTM)R1`X)qRt5wtDI1=+6k<60^4;M z20=ygAgJgu2rA5jpu#o?Dh3S#G6n&Ib(}N^DrO7=KL|K~5a1aEEEoiM2LVe4 z0WE`o8wLUQ4Fdi;2x!%DU=URNV-Qpz11b_T07C|lngOI`0KIgiXF!FL0TtE^sOXmg z6~|=&&J5sq9hn(WF(d;xIRnVjk(&XG$^Z&7fN>eXWF4nxK*jV7sPJR}oB@<&0P`|{ z$_!vZ22h;=EXn|yGk`T2z(pCrx(whN9XDh^#UC@E;*kufFdYvS9sztHfR6-lS|(7E z3Djl+zD(eXOyH_a;F?Upp9$QQ32e&*{*(#q$OP`m1a@Zv_hteQW&#go0>Mn+(M(`p zCh%k?@QjY+aAyCmU1Xv|M0u}}ieGU9@NQ3<9+7E~1 zm)DH=;gAtEIOU8<@bnx4&+;Mg3?2f{*dg!~41uR`2s|eYf#<{_@GKhw&x#>!JHyr1 zm)6$JuTwYa#;{?Hi)zZ`+eyQQd21Hcsr#*=lxr)HT{^!yTa7*T8#8j^%&Szhjx$^3ixy&bk3+wR}`|lpn7RDNFLBGG$xQcx-tYFBxFwJ^g<@ zNS#Z0S%;Aun-?wLxsQ^6{s0Xh=rr>js4>t4OAzFII2s0Pz@w+*h6W>!wEQ~t}$DRX9KjVK$__RpDF))P~>dQy4mRIVxV)=cFkQ|hay)K?YN&zn*1 zJ!4MYv_%aQ%je9fub#T7dS-q3tn#v%74?&9=Febt6Da*#kYm)(Gsh2d!=-Phq@eivlgg2Wxw9(A|O=b>kF|*Te<`%!1-CNBZ z*=lCvW;2&;G;;?LQGxTT<<6UJZN&@DX*|sd=de?&=gJ*tmpI{Uk51!hI7QnJYvchl zk8V9OV#~$GkEZV7${b5ueGiz`@&jKmbHWQp?(^Z~9xktOf5)~DbxI$u?!P1Nmyj>^ z>wXtK96I#lq3;iUeJFA$d?1DB56tX&^*;x$ zkIlUJ2R<^ZX~~Q7W9vTidVAkSz1<#{Wd?Oh zOP(R7-*0@_v3#`MsGJYpGV}UZJIc@g$js+{WNwpd())VShh{E(+srHUv~25yx6OR| zM`jMk@S^f1e`?swC2wf--nX=P_;oW!jsmh?ci5u070u6l%gnuFc<<_Rqxq8F7>6hM z&2jkiq=Yv$Mg$IMYGLF;iu+wJYHFgU({69dfeA%U8 z69#cg#;YbHcFGrbB%vd)RbLC>fnILS;@ViM|g$^VAu`Zuz2NMetlVM4N9U<8hHLMIYcGXQmlyL-56gzS%(E$m?n zm#~H1Y+)B$*vS?)vW0ONL_C&m@s`JOObB@_$AqBA!U2zk{T>Uqcr5JmSlH{au*YNJ z5|4%59t*oX7Iw<~3oPurz{2;R|LeeefrUL6Sh(aDlIi}1+Wock6D!B{D;$eB1{wc2 z-_m6sYT0IG`5kvjd+SurIWjH3Q-0K9tCgicS<<8gji%|ew@!^Zwdl03 zP6z1JsZ*iT6LfmAPF*_9)v5G7OL+x4b?a36pe0}Wpd~$BrzJX_snfG{I$Nh6otEje zLZ?+am0xL>?bYeDNvF$o>eK03onEZd^*U|Q>D4;Dz7yS~r~Nv;MW?sxbh}OiI^C($ z`*ixCPJ=q#n*exk*2asZa{Ndt$Bm?N++dqk8*AIFEWa@#sVpa{9A}cM*EW5eNh-&g zq;i}|sxGVbaVDu8XOhZsCaD}}lFD%=sT^mLsvpSJ$C;#ZoJlIjnWS=@Nh-&gq;i}| zD%a(b&eo~idqAeu1;REftNTlCvvQSmTi&GgUs8FzlFI%|D*G>~?0;tM7-wc}Pe>rM zHZyBznItYrPr@)rZv-+WYSnnQWT^ijH=I3ZSmwfEnPtctS}$E0WojAKh0z|q%gq*!G;4WNR$I7kwT16pZQ&D} zyUw50bD{brz}4_xYvG)$50B@swRFLe>KtvpZ2M@-KB<@8cCCe1`z?I8-@-TfEj-(A z;VbpD;Im1|L-#=EZSanLP}qG zV^ZEuly;x~y}sa~LxO+U#96$2iyGP1>FtqgF+w8+SWY;b9BC|F-vo^CS zE3*lhIkjZssdA5##?q5i{9&hsUAru7++|@I5AL)u^!S-OE&Sy!3zzJ+@MXI#eEV(- zm+Z3e^j#MA?XvJLS?*p7zrNeT>+ZGivU|0(1FCJvsSpFhC9m{{Ho4T>}qH<>4 zYf;NbWk>n(+K{p&KPpqU7mdf3mvQI47QSltuLr4fDeuR_$c)X4mhaq0$e3_jZQvoY#Hva$lN#7H)b#L!Zan1k)oan#1dqvg7zQvSm+`jF)s_i4Nz zAJmTb#78VV=@AQO2QB>6J_~OPTH5lY{N#r$e05A4cRs4sll)Gu_;|kfwy^eN3ri$_ zV&Ts}w(!o6EqweZ8n5VM3!6W+@bjNoc>5<7Uj2!MXMSSgb3U=~6`xx8{7)_X?xz<1 z>nFb+WS^wGmkuL0HZNMfa~~!DqR%XR?l888&a0!$I6VxW6R6hZ@uv+$INg%?LG?80!2Kn`*-5_uSf ze2fO86mw99a&;#xAYPdw6k`G=;uLkas#7sdrSnm()|rMPbqBO+u(~7J38+Rrs!*lw zg(mI6N4~T0^^-^8TLzqjxeKWOEWez5QWJ$~yC7Jl?75S0;+8h_N6=SjXi$z4bIa~|QZyZd(0P>xJgLAAhf$yh57%lps4 z@5WmBv^f3wc69tc_84P5Dje<@#Tc#a(K?msC_2}3kBZ+9S?+>3c`wEAdgjNk8*^-Ie;j^F9A0dDN0R@deyp)|j#Yke zqLp(eSlg(Kub*h;g@?g$6Rj#_+3wJLqBSnMD}OBf+YTc)+RiU6KRV~chM()72QpEM zOk`oGI*Vy3S6f>30U!$_^xP<|Qg=a&=48i-$(F0s{UgtjegrI3|I3+D%98s^%Gx=4 zyPAYCZS82eQd&E&JtlKyOPM$cF65{)u-2F8TzvgPD`(96^>DY8S8e61s;#_WktX-6 zS}Sj@vGV>}D?ihzFUI-peY;kV7gkz%eWjI+3#@$B0xQp|v+|BQEAL)pWq7SzRNr2w z^RYc!Z{>@tto%cjm4CZXgDjKZpz&pVT%DEk8m+v0o|T_#uyS&h)?QS;Lr+hyv2s<7 zmUoBO$}f7Y>|AW+ZHuk)If)CnriPcqc??75l`g3(ukD;CGivK<=2y?_oTCQq;gGrI zHRaWFj`8sh1aGu*$&FUVjaCk9w6gDdE4N&4W!zxpz;#x3Z?tmg2Hn>eCj_svvQw7t zR6lgRR^NDomA!|l@7iKz=VmKMHd{Ho$;y!}Rt|2lvUih}{adW;+iYdurtalW;c84O zFU3@@L6NrxQ+Wxd)K_CleHDu8=V3;<7iY|=!?Z;Wm{>kXmapfUC9+P98kx#9b1G!j z`Bk!FxvaTFR;{nCleO#07nYXS$Tk*9I&D#d#+X<>M~lp;ug26x)tFgdj#=epm|0Pe zNj38!pCOu2UtPvaWVR$T>&t5;omE~|t;J?m)Yqu2Nj39j&J3=ruaS|=$zw97j>(*X z%!S#RW!afakjc)>QfFqlGn(bhJO@QnQ8G1N*10lwVHq+{)!K1pdZB-ed5UgZPeQr6 zbMREK{OApe;8m$i%cp{-pkB4XC6yl0BGhA^y8CXqx?ArVm;?Eg)HEzYgSw+{xw^}+ z)_%R(s%%G-Qxn6{B+gOykkzElS0!i?A0#&tf?<^kbWfMd~rmM7=6^7RuFmaV9F%8FmtCFkd}p*5yl`l<6AMYDZIA z8?|j|t*vU5$MCdvYhpN>glHQxR5|siY2##KvN~^1RsYMKkL8s>UN6ej|58VpU^tP9 zQuTki`oCi>nR||^&8YxN)c;3Y@7%W9nK-pWUu3It-{!*wcdLUZwmNuntAkH(b#O_m zgJ-rn`0Q2(&u(?Fr`5q_tq!heb#PUygT1W|ZfbS#>Q)D@)5~Ap>fozd9eiD@gSWIg z`1V!@2U;Ec*H#DbX?5_vRtG=b>fq;E9o*XL;1^pR{7S2X-)MF4yR8oXxYfa5v^x05 zRtKldg>S^a;NqH@*7wOXs&d2Yu1m~zbRm*rarm68I>KP$Fp0Y^pVg8bX z_r2ucXJ2w~=p_g5f62kGyyW2bUUKk1UvlubFFCrEEkjmxT9Yy9oPOEC#V^kV+5eFTd zd(gpo2OXS$(7|I4I=JwlgNqM3c+x=!PdVt|X$KuV{h))-I_ThY4?6h#gYEjxxyQ<( zd#oI|$I3G9xyQqX`KYnN3mAC(>D$7@5%lKiMl*q=hfBO33wdfS)ovGQXn%YdN`K*I??dhS624?%gXM5Sy{#-Us>6u$1nWK%9&qV+4r@TANbnJFU$D9tla!B zD+m5%<#%PdZ>&t;Soz*>tbFG;T3Yg=e3=&yvTQ7WtDcVKfAV$5GO^{O@u-}2-&oc1 zQQ1*`yf&mP$&bpEZAIg;9&8!PYm`qzWhxs;c67`d@|(ej=9DEa4qqu~RcW`1ks zY2RwRpYz_-7b!Nr{d=p5cM{v=WPVdLj}9~n^@@#x)p zTUp6A-k54r(~=kE$JU|L_C7gc;VF@{i)2mU|d>d2cEjqVGqHFS7Ak z_kRx3if#PXgs%O$vbZZx_Ip9`(cy5%xLR+!waCWj7TMIach6jlU|kwaNWNm(g#6jaN*t@#dKJpDDKSe7B9O zV)_x4FZur8+Ia6N8ujV%$0ysk`jjI>*6R*4CwI*I>bExjAH989=PxnwXdAvxb)x)* zarg`4)Q^^z^w*Go)@e3Ac&e?9%6PxiZ2aAn?(zB*n+jRBJ3KkX78l)>KNf!ZlQoXV;ZgeTBW|VS?WI9A=4a{u6^k`m6reQ zZ<0DM@Fy0_PhvDo9wq6`SNB_347lIj


SXc@To!552x+`(Ti=sf|x@Tet^6-|Ku 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

P{}r_409S-^vTuofAj2^{Pc_dh-?uc> zxl6joN(4z4$iJsye@fy9=XAl<9Y$a{ zi*9us6k;K)C~=-m1!vDR78)ixJ$8!u=aWLoTL|M@oQa|7lS6b~!Zn0SjLDxQn)W_) zd0GY8dBTGo_l~Ncb6NAs?&!s~#mD&L;p2Ut+0D&t1-6r&wd+y*Mjk;f-rR@LVodNi?tL2y3e$#hq|;s>fRdEXlJqyWOI_ z6Wq|z&lk20YJUp7;ALzb;O!?TSLKm|!#cV=z_vs|?J5~lJ8IkX#K2Ugy++cEo)#J3 zDvK-eb zC?2e(CM(XORf2$~Jzew;>YP*1k3I~Sf&BojOFIhzpxyr?E=45^&J7vp|&=vAnfF)rjn3&}SP5aR$N4ZVf@CF!C&T%+F1826Ga_2aoM0r^bcQUxVqIVpoZB+$6POD^FZJ4+v7w76~pCQ3c zWC@@x0eks;~K6qc~|~USWl0}KAs^S26vYK9Zj2BUDu)8UNy~*;{ZyFyB$+^5<8CC zdK`n&(|eP(2S1Irh38*0>F8riJzn4EVoWf%9hEqO+zMtAu<+oNGCec5-gDul<6rDv zsNdOw2Le5-QUL;M+N-WdgX8998Y<%s(5`L)O86GLz9hP zb;TXdJ_7^l7(VMZALw=H3}N8XLp+{`zO5k_B*vaZu#RW2Xzqy&a-e9(vzWvmCVgi&PIycPq%49{zFaVSW1jK%6A zj$%_uHnD$kh>-#HcvjOoTqXJ5qNOJFc!IM!jLIOE7r%*Obn@{e9S15ai|}f@MbaM5 z@x*7K00>lIZYMhVc#>yH9^QGezhGp10E<@pzL_*E6$wjwd19?$4}1;_dN z^tiV!QOP3+LUrvt|KdE(cRY+^+ggDjT6n1CF+D7SR&0j$i!sI4d5lyP(;}9^esQ)6 z!o-VXf5uo4Ca12g=mhb29*Y(DUWa+MvJ4Py1PfWE(Mx^JG^xC+3+Y&GhV~kUw$-$* z{Fsz-4i^L=MAJ3XjC;hUaK2yXuroE0XeT$a+jkuedXEc|e#vY-QqCz@QK6*=8yKC; zMyRu5Tf=o(g#}K7rt%3RuEsO!(K#zPziVM(^CyBWz>e6EV!I%Tn~NX4LYybCT=nkF z6HSw9X+(zh@0{|W#oR2Ri&j@HVVu=D9B;39vqJ0(iop#$e|Kfw?Q0CXv~b=KpaoVL z?fQJ?u>A+g26=U{?EL!F)zz$3uuWuI7tU@>+t>ldzLaKvtyaeZXgstzk_1i;} zd^}0vu;}kn^E|4PN05X~h! z-a)Au#!P?%W?SJ5c*hIm2y0u5i+L?#z#CvWY*Z2BfewVHc50ILt2xsOV61=04Q-54+9Xmmy0`B zr2m^yk1tZ!`j2s^ln-2ADAR4b5sc2_3a-!J!nPyM)|ROaJwV%N#<}f0&cizKURXrc z$pi8Yv=6u@vn^U@F=|mfm`S)!hyVxr80F|JE!_{~5oY^d)d(F86ljiD-13KUMH0h^ ztf&F%=MappP5SoMPjA!4z&SqaOI2IXwB8&C*xC1TycE~&8UUD@Zu{u9s@oYM!Xz$k z^Pr4+E(Nfp`edM*8s$M*h79}`@hw@}2Vj<*hsDvSZ59%}V>=s`a_f6(gk~K)SUufd zV-ZHLQe`t0F_eV|!YVIQamCFltL=2m#?L-%*m;=q40RGqVOs}qO=(Xbzx&2JPcGTz zqi0Xv#wa4-u?IVrrc1yfhMk*XyFY+zRZL4Zdv`q#e9Tyh2Ma|-@*fw5TI%b{?tr=?!xJKt9+)GlrM%;$@1tPiFO_aTiSOnr5o#_BO87Y~vv#16{wC6D~lh@aJ-f%s|n~@rFZG|dS zi`T5KOeo-=@kbRV63NX$GQLKt^;! zf9y8-MU8Y*on9)b3N-jifA#?-8W*4D9%Mv4nsj^TM5XQ0ZsX43_A*>_hJX_IwnXDx zPRi_}8zDLcL7)?M#~*Or4p9i3u=b;~jp|3ZEd^JhDlbLY2(^bM(mGC>;~j>5P;&3e zS+KXBKEL*u_qKQWOy1-cRpEf0LJiCgTx!DGJ`j=IHhAdWHIOj1S&cEefLR1>INTg6 z;8eOV<5@W#X4B(ns+PfA<77R@mC#83Lzzag7d`@}avK_BM4%b~Zs<;YhLY~O33uj=rhtWz72Z*)-QxRLkfm*DdbD%|b zT!?>zZ+!)sJe@L1*Tb_^&cK-Lx_Gk6N?s&E$Ww^N54^4IWFSMcbTWx*&*wSQK6jh` zq_7!mwG+?3*vR-zOUGqwS38pljEdOAAq;!~j}JA0gp7I?rSA~5C=t%8(S1G3v!Dv& z7-o|z=afCU^q;HYSq1&P;|~}j(^3#(NH7Vfk?azg%5)m9vk>Av!3{xq*+?#><#M8q zYY22N105UFMzL&d#~b?{ZPYESQPf=-k**blR^JCO@Nv)N727z22)yv_hAg<}FW!6y zqYLBPbVjWomwQwJPS0%uVI0Q*uSi-uoa4fyLQN5@({~?ll!zVk7p*$y46hkB3LTJw zU|QrDG-X^kaHt2bf|Lxxn_N6vq9yoxchrN!a#u(%P95Mr>JBh97sbFoykvx<;y}kb_jFE(iU-qD?2=-WRKL-iP%IBov|eK~>S@f%dtQ`#e4$Rg zIBk-&g*38^?fYx`j+;RlZN!m0T36WyS+wx%92~r21<&=tQD>Y%$n0BHD|AJpb|~s{ zap(0&(;CT^!7h=pM)c#AYRv7vUYVv4yz}|xlgCeA^Vs#Xt0$LlSo@Vtrh!=yZhXL{ z=N{XkQc&gT(aez63}!S9-bAh$nlPHUQxr?j)Ow}f_Qrwp+^8xJd*fIU_2jD$&?NHt zqiq!D;!O-*)^LEqJ%2+^sXig}Q#g15>d)uwdVZMvLg8OK)1}9rJJa`hFOzFIKG*dj zUd_F#A*Buk_nH~zQ=Y%KZOtI;^=%N| z`Of6ccOJd%J$?R+u@`BY%E@~P*CclQNv1Iui1_5PgLkN0B@cI=PYZS+AC#_Ckt=Pw z2gfjV@77X1;2m}VMYS5cNYG&HO0|l2u$|!yDrW=H!0p7kxGy1%GXZa@*U?uWp3keH z)?a^m_12?j-d7mhKst?Wf!Cm};}3B4DxRU#3!H7i6S#NF%hr&s8AcUPQ<06PdAE-? z3KQ;2G86u*%F0HXpXMYHUy{u^zPVu^g)|?9`I3z0x7!symErl$Spe%MxZ8{nd+X5L z9T#p@t@5%en%8s>G?HG9mz3K%lZ=BTsd#pjs%V~|Sik@@iWYe0QDR-&<5XO@PK z#Ctg=&IA{!IQJd7HftCU^B$bX#RLuSn)>1b{l`aQ_+cH_~MTW9lFx!@; zE?+CpVGBx^$QWGR;kq<*Z|lMr&?Z!Da2Y_O-;{8%YYKS*c~zpNeUG=@bmgO=1B8L1 zi**{5spk*L&@WS$u3h+kK4q#hilGuM7S<5p%KG`-;5i>A`SN+6XEeWv=v*lPZQM!$I?E=_Z1TtJpve0 zo5K}Ts&fWMUwFKtw&l(yVr!nK@TmDf*$(8im-x~sh@OlGcxt4vCsmTydaxarrW?L&z%;u?vB-t<3eDFm zl+-}`I9myCaWyy&*CN!QvYM%bO5I!DQG}t%^=Rz&)JiiA3O_udP-0{8^`K8_=^>w{ ziAR0%+ZQ~n#f{Y~lXEroD3B*;l%g6ptu0d_Sen47Nl>?!?jADb=}?Uyi`=eol1KC) z0=9IE{+1LZ!~w4NbOxoTu|63Z!){NQsN*PulzNP!xu8c5RKai~CgetabE1?A!{sj*X5RkAQDRi!n1V{Ki6*Yg|~yclpNa=Vr9EH3Bxu3jD7wp7*4HZ*1)h1ss6ZU!q) zUG3cry)m+v*wmRBzI5gy+@g3(P~0={cULm}g0pC+?s!?ndDcpvwv*Gi3U!)$+D?P5 zUiDDbJhf7nu}d_Cu4vl=UVms(`;xbk?M%%xJ zFCAC)$L=lq9`Uf)c6bk^TMDE{-EP$nPcbi#+j3^ciK0tM4ViLGH78n1GIo-3&UbNH z!D%4m z8xXdGsZ}SnJ*q(7qDz`2uRFQha~kAsr?$6*QrEVT9a_ZFaU>Ql2%uk$pkQw&OZS}W zkKc2+^VZTK8tqe_!t*6tUZs9|&D1{>W;uv5#2QE zWWehW-=wqjhb}vUrK0qNM6&9YojGYB>+p0&$PJ-W{r20iL2sr-_c3@DC5@fy3=)y) zshP%zHVCR+s_yy^8sADcTzjgWph5E9B7umj(nk^1lNO=Zo3|Wk;D8?c*zr;oHPZ~g zxilo$CF?HmK!0g_1+C|1HGFY#Ze>as;6i3H7zwv(as2rDooA2Ve8rj0#B|UfZu$#% zYr0*6ezj)2Hgyp>6=fXPY1R&&@xddJZjIWJ?Td$uw+}=JJ=@|T<4sa`)PMrTt2pEJ zRFB(^8wC-obMgEWsNSHZp^1A8{-~-M9@L=}%A#f=Ya5wCLCtoZsuhw3vJQ>X2Gxy3 zC!?NafQ0tck5Xn)!zVgyXS_LYLRyAGjvxFo-a2n1b)ccPHIs2;2v1(h@)x2>r|R!c9C1*n<;zC^wHOsF~C zCOAi}?x033x1o)VZ2;fi{0;R!yriri=-O#O#bf$-^70d*~nDl{m z&8vY?hdZ$8l46e1qU!fH@+#dd(#XglXc;e|NgqF68XAn!lytBqg4mXF)q_~d z!8qYglpO?j#MMK!iwm=9+&PEcu*B$^$jwv+hNn>(T0@jMpY90e^k!KyoZMZSsDf6T z*3P)IrEDa=)H8a`V`ituFEPFiiQv;K^Eny#m%>=Q)8xqF=7mU zYltvrJ0L|fKo~P)>Tofd#%(6hENV=80~P3XjR~Wv^I;(d+q#kP_#BNhi=1Cg;x;(; z_BV2lHF0U$syVee^fl#mreXO|)NIW&*?2vFrO<`ywh1M$5%_KgE2^`;)0N+OyZq5WM#n+;Vt}K z+Iqy8$TKvR_GP!=wkOhlmVqMbiL##wQ|!9Y!!60!Y()Dh(>h!w`MwDqW=$Vzvi(es z18)>&(QV0tJ1glP)))ru37S@&`O@2A#4!@g>M$w;jAdc3kl`t;ueEX5-6v)Zh0_T3 za*dkU42m9lin3okGqPPaBfB*hFF^V;`TVvVY7NW?>KIntyS4g8QlC#3Zwv=LsP}2= zZ9_lBndUoQCP7i~2;NlGuS51R%`0T{Bw*Xw8fw6VI;POw{N1Qh{UR7~$1qcqt)+>m z0E0F)f<=aAWa&)Gd3eWbXNHf;t>XJ_!EX5~ zFVzX@vA7NKw%|y65m!w7Qb$a!qEQSxA^YkBspw=oiRngINtKgPUy?)V-Bu*cHggl!_q+rCgG#|6nt1zn*FBS?laL@>2$cooJ;h>PMA{Btf zEP=N2^fhW+`Cze)3m8mko(K^}DcYLJ#>s}*Z7SBmNmN58OtZwb>&qaPg@Vi2>(4JA zKYQ}@QarOs3*@@(UXRR0!&VU-`f9aj7$xx#86x)5b;P9twyy%lcRZ^Z#7GeDfjKTf z;hUxPJv5W0GieaTq;92P5!&9Vk6u_|)sDkfvj~*IP**D1BJ=38K~lHvXROR3G#GXn zC|UBlkA4fN-?|9u7(S+lK>7?c&KSz(Kx1YV8F0t2((|~5zDBT@78|h%qsd(0c z*DQ#l(!ZEP^M#+W?@ZNiR@HeKthpawpRwyRaev_Dvf4$b&BwU7#olFH++vD54OT44 z!ytjBEiOQcATC*0s&|+vA9vEugF!aqZ0%j$Hm`&C8mL*4ZPQzhFMpeg z&?Vr}#&k@k1!Mk|_w3ob2PY`!93HLO1~pegCs&D0z2|U+9wxB{SBB!~D-EA>*?IoO zd7STf7{~S@2@Le%j>TEc%M9K+pRsqYAH8+`hN0-R#`Otl!fwEY%LW$MU!xN_Z{c!CO$yF^lj^lL12|^A20?pk&%wpkTb&`(Ow4G zb}G{(u4SLuezFfex3yoQYOnKJl^qc3i)M`bvkU%{ajr`+?8kTSVOFXVAyI8OX55>Cy3MWP2;2>{`P;vXcX+ZQ8Y=k6}3jMrpP7{ApUPH&GcI zA73|awWiSV>l{M@#q9~&jNVcvju^)(vxPjSWG(F=h2xdkK_A1?Id7Uv5QenPvb$D$U-QN7i1arLmxSP|44 zb)T7bo3q;(9)@YH5H0IeifGrwQGAXo#te!9gBCknmYHZcXPv>&Rvt65K`29EYYV(ASyKT#Um9xu!!0~kYuofI$gW6T+60xR`6NZ{EgwEbN=u1v?c zbsdCQHn$GO6k`|{I$(Jx^_-Vwjp}#~n7pcG%eIjcG%Lrq!pck=FWE2t#B$ayT;? z6Hf;i^86iEbice7)Z^F^T=d$N*t6PR zIPbPW8*W3~nKxd-&}OS7*l}n8Xk?bt$IGG2VH({+@34~*og=90vg^fX6wB;1DEqWQ zMl-%e+qezt>aN{?O(I&bE9sUP`xouT*uEMEnwB+#D}V7MTAm5l4Y|-Xl&HJWZr?jI z$zsIT72nMw#2K1gN8q>TS5vl@6oyg`32{7nTLwd}mIz%5MXe9XFap0VgejX<3Q-+; zxzWwsPc@XUTlrlFreo2^c9mI}@E}u;sHDXU&1$6M$?L|c?no2jU6dixhSF>IX!~fQ zafXO@>q(T@Y>ttfj?XZ})>Ni`WenmB5jTlA)Vz+yAIr4Aiy)0a=(~+JmWA5T>(_hx zx7i7p@;Vc|o+doHhgwM&aj2k%nkPn20LIJ66NK+=%{YMips9*O# zTjFr`rh}TYH;Ja=E2F8k?X>QjiOr~ig~qXH&$?LcwM>(Q3dKTNE2f)SsD9YA@X5*1 zm>Z;mOjH{jODRCLj>FLK&dV~(VQ)BqY#!tnMP0!@h?SlnDnof!9MM0zh<2Hb+ZsCM z9K^G5&~;~MRKry_CWB^U(#0^J@i`2VwL6(vR|>#WEOUh z!>qK|f8(!e5D2i+Jn~+swXCU$I5TaUm5+Cc7G>$9Mtpm-SQ_y4qhBV0;Oy$amRX_L z*_sC--4INSbxY8;NqFsJ8}zPQw(U#=)f~HqqLI)wxP~EkwqPg((HIM*ZF-hPX(Cxz z81{oav}QNLbI2%kEOOf-MDkcFLP6GGhhw4$Q+H`?kqG@t8LIk z-CZncx?vd*8vEL~G~FDUmQ4xJ_D>w3P|Z53sl8T5wk;}*p`THt;hyt}A4@^@f)f?(HA45SN`9mRSh zW9ghFE4G3uQbf)1XW&}BV)gZe#l8$ZNTuY~Yy z+ln`BO0Z{Z`bR&TOc>WLXE8jH%ixxF`hatM19AEgxMl9858`(8(s6_a*V~|sL{6zv z=M=6DVtWyH6%|R}zh?f0h^niQ-HG%XhRm2p_*zKv@WEA1;?!8vT%O$BdZv9D6pn+;L} zkg=;>r(K#Du6LCj`rfPJ@eFIarAX~zz1M&`weO(&PLPNqR~WsrQKW1$W*iG+@s?t; zVrzNPUMow{>k5GSP9IR^m3OZcCV6XxDS%R#jEDjnU$J0S^Aar>Qr{BWoozF0Kk#sS z$O3=c*LO5LlImj;t8+0Xe^}4+Ge>ZuI?~e zYXH}-^6p+_%^~JOd^_NJeRGcd2PmGSW-SP>U^q~D!79rk z^uY;RWob}{8|Q?{3m~t!r>-kngj@1zn{pOz;v`ZtN*`)rhD~ZJu4u&dMs1MmZ@{Bqe!(vRus6)!pf)7XnZ+s56sNE34s;=PFqX^0q z{GF^y&c)9(xDU#8!ZYy+Yl=|(gje}q!Da9(u7m_DXk|gR=22YAv{RXumkRq#KyJ5j z5{aKM*N9)ZO%*?3?;(NEa7%>(K96A%^Qr75q zmS=#*v#9x9)j?UGNOIu@v?~~i-;yv$a?<`_d6wWhVL4s1$8{e17Z37qba{^5+<$-v zYO!<9M7?qU0&b-U(3&OqWa5K<1}i z|3X(WyIGzCk}E{JW*P}eVB)DtG$&6wv@zRUFfJT>lIveQz+|t4iv1TS46=zf48P#M zHdG!fP8fS*`Sg8{mW(}No40~Ed$tknjNL3346b+7yj+>bSax$cE%wp6EF4EPBH`1G z)82BPZNb+Znxsa2?0Q%Jvh~=HGovBRBg0#t$1!0Oj(f1OgxL$up*V&c~&=B5ZYwnSuL|vz*Z*q zOTe=lO^wdH+kEnEQN@1hx0}#GB%9)}+(5Ar6+W}G+%44|N5L~$lXum(dwCOcsZ z!6pj3xjCzD2bTh4dgO9m?t+LXb>KTQ_T;TcZ+PtT8GF-v^qO~doeGbL<+Rw=DNlW8 zAyJ;a`TX*Nz4qwYqf^(vz|y#9U>RVmxU6cH<#mz=5sx51K>KwAkpC#mW_jp3n>@c` zdC4MP^RSi+WB($A%c6||Wu69i;^Fs;@X8Ob;@F$j94-%Gn{*}#+|=P9l@M2Mae#Ow zw>YqZ+MTGCH$0}xf;!K7kSHp1#u7IW!1uno%-OgO=? z2|TOI2We+px)X?`u!^&|+VF^hnDU*2r8AL%A6K~uNG8pt)&Xt&e&zTU^SIS| z`3|0nwg8V1@U-BWN_S86=OZktKz|GTL*MBG1P0`9r8l4L{MS4UicMbfwhRqW%h7-Y zFQCcPTiqd=quJgX8RXc7uWS7%j->MUEnuJLz zUIJgv_i+*hx3}2%mN4HTqJM$m^_Fn^Kik5T>Br(;{u1u=0)+fC_<w1G-dI{58Sn?D?p@Kyc;_mxW z1ZSS*Wr|@ET4~n|=f&k5=)2YS)_3dFe|_g)B+2!Jc}bJqec(aa;Wk~TFb1NK=a`>n z)`?C(5tF9%2cTy|iO*pHFN*9;#f}4XP~lr3h&-!5fQwL#E$GkIDGsh}5;G78%5#w< z{)M0o63F$t*bU4v7^K2-g+UO@)rUEgby_osS}iVZFX|6eyxs>%q9(2+Oj_wn2LaD+ zpar4uj)Pg0VG}unj3@dhu8>jy!Y}xXSmLLPdoZ~bb1|o7Qe8TWZN;128%yO57A8vA zA=t;sr90vGMPAl2kF-I7{5MlU#-8~G9$10BvJFKhqlx2Y3g#_4E*6%h92)F8J8Aub zm7jv!IF0nvy_xO?g%KrZ+X_578C>#5jW~0fV3SB<)}`>bzj2%v#FmNO+{_TIurA&t z73ex*rRlhBkc~3n#Mvsxa$qsw%ZAOgxXn_n2eM{G!-RMF^eyi#p)|J*vSc$hY}l_g z&mKit#p0T$RkQGTZ_CRETm*|mEL{}_8SI2k;A(VS!eCOAaaOMcVjaqzqM%*n(3=$| zT3C2chG5=ekXH>*_>qAsR7(4ICJj0Qt@()H9%d1Mtwa)lux=;p`kI%!R~*-w!QNN! z!2||bz|^6@S$Zc6DG7AHda`yT7pPI51~EkXLN1uw08;5KZc)anySNZzS)}G1VJTTe z+cX8I=h}Z8=RfC6EckF{E_f+ceA0Nk534Y!c$gMoOx3_lL1Bd?!Bt%0V|@7Skf%bckKA%obThT zDB~QCEVDQibE|OTg*|V!B?|c5tyOxV?XMV+lsF!bd%~C&2Uv+WLbQbTFaowlA^DlO7B=4{5%Y6U3McEEkTG zra=Mr+`NpODOz6Z7^cBh609rf_1#08;l5X#dNJ70SK{G-%MLYR*Y*4`y@JR>;-IjD z;he&_iWFEH6yB9E0Qcw^uJp-*KoqtYvO~56>ZT6qX@Z3aN*+|s87vB*JnZ&?ts)|4 z8+i^TM#EdLG_Y}lngkOGFMX|~z7FArNgUsIb+L3#Ave6wgfgLiI(+d284P|c(tzd6 z;)nZ3j8L55G*ix$+EoU6)$&OJ!w4!a??-hN%1trc5bhc zoAVToUu_6!QRZM3gA(7&)t3#M0XaM+w;PXUsW{cQp~$^T5bfeh?hH;lFk41A>Fs(0 zoPj<)A1hwWA%hsl6INRFclyp@mvsl@c*3$Wkgiyt^d;_K98cJFMDTUcNXr@tA@$<> zR5?!dnH|hEBmnhQGu6idtZ@uFS{GfJ((h={hIFvx*dh8+1i>%yV9uc;nLJ4hjrb7S zNEQaQ88{g9X23dFe5tsX$vRXl?RpI198;c}^frt%io8K*gt|dv1m{?Njn8N=jyjuw zmeoF+P^Sq42v(x{RGi)PSFq-VuFCP+kvU9e4DEqA7w#IYxDG;_gFKO#32X%(e>2f!C{@955_Hd*c-}s?2&AEsrq7HqC#5bBj3D zXh3%MOJ@PjOR&hzf;!%D^tf&L+c@Vb_-a@9st%yS7`b%jDwkOPfW4@l=~O!INC_JE zol(kz8NWi$I2OXfbhhT%Ca5-^@6OokPnI5g{hGb~bou-(k3G43{prQ9U zPKA-|Ku#6&www1fh$8QWKa;W`dG#^f77?5Y`p!9fe);6_)7Lz9{p{+=h!h}1KGY=ou7zZ1SCn6n>EMU(7b%NgxB7+-`jE#~zpPMY1ki$)O9I@F62ekgmgk_Q-R zWE81|EUjQR+7#WcxGs%(m}fg_ZaeL8oJM>Xha9}D@Cm-Qphx5yEr3x!Hfag+C&X@V zstp$-A)~cB(gG=CdKl(}yiKC(#Yy%@%kVM8IqrVMafM zAzoEPk9`PFjdxxu)gJIfOEitvPdG@1*Mo3g5KVU;<&}6D0jy)-;nCb1gr$%n^+4cm zOBO3Pn6BVW>3GG^wb%2--5nF5=0b)sQC!YY%kn3rCp+uBX4|S{w{hkfm*cojf=LYr z9^ZA?6Q4bL?UDb?yJC-Cd+o}*zV@yW%{c=f>rGzOBKVU$_;(Z}4dA2>?t}roxY$h@ z_&im<m0QUKy~2t*&(2`g zAnpPz3D}!P@j4cV)G9Tr^Wx0E*eH{f0q&iyQn9#n;bA-|GF%-q1nl0icqLRg2d@OS4g$5YTsqD=U_mU-SbSfX z-@kxcXFGM^A}*f5T{awgVVSBg<{fiGX4D2kFtUs#dW+c-K|L1*%Ie70PB5of*a&yP z4BVLHZ*Vvi&VcL&wl>gT_HhPJ80vUwSX)zGs{UffwDFbWDLmp-=5>CHQKf&-s|a*(<(%s#kp@{@_!n|% zDOQ$8;0;KAc|qt;;|lJX*xy}{LW6X|uj!_lt^{m=AHg&$1e_Ua;b@|Bh*t|O+g~Y^ zdMFZW7K;Y6sDd8IT!}|C^FmC*OV@?fJuhpvuN)Q^a1REDRL^ntm8(7lFYpEjUYdyE z8M7NBn)&TE-8Mk0N~nf_eDQO@%?BKslvHi(p33#RW{n?&e85c<46bHE!PKj6hsEXP zuGPO>xFZ1s(4A2w9ZLr050rzFfuzG^V5Sv5D4-A6*h*Pcg0Y&6c!%lhZsh0V>vx_#e)E;{bM4q9`>wH+&2ziM{9tVCY8M~}GD&AM zFv6+Qal2V@&1>N@Cgh9@bfSWL1S@f1>B5~87DPb-7Y#6#R~4^(+uB-;@8h%CiUlih zyxVmTJB%vD%}~68jwbCAkSYN-BCs}ZG5Ri-vI4U1-Q5rVs$;ImonLaYKw z8b0x=Ymv+0SgmVyMq9yj`)YB3!zxin0E|Np)zr~sQvw@Z7;uyna%BtGN{1&~o<(gb z8Uh-AfB?L&CF@7%2Eq*2c}rPm0?<{L>Nu_J2N={S^bOs3u${hXAnlB1l!gge)t!Aa06=zaqTbzov9d!Ape@zqEs*u zq$y;VovxKqr?}u+!eMN-6Bo|oY>nuM4UbpA5-tg25qw76Pf|lD=qRXa3B()=0SM*& z?;#47+J*KsnC$=XwhAW%(|a39C1l%_mvLxHO7o1@LHS@z<5dMN((SYx?xARSqoTk@O%6>K(cYR3084HOdiHl7|8KsYB2(`5R|(FjmSC5|!#PC{!yrK$Bo^ zun=MZ-<{UTyA%CeR1qAU-ea&a;q2SG_zgn>c%aC86)@EwMz)JH%6=@C6$66pUdRB? z$DrDUf*XMm<8Z@v0muDdc*25*FI2GyQ0#Q);y9QRhOs!ti^<^pJBVeYzLqtHO#<%r zqMB^ji9$g1Me}LHUv=<1hWKL+2^LL$8w0Rvpu{IEY5iWceye6CN~pf91QmiTq58Dp z!->Mif{e&hAN;}MjSe#+B8+E*_BC>STtbtp4Xy(W*JtWK06qEz<%K#+!8|@$X zi zY{Ut7<7W9P&VmH5@4>_+!;hyk#>mkn3X(?VkG#8G# zbQXe6$z^ZOyWK?Tjuzi7aqXNq{1@%zRjs8cv>$!Nt7}IlaqZz98c#gU-=P#(QI8d*_^iLnwAkG`K!c4@Gt1 zm0(`%?MY$#cCz-n!#NiMt;uaJhWSPAqM}Y$;XcA6l&WI2JGtid>(`GrK^cTKFXO6? z!^%UeAo#Ynah>T3_F4ei@v@5ZOpX^ly!m5@<_KdH9feFXoV^ZVAXL}v@|?aNC&`lx zZuF254Y!Vc=I-K}*RRFpoA|cR>t&w4Z@XIY(uZElOV8h%8M)3iuiqBMf?N&$Mhu+u za359mcC~Wm5X+?0Lt?m(yjyW@a1hJhexUz}08LWILmj#iMl>@$>dHw$BeXotE-#vF z!YK&*A--fJ>rtmWaI>x!tx7pWHK`aP*$?AbdY~E-2FeNNfS@w_qM_L{MsbNf1{#e! zX(qtdRD`4dm9!}z!m+XJ64yP+PTYWFC*GO?)zEbjzAy};$6?wS$?lGJ6d3++$aAKB zuq``G0B22R97M4E;CC%)h*H-W0YJJWBOY=(Rp)g!EE{7?c}uqj;x;TBah~m% z|LED94Pl{`8G+jfwABaJPz*5%;YX#8d+7s7m{t3OH(EuVca*A=Fql_Uo6ck(lo?B_ zD2LEZSd{Z{6AhkSjo#G3OFV-loinw{l2?Ysq85iqYoblRorP}GJ;+dR>Ml!H7!7f* zhYcmH@i88bSVJFZwGDQoZd>D`nB9JY72&G(-%YcX8#ZdNQpLP;^)-NWln0g% z*$!bHVBk0~6Uey69bvl(-a_IqG5U$(_HZoojw}m4mDa>i?(lL^m5mfOLJ&q>>HB7` zzM61}H?t^4w+aQ(J5`9P!Nhu-SGLXS5_|`PdRsAm9}CCPKFlT=uICF_vV)LusGr5? zK-I?W98n!uVjwRx-OA7zBJI>ogNIuVJ8zBASdR7MOgAI&2ZR?)&!F5w3`JLh4rc`$ zsTZq9P!+)jY9}ztL?G$T>rGt2Tb*)g`^MX*6wf(NA1a=#SRBF8s|cF&iDH@^${3g^ zu>PUQz8}UihI}7vSA;Cv45~Z`6R~il(1QdXyPm(ha!!Rf5abGCtBKJ<)bnGEK@#ue%dgHk zJb}B-@XQ=Sp(qD%Q;MDA=*eHnqWR0~z}^e_N`Neb3BfK$lk2pI;j~IThFU`X;ub=s zyAZ>q3p!mzmDdHG!QGf1>=bqsU9?%4!VJq5SdJe1Aa36H=zxw8-whJ**_H1Ehy|FE zy`MNhPOzPoJmEnlYy4%RD!B`2)=S5ML54xWRCqIVxa@*$^62Gv5l6U8mItSeTP(!; zYLaYZ;1L;tSUG3#@(L(Aorcq(Ej-J4Y(0CeGkF+j*WKMu`0{x!65<1BXeO6~=U zjgvt)p<7c8eq;1h1dJDeI#a8QRgk|+U)a^$1Z?PP3E{T(F#NV# zm(Uno>wCeZWCqOR)v{RCFo9*keWGO zCeJy;bFLlq(PUYqt z$CUvDEY(2zIY=>ZDP-xK#YM>AWuSYxBT)uyTbiBQ(m4fUVV=Q5Rj|7OT4If6NgE|S@>OdB|VE8D)d*H0j;~fX5Z2v`10f%q~h|gL29(uFKAUGv#Pqz`RHmQ8b z3fyhf*AVs=!Z8aQ+$?<$GuzP9_rU)EoTqRMbS4@wkfrKpk${0LSzgC0jGTM3NZ*s6 z1NhiJ#kCn-StsxtQ)KNSKt+FsNQCc+uK~hJITi1yResqrf{g*QAT!@zRO&5=TX5S* zl@Rb#alo?&2m_7xJ@8n{zmV_JEgeIO=gc3!`^Gy@F4^mko-ChVdF-ugJX*A&pFO|4 zxP1D~C41}XYtNVHBaeiIPgcs)ynMj0!O(*W9-q#qtlVaxK?aYKgh36DdlWL3w3v?c zcb5K_qIF>Im?Px zR-UZ%mmXC$tSaIR2S*KR#!C$<_b`(6@q#RbhaQwz6|V(IMjIpWjujs+NMKpCq>1}_;+;dt>F;02v+O22ye?F?Q2OcG3L#afHof8wWAjA82I8i{84|LQ zcHco9yGETkdVhClgR6>o&()GTKu$zs-h$(~KNWwkCrrrbI1o*YbyNKvB;xxtkO^mG zr~`pz=QLue1=Nx_#YYux1abVd5wE)V&8H0?hMGFR2IuGG=2@0~D*7@BoP!H1N zcXe>v98s41UadS`#$sFw!i~eueDRcrzkiSK3x4_^$PDUYa_3d29c)dKa(06dY3 zO~7@{iS|191o`6g6>v4x#5cCCk;J2{9c;3cyAkIHM}b$^l3q}m{$c&bi*y>LyAg#1w5FQ$rYBWTU82} zvZ3Nd$?(Eg!>&mfrv4Cfc6AtN|bp2n1qTUqyJvI$LHO35TL(#fiBO z(rF=XFXIGpLIU%w8$`8jE88}#2Nfo)&T9>K`4LY#m$)7zh!5sfx-tjjJ*!x}RcLA! z;9Q)>I#b{>f2%}KitrvIfy>QolW~$06@xN(oaCSx_z9ZpKBobOGTHQmQ8V*JrkakE zyse5VH3H0H5v0sif_+a|?JQ1$w3&)+RX=4dh1--W;dfiL=2a&~VBwURCIL%WO<|d@ zh`3z9f|-VC!DzX7j_9Y3T+#`8m*Ky7BrXH6(4IUaKZmSe)nvOYH(LWq&a-JUqDT>) zmMUO*ck!uV;LdqXcT_gVis~xQlEXcBAePQJ+cYZgz88~M!#}^Tt-J&^*^YGtclS^+gcVB|viSa&3u3D<6LWZbV-FU@eW$W1g6IRyO;07_ z#bJ12Xz$v*pAvDoCyVboN#<`=Lq1MoMVPFp6%obd2I zSw3un#f^Dwp@$8#jI=5U|JL6neD!+&uq5-^_mq1Bh`icXB{fep(wU3<^r;4L^nM^_ z&*F++7RlmKwiunK`~=6{k>Pr?-aoKq%v9bqMC>D#n~`nM!$w$Pvl$SLR-E_I=4QY+ z)G;9F)q9wn#z-4+!HLIrlIwW5r|uVvfVlK_7*hnu3K*=3mLC?8j%wI=*xX{dGflQR zDAxMz8UnBu?ag-_{eD6JB;p6D!GjE_{9?)ECTaon}f@96M-MW?&M<9HC9eX&T* zQ?~`VfmP7=89~J3-FKmtAE>lA&ut7^_F@hgVSn-_GN+-xQ&I=ED9R8sh?S!p!Mjv( z1RHrBr_;;Fos5J|ZJVX5qF8e*d(9!)2ABfdHkcRIsc_AK)Upn*(LC(e zVg44)-9)@;nLWGft;i{dh_YF#5y8Uj8+IpxOuBmaGRcqndPlJG(S(9z=A;w%5UqW@ z7dM;_tmqx=`H~Lt@yPh1$?CRhI2NivG*-aHGi8;j(J~qpm5RV&hcHr6-eu`}e=mfA zhIdN?YBK7QPcc`1z2mhUOP|KAB|^39G3VN{%uy{*LD8aZUOmMyQs)Vv&hdx@Y=ks2 zvgvMhEx*`0f0(NOfeNf$;SAx& z@@86E;<@aQsP68$nrCh#-m+=yGrJJbEds zeJPWdr4SW%9B=A&c@-4cS52M*ohM81SvV+hb`i9ZRHdzQaLiyIW=q0!p=zRPUt%iy zz4qIbl62S&OD?a2-qS43yW=7^K@kb{e$-4j5l=DvvkXBx3tAyrNt{rqi9xwuZ{p%- zSmt~Yv;~?Cy$V)@+H~4S+ej@MWK~?ek2@pj8?CWUJ@P zU^;DFJjHyyB7Tbi55O2xwxhctpO4U$$C-p}8^$XAvU>P@|84!_&-?YSb)kIu?MG`( z?szze=68M$g?K+o?(Y|u(bv`8>i*m3=#Nk9^|!mPMfRkRIO3t^e{X0Sx({6e!~r6n zCqNR%hr*0GzlY41oQ8@|5wg;tj=T(Qyie8Vf{QU2qKp4|0_DSP&4Gnu@#A3etp<|; zt%K~TYmGi%3DSu^8e8&H2fkz|LZsqnkvKV7E)iXU@rvFU_XysY7(Pg09dZAw5U(Z6 zMNl?1Wj0;(Rw8rSG?@6J$j0Yhk(4AE{}W^U!49X_XSt*oHf71&6b8e{dYj(|Djpvj z5Qv$_>gktB+8MN0`wNnSyjgl?3?%uG2HXhNJ7QJW>OSXeA(u1P6BDa=?_Ky;EOi}MfFS(4VOsQn|m>2PxJgmn8!#B#z zKr~zgiuo|?WMtn{G{A5b-c@rBkTZF5mWISE4=){qjOj)e=Un*%$otVc)1BWgE|s>o zhsfsfZe$lsAsO7&LRUPE+c=7MahButKRb&3%_6Z66rY24Nq8l~gyEViV$BztYyMoO zW1@qJ({7GZ&Kss2Q_s2bw~I3x{uK4l@xM`OZUQc30;al{m;t)?UI@~=x_&<#XUze@ z>$lIy4t#!*rwYwAuZuiUcV>t;H2q_Tg-rcSfjNj4s=9(>$j@3odA0#2w{&n$P1tOi zxyBtapsL8&p-sqozddcRFwoJ5dW@^L$YcDl`SUd)&sg0=@ajCfw^(MJ!$4%;_Dh|Db{{)ePG|sPP8NKY(hJZK@AJMHM~- z71ekTR6dTm9B=Oc?6}T5U^}k#9`J6wQEGdDSIeR*-vQxhwRZqHTJJq@UiaW6rs*AE zUbtFJM*o*8?-J3h#hxP~$yN1w$bY{~d50Re1+wM|Iu>oJH8PvMTxIJ^Yl^3CBX8^@g8?MHQqadOl6F#G5=Y?& z6sD-Tt(iG5A2C-|J#nBqELbj*JVP`Uap3}vr{1Ry5$5s(T$m{Kc0Y;{6AftohbCvL zF}Ksj*HFOix|K_Hy>??|Yxa;f4r2q~EW1#d>im zEs>dHR+V<*wWIjg@)}*=UR4`7QkRH1|34d@p3KpfKMd{N4L$tgDHmaYDM&*0k9th; znQC3nm%y=%8A#7%3gxD<`xiaF!hJHM0(xIANdu;ON@8nZi&xqVDh8_b6P7)ObkJD8 zzzk#yHf|+-!l%*a0Y@>8$=&nZxgnVWtr% zbNgJ_DBiTDiD0rUXnT8Y>%jTyRN-l)`w&fkytL2r=jZJWZ25f%@oQ@X@Gk6gkb#xwq+X0z=E8Uu$Xb7I^0DFaPGDjv%caw%}TxU|_8YD85jzBsb=_ZyeC zR(P%Z~b)F0r^~ zCr6lC;CB(*mu&sLSQqz&y5pHEGu3j?oJ?YnGF8d@5Ild$@_coV#Uve}Rvz-z8{AR; zbdxt|Dyp|lodxX?P~%zCP2FCgt<$4+M$)Gnxk4NEV8KW`TxD?F=TvPJNK*~(MCIvo zrhIA;!^O4FpEKn%TbSYr=8eQyV*w;(rjjY@_CVcW-(q~|(q>!dZUL(wcNWe8u%xYN znogp1FP34_OfT?30BrD}Y06BczdHk$1mv+KFjSbDmjYhVQ27|7AGJY)J3@%h6? z4{VwxAC5>H_79PP>Z4}0Ym#z6sv1QSlK_v zB9|PrHx2wP9Byar-_f&)o#lvatGYI6R5k1!w1i$K-YH4#mYh=jy%sN-(@i_4Jmd~y zP<^(V*h~4*jq8DY^kBHVf(W*hs~HRIwKC4hoe4WeW-Nm58Nnjo%%Jo% zloVDn@pCDNaGXBf#8TCo1i-jyvYkm4rLcVog}{DGBJh#`*QE+b?^;JJ_bHhAQ2it> zBX~QeX~>PMI}O?U`kAhO1g1Fby}h#8_F2rC7x*9m$z3fFaW_YCD+(Wm^=UU6eLY|4)cuXEQg)r z23~`IEiU~xYc0u*tygd{TJXKyjMv7%?iLq8_h6d6FT0~0^`zYc+1ByC{JdQC5=r|? zIta(dg%{I>VZ`xl;+lvk&CvzXTfI~sHMY2*h1gV0#D1r>WH8PBm%ZM^>Kk1@aeAP` zrbggl9kht1wJ|QH%yCIrz_f6ebW}Eg{Q|!94|2)!Y+<2smdv4uG}huph<3oRRBFT# z_}yZdr=g(6Zc+b=9&h2?t3)iB*DO2y>+BL!eS7t6USS|XB`%_9-<0cpugKyuifj?* zd9<@+dAA`E*aOMy5Pg<2!@Pe^B$3Obqs5gL+}XV}19_RmZE}6|GHHr$7pH0Ew0%Up zcV3(3Ij*hv@JAH3Kn0zn<=ifo=GAyF|2U^_->f;kX8()d=yUcPeaSZ~j$QY0zYZS} zYTr;~Bk+0sNqIPpey!o^M-+VDDmOh37nx0pKxTWljCU8rWWvlaSciv&SQ*cjnC@tV zm|wD^O?0&W&LNmHeuj8|>FEw1ujmli&0Gt7ksG?{AneTvpB+1RVWS3e{0dCTqBmzd zqE%7jGkB|hYkg2-Y^T%B*}}BlES5!5r{lW;yj6Rvw<&ry4k?hXOuok?B;%;@n5}I;bOQ!@@=iPPvCdX)k^jn z&6=z`78h+3mv&P%1qVomojoS}_NLvuauP+f{*_s23ZJG+e$~PE_UR?~dTD}>r)+x> zd{RR`3N<(6ztNEYdTD|WYRKh1E-v7$A^{X12&4WBan!|r21=xx*QhZ&H%`bC4j8C3 ziBMqsz#1aRV-J9c(-9U?pgtNI9ueaeE{4Iium?8xVbDB(PCi ze=FO|^B>iJ%VnK%rTdPx3>+jf;7ZL5|TQb~jn;QNg`7Lj~Y>Rcj zrS*8{*U^_x|MwyK_v-gQ;al|2yC46d-ARqnFTMm47UN!p@KcoDR>-MNqFO|Q6C3pL z?!4&Q>U`V8PeKtm0hd%~8Ba-9aq@SUH5z({(yk><{q=J}A5mhI2*)GT`Y^2vP#uYHM{_~t*`=+@359PXa@_?@7G`$0P{@t97GbxmBI>EZA52f&rnX< zezV+6C(E0Xqisfr?+ccvWA{ZI*y;GySqLh;t$DiwiNGA2;CaDMD*Bc#7y=~ z{~vNx#&4i^?SpAQsj;Q~ojfv*B&rDVv~A#51woC2*~Fu|AkuV!X~1vcO2WRtMQTAvyT5EK&NCb3R(YS&qi4e7lfqE_6HZ z9L8ZV(>e6yWDU+9GS{;rYmOkO)a)YL(u0KI``0BWfp~C$M}a(;Jl~31jZ-AZxq>qzy4t)k zB+94VFD2>opJ zq6eRKyp_BSxQ(PL;W*#@0+Q?3R3B}700=S>H|}$)eDwHuC52Y!s7d2>NmH07W)+!* zpG*?k+cwSkg?V{Cl|9)UBt^{1PZe=?9K`USNI+u=RK#m^#zBrXc+mvtS_qH7aVu3X z2B}k(UC<@Df-Dw6%A1u=B8}Ok)lYrGRBbIm_!3oCH2r1Ba8KpZrkbFAvfD5!+5eq+@rcNZr~H4c+HluTn_k&ptk0(KYOBlAv4DVq2G)G*ABSCE=|q6v@GCU0(zmea_UB;&9L&RF!Vus!UY~CoYp`ibFYp{!tWLL|fRz z8A%BquXfLIx$P!ZouHlFWEI>bG0wqjjHXQW0;a5ADM*>B6g@tkZ8mmwA&$OHnRcxy zS?+R$>v^;hq2L*PfupL*oZz}$T#WUQRLIgkbB&zP#Q8oqU{rbC zH*IqWzPi$X!238wnVcF3&h>hhrQI;6AbLDE?sKZe4e^;$9BgY*rITu&!sG^}t9?0L z8f25`{dAEIlE>14>pmyJr4m~H60G@j@}oH#0C0!C^VmMnL0-O zngS@2Tgpka!PWym%^UiacJ!!>5%NS8p1eM!>Q-Qo(LRH7Y zdUM0PhU(QJ6VnqBd&+q{JDNf~!@)utG}Qy<>msSjlKf5`Y+h|seV&%j@Y+G|04PJ= zFX-SIsXyJ>Be{3ZtL=0Vh>r;l@%_ovB(JtmhM-t7{>(lg;osLN_`Px2r zZCdS}+DI?gYpe8=$J^@JR4{@JVC$Ed9`m5uHR%>ayO^GcSx<4k$h(`qpr+C8KPS=W zho3(_|K~ToW?n%&skq?O=O3?jydKki+%8UE@@lJfh$!dPc6`UT2^0XI8WXD~b&xXM zM_*RwqdHae82InXtk60Ssn14kQNocgeU;|1_C8H5>h&dU3J zz?xc$L635x)bbQ@232QEPn*?xd43dmP)?%3!ecm#o4Trx+Mu&y2-L)sp6Tq+N-eH> zn()vk<(U9^e7oe-j^;x(ScY@x14Hf5zsejVy0^ER&C_;0s(B+m%?l9NWga8G%W^0~ zn5)S?bm+`9y-{dxh87C#i#aT=Wg(u-rfN*E5_kP_=S^3#nP-=@Rik*@Yinvz`%MuM z2}w`b2IF3s;x=tRRVQnJE=P^`v5A}Sr%?wUKiqO5YAEh;9)R(za41J5W*c^6II8Be z2C%v+4s}3jk4D|g9qebSpp>v*(l>vuIKmix)WIO1yBH+;PKFse3f)t~<~5y~)eqmC z8y!f~ux>whFm|eNJa$Sx0!kD7RvY%^bEqHx>G}wgxH(*R8pC2Il{y2<=ypOnYKQGU zD}5S#m3EEIcE;n9P6@qtZ>uVm6Mwb-zGfY>_Y_$y{`f&ctqt@Ouh=x{m=0)X=Lobb z`(D$gx4f44ACDhj9ljvj+`^sGCaNm}cy%<&8}abVrzXM+UCey4*WDS)3wfuXICqSJyw^_>aft3M|iYK0|FlqX^4cuE9QZBrK$m6EagZ zDwlgBhJoS}mL`1w%VlG1S2*i^w-<4Q(H%CVhrQgvUZe_cFFF#aoa0ejMm6(-Fq|V99?}7UJcjk|xClIyLkMP?)%xxs zTAbbgy#4d@_vn80>C5V#VtpUiI#Z2`4_C~q>ZPk)kBTxpxbVP+P5$q@^-dt@Wi5JH z{j+Us&>@97{{|I7-WY?bG%q$slb9$p> z907**4HRaYl`}JZv)nXb1N@vmf9^7_W!%LVcVbOkEQEy^ zlUsleI_IByd7!KEdT}1ze!Bm4z)CGf zW{7cRqQK>RZn%Mmqyj=@zrBxgooiMejLxt>dyW``<06w)m3sO^LGPmQ-NV(~dEv4a zlUaSTcU1Eol<%lcZ|-33rAw~hxB@eKL#M=Tu=PW<{yvbek=X4rT0LBn3VcwBC2U7m zfwQ>9*-+;8aAPevlPsVHd6%38{$;mPf4Mqnu(EQ2>m_YXE0KID zR`0L(7seW zJO5Q><%$qmjycV_C{90 zqhn)nA-**D4;&@8jqnjiIn0$D zB|FyaD2G>em^?Dm9?H?V4zkB)JIFqoIXJTN0NBiF96T;Abao~6E$ma*OujkucNdFP zwU6-q#ZYSJ86q`d8?sXGsP`6>wBcwLo2*JqmS^SGL(I91k$sV?q&+?^u8%X`*Qs!c zL&2>}*7;^26gm36xzxwU<>^?~6es~}e_oYIPdJHh;#Gzd;n1bu(}s+$`rwKtrkhc0 zK}RT+(evx4sv~nnriP*&qg7d#UeeKoQbC=$UQstdO{KYaM6IdXDyf1E($5}}wO%fs zSqJkuva@}a8Bl0$r$HG`{lr+N(0!6hd)Taz;Y5$YD+MkX>;&4sT;OJLl(t+QII41n zBQ*PURABK&feWb0D+lg7yTLvtb+;8q=nkRlWlo_I_VWiEPX~Qp6J3v0$~ciV-EYv; z;?$qRtM&J59Liu(m@V+bohtXPPA=$7=Zi|%xu(CX5kO#?g8XO6oyUV0Y;Lw;n#g-s zPwvvpd@T4Q-%~I1UCoId*jQsh*1MWwyER4V?AI?26&}JjQsjM26F!Xr>2u!I5CjsF zZS^wW)!dC^6A8E(6rC>lu8z)Wn~zR_%XwEr&_5T#0H$3|8;?Q5{C71<@orVKpJyUl zAJ$CT)<-!1M)8?0{pEx7X;_69f!~F)%hu}`bAt6jG7E^*L(MljnETw=;xsDFp2aW!6Sdae6->ha>6JjeLx@FRsDk5h-pW zc$s-IESaNe7|V3Bw~?VQ{PU;xwaC>X~*_66^&^X6x@^S$MtTGjIU*T!krY;CU99 zs8wxL;hfM%=ZY$`0K*{2EwAsh)nsJ7{&cjn6;&P*^v6k4)uPAc89#~fT!${p$u@=8 zfFOYl7=KQ+24N(%!{y!QRC!pg#ChDz_-uH*?B+`-+4&Z=km5DKSWWxl(k4j`9X-1^ zhqDQQ4s2V0zrxR5oUeOa)$L*#p&UEyZr3*ve7XGi_Qy(`ht8FlnS=N9l7a-)CXL0G z4H32hEG13#fdcT_VFTe5aeQiN zP2wEP9VNfraA6lT+h0xl16Wq74w1A~jCNdD-?32Na3h3CtIPJEO&*iO+{X*T(kZBT zGxsTcFKxbJpHy?jH%N69Oz`5gF}BJ(L^9A@mYdLi<`f*hxnfWQd-V3E$jaI@Sp^#b zVpT{zP`m;x!=$Mm+^CvCHL~=ztHmjIfN!Gw+N|b}##8sugbx9_61=h#WczNhfW96) z2|RThcdwI|(go~nCC{_By;R5hgsGlW>ZOjBy+{D)SdSNb&0&jt7@&x|`wwsC_a6)_ zrjmXx8?&okCJ`41gLua9thV6DIT8qIB|g0G&f4}ck>#rL#hvGz%AdjWmwF{gSMVt& z5kHZA$*$)W$$Lpth!;W%13;MGsri_L!)LswnM?L_tS2@@e#*9sU29%p@5NpzX-u4x zm7P^5ag@BEu!d2b`yfMqAl`)@-xFir^9ss+a=nmaGSb3jUHB?|GNM7 z?KLf-KUx39m-52SyR1k4NNq%5)MxEH%%I(3zW0E zMi1V$-=$9w(hrFvVYJR}9q``leyN{`tqI&d3hA%43IdmHYCSs>dV{NmJ;D|Hae<Y1h87OE@2qmdNY>r1P5( z?M=M4?Xxn8>qP0xZ(^(gAIBW?mq;OsVb!i+@@}kMtuO!c^X^L&{rZ)wpHGghVXT!P ztb8cgu;haLow?QmEiRWfpuyU4veR~i1<;I}y;s1Mo7HIE>L$r!OFnimqFY~&1b+oOt?rjGoOP03>ElfP z44S;3TZ_m=`c+rj=WIhJ=5!w4o}KQi{pEQ?0txe4o1`@>S^vt`>z%lM zUCMvB=I%MzDNGUP*|r?kRu~qi=q;fh@T)QIr&dKWe7pd&5DeBA?xj`=a+>d48@2x_ zGl2Q<1B^CR1^+{E9i)SXZ;j)05P_f!CNh|)sIz3P&Dv(t65kT;7U%sawnNLaVLqnt zxDswh&a!cN*>4hOR!mqk})SHETa~Ff=Bt}WwdXvq!%Dk&FHN%^03}t*{a|3m) zy{FJ{mR;>(#yNaJ;7UPmo9n7+qdY#ChI}GoZH^abw#qbRn45;#CJ95n&kcKVmOPu} zMR7tegCDCi1Nm^$t`T1h?=qj4D;O}HYs6+aQ;*t}yuM9WTZ~uxpFo&sYjj^tz`GVd zpGOc+G``+_1k~w92*#P+L61h{LOd|dn<>xuI#Yn2n9$(NOuwf(13t46hf4HwW#4X0 zWJQbfb`Lci6)+{}&FWw*_4-@jFAx`Pk0r{mCw*30}vX`yLYriO8ZC*x2sqKxNxOqs}c zr}KEeII(_f!hNxikJ8DcCqNJ?5^ZX_A!VBbL=?d%B5Xw&oRv`q{gSjYE+wsu;RP)s z1@5P;4S(Y$psEj0?e@P=U=!szGo9{dm<*-dO%#+sSt)>@obMAQZ5tOwyn(nYD{()A z8&3VTIf-)0M>hYWl8^~d2vfw^k)IoQ;e%W$MT}ba6HVkz)s^W6h2!SwKzy_Nxgno@ z`BRQDV$jg+r+ErKXnrzd%+|Xi2+V;NVHZBplz%@V#M@9NzwsF}9voS?fXVvl~YWG!C;l!%5lc+>m^bBE2 z^kSOQK>9#)B42~iX)~L5wL?JqhI%k3Rexsj-78>TVU6NOZC>kM_NKr~m(Ry{uYf~0 zU&dpoPkTPp74AH)BTDGC^b4VyT>hc=_3N}(^w9tOh44+jX7B6QqF=NB`KyOihu+t( z{!AYFpMIbDo`W41BvxBoe+LOYplXU8<_1t#`(C!&n_(+1u~*b4aSox2Yl{;4MY28; zQ%NL3Aq$;;kHTUTnk?SOiN}n28W27I8pT8}xm)NP+ z7eTzP*qWrMDMVH2K9VMDvn0;pS+}j4?4KAf{7fA8@gd5qavPP#q&Y@}cG~KNrrZ7E z#GHmnsU7{6pZST4b9NF%aa-k-tG-#bIfXuNOp?c05ve;MnDCQ_4e|~Io3`$WlEUnngp+a~8rb@q`o3hK{A)mY{!B@UB&WJD?x_n>^?t^~HjERR)9K@B*PLSprjrK`{ zn1E<#pIC=+_(-v~l6pLbiTd_mCzRF8;SbJeD+*8pel3gh-je zPexBlW%QJvjGp@}ZNYy8W5;ihspcel%B+bS3Y8Y^6Db=PPuaGsI{Vw={Ok3T*PojTJQyKcWIdP?^a@R7Z zMHD|1n+f9hD6>^`eSLA`Jb5Etp?dX>x^{Ez0~&HfnPK;TVrR zO|r1sh|8iz{1*jIL}9?sF*WI|OmFFBlbl4aX#-WFXvfRU3H^_K z+?21JAwMIUj18VEC{~F^EavI3V)9#V(K2D;j zHceACR5~&`HPNQ-nk~00zXj~nIlSGS6JPE9mzS+N%z9NZE|8*8AyfhL3;aJJUKeLkX5@z&S`7^=8x zGG?t$B2!emN}jwHCy}{4Z!4ouVJA_Pr)@=XcW>OL?$yYu}b z1k)ya{q6kb8mJxQ_;N^h;6*#Xt%!||(^U9oJmp(c>lcONk`G-PX2KDk-ULNe&z*9! z65&9kUSsNCEK2VOKJU(;==JDc`wB?52F4)i8h5PKr_HW`QLC(jxRzN$)U4B zezQY1bXAx_q1WF?Mw$SYaP!op{01Vr=CC3phS?LnxcL(TCg8m~JyJp82L zB~8AG8bMH8IX7sQ=+UMz3ZniN&^UuUu@m8}xI6%^q=@`RgS_Ll2$sQ>;SUr7)s<%G zrxcOjC())WgZa=8N_R8Tm2OJ9($7g(`eE#|R0#e)SXKEAIQD+iz{P=_*oJ1LmvBN< z9JeYO8S?O(wLpFOFpaASh5^B}w*Eeeo*ngkmK_%)(r;$isLuc~%bf0)d@3gPQ2e$$ zyIh>$k)5Y4_=$B>V>k&JVG7$eCN9uyfWC!s*gH~?lfVu7$~4n1gzr#0*Q6>s zn7E1J^j8NT9dui6t01~_u!}&XF=L!&SJ&AUl5Xx~P*dji{e5=C7}h>gjipMsz} zN3fCQzi_eyR9k=3Aw`QzE$x(4;>%qE5ZuvS0=Y!zqvR^ z6~A3^Ecyv?=i>DOG$qUmN>U3ni6|4G<1SzX^f!v=?9(*p2WPmo*ja6I=b_V|JR!dD z|BOoe#Hs`)n5xLP3^qM(8dxUb=gvU#!N2*QMyVCt{oogKkoeX0ev|MX$;2EYBsrJq zfA+rYa|H%~%LN}<*)A@7Ed-yv%&cs$dj*OrQU69_nX$L^z7XfO%?U6>*$mD0Cd9iWlFEuokx=>pPGI>Y3O1@{89&i9O? zN|M~+O4;j$oUpZL%cB~4bDGYWY3w*Fm{m7yon}tZ@gCRJ89L5UR$H2=YI_7O()txC zSZ26FoS*}ynRQ7XMwcXrl1hrsU{J4jU*vk>1(8!6$KqNFmeN(yJ0B+m?!O>47FpiRXPz-bN zUDOo75yBSJ#tnq%!Swp%0YE|VaAtfXNadM1O6$RNlpO-aQq4X@oHhVQ3kI-+Nd(9s zp$Ek6-!Z0wkdoX)u3CDHYvPsmKQWly#gE@*G2Txpdso z#pxyZ#>nmw1(KxD5oyFm5Jpm5Hp<@Y0%;{ee%jVFt_&415Uj-Dz#~hA=@;Fo=ojMk z7FEh0xL*iMNoDD`9hCuJdtUD1^cp-`WXA;?mp7CN15$>%F`G;#DY8(+5>Z*SNy=8{ ztLXBUx@rHx<|JvX{FK-ZlF64G77dm1q!2~V z1`jpjf|OA5nZjElqofyDu*06Cbv*Q$m%X3goMCD$2{>3bVneQ<7Q{1@0ZWZ{H$nkM z;U;VO7sXMeG>NFlV-Ic>kqwv6dIBY@|$^vD3cx@qi!^@ zsM4d7qiJ29CbUb6F1PsgGtS!2RZ*-EOX6RPLF zjGeKTxU?{C|2-?yJM-H9x5~T1{G>L%n)Z)4%WYn@-^xuz<{&?E`w5!%|2jn<|EDv} z;Y-#Khkl^m&d*O!5zst986S<`R&jcpJvDK2SiN%FQup^R&p)+olRb5l&*9ff9YvqA#iU4C%(EBLaqpV)DcFk5TXz8nIk@C4p4G*7t!ZbaY1h1+( z=m&Uz=xVh06E#sys+^xh_ies{W5I`vT7cTrgqHp%!ar)3US-D-e%_sD9-{udd z{n}Jr{eXA9tUY`&HfgfDts3h2ud;~i|7K?Y=Z0qz6Y&>0ZvSuAv|XJ4VT!6b@Zg%* znjdj(sOo2kA~EIvMvOlhEzb(<;y=;M;uo@_DF3yIiD=M5mA1;w=QUQew@{y`>H9YS zOj6SksIO0=pV&d4xs5-&w(i=WgePCRI?teM@SnI$frKcVrRMW<-2ABi015l|p*8=) zW5CzEdW!SgDj~=p7pscHi$+^N^L>-2D0U%OtI=_~)uV z08g+Ze{YOV6vIbTM=O1H35eEBw##y}HJ_o{PId0u-x2=s-z4C1+XE;o_=tw@+x%0S zeoA00^Tm{zNk1iK^-2S|Z}VGIZrf)-aeflf-j(G76hHuSsjG90#8ugv=Cdds=-%KR z#5m=4{7)Gt^>4ICg8!b*JRUro4GKLNzM_QAA@sj?K9qpzlAL=5l&u*=56+VEVOIHe_FEFk*!Uj($pFhEGZ znily#4z-Y{JnvyY@HPz8ad?Pifj1YZ=)-k?75>w*67Pn35X5Z}YFF{c~TM zM#nIq5f4gjK36697qp0Ja0F1+X;tpBrYiAn_TRY4ppMPk*^#S$1HkRBHO*aI7@G92 zMvelc{9ZMDE)3}}P%rtr%NnybPqcwg>8t@M!rrO6mIjR-f`-y{RvSW^HM=}_6pVMY zL#$xwK9leCZ!|JmkF{xt(3goJbTSPFec$GHK!>)oKdLX4UExiWQ38M+Q&8G|=)Z`Y z7uw@YhnUE6ORHCIAt24VADE>7o;9`w_Iyg{q+_xH4EaeU??-M4x6V(ZAL_YKke(a( z29vLBlbPmI*FIBhdD*J>ZN3J-_;OY!y9Fd$6+ipO8&_0gK24>$gp@Gm^}b( zW(r1So4B+Evn$vvNLw58BD?4t9)W)<$>sItGo0E9w=ed!EbF?dT2Nh>p?=8_FB%>m z9L8b#L11FrGFmX@duUTRotP_9e&{poNdcGeF>#sRW~KRwYC3O3B*5#q^YK%X6G(Th zBO;*dj8x1s(OL7m#nx-8oSQg30akbBFKe1l>(A6gu!zo*Rz^xQvU=4Cdgz{dctbth zRc*F8e13+Zy4z9I8v*1HVWhyIgn#YJ|=^z$#}R>Jm|>qxjzWxRI&m=^)NFpx85I zJyRq|0Sd5&H+R#T#?rikMk2Mc8L@?Ed3?*sDXU1~COaTs;JiVK{-{#w@}aXZ^zlV6^xlO6{AsN_Q6u6pyUiK7!FfiB6NaE82Z^g6BE0~cr$@60$y z?$O?X2O9k!6W6>Pbh+Ydq!5d6zq+MkxWCR{QSaM6M$4FauM+gSR0=$k&MEkrH=sLf zaJD{}BCemShA$M%89p3}C&X>J&B~WPb?sAh-h^N?X|dcz^GBt(Pd>(me7mP<1TslS z$RUQ@xslpK9^f)lg)h+Dtq#0+0kcCV7p1OZqNF%|KgW6Q_>xaV(Xd=19pO4oSmO_a ziQ(V3wAejN4EjCZ?Xn&`OTB8pH&yY;CRz3mx_!uvshJIA!NuIA#7Q5RxguJ~cV!G4 z2N0UXtyL*DirlyPy~#~%!@C0m7EBP)0xtFk+-gmXj;~O3ucRhD3ZW|&Owige#uCvV zZf|#NfOhug2H-Pf_ok>?<>0Y1@7w%KwI?mw76!VWx0kDJI+uLhY5L$ZhUYoA)N{-6b}Zg!zd`r#gp@s`ul3yyRLXL&7Yf) zH78z+$Q8+HSa#GkwrU)^1oXkpT$yXa;s+C+J+vLLT%U)Wx)vT@y2A@99T`U_qPyP; zxFPY^BF+7l7+og^?5Hh-;vo2Bv}O zGIJ3=_4e~0aUJ3j^MKzf0f{#B@V>_W~}a-LpH#Iz{zzwC}>^-9E)FglRT{7w!s%7l(IK{)pwK%y6!^Wc01Ev0oDFcCcR z{*{c=uqEg@K%}%n7TsZPnb12S=rME6?F{B8AZ=}vGlG$zf>&E07o-O@CLW83u{>D> z)MO|#lLcal0AVo+pXK@kzt?z)pbZ8_fLRB8KNv63V3>G9kw@ay!aP=Gcw+=K!ag~c z3h>^wdRov4mE)51cW1tlh*oTL5{$#jCUH$ts^4KbhKao< z%k9*_~Yg9|2%r)Yq; z6lVKVLZ+>JDFr!+9)J9Iaj}u8?vbT>u3^?6W38P%j8tCAYF|ci*FHlM3Kk|MmyR~F z=wBuqP97tefVm}t8jQMarkSN}K7LP(^VC#AebGSYxdLBK`VC1}Mc zv8HLbann$@2k&=}`hDQ1gphu5M*mjy{70P0F{{`xB1-ls_pSV^lz^iDA>H~OIvgy! z2hbT~;?q0o`Zs~Gsc_0t+{~nWZmcehxZE-_GKglOuFiAZ@YbZw7#Koug1SKqM=Y-i z$K%bD=W1Vq7RYWSdK1n_+SSXG=u2to1dBcqe)G5-vB7SW`yTfy6aw@C6h$CQyP9;K z8E&Y0>rPo$w*5a{){2}7)WAE;X}S`2i45Ym>9N2T-A1KMAT413Wm>>!TOwSfz(A#r zbDF_af+pcu*dV2fmo#gz>Es)Vt)=MTF?jc8>#j36 zJR#!ZMvn=J<5{FNusk_T;23Ink%q5o-vGC)oF1_juBa&P@wYVvl+7}@7{He9(%SE4 z1{C4~7V@*0hk=}8y*W1!5QVBOvM{)Ne$KP{sfrtVaN%^=<(g*qbN~?u4hLsiAuzL3 zfA0fSlB4Lg-a^mP+vM^X#Q@Dsmp3XCVB4d|Xzi(`CkaxH^po2c$oLDqR6^`xV!v3# zgK1^XZn<0pBtmr2Yy<%Z@`*&!VF@KjM@|L*fcBjbR_=Ji}9GM8}pyhR%q; zEP{fN+z0m~>H^O6o=sdwo0RP<0-8>`+*K1*P`>EVc5EPKSKSDD56NzQ+PKAD8SnO*6=g0GMA5`oR5ysGM_m{dZ!$2iH`surD7 zMdU*X1zrA%qO^=)-^?rQu3l)4W+)`tT*VzZ$EQ*8Hz~2|$++v)gTDH5GxWf@L3BoeNIZ5+p2`t0bl8wD(a##*;u!e`{Fm;A2ry=1xL8h zX&!mgP~;4>>>yB96`;>~W}M2IocA;(v$9B;Ssg85F>}Mg;yra)-ezTQ?F!XI=Gkzf zW0s=mr4I;Qns%HS%-MLGqSYSFdoRE*59AG*lg^K-&8T{r43Tz)p=VZ|WR>H1O;sst zO`Ep3_Ooy1qk~R%9j?m`aIv900d@LfRDJ#y7@_RG6IhT`Zt{gobBIU%YIb1pTB+S9Xm3x z5nU#V6+PTsi;F)#{lC%A`)@y1(dYksx_|Jp5}QGQ#4(C^c5z0CxuB$2(+aNKwf9w? zgDR5h6LYf!**b2Y8Duw91l4Fs>=N(Hw~{oGX(_lL@$oIrxfzKD&xg!6RHcDi4~lP~ z7!>gU6!p#qhFbmX%_QF~lxPHK5C3A}Q2W|iq5b{oopmR6UhO*lE#8^o;FITrA99;$L9p ztV$vxxNqj+OQ&k~zUdIwwzAnP1^RNuoYlBXVLqge>Dm-dWeI=kx=uo+$CVWnf%;;7 zX-qLfk-;XWH{@N}U+p3K^+dzoncZY=@fD^)UPz;l*Gq3EQQ2rfw%b=Yw`HCW-u#J&k&2Me2 z=S1%uB4!Ajr>D?3s8id!IoA6wOQVMPVjd__Qugu_a0hW(WTi-!r6A-{623@M$S6r1 z1i8kx2xsB2fi9~gA1Bz(+~V}^-Y~Mkt(30NG$%7p$+YJa>se#Ph}5((IX7ci*r|&m z+~DbY_}Ij~PQ1588|V9#fV-PfP1nvzo*IY*aPo<*KF!3Hn+dE^8wZjIn{6#CKN9vq z*0tOOxJCjN?{T417Snuv`10s<3wk^n;%Rhx+JoQS!TwL!s+*v^FjpMdCZ zn;4ekyDA}DCT1+i4H!HxWlv?B=6MuH8DE(kVm-{84$$&k`{l{(3q?+KI9>dWneAP1 zN+3ZCS6NUa_+@~!x6U_GVF_XV$kUlMse0$qx} z74g>mI}VzyTMh4%XHV>36*ls21_V{eFxpAA-1{U60sPAr3r-xA9Fww)%SvdSw8o(i zT`>i|PoC)_4{ZK17UhJ&VzPJwS0z>5#*G)+VfvaXDPl`Tk|fA$$gzv-)*cELYw;?F zO5n$V9nv3P;wm5`$F`RkM%q%Ddm=en_w z*Hs<4I+Kn?(8Q8t2pIN_AUSQqBc;26v5Yn&Cb~cG3|=VKO|{EXHBAZb#kb81eHIMu#TIpO{|l*j-t_ZC3CG9AL6aOuaN{Qk$q_Nezgy&J7PqZ$Lk) z!4^jH5VTi&D{tRXs=BFBPF7{Qi=EhpUc~%fYs?l>UM=?3KrYuX&m0KEdQUxyMG4vc zD74-}VM6;_7ZMKH10K!N!@7ww8$FRNI8VHLtOvcIleZ)1-n0y}y8hAtg6ky}d5Go% zhEza~ZHJ`z#x!wejd=z43hz0F<3lnrVTFac=VSQz^VF%U(|rrd5dr~GQ`JO78+t%^mqI)i zI$E8>9O%hMn<`K7{Lemp8A^Ia6Du=$Mq_-z8(balJw?*#gFNAA<}_1?Q|}o%@JK|9 zNjJPHWhO3iY|+Nh-kU9W5fSA=#gWSoANyQskRsBC`AI4(y3VF;5J{8y^z%OOS3Cym z1aQsFp0298Bjru-yMiY8w&TjR~uz2Fd^09Hv@AVw%w6$p2~ z&YR7)y;HW&l#dw3z!NqcPN;(er3(+URvLGt)}OTlK~K4{5&0@E;=1M=6Sa3YVhbii zQNV*oS@@&T7Xh1X8`E}lv!p;JL#5Uu3t8NA*ea3`2LSSSZ9&1-F;m?15Nu1kdyV(af5*P_~w zp{=gYGHqw4o<{Fcu-ub|ieo;U+_>nx!cxO&E^<)K$ctUl*c4uLAyD*95(I}!drvN0 zZ!@+S#m=O8%<*jLx;s*HEDqM>o2abzan?p@R}^mN9x2=EY_(PYMS~nALh`sXLXv58 zV}@=rLb$HriDnOpY1TyhtbLAf`S;v2-v?b;_y#tu=bF8=1@@RaO2?VIH6fKj>5sUY z3ho2?DtTMnw>^80LmG}KLX~%Eq36t1(qNKZFg^Y8UysgZN4zr9F8u3Y5ts1I$_wXs z8}}p?oOYCP6qEie_((ym|pk0b3wn2!w(| zt&dRO!!58dc+mD`9Uf}Xp9cEkaT0ATT{0~cukmEFCnGadY=IBxyj(&Pf8|gXqm^JDy(9TfD z=+XiP48Ha8$A7P6CgFcHiAuaYlo=$cNI#(t)nP4?46l0XwvhpZxyjE%%eQ0-czhaL58&A6#A z4kRV#B@KUlbX1*bOU>eM;x1Db#`9$MZn&Q;zjf2e z&!{=H#FnP2QdMP$^!j6=GzeoQ8;;!r!cACUl|i>ja5{_*g2wK)CxK+gexSTBB}W0Dtu zJ)#rVC(!4R34-uH7=}7gWB5mOl$@|BsXO{j2d-Ok@!radBNrts3cU*(dtX&-cj7ke z8`h}Oa%~Yzny4vvRs0>5N@>wL;1jDVogz~z(0MHG{P7hqfT zW#qm4N+6KqtwEsDat@SF!Fe$cK_s&OGFKQ75blrU0?v!DBs!L?h3pAuBeCR;+LMfu z=TDA9XvvUYIyw%yX%Jx1ut=V>Jf%Z|#1gJ|C~)(k{i($hnhJs)ljP6TYJYh?dKWn*%h4yt_smCw>`4=(Ajke?$(20cTR=ta^pOwZlX=>qC~D z)JS#FNR8hWbu5KO8>>5t*~pOdv-~DbcUkZjB-mrh)a#lIk?xSS)6x$@ipFk^-N+d3MVc- zWeNl)WU**W+rZSTD_g&cI(E_&!~#2nA;Y_HkJF}SkyYSK0um?I%<&Jb;Cr?ug+I7A z+pnhmZk%2cQE*R0zm@JW4`&j6K=KS)h=+P`*j{CxQZnd|d7BuTG@SH0wE@2ogi`Tc z{@Jx7W?623o;`INKR=!9N9yJ74G&h#m%H-<`Y>)fvCr%0gN;ZM;F57-!FRk%zzv<5 zMur$nd<+#2f8$~oG&62o1Y2aRRzx$W;V+s25;k>?0e zgrESdVMvFg;t%MBA|V#T33Q1u(p}JZ>Bv3~q+#7kgy_yp}dHnI; zi2&1zw$8tt*y6)fLzQ_Pgn`IempMQuZ%i$KLM*+*4P150<1*yu-|4PQ8_TwT!^xT( zc0g5O(e!jE$=8Jrh#q1K=OIBCtyJ4JN!XgUD0^Z7-~t&~2DF53k#QlZ!vR0K18&jRDGzA1?LC3`Pp5eJ?}rUjgVesOkuafG9De<&?gxbB%cvks;7qnG2WLSf8Iy8-yVM8Ty?Yc08ejKs9&TD8$9fQ z(a?t-VR#*}R-&KOWN_~`6KN;-yO6f(rBTGa1kxya%#x*e*E2k^?h>0M75BQN#KeK& zAMY;feY$Px%X-^qSojsrEv<_4JuRk9!v590WHS#H#SRE@?)i9tqQO&S(SSX)uS8a7 zyK+zRI+9@&L^zn+b;pF-d3w@BOw$7?u+jqrCV$p?TFyB)wxWZ}W?gSSxkVAVw+qSA z&13r}*}1onNw=kpg9Fc+GI|Nq<>1(~5KL`MR91NA>}lCb&^)DVecv(6{aEsB2`>+V zM_0_LVUxgWgUx8kNg{DnjNV@PUZ7GW#Qstlp+ju26fZ>}eUfd*x(bj#yU~!;sX=ez!oH0G(rD-?g>e`5 z_)eK1SRGNfqbDr}cGFrFb@Uci-SV36cipA{5Cs=KAJ~!3*_vg2)QYDg z$L`={5=jNlKNC98Si~C0$`EXjwJHQj0yecD_<;Lns|##Nz&dM5K(LO4XON!w6+dp( zaEki}5$Nq_#ZY;qX`4fn_HOlB01gQTIuXEIRh$)eZ{(g#a89|+6x8A;9cSUesVhV` za>No!uQCYP{4BaqTmys3?xOqTkh&juvX*w3F@z?eY7QF_IG72#xHn}Dbp&CU?q5I0;WWS<+64>#N5%u%{JV72%qUa)06 z^nwfueS2>zbo{;X;zjFG_YK2v-gwsn6}!)p3#&LDAcq7)`i*ohhi^gqBt^ z6uM9o^EPlf&YO&H3ZK$cJUfEyaLyRNED&m!${Q1_39QOWc9G`a8sVX;FIW&9L+NZ_nxZs@*p7>ms`6J;-jiE|@ZgkSRPxs4Us`q?*oW=|-;SS$ z869EcHH^(9!zlUc$76C=ZD9Twib^@6;4bc|B+3dm-hYvAm2olP&{RDc9nBsgc;qGT z{9aaJpL-7|x)4IL^c>|09k}JfB{C)RC@+`hp%eS<)*Rf~o?XdsHb$($QL*EzWXRx2 zd~Ndn>Al2;ioE_LmAJulrfIMZRsl=l7*YDmRN^ z=2BSrtg&}w86O}1e9d=L0YME`kl>n#E5ey%o-z__K%k`OTn_5zwrW*FSqpyO=*$fd zdc5@@22`}E5Yx~kU0;jKZ5sD(N{WpHCf>9M@yj@4;CNF20jI$#`5rPcrghV>buaB& zsp(26-s;rwOG)6Hnoss=uU@+8aVaD-AEy+4wgmr97Ql3uC7X0Lq@)uwSH`@U-O zv?rj6liXGf`^w>2&o-ojgo8kJv1raj4I)s0;O7W^{up?@+2mDS`zx&Y<#F%*)Fdf| zspLY!$p{pJaZazecP?!TQ;2#dnLZq8E^zbxO(Jm>IBPWc181>>60}CtK?&3uchv%M z&RneQBIm46a*r0XFY&h+P>4%i`zprO;5GeOh&Ra6ctXUMTdt%UjOrVZk3nleSm(WGizyF*XcYzV_ki({r| zZ5W1Fo7PC#*^+}}(uJhXqD|b!93B<=KW>y*g;2_F3QWxo1`@6e_?(S+DjYMhlHo%; z*ZX8S*r=qpaLp}u|2TC_9@>o1a)30%3{%kNXVYY=Ov z9J0MwgWio4{_@-hh+gCF<+x=Yi)a`GNHuzE)x0=Y336V#E_IWDFE)R7 z2zwrt^$8KPHdMNlkPgm`zsy%*xAacSV39{n9$|3zcv}$_PHR*bh)E(}+UeC?$Q5q2 zx-Fph75E)-&jp^F<3Z0fMt6Vii|;I;ZhjDN_DkH3lM- zGUbCN;LS*}%0Hv$iRZbFWAQN}kve2xk?L?$}+4?gCS$?T9e8&Pspj;bE};2zfKS zjSp29`W+%aaGCmnN(j4W;Wn2aX9$byFz?> z>!izBl#OvR(e zMznge+U$e7(&ODF!lO2afpQ$vL#J-YV~`F)pSGbyz?uICx0cPAlQej6P18_DpqO$E zM3LTJ)24tif~Y()N>12Q9%}@X5nr5>+Dy3(RM|KNv@G8y*orbbD9r1Mk_0;lp(~JW zj47ck>1?+Zai(GwNIl)z?l}}93K0@h6NC7~QVnOJ+XK-)X{*9(e9==ENQIj>H0nNZ zA#@+ApYIaf#g2EV8^>sjGF||A0Mf^cfI;SW41pPD{!r!a*%XOPl+-`DHQKD9qb?zD z16QORK#gAIsDKME;zJu;j)49sw^!uymJj}{i zWTM7wtDJ1M$tpOY$*cW9nAvl60tpEw18U__%@h!uAT9zDNN^noo#6E8C>kz5bY4s1 zXL3CDt*F)a*e1$T^XiTXZ)*{-Dvx(JRs(V@PTfz)_GMPY+TII82X>M;d^aa!e&xma z+4!S`v`)%E&VbyZB2Hb_5ppja8z^Wjyyy!CpdO2ybPue^*uz1n@PP{m4w_WX{3DE7 zoJOVDGr#2@Y}kYUF%feq#Y<)7)kuaSqhxlot%7YrvT|2bUo%Ot*}scI(%8h_+)F$0 zV;5~7b%-KNSs-H54Wyi%O{!4G33B(SX)vP@YMG{YcQb91XGPYMIZN^!GRUY9?|M3} zgw#M@BApt_5nTEmdt6aNDjTZ5=&coJhE7>i;q{FExgD+IOeYvCxoUgOYhC|N@-LIMr<)rsdxDUQ>*t_Txck;ZIAWnHFI zWy%uei{p-jLTaZmEG?Dx4Fa?#9+K*-zJ zfbNH)=PS^^tlWAcbV25UMfh%>0aQKWRCB@O}ta4eSfjN9Q24P)C12Vkj z#+p%)w(W0w6TkdMzkh=!Z=AE3j?9@Inpkfx5MqJ4>6Qk;DaIDHXwk%T2TYASij^nF zKHK-`V-4J%QgPX44_Ud@h*~VDV0Y3{oM+pT?7O_DRN518Hh&Vy;}hEI8Uycf4tl?} zS*jkW?ba~9bAet&`hwVXJu7L?TSSr3 z(~7z1i@Z+Y3%-@u$=;oW&TRj{l!K+HVQ5Uu4|U_*EjeBbr)$p!AbOnf*?U7Sd()~! za3AS}#OQ@-C;|~9kHOzeBoBUrD+yvo&~x?TY-7nzElT3#*<5dI zM&@W93}BH&#~7KVNs&BHlr>^a#GhzulaogcMSUXRQ~r^;R%o!wDYR2V6RVztukPBe z@2(f`wk(t@!WPrsA+V=RTuIn}mAFZ2 zAzI#Ue7y}ykb)ahdljh#IM0-HI{F6rjJUfe1_@-O9}usIZ3{kyXP zclFBR5MfzI{pR(oZ^>^{M9j`DZwV%q(x{Gz|^u(CgEoB}^quqBa7jmGqX;doqZiBhTjxW-kcQ zX__o}Io@C`#JMRi6r7jqAH6zpAbwPhf4?#P*DzX0EoL6ZNPbkfDY&h3Q)y^E~UuQ#wm00;_cnO28+e>l|V=;J!1}e~!tIf;$U>aKxdj zJy?g5$AuBE<2|hulHD~2k=!w?q-|)*AQly?0sV;xTJvTE!o7f7RG)a^yJ^+DV8h7u ziG8Wz0;O?kNPdYO?Kk6eVW*8g97*Vf#& zt%UuPVyCg)$DG#fbeuY#Cew$!a3~3q5L2WgQofvDf9Bg=01J?moYq#H9K6{i1p?q= z@B6Jsk5YM3ZMmA1fV98o{MC7R<1it4lB+L>iW#f0=4M-O7X_Q_cLM*`4n^4#Wdw+h zf&N}TFGknn!hQ2|Ve7U-78sOJaX1IsrVM(n=ai2*t-C6y;*`Av>ByL-yZg(Il)540 zA9QWe1R})_?2Ci(GH<0TaVjuPfMI7nQ_!a(BuGm*Gz9nC+G*W-gpEZ zAJGB?TmbP;8rc$UAnYK#$C(1bKjyv{@e3VE=Cbe0L-KZiesH_7Hv5=74t;|5`u~pLt zWGUct8_G*rn2x)2v6?0BZh?wGKx{n2ZS8w4M@$IEI|{ejg$`kO&7XfX)bC`~+`9gT z@7j{ES)@^^YoMyIFc~z42ZQkRTt#K4@?Dqv&KQ$8DZy-W=<;W_zO~fs+FgP!z(!}> z#>?A=9PR6SXj;2~ER}pHO&Av?QG#w!%)FSZBh*Qo_gzqe=-X|O4Z_1FxnmN^kyQ)O z8BdoL=)Z|GmEURX<0WlP%u$F zN$|S7rM)gjNRn>t0(9iw85d^g(nTqI4VxesnEpci6(@v5?r+XrR%w)dHLK8OU5Ig3 zaY=#v>(&_rKLkPI(!1>iv^8>w?4?|*q$(-;3 zZ_Ttr5?L>aiNnih01qfEazl6|c2K81G6}N~o`qt%ylFf51Y%#2v>xy)k=;d5*k2WF{fo6YqV4rA@3N^X)Js`ya3US06!(kvX%5DiF)ZdfD0apnb zs#a(}{w&vjTXXk*9<&1=S-saB3qjoMFo%dUkBV>LB1)WS-vF(+A4~}9|wm)5+ z-Ps!A^-U5vnl7a}krpczagd7807LrqYrly?2HyS4C-vk_qUVx6Ulr5B@jmJ zbeErt%rH(xx$2P8WGk~UOtGY~(~?8>q5}sS>u+?W;!E!P|1mRlhg6^q8u(KBjDret zqhAs1-ut;g^HN`8QpYrOrs$3JoCn7=Yh$t+x#4UdhHx zU-)66GNF46GohjWoAKfc-$0N*Vbv_8;TRQ14wxy9uozlN2`X~Dk;)b&yRZ(C#zt?K zWxasYlgE=2PhLJ{A|~;9?OCTXB$fPyO-gaFfhrT%5hBaWz4NMLkZ=N_P+miEW4IrF zx=PRe$*Gjm3x6EU%qH%O6rEX2j-W28R^S14fisrb)pY38eOH`_!{d(W7 zEelkqX78D5 zt!0e+R)>2cIv^J+CAjyn^_a!NWudE0fbqp5$A3T+{5wspuYt;L<3%w}D|zrzHC~?H zz!>rS2vZBVAfz(U(sU&VXVpf%NLQR_#53HLbR7Y@rR|p7Mv>#zn{524=XZ9-Y>4rg z7~-JUELu|lY2`e7J2Nn@KQ@1EtIq!Cp);g2@&^;&7$>`=6~jEhRp;%X51b0B`@jm5 zQ-<3*@*|L6Mk!$oFQtyI4({?Ef)?Iy(biX`-a)eA_YR8-Cs>rP0HzwPHXZx^;fW) z#w`O)0i>cv4j0#ifbzw7c|Of{SK2IsB0u>Q7{H(x&8^u~fHt6D(9+z`?7}h9ou-GV zIHZzZ+-rg1IxB^sFm19VF7* zD7|{D$sBRkjZqXyHI{xTCM2XJ`?M-n6On7J!W2|xNp*`lq1SySu4t!;@HulXkYLV} zW{0LE8EpG0rwz4@1yR z=&BX&QXj~D_kVpg_RC+7-JST2qu2dN@$>s;klv4f9p09%Y{#9EnfU9MswE{D&++SR zYl_l&V*I)z?sSfj!?w2F@a>b6xxL@6i;0;x8}x$S+>rb60&e?H{a2nrZ!Gk0hQ~dA zMV3GOFzX96?g0rz6FUyg*#lC1TMYeXe_chB(-SX>v^mrzyv4`4eEe{BBkq4*BSULrxmr14Z_e?V&f zCggg2T!6Piyw=V2<vPEWBT^a(Jnt9y8nCP*5sW@e>vNt2M~<^uHMHkSy#Q z>9*M<Z^q?@4z4@u*_1O2sXYHB=AoApE2TwH$u zI_*FvSWZ4;VoCLjr${ZxzL|s?51G*O64TRiq~Ya78U_yj^Jau*(=wZuDbeMG>`J;& z<#@%gr#HtdqOyaW{L*6~-$y+}mVR0K^+-3DBW3Bg)0>;6UzUDPQ0tK$GT9*$*9-PU zQTB&se<%Sj44YxOT=z-Kb@TDlj*lO`7Czg4+4k$5_?Kh*eFs(d0{T88oALpBVF&Dh z@xK4>vbEl(Rz} zubY_!7avj1=loY%j9a#9rK^vl+6jDw9MtbO35 zQ5UADm6S{rKN3L4{*Rs^H}!{&;b%h?b3`)IucOHvB-pm56KK(VsdyNT`onQQsBf9#$3-P_EvQ7&JZ}UvX=W= za*l`o!0}Ls=p60r)m%MO5oMOT*%fs#OL^3q%u+Yb0Mb(RMYc2;VH+=g-cLS5uhl3$ zXkm6WX&BOW@Qan0fycTCbRTyV}2?^ap-#hF6*`gU6<7WyAh^RWZKOi?-ij zPualWsf?I=dMZ6%>J8=3Yx)y^Lmgzr_QzP3dioJ8DP?Hm)9c;wON!q(dR^8tJn!MF zSC?nghsCH9+e@qKAGY(k zz30A%y?5;UYWwaF?!vz^{L)?6H-mlm-7fwUx=Y2k|K#b7p)dOgQzVwM`&P2=ewbc7 mZn*v^iVX8EHm0nK;?t}mPU8Np?>-+#y88)NB;xYm0d~z literal 0 HcmV?d00001 diff --git a/binary/ipfw.exe b/binary/ipfw.exe new file mode 100644 index 0000000000000000000000000000000000000000..09bdc378de6506a7474243c8b0e57580f36ee6a6 GIT binary patch literal 148202 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

s~;_3Zi12jHPk3&Pk@8__K8wuGW5jBxUx8Es+^f zg3gKw66)QzkF&6?U;;f4+!uh$ zSOXW)>gyPni$rt?^(|(1V`AM=qT#u^`vqwBJ_Q%qid*xEF*ND_HJaXuxlDfsX#QfM zxg?I}p9g91qyBelt^k^8Pcas`5i>p|jzj&gaoh+T$-vPI+%Of9h{A=>Vfx(Wkrf%K zdtXVTc&wveoBU0i99(YYMv9~Kn&%kPauDn#whgd`1(Orv+#7(;{~VnBM5MBDmQ7Ux z;vh{x`aY6HU@tX~OHFm_$A8aQI5&~8m=SA*5koTE&@YgtXC}70kbVcFH|Y!T?4gnJ zL{P|T$`fRHLg%G>3}b?@o1cMf`rXKZtj_P^ zpC^x;AT=$2LoL~=mF$T0(26#7rl^te>x9?jiG9t8zMnE1USoV2a)WW2Qd*)(>#cMQ zwWLNX*{T**(gq_+ZV$d{PSPsxA--x)XQB%!)B5mdorx}_6M&tcbs)OlkyR8ZO_YNV zMAj3S=(l4cD!tT=VYGoK(95 z+K=vZcv>hkfphCW{0Y{$Q4?CUl15+VC}}_p$lHSDgwuHBnFB7Q2`#w$F@lcYpIn3F zOV1`8(PV}AM;}9fyFvm*BWX;LVdy;Xw51b%#OQDO6XdrN>OE4zSLdf@g%;&$y-8H} zfaBA;%io!4!9wHGzFDC~=`q&-?catG5@;jZNhGV}k{TwBinz3*O_2nxXcGcMn~^Qe z3!X~VQyHIwu1UE}|NI%o>L`OXI(0Y-3UTg>0DsFf;N=drs7do~ zu-LgF#;G_vUjrQ2q?+8M0~=y_2W~D07;zo!Tqu_WSm|AwcfDN4X`c0bbuOpwA`WJS z7NT$&hk8j%z&RS8^}%T{%fb=)^eliP7mIHH6JC<=t@f}OR zG|Ak|B-5g|e_D!dOO%DMH_ zr@{Xgxt^0JrW2w(OeQ%BF<)AOFFm{wwgM+2FG1R4mA{8n{Je&-?GUo?N>uiSAO%E?$K=)2V;? zQ=EghAPr56)hq`U_eZJF5^$4^-l{92y8lnqRIUk&fU#_`v&a9P3p(C^+ zS5P>_wq(rCH4hRtQ=Y`yyj$!^fH~Oo8F-HyXS1@ntVwYWmU9xgGE?a#(VsD=KP@OwV-2Q>Mdf zb4~wZoAT$LWbD<;s4th<*Q55nF1Px6(~_f&P1M({j(tphim`()E;9^c@3Dgl{oHvd zyf}5Qj-Lmcmkf$H4_em@(eiB@0ezliOb)stuD!a60#uj+9kdDb_x{+CTgGu5hJHdb z>c5o>CJvdM%N(+vD7QbzKfaq|%y27>d@c(nVp>LqgfjdLqsA;66%xv@3MqbS7F|{x zN*p>Hs~}qUVhnt=Rp*G+tvsuaIil_EjMZHi#Tl!c5~~}nU8%I0!~BSb zBNNSEu852^f4Mwzsrk$F$WZeaPo$su%h*Vo`OCOSviXabDD1B#MLo)kZFGLBontu( zotFfb*F-SlHR6NrD3;rQ#d7+K01y+(Shv__%0Ky z=)p1@8+JSqozJUG<|h`165X?NnUe(*N6yY=X~m($i%HJ43Fv-2lzO&XPbLD*`KOB$ z*>3&ECy3}gGtb!XZMH6-)7g@GT(8+hYjA?pEX73bdE0O%JONIlHyS8z9@A#|kB!8{ z)KKDZq6EjuTkxxvps%bm44ZuRbwtNAM*T4=VF}nm3QaILrexd@m)&X`Gd@tw#RL}u z6p&BHxh=XN0odb_IWBOM1vZzQ%P%xrUf0LTxlF$shsEuN$(+w^1H4&95QOx`1fh93 zS>bPO_2X6htVL#+)Mi=Zh+GrpClZslco}0gP*nQwYvHMphKkt4{TCbNmQ_*U;(EhS z6%iiEl}a10>_g~EsDSke32-u5NI-%o3%8NO%gOBn#C~%70Dkq;C}5+hcbF2v4NkSsIad6TW56x0`TTG8`}lz1vs&-39nn(bE1-r3UyEANtnoTUdv zS1!{xub}DTl`1pT;6f=#ecJ4a;;=8{{I_I{HP-bu8kNTxLy$&_raNUId2{S;19^L7 zzW!x{zVUIJf=GAkPyN#{wjq}pW;@9u!1Q71dcC;yXGR_R)kUc(vV? zHfe%>5=3V9kuHzBPDIQby9`6?MYnb>lD;!ZBAwOn7-RZ&YC2R*MOMekGiMCON^?7* znIA=ic}fEa)&bZPMa!kcWnkfBjIBIF7yCQYb3qgl0uaQaF}8+dAEN-QT+%X-GzTwy zs*ZJU!7Cw}P@zlPXvJ$ng(|Fxbk)0o|K17+kx-#O9)OOiAZs}wa@9E{dpjleo7ZoM zKQ9MKG0E))uXLeomNLdGlQS3#Dfc2ZpCb0+Xuc{bd$`DDKO(uUi;EHug%~=3NWP8n-Lv!t-UHA!+PUR7z_%Bj${|Bmvz1+`*S^LZys8wfBZ4ivCX^#6MXSHOE!Qzg%v5*ik8VTe zbh+wXtqSFli#1PqmZyR*JA%{=dg}ty@SIKLYGrGJ3Q_a6H9Xizcl0O?KqS^;{SiC@olVKIy%}?e!QjHgd6N7HTs;7W;1hsAIXsh(0ly z0&gw(iI8#(+2%YoN;K6pSwvq$M4M%MZO~smio6F-^{zF~73T9*X}*)g#YEr9N2FO% zf(g}kwq|dj*-VFTnS)6e$iiBiuty2&qj}bp^?75JjHH2NuanXlMEEFJk9GC%H7 zyUYt~IZarr^;PzpjCXd4`xkgrT7}b>+hq&RjS>*O_Eoruki=FY++uST9x*FAuENz-vdQ%k9hf$G7&T7}E1Sa+y|CLHV1snW@h%~KJ~b+E|8{I-M+doO7`qD2(@psO)!2$Y_UX(BPOA=IU5E-i^|E|RKVQuWv}*fp9>psQ2(}`~dWGlUS8q8zAVJdEZsSK_ z8FY11=voSTn0Lg=0^(A-8J9g$N|NhvGZ!Pql=wYOIMcFT#ki1|*_p<$r7;qbGHWC8^A9Z&i^}8sn}=;A9$rGDJ&VKzOFNPXydbehoW#K((ayyuY$U2C z-WV7A#Yse(tc}DmQ4%46Q7%^4NWA7eByL;MkwoAHiTAw~O|G^fUr>&5IaznaxSWVZ=))(_}o+t=|t5s8&#{( z2DRk6ma(by)yr)_P2dC;7c9EVdbY00MB z{27|JV%1qsnZzV|-Xg}L7soLfq?w1CeZVI*SIK~G@fG&WgXh*MJqeRt=MT215Bx1g z{U=>%cH~TJ`CVy4oCWG((g#JUqul%03=eoehUW3EF>lW_x3g_{{__AfB4t*M&sOs# zyc6?HV4CVJ!z>C15rq|MQ5ihJ5uLGD+Hm~oyx1RlAR6~~(#jZK9Lh;zESQr>u19}m zzj&$orIp`|^mN_*4uq^U)m4}%hd6DpvR`UZOUiwvi57brZ5{W20QZrlk+8CG4RO~9 z!S>Lma|heMyWf;`I*l9P)`wP+M0YI?6($)*c#u8ZZh16hL2*C*e%xy(Ep}GWy{{E? zPgC|wxw-;wWcDduW9EC==^DL>rtAEn_bK-?rWX(bgx>d;x>lZ|&^t~dJD_TXi|#4c zdZ@GiyYTz5`(p3vQXZO}uIEgDzaw4t5d1s$;qdp?By%xPsJ$%QJH@nE{iDu`JpjGp zK9ki5K!erQn{3f%++(Havn?oAi>GF5#ibZ1Ld)B zdG=gw%;0f_J_T(kc+C4fhfII&;SI6aafK2PyIKqWYL}&vqRxpuKK#l;(-Xik5BX`| z*`%@zl|qHCBHTvWLkaK&MdjgEx+++%rA1qvwzZmJwJPu2>MgXg`{}*9$2Cvig_gJL zsX+432VPSX)|bJjji!Z_nH$NjgWouF4hvB zL5WAmipsG)uh8?~qq-<-4J~p3!t_$fO(Kqp+98-RM4wt=C+0u z5$D$beO+vjNUZUd92#Moz(yNakKGd&I!Z)-=lWQyX+VmdGUKaqF}bURRjYCx@R>3d zgD-mzzWYAP3GDRB#MsNVhh1_Vrx?3_M{$Bf!bKBoPSg=w1`|4YUK@WE!V%YCDtZ&NQ=eNG` zBk%pvBt7{a^T?ZQoSmlkDoI8=+Bo~M_doAqOy6-gnhzDbDf`!SG`@CRcLCS`#rQsW zS4ZP(N7nybgxQVn*t_69?^g#{aRbZ}7S-~XExp2p@fC~?HX_%YAqs8$R7^9}(JklP zx=48A@rYR#UUwYt6_^up6)f*?wgtmXm~aoe6G@7*tGWv*oiXh>&ql(7#YA$DW&0*O z5 z)f;h^Wo`&9|BVucoJ~AsuGyV(6}B{kj(oLv7ZVy^J@GSC&wIk2qx;(tNa%3chL%zDuBbTllIZSs#`? zVrdui0h#5!a#`&WCp{O28ysWZdgUFM%ohIu8UG*qSk^Dnb|T!1CehF06+bksY7S-(jCveS9V++4OY zf@EB^h~5&i3@%D=6Ba4U(rbo+TrY}DR6%wM++4tvA$mW&>i4*ykczx#=}vRY1r=Qb zB)U*#7?JC=q-ZW{c*?(U&ubNy>qOkCnS2D|L?^wY@b?Ay+p`M%8Hm5v{u?@B6&&Gi z`1`N_HjI@G$TU9dx+=ZypQh~D>`u>RAB;-JWt&~9XSaOP(Ql7@^V?kUhZnmb!}&?1h2hPe=&HkDO@q?}67GH#2IQd&@r414S4+}~SHz0H-yUNH zugrB|i`w*H%@ygnY>NPLgy@^UT6!+ie_g;BDJ1L*lacy7ke)E?N~zCMYWUxTGL|&9!uyyK9FfFRkDwnh{vA>4rw&+BBjY%mvrSB|Yu^TdJvhJvD zNyEDkj+ACJJcd_Gt^9RL8#f=(*6(?R+};dp_|`Ue0|t|MJJAX@L?%bYVG@o1W{m&# z*!ZK(f@pSPK4X#C)x#!}LQ?Yl0$d{Il|wjeFKJ}(dmAwa-z?~Giw_@>$uO^3Ir{CF zziyN3AI9_Mys{Rqiz%2qa@Zi!r_gEHe8%+W7MKAs&aF2sU`&6U{-*19yBAP+#{3zS z+q*~?L=O3vF#Y!?Oj}NB2Ct;xe)aY7R?mX2_Ab&F@|l~&B>BvYHPV~Wd&0NRhZi-2 zFKZ&2=uVi}MZb9zW8qpBpNf20cTn;^O@=D`6rYEmtV|8MliTt#$>BVRC*M0RfS1fa zTXey*jVAnWUPt?#4bPF=Vyu(g(K~G4V;+B|Wfhg%F%6&2rdGc`*zN)8|%S3sb4YOnC$>e32tOWn@wJj zAU<|0RA>`l?QPAfTXdnU$2QQc4{@HL<^w9WDb2Li6y8ejK_Q09P48o-f;>z_i1@4p zcYU8|PV^mSDN%5v4Fh*8F_2prgB)){;=w}h!C0xAN_pj1_%I24Ri>tZ51^QSF?aUM zY?$9H!efi{7$wq(tm~(#pg16oLYnhj2ju6HTNzs=e3PBAgx={uxAxb6e_w>RC%?(? zdk<(y`lstiOV|>1?GG1UUBsB$p1puyTW_vP`9l!t5KFaEA_SlLK(h5?MHDL;&2LMN zYiXy0qc3-Pa_&6UK1Llkx!u|GSqf4*iO@H^B`vQSfAQl z+cLPeeXtz36KfB`>h~VN)insu-Q^e>ucjx&)`ys`-%-Sv?-UuCALP0oS!v?1vi&tP zdgrn&H}vjs<#V;kd%E&jI*+lk{e0OD^J=}>RqSnqJ7IfI{Kdd`gs93=ws)ZX@Lx1M@{Quu1ARSr5L37XX8FQVH)l(jdH9?K{O@-jkhp6}P& z5PxzDymp~g4mhyP`07AbaOt*iibVrN+jLG}BrCxy|8hX^CEjXe%3ve~XR0KQ>W4XS zU8<#4zB;H1yF)@FRE3}JH@f^}Vxb!D0#(Oez>rO7j9L`GM_?$iqYlnNQT4~+`kt`(4Td{|1E zjO0FiSLzmg03;@_J5ZK$GeMtOT2JlBEwE_!o(@3H;irQOX7R>=LW z3PiYr%?F#KW=TFeT@B&WaGxkUk&@zatmqOFNdEoO0ZnMq`dX8TN5~IZE8p9I$)bdH z(-(q1>;j%9`R8z|w~;=nHAK2FLD?^+%0d$-fA0tnqxTke+dgQt z@@OXB3Xgrbt=_kcPZFo`)epEd7hgTIiAM_fK%eMC)00nnQ72SB0 zBwd~DrrYz@Xa-<3y>DcUJ~5_E9>Z77>?SW8%WBYgo7p%>Z$0B%T&6hBM5C5Dv`SKu zm*syyj4#>Hcb_sWAWB%h^hOA3eiy6=Yx^yu@oTomX0zxQ`KZ}XbEp~mi#B^2&F-B8 zws(AVmcHp%kKHxpzPvJrv0y^{OMP_jF`J&FSJ(aYt6>CbVX~}7zU*(w=mzhICNH@# zq#Xa%pcH!lhgk3UMppu=mR@MSB}GQHd;sYmQd-?XWz{UF?_@Gx)-{WfEzg<1~Cx~o=qs!F@{MTgoXa-kamo$JNn9BNqURTM{5 zU)1q!K5DELyceC!Zvov4&_PGm`)IJ@utuO!-?$JR-2AyM8O~TAPm*Yx%fnk*3i+r~32LF|~M`)RZXKz+9$3IU6r5r8)Sr zcD&<|@79xlHH>g1kumiv`9n+(6UX`LN5wHPV(*VchS zlsjCflMKg;pB1a>ZMv z#ap4DbGP!&!h2)CL1!j#kM2z8M3nZMg*8yv(_{;6U$LOqb;E+5?RNPKqnCh3FZ;LE_QrTX}AH1d^ebG5_uejIpACKQ{-)N@Gbp? zlTq~1Q}{pyKD(Ey70xE1Dx7I`a4XPc-N0CQLjpu-e}3x07cqZoyIz0Fy!neiDIzvb zx-z6(Vi<;W-@W&Ql*GY;wfjbTQTPy6V%^5(dbT+-U!jaFsE)~v1x?3Ms05^VFinY4M zff`K_t?Xy07lP#6`obF^8T8j|ce+*xotL5e#cGnHc zrA@;K%m+T7p?;<1r?us$xluq& zg~6b1QwJt|g1Y|Ey3HNhy^Eul!gM7dUZyJC8N=95|35Hp3}(XOdu@l&t^m5^AdMbN zc|(SH!~Q~XZ(`=9x$MABZO*;gj0g4?-u>0iy*uTW9J!qo%3e8e?ZJ8O0qShi-X5G6 zzhbt7NTQXM?$!qb|Aiq1f8Vj_{s%%zk28iLF1Y93pwb(+)_i1#m^j%_FnIgjoSJlV zmy{Npi`3X8(EBza&fN~#pLiW(mbnZ6)xN5SYlZXG0=HW$oTnDJGt31vz+6C``!Hv} zz@2JM0v_8ejIPuHgL9ew#SF&U3R4|ofxmEoKI<35h>Ta;_4)14{$rIu>B#;0BOxkw z&VO|RT=&N;z#YJ}dIs5zi`!w|5*+neFT!H;%A$6}6k)|X#1uKTuJd9LpN^kfL0 zYkq~|b(!&VG`=d;$#2`+RxsGXN!@%WE|V_6_fgL{R`j7yI2~VckQztK?;BcQ*t30t zu=C^n>L>DegC40}gAx2;27H19SznOdZ|SV)efbXt$GwJT52B8)OH1*-?oPCMX$Jg! zmld~wV}`(RyIC46NHSOmUx8xbYOHSaS$(*?6n2ceycd9Z_2x$rv!{t%_8+D0lr!6U z&wf1tHY(dAa@h+dd_YP?X-*!GN11(@d1mnV2*@mObNXO22y)9>Z0V%I=qzH@{bz74 z+CUv-o7D-mUneO0&5hqr=0GWe`Tcap)WJ%dm=H`l%WJ!F&a9a=&AE)}tEOV~$5mze zHp5WYO~(KIIk-NT>r(TE2bB$23n0stk;^m_jC1R{2ey13rN;8g%Q)U%M<^_X(yHbsm^n!oe%S58|LSxnTAmUJJtamw8>$jl~>*(H()+`D;=)UI7v5m;Em6QZZaM% z8SB<{5FA)>-ZnM1HtANIP57yxvx#T$dhL^+nJ+D-L6M)Y^P@IIyQZ3Bxp)Ysmd3)l z_1-iV>2m918h-yWh{L*U4E4Ca^fdk;3CT;h1De-)ALN}*dZiEG^K;4V)w6?(g*IOk@$Y<`I_BfYxeCFlflTE z9!GIeGWf?T@hX%#_TM06wGHFCDJIvpV5l((I5ZU#DE-m*A+4DI>*#V!q%Is3W2@$0 z2Q(0^`=-K-glHKmbFIY^F15l++dJ_4W|N3X@`nV-m+eES)1+~>JMDZjVP|voWOH;M zbwKRsjF?gc{!fT+oeWRjqU&cwQ;F;PKTbf+iCxv>`m6M-blyd<+cpb4q00n6#L;o# zoj-*!?Ztv^hEe-9cd&fmMo8^gw?26aV+YFzZos|aQ7E|j9DwoJ>=y^u6vEcR9V|;k z^Vl0T=Oy#Bjm*2RWlSavjxgRK`rk!u?9jN(Uve$>SFuS)vPt~UNQwD7cEceBoS*>x zU7bs5Yj%Bzh#(I&hR|$qo97Pf|%bX&B~WJ4l*WBZ~ou9pDQoN<$h1#Q}YaS1N}hK2eAfL9rp6Ybp+C zC)z3uB5O&CCd9c{0e*2IpiKHT1vX3$WUACe{t&b0TyZh>R>+O%sER9X%>Gay$xlu3 z(Fe_4bm54&h8>Mx!Q_*Eyq2;3L|ya5>`Qa4VKDwFjWKqxnc|yt#Jl%HTpi)7{rK^I zYO(4Uw;2W(xMID3vg4q0?@qZcZGU)i1QJ_D5__F6W#~c#2cGyBg4tQ?mcG4TR$YxwFp`V z=&ICWbsgFh8S2NiN4SG!y$NjR{xJXOeTHEi+^g2r9^w46$7j&@dJi@qY}VGH3pwC0 zmjtLYd2UfNZ%w92jtQvF9IG~Bu*w6VmHvOg5B=Mr)!dP0BRD(s(L!=O!1(BdQhaHF zKta^pxGQSCQtB6u;sYaFx3SF#?rp&)OaIGvhGD*6cgi8A$fwM2yE#`0-{TXk!cTm) za1`EypMJn`Ux;R}%A}F{K`d!;aqcFFnOMNgciHW)Y_2?tohUxaEu@A7gm;;I%%MsF z@#5$ydZ#zLxtS?bFGZ;S-l~djelZVF`S133&Wc3+3N#nFk|tTt{AtDr}@@GwB_A z^|)R_Wi|9x!Iotv+&xsbRr79CZ*~Rq5|~`)R=t}v&qm}zdNydnMrZ}$dCj|V<nZwr^XxF>(l4~cyU<-`2kKmx92lSqn>5c>xi%G;i?+)3 zebu7pL&8RIHhejM_Aoxy&0*l6CQ5P@m2K68jfB(z zgf(@?#kK>g=Xuq$Atc~c3>JHFla`T12A)3@yJ$r-wtRHAGRm>RGJ`HN?qPv2Urh(07p^rLPs!>kR?_ z%oFm-IsD_>y5i31y5`}?2HI*R%MZMWv?vME|KuRaajQHf)u|N)!hc6be+=+y8(;$f zivscES&yyqjT}=P!3+rQQ@Ny(>4;&eYwxi`;iV~&t_Pd<>T7VEu=m)3ZrIfCEeZ0~ zLXgsz8Z=?+-h~bO=ceyn7?h7Ww4wm+zV+`w(A~B^uLMEfK>ViSYFlL=5Y%ZKW_|k; z?_JYawyODQ=7ECm5I~`@HIm_ki;exnz?ymq%J04m)ob}`;B*`Fc$ut{+?dEhA(@VAU(V? zErqc)VU_+|$d~1qzpUsfx8KAom!&X9@%P86_yN9bFQIslS9$^AafsF~^-E3I6v8LK zjZhB0hiepva$NNPE`|}z=?2@tA=N<>Hpu~coA%2}Gb9-+rRQ{OkzncF6v`VztIxAR zPI0Jb!f(3b-Q6nVM&lT-!y(`$Kk0&D#DQ3#~y?owCQYNlEUwDtR@VP8@uhqou23u@Cc!XP9=* zt@oV>dxm^>X`I}iAzn&$7auTD>*a_ek`Zg>ZH;CNv}U7CB+<+WZWEK$L1Bvb<2e)e z%2S97m^X&|o3zkAun%bQlozZ0BBgT4S|(luNZx|H(gt~S0{FaE?HloeFmcq%QxFsr z<#jf|`U&(AU=FWHrMvZ&ZyH8q=*m;@eNEuIZNSe0t7p@yo4P6c#U!n0gWT2OUwQ^> zZ6*$8pxj*H)z~I`1M+xl!IqgANHNbQ3|qD9Q{|5{)az5__8X-n`Qse*dc4KWRl4zt zKmg~c{Xv+}sszNFP!rX`U9)XExC?afqW%Y)@nj~T-m(!J9?w{Fx194SNTadr3+co2V(d<0jSd(&w<^U~sG=V|I4a=LECha|<7nmNhRr)g-Q@$ zcCX+ATP3rN*CwyES6lKrH{Qdmc*QW*!yX%w4*+fN;i#?hrK{r{we@gYw1;`|9&$SL z;J7$G-#2ycVX&<-``kVJdX+VX`SBjUf+dZOA=8HB7eL#`kZ-Hpchxz^a7%Oyv*SH1 zryeS;toa2tBC)a7m?m(dKQ`_~x0mJYQ7_1hx#7V~2Wa3NZ69t@CRw2`h*5C|)SO^Vu*D!=K9vY;-gkfh6HPa72G!c+NQh>lmwMh!CU%l0F;Id~Wa-FO zBTGW(96N4o5~>(-_S8ThblY9FK%tMl+uqV{o6;?%4um+g+13Sb36KSsW~o!B#}>1fa@|(oAz?hkWEF3xnXF;~ z_Uea`sj1AhpJ!$$cLi$|L()gvUWXnJ;tE@j2jR(J;5A!vf>$G$V8J{z9()d>EB|Yl zy!;9W(s)ff|CJG3ED!COf7CLHKpE$qA2Qz<{OrObo{#KCMRtXhhCgH;ndH?ZG6T1S39MN!u_kA zjtSTP)lTPQ5I_vPuwz-?nOVPL2=Xg5mNE;6Sp~>t($3{0A)hm3TkuWbN#rZ_;F@pm)~e3WBx~ z&z^eoot^Jo>e+?k{%om>zOzD2LUhLV^a4}1%M+S!U#pVgCb#%AuoXlPc z@2EV6BR?48YZm)x{P)#N_WLIw<&omUl#HuG1`j02W2 z;(5$kFpz=t%lEM>8-(=&YH|T zE?v=fz!mJ))< zw(hg~N3EH6na@r=fx5G=@Pl&0ZMBWmwLNOA$4epoLuSogb%Bw-rLfj?{T)Uf>J_SH zLuEC5acU8R`Z<_`y1+>P&-PD))f;Ryt-wCKJ?9^hSlI_WcNq|?8Kc%Tuo04F92|Ci zn*sWjW$Yx?Y=LFQ?_&eb!R_Fo;xAKu=QYVQggdz~{1FvG%Qt?r!(d(Y2uc#@A*}Eb!d%5s6)Gx2wiS z!v%Q%8aamx@NPDI?A7$V&+~COtN_pPuvjdx;et~86Qe#{fLUU(udrpu*v|FkMB|rM zOnH>*tJ4{^YRlmFVRTNEXNke__uwyp`8X>LmzEC~l-r+7Sytc@pA-GV1vrC;loPjL zI^xT6WclNZaUukRwWXZs!4&}?O|%RbEU+^u!v${JU&H;7Hcu=VE`UuYE3{NFytgkF zT7skZ;&eQJnhJCHrDeE%c?f%o)qfB>$ONZ?JOg)qFgeL)!zvyu{d`Uk``x@YUW_)j z9$fef9NBwEx^>RU$MbZzwb5msZ#KGy3)nL&Y&_UmD&}KvxM0MWnZ}5D{1nCwsOB9P zyMw^9w)MaxFD~;@-Badp?gm@K!%Jqv9b*i_fr3YHXS8Rn|A0*xzKnkQM=+XiEMnNu zGt8R7vV9i^{+r5Nzd@?D5r`Z};rbV>9?!b$n`7@T;|scuHQY0RJN1E3ZoQR1#B$1*N4Y#} zrgZ_mrhvIEGJmo6olDG?vSNG9+v^tt@~<+{gP4d+{}C9pW}l{*ma`o+`j4KLM%}i7csrQfM_5uwahy4As{23`0)%3^3$EJ zkJQ*B|GNa6p7XGeEcv3igXQSQF#X~=pDJ{9Q8vS)JOiEyby>zi;JhW5h!fjK=dpbJ zgdfXSmCd&+KObKqUpQjdcN8;`Utca?OMX88L5%a!i|zWbYoK|USq@1T<@KlHZ|w3J zx@anM)n=RXhc4Fd3t2bX4gyje4v6Fv0iP+B&Ahn?dr_Cl9uSA&?0HQBsdctvL;`TWmMP97DvD7ZFclU&J@ zoc93mEC%E4CnqP5zAnb$hHSbEc)IMBYOJ5F2O+e3@`=ewCd)?a0@)nDjO*T9f*u?Q16xAL6Ks4!Rt0}@u5XBXZG9UM3;vfu0F96M{h!Sk>q zYm3W>#&1XAPw*+pKGL!~FI7PqBjyI6HNh?&@N%eTtJGCC-o}gPkI*u>85k2a*XP&# zxx6yJeJL;N7iBO3vXh?=5Y0Bb01X3iz-9?Gy~|RgkM;=seO{RXQD*;?GJiZ}MC~E@ zL75oQqKR3>#@7sfZ~WEC$%)?a9|3q7s={@@m{|+s^;J~Eg1?zp`Ph71ogvw; zx9&j{Y&W6XA2=X}BQqcU!zwU&OTLGm58i`TJ%W9HeD>>;lRyE;3$`75#aAw6M8g9Z z`v)$~n`Laqg9Asfl!W~)xQ!gx96@6H*`3Go8vE;cXa_Rx8Zs{N>=_++TF(lo5AcKx zsQzUhQD$t%trulZ+`1zxi8_{-;tTU&fYMT&lc8jeyp}m8n>UrsWQV-^%1ZHQZhz7E zA23AkO1Cx*>i4~8O@s2R4*dimVRoaG1w2KJV6Y`(MyX=KlTu-@ppE$g_ub`+vh( zM)rVtU+x&o+<6RQmLWIJwE%KDE@G>A*J4zo6j@{yo9A2WUFJrYwcc%RbmR5g#-d^W z7<7U=`+rkqECTceQLBIKN~S5yzEbr8A8kgS-E#@i;PzsRzcGor*53(R`{H>{Yqe`$ zqsv?d+APcg4WlMop&w zFd6KjuX8SEAi(OJcL~vL{j8}*;lSI*G$hltjQ_AZ^Ms6hAck<-%YQgCBxO!q&4t8e zc?FDJOk^JS>|rUawnOff5?cP;#aWZ4a<&)Ri?Kd0??V@ZkKuFlBlGyM|1dy!;yZ1o zu)fMNo`d`v2H=kAmtgyStM0i|UZCS=sdt`GX#BEZ_60g|2&5&i-tvpFo4TWBaaQ1n z4Oo*SfH zFFayh?xTOX`*I(7njhzH8{4NWK8@@t_Tq-yv&YfUsJj|gu?MjM_2buFM0E5s5>dk% z7WlVF?n7WdNZnswJ=o~TOh}&QC-$Cjz~swwXM_nS+?in))3{r_+?D!A8vOcvzzTqG za5Xb=_++RLqf9C#nz)4L-?8ID>mC#&ivJ-Jyfhcs z)xpkjU}=qCjQS=VxI;5DEFb;a2M~5+j%{H#lcfSVn=kTfcwlG91)W9HGDEJqk@VYE zTajmvW7iOWL3z+9VnW62{pVRgXZy6DogYWNEZccFr<}d~{Kt8K9G*+m@Dw*Ccseh9 z&0He$@uA-qc=kMP?#=w_67$3}V>6mQ>$00+4D5F{?_49fGy6)XbfetrcMrSDev6U# zw>iWuHy%NUCKSe6n9n`)^1!C=yYzWh+Y#w`Xh=Md4T%x|BeH#I4$&hRIY{2#m5l@J zB+hi*!-d~(?0vbwY&$aX?To+-+1mPG3UFZcXBuTFM<4R%y! zu^An1bie}et)s991hk*Cf^+Pz&dvgm4AgS)M%>Hf)^E(5aPOFvIpK)jt=DBvxb!Qa zGzh^SX<|MsRhDK>$UEGb6UBEMYbKUuPAK|vw$h?^8&^y$iDuR~q={8<91~Z=aZRj% zBl9@-#3FnZPh1K|nJA6kw#Knjyp&PAB8S0)vmr@%i#!9XCMWr&e$mW!2kA5RJFnfj zMv@+ua+kya%~=7=@N$gJn?iVKcjm|5hS;0(V&(kUzd`I(d9m*N*!vMH=fxK5=jYn|2x1*2 zQ;~J%SUI<_#f!bG7$uGyE$|E{r(yeXRR@QKhO+Tr&%z#_U95xrsd~^{x0Hy*TDbF_ za=modQ#m^DP~K#HXBN?w%%~_!Ccc#y{n=T7?q_B+ecpw|(|?4Foza08^b7V+yJoP_ z;a(+0&6^!I5Cd`r1Cw9J+F3+=2Xz6w+ltIX<2SyIyUH4+uV1at&Wv3RNG;g!Y@8^{ zoG9?zGc?#lD|b81LpTt}Zf)3@$;*7vX)~|N%k0l(23csY=$kBmF;24k4_Ix*nU|er z+oM)%@$u)()+59IL!i^&_Pd?N`OM(p>`Z^L%X7~Yo;@#^fkT=8qG_HxUIz1QxS=q6 z(-|nX{6(H``HQ93O#f)z6Q0a@u&(PbmR>UZ4_p4?POK6ttwYj|c~;v2GcaNmO}9#?nWfW#sedbFhFk+r@A$117@3&k*)wyx zXHU_z-9^)P&zzPSlB~Akg^v$Bz2g;UV9fFt54xOn{v+BvtG{@#;R^G`oWNnG=_;FS zD;XH_+=b`BtiWNbtypS1Z21o_9I5khd8WT;f#-Hy@nZRl_KrJQjDJiTf?jE_**fa% zA45~bOX*hIOmil0O>aF^T`jhnDBH?yH{zBtod0YcVQ+8r&omo&7OQ{M)7(EYu>yC; zh|M~$#2vCI(dr-Jx~FWRR{w~nxqsAZ8S4`NGEpdmO?G>I}b6J6zW~t~^ zV4tTsFlzb707+x!8;je9a6Jh+2qU6g^}RJvtBJ=d^XlHVo`s8>A#;^_nvKzk1{TMO z_`I@q%;RODp8T>r*BGM{Zp#?M-9TeD2a=buw+b0g>fW~1ED#F6+>n@WdYWIFsK_SI zbz}!)I9T%BIGFExnqOo~2G0z=0V(GO3QrsvGpk>T7YdC0m z?!1!e7mp0qEISH9dSJ-t%)>?(TC*57I>(%T3N|uE(TketW{uMJAP~RkK#?t zG0&b-i4U*?11#|Y#s$T>0mkT#S%D*irE^5{kNyL@ad4D817HaSvUmDNO#fl4f2i(+ z=k|FHB4>ZG**^xmE{^e!{8<=(^h_9^kMS8XJ|9RH!1I`EX(vA&oY%5j77bJ!${%Eli!J~>%u6l-&=z{tWk z&4Al{Et|?;bo497VMN5G?|0uF75{8{qyfy$Nhj%xdTqWju7n>Aza32Jwt8Dx^oFBU8OFQ2=ucwspNzc4|{PBg? zx=26!U(`Auna?(~8*?YNk3W3Ql)@*vGsDt~1A6#qqgpuv^-ILy7;+>chx=9ecpH*D|)`&?uogchh8k)`|Co_9?!0)jK8&7 zi_F>PExhfSeGQE7V^X{}^FK1jwqk^Uj$&*rE#rX-A^3ii}B)*rGIC@gLtMk%*?i^5tvRf}3_8-C>2SP|R z>^~B(^C8NmFCO+E`Fx#^CguFiewdp?~{lsiL_%9Gq4*U1vSjU9C z^+4o@Fe{vr0)*_ae;@XVVgI8K@!B0mVdimZ*#GEP>Toe~34@rNc}+{@$y ztYLNjBF`sV97Mc@#(9kW7=>?v8@G)&uD_R=x$w{Ge$( zf|b~RSdbKuK7bG!cgvrF(Vstd_QDHdgIYFqgQ!lBd4$IZ{4i2y1>Y-XQSMgcqtRpxXTr5{Re5=O#HuN z#%=uvUUm|77qF4FB`X6j+`8j!zbxs!uooV3vT=QtZ6^mZLj^y;V408a{o^Ia-!b=F zeu&~_n9{j!G@Bq`f7HCGti*iHe1j(uPolh3=OfRz7zxUlzh7Za8TaJ^DKN8a{Ph{Y zAxHlPHMQbKw$f~=B{*)-QZ|zhc4la4=4l8R+?YtLEusElBmSA`Fnzb$_HkwZ&#cyc zo^So!e8cmt5$PAl)qR6A&lPs5umW)Z9_?r?;`A*u_=~Z2h@&s&p((ej<>SN5v6At# z3t0o)hw8bGrKsKqi8jy~j?g^?$qdr{#|)nCz^UopC=}_gziuNoC8NmdFE(E@pC6di zFE`(T)qb^SPs#2%na4q2?Rr6DM-rPmlr8kjU* znfMK>dqo~jDjhd);tZCa<6F@pj2jzBHh|3ZjUDBU7IJhx?g#iX)9L9~_}zK|yG(9) zdTG6nCW`spE93Ln(=$iRV)Kys#+1=w4Y(oOfbo~WY^L0q{+Z<2^(G@wOUSbe<^xv0 zd+PGG+DZnS3QJ&=idQAroUpwFH-t3f5)I=>)Lgc|(Xo5DksYxe+~^+MUSjqiwEEps z4cn~#lEEg=`I)iz%trSqvF5d|;gxIzto{=76YR1{eoM4q48~XE?Uj=Y%h(HSA)i4#$h8b}Yr%)gw{UxxdkIhuyLMBQ|Gj z+sgj^D#+D616Lq@qs#P#q;zrcmNebRHf8&vE>bz_C{PJ2-&13bD}`UT~@|*gWWVS*J>NdJ(lPf zS-jJUCe~T~Be|=~uN6^+h^m>AYpsZSbsEvc>?yf6il|X`pP)N4=0wf&aTzMG7Vg+a zQ`v^;D!U#-*jvE#DmoMM14)m6Z5oktZsrQ|46J46^C8sAxxIL>vBYfTE2j+?X)=Kx?m8T9Dl5f|abs*K+n|O< zFt#q2h!}JlN-vE1`U=`VqKLPE&&<(7%oJ# z8_6Gl5s$9;(NOC`bEDl<@SeG*4#FI8YE#X=vYDW#K}_3CbkEB+ahYi1FfMMKW^H70 zMD(1?GRCh!Q}E^~T0bex9vW2Nveg8cV>lC#y^;=0E(U~=Nn$s%X>3d~5e*Hy%2Z79 zJ|N^{rBJ2MAOA6shY(+Wn=hsm5(OP%G1>c%7}l#Dd0Wy3ej$ZDU4x-5MJx zPn-L#)+6R?15fGGj~~iBO~;>~0v&fRd3wp)btihB_xxxi^Ts7++o-X{YCT-nI@Ud{ z?u7Ygli zS@Zd4UNQGR^ILqG#+YRse&*Na-e-P4<3;neBpJvASo{C074oqp7f^LQRbv~lW^}B?g`=EB-~Nqjtlpga7%@Ig0*eZ+a$gp5$;36{km|s2v-;G zHsQV}@|TG3hlTrH;dTmlW|+74fcTCJ_mFT83YSE>G4cJDD1W{9b_sVxxML#zkZ_Ad z{%b`1J`r9fzF!mWkO&_a?hz5*C)|i|4~zJ6@!cX^x2Wf^_ZxG?{ z30D#BZsC54xi$`IGnuxr*a{R`29$3gqQ)*)+tQvNEJPf4H$^#S2JODnAED?qp8W4bLg$*#)-KTEA`JY0oZjo7VCLH~HAR zAb0}CI(z7Z!Vb$oBKN>Pd<=PZxj>>VKY*{dJ-c2(zs^1=5+0C<9vBe`{|QmcM@2$d z23uzz5($$?cvvLdfDhDVI#?~{O4kD@-(2Z_0419%i&&xN%Hju5oVjx511QK`S;ERN zSC-o6IjY!z*1(#2xN*fXY#faZv>uMKKH#I_47=n&@sZismpSGd&cN;;-@_SpIRYsl z_z*U}6}n>e1jD(TZw@@}&Q74kHi2P$jOtfD~Tw!Q|x8-yvjW>4O;I zqYr#AIXT!(*2#`J5O18 zt_J}VM_+xPe>)z;93FkJv- z1?-t2x7AvlIU(uE^qdSXBx2V(oN($bY%ZR9yod(73EWL~YnfR#eh}Q+v7&(?{YC47 z6{y4i7Q*)dl>KiF7a)uYcphW-d7G`p!+v(Dm)Yiiidi2o85(%X^SL3Ey5&U$7H8%K zXzg$T8jsD`JRALa5X)qIJ1RUe`5?;m+=ByaXc;dS(jr!DEhtO2f3yC%pE^2|?T*-| zicZEKQ};jCS@S;vj~B6>a?M>kVL2Q^6;s5LJ|I8om zio~3qsdd3wKEmOgsBr7vSJ?Mf@qP9C3QZ%T^ei9YV13UlAI%`5>!$k%;;#N#KK9Vk zZL@rY`-T2ymXBZ>eD^FLh;sUzaPOVvqjQPK|Gq-!5z&LQe9T?{zCz~{QP=wl=|ptx z`wD?G`}!;&X+-qxSw6aeh$`M!m>B;DvwXCQh#sBgBN($i`@TY8V1{P-s2dyVEFaCr z9eeL9H0Mm6&ifsl<)gVo^ovSmGmthzceZ!gEB|m-v`_ zbBPbfEh$psqa{QXEAi1%++9=Rqh)Bvq(U`Bw7tYf%Zcc=5+4DpS;GBviH|NPqQ4dH zgC#y(r$PT%;v-xE_w5oN)e%v{q(XS$_0bX^bN!PFT|q?qN_@;cSmL7wB6_C8M>sF} ze2I^sSNK(lkDxdBt#IEe@zJ$J^lpid@E)vVwvSqf=&ad3Y9*qXvwie2jMr=*0UKQ` z-1)P81Z&vEvwgIZh-zp1sF8?P&h}9g5w*`5=wH=qu;q6&6hu2qg zQaNY(T`kIM6y>iL`PYc@)`@yH&f)9t`jg7VQ{%u#TSR`q54P=?$OpJ$GS@Tw?ib}f zB=Y~GXwP@%@cH__C}(I6$D;@4_!zz%ox}0vuS7e4JBQ=VKg{tFWMa}>ADu-+?ztR~ z7SH8)^y0Z3k5*`RE$Z_=|khOhnf#;`n3TB91?)FK~UM?~LP*gj=&wuq7?(OIZhl5(hlFCRtPQhSW?TBf* znhr+Op)NHTOGJ}A(Z?&6h&0!B2RDdRjq#ACsTu`?5%qLAiONaVRNY9C?A2uQYF>@J z+C26@>7n+x8cKJN*C08Ts=bghI@u+M61^nrN#?@;kt(WQvUFL^^4iN+)P>r^ z5jE;t+1TV?RZq={a59}%!@At+Ym`HgNLtmjywI+YwpEU+i4MKQrH9g4>yvZkg&>5!gG%MIS} zRdOsLH+Z$HNKYo^u27;^Mi#9q9ZGblS|QoFqVZ4%T2{TyTV1n_yb-$k>Z=(^MNR(o z8~lyFP5!2O`7*C|ncNl9!<}k`e}ptSBx^={g{G%tiH;9XOrg!p*^hOE^AxIvMCp9&Kfe0tNQgKyRWi~dlH&Vfhm%R}=Y3On?Dk3&} zBNg6AAUAf|^xgglaJI3AI~Ii_z1vO~>rXn4Nes(LoJjLarjT zj=Y*2PbRk-DFGZ<0J0cDuR-NrgS=XmH$vX9H$rGYy;mayFsLWlTfKB!{h9tF`pB80 zSRSgZtRz`WhbyqABAU)z{#|Pa)Dnh=10(5t&lyWV`H*$`tNY!&@sfJ*2AyIPalw(n#nOQ4_tCRy7rce_Rdg zWF*pRDBKBv&3X-nRHc^DWU2e=}@XurbGt| zi1tL}EH=T1SEF)ogc2cLX8(1>lkK56njDR_%UFk+Mrl=qb#hox0-c2Cs1y z$?;IHnqJD0lm^Tii?HHjDP4~XA7Gjz;8a=-s}VI3Rz(2ow?VN~GKHbg2or;H!d)r7 zH>GMMs~W~Vrgfr;dN>sc=^>F#52t{YGKod3Mu0e8# z_-3v_^2bB5I7`^ArqgP7Dx`N3{8~E9Uj~=X_EWJyb--prOBD`rlV6R94ONB7gp$ang5w+?o8*DusGQ*@r6?(nJ|E^U7LUt8nsec=nDpUR*T&B>cmnk&8hNnlK|L(un>QAlXbYXu^JJ3(`?R0s*vsB6cUARoi z{(WMZLNC@S^l$Zl`d{U8h1!-Y^pRSHzPenYt;-d~#B3WffzPN9DiZ8}<~ z&>#QI_MNFO|C(3Mqjd`H5Z_NMSEv&0_>eKUt6rgd>lM=S(%hEk|Elo!Em!ECo?%Qk9Njc9T>+0_+FL`dsQ_E3ka1IZ;*`hw>5!By7>SNk_D#NOhKkk%7Q zv3&5zJo8dU10;;Db~T+x_ps7gAj7d;$!?X>MqDKw;t0}u6MAS{Jxhi-c{3sd@(n=F zAIp&dTGB{|RZ%=E$tJ8Ks-{=6{J`OMXnwVf_^@d=-R>nzPJ*W4Lm`I}5m}6qtaqxi z2D(X8bxzIjL{%aIYxC3*YVx;0rqvbGv{<4;-m3QYB-0V}WNOwzipJ7vPbeP8PFWda z|D`IUJ(Xfg?9kfESgJNJJeg2~DeR1Pf=Zq(8y->HjgFIJd0@AiZcl3J$&q$&q&E=+ z8VN(@!aor56;o1$EUl^E&{#o}!BKxT{vc#SgwLM$FvJ3?^*nv4p|hA|2s zOiFttnr=f3r)aXDoEVd_{h>ZVxy#Lst?L;j6bg5uEi8devfD-3WE;zD2ZqueMwgn< zq zg#@Y-n1xfJe?kkrTD@$KkUcdl(8g|dAcK1rV~5BwZ7MUhz-v@idX0rVDKA9;W;RcE zC~l}M0azlzVa-n@_4yp=!75;#+HGRYbvPLZ6G5>Q#Zuih1o=QL)m=-F5!em2Q`+;M zOlPCkZIIjJ$?#TMNd4K8=P#UJNTAQNAzQZK^Rmk*p=!Dsk>@WsL!-nFVT%^J)LO>R zP7TgqY+JVI$;&RwRus|nY-aGr*jHi+h865^wq(RkGC!G~&pS{^i_g@y#rBA?et~f- zm%+o8%iXb%4RmrWp{wa=2-_R>n`GLqj}~3MnYAUBvV-h_%u@JvDH=zr$*9Z;f4iLw zSs;kAz9|3#mO+o_O4+ojg(}Lk*##p4&LS4crHV!JQg8+!#<-E}LK3nZyBV<*r`}Nz z7@BN4a0WoUv3%|(7YoSD$2VD+1qRFUJ@z=C6b)tw{7SYwJD!DNb;^lkf^8FOLMN~= zrzS<{DM=ZZb86bD!KrjiOD5#zCU96bH(g=wp_Auq)Si8}z&w0F>9tKlZrH2`t zmMzy#j(D(g*$7eLX~!zd3*v-EmK)1MR;f^$iD-aD(_-a9pOlFA%E^QZz{|@AbjR=^ z@R7hD!~=5p?{r17G&$_Yvp`0bZMIm@&Fixv`71RqIGeEc3@LNrA}QP4Y>3SZ%f}k| zl}$;1as)C#)(O0#rNh}abcMovJ=zu70mwknc(SJ=7LlW|xUQzz=!LQAFv3XyeRpjZ zuVULHknPyiZ5fxmpewXZUQsQFJ40!W?LQrABqzYce#AwZUbfrjAS7=)hR!^h?h5Jk zwt&orD=x@M7+u)}VoHS|4I&vXHe!+*O^wK0x&XmmfKi5=q3|^|<&%D1Z6Q%)jY5yK zD0HMnp$pe5^n!5Vceg5ZZmU9Xw>@2H)|C7=o*E7 z+M>|Q>lB*Ps?Zzjcv&dpf5TtN|FZUCOt-Zt^wTwbd@I%|bgib)-he{)1QdERpwP^l zc^Ja~yZ`2=6l#bl^mIg_PF11hH!HNIQy~Zbf(l)CvqHDttk8WoD>QVoLYD?}f4{m} zp~u4teY{5u5jr-5WN&ontm;S@b`&vRF zcT%C>ZBgiGLZOnlLN9Dp=s+S@$K);Czb&oM^=XCDI{*7vo(un9>JR1rSIa^f8~hvn zn_AYbrW^em){!sFgx=st!q9H15o$?xbg*wojX_a?3$!ES`H><{J6SdY+~w8s7?V8a zlwrIx^NPsoPw44hNI1_}hTxkZa_5|`M!vKv_a+TlGt%nS^5)(|Kt8o$Oe8V2xn3=} zs-g;g6M|h7E6Xk_nU*gL z#p9RR;stxdiVz{=l(g!$Fq37WvaZm!SeMad6Cj+=VPXWk{3&8D?1>b`nAp)=ZY2n) z2sBC*QK7=3=Ji>MJR3cAm{(mN+yvzeo8U7<`I?#*o+(bu5mEjg$u~}3?rQ(0jmK+6k!p!Y%Nqp^0T;-OGnzXi(; z3^Ori8NLoR0%{#(I3uqqmf%!k9-T_<=~x5_g+2xPGF#P>_2l$2c9gA_foca76!SpV zz%?r1RpKgG6RbF?|dFUua#pdfiqS8(BdVQasrc zQRAUr(mT^hqoWggva}kHh1z5BnBGfWP#kMIg_BUIGa;QCPUz`SLgVyzO4gH_U0Ro> zQCDc2rgl(IED=fekj4fx)`f}bN>MnBk+qX+y$OoO5`;7A4cUnE4R$0eDW^50oVOxu=*ei5Lg^Hx z@n3g5gt3}4RWlhDQ%J*xRF-AN zIwDkt-Nn*v%vrImid$jG6<19SD5OGU!Vf$rGP1=~FS3`*;Ln1w2oG4Xtz3q>J+HXj zR}QNtW47wDFkf~ak(2FEwqxJdVxNG9vk+}=?2N@DX*I#>!p2cAlh=?bl+b$AG~)ro zT@l$EDd)0+2$(=wV-_Rc2;(i$VW!$eySE{<-GD(0ls8Of+N~B6tz5H7UY}0taxfU& z$n`7D>#G2t!C)|m&|ni&uH=VqO6tMXR=ujdS64N8{Z_qdWv{NvP3aUXFBlA>NS0sl zvb?0+FI!c2ZML$!AFDU-XE)&tsXwGW-erb2Ox}tb*hADX^N8hImA7JfL?&+?0_zZX zc|?}I%j)cye7|?8AtR@EnNdjI%PW^f<<|C?UZshTHTfURFT=72R!R)$yfqQIOOxA; zw8rEC-iW+rCH`MY-enP4i&s)Ao|e5)Dx4vE!yEifa!>FU*lKje5<$Ha)72H)mgh?$ zF+q+iGgB3BL}u{Lv?KN`FJ#+0-GX*xlVLVaN|l9~9yQj{$pA49Le3k3=n4)Ktj~bB zAsUOT^;|&7gkkZdrlFx)2u3{sEGCPH7^ygPDXOd|x2lP9If-p27E$H)P$I&OiNLrqyd}ElH`PAM+n6HYs+O5XVTu!#lAnmvE(VYJwV`H}!WAb5R z=+)$ov>Jjyi>YCjR94R?$htvIhkChc>`$mCm5ednm63>`!ZXe>^lE~9I8DW8&X-ke zLS|)C!LZ1iPs}b4c4kr3UM`0;&FBKpxTG4#4$d5(fZdtKV8yF3fQ_m>xrqWHzyMSY z0Y%`Vl{4{*wmQ{TGczJW4#^!%$+fFsL0fnR|w+6WY7$%}TmU(RjU%HU^ zX3g-5tvKVBn=GNNz*|xa9L;FhU<`;=+nSAATFv5OiCPeOSw$O510H~p0aLTAU^y^f zYNVN;WJS)*Z&s zR$)Nx#lvQiFQGzAJhnbL6i=(6NH4Vcb{NBX+w^ou&L2q#9#{?_H~>F*3Qhr>+z1w$ zlgrzS4&{odDR!|7sw*p(-dwYyV#&fB9hoOy7cwH=7#rvtfT1{!$~PK`7+qbx2*5xD zv9${Qb#CG272%CXRs!GTY*nV_*WyWCPpG>C^llKS?8EBGPxm49G_TL$ z@y2y)S2eG0+u+X^0WmEI(c}XP4LzvP6JOx2{f)5yKm0BIf()A#q^zNlpX z?!Hf6rELgHVKCdZkc@^%vof$ z%ZPJR2tx~XsP%<2VyS44knb`~xA{u8{RXDSRD`G^M0sg*s$G_x@eCpwhJdnWbajQ& zz4C%~Lzh#aic~q0glss%Fe}n7Sg{Z%EmENlbzyy>sBm)yKXB5SSbNJxeN%TpZV(jQ zRfUB;ooZUm1@P^K>8u&HPQt(?mguN2EDS{=^5%rm6_7W>gm7&@-ptJBw*}-4Z7u$a zmFt>5R=6EVvyUOUetE4NP9~zU4tag^dJ(@l7ax$f1Hbffv2hpmueXah!c(S7p*7?C$q7TN1K|rO}2ST+Y2;F-hQ&#j9 z&X|$L;Rj9aOQn%A?}M)GLv`(!4JFXU3` zweogMPAs*#sy(J_0eLeAIJpnoFOHSuqC`%)kLkJlMF~)IY-dGgBMP&VT0bN2bcDQl zy>ElBbt4M*HEwENw>B4o8Im`zTaQpCV-FPaBvVW1<5~x~Pi9&r*2+Y$+-Do+Z7;9w zmmAkL`Q^T>%t`#j`HHo2pS+!ms{3?R?U&cD+pq~;6DD`8A*W;p=&`JP4@Myz%=$pO zL}Tsps^*n)AJevIg}j^f@{G+ep2L6Q=tRr9)$CAJARupsTweZYo4?H;1W*PFQFHx_ z8JpQzE@9swt9qxJ4l)ujAQvJwmf}Y(I8@7ORZ%^)v~f!uG(BS`08hD#{s$gRQ;RFn|ZQ8A+Loe$~B7l>KUKG z5~H9%VIFwZ&)^>?!5j~)pCL3KfG>6eN6q(URUUcKLg^v*70%esH3@xOlhAL^3c!vX zMXD7swSD}%+YaciMPfb;b~(T#EImB^G8>w{!Wm2-0;o-gI#6;)EYfGhBEXw{a?Xm4 zCx^hMj}g6?v{)ot3O6pZ6WOO#MLa+}8f_>ewP`|vrc~u_=>wdI=DUvXTTtn2y?Z4pk#1j4TT8yY|$7K&q z&Ri@z5IGH$U2je^B=_YX)d3Q-&*~Hs`4V!dT}#FdU6paHhgmDy`l3VB9ep=bm$+64=#g^OdUClu3DvB-jj&`hP$$*`(v z$u#WtfyWp$;k2T`4xM~Rnpj676lc=2Km4;o;qOlUyZ)r_ljHxh?`QMMd?n9+x_pwT z>+J6;wC1}C+3SP}reVX+$Y(~z;$#~;wHGLiB<1;x3a;p!5Bbgfu26!dna@^7M1^38 z(eXHD-K8??=BjcAj9jKZA7^|2tb?#@74mb~Ork&ad_i}uO{ko5!a$rXsI{&9LSgs~ zex6nwpk)Wey&CzM7(SsVQ$X!(83kb@dLS8 zq)Xn2H%vLZWnpp1t%SR4fveSo+^L2lYMS^L%#KA!J$b{n5dc32;th8uZ9Im$(n*7# zUl9i_z2UUp8A(^$o~7gs=Uag0(uEAYQ%&gNfQj7%Z&*!)Ln#exm5MXvVS`DrQlZ{> zGL&y!-CfH%nL}?34cebm1Vk|B#3|LzBz8zbn_;V<<0I5bs+J3PrkN z30rF{pn_|vfv>lAb?7NbKekdUt)@-1p8T|u*5rLb3!WdBpOR#1H=^>qE9JFqEiKe( zbcJw$H^>ooWtcQ08jWqsCeXs6xGG<0@919wKi{rWp$u#|aK=VIkdgQ{_#~ zsVMHdfnt>#KY5LE+wc{7a!|Ef)pSCQ%UwyxNKv+|;v8-vaoRYfCll1w8-yu{s!us7 z!g$~y-<^Wk^?(h6*s|EyUw>!%vD=Mt-wa88?jo0Kw}dM#h~1f0{H#K2B_iKB?g7Wj zvkO+;;ary~xZUMwD?HmZy#EQ`ljpcr;*y%b{{Gkg8n)m@5sBW4NaRu_nyE@8s}j|y5?!N8v`LjHqDrKz675ta z`jjfs7gUKJQYCs=mFN*wqJ64FBdSD)Rf)z`iQZBrdQX+e9hGQiRHD+TL}gKls-qGq zQHffj65SA$s52^&9+hZkRH9EsCHg{CqKBdqJsg$j(WpcRq7scpB^rxLbSx^-iKs-b z4vC68Br5HYXhDZWH60Qu9TK&4NVEyB2;u&*4v9YAAyHq4M4#%A=zbCY*RlWqZtOi2 z4B}d#v>uEai7=fZq+qNoWu#eqi0JPep>`ZQ{gMObs9cx+6Guo-Mu`r>jS>CA(H>5wdg(=nxXFiz z3Z3lk8CvKJ!~TyNo#Eb&o>(FXdOF;R#*^O;WA-PB5MfV++8PA6w^P}ki~FfBx1c1C%nM6}l#<;)}zJ?V_%Ks`O>WNa8a`~ISnu}kzT zXOvOKFzorYGnz8=FpWE-X;mdEc13&AF`eleWmku)hl!TKg=t@VFGw}2$$c}U3Lm~f z^Wok^_?eJ_A4x^ny8JN4G!t!NVLgdZ7tv<;H8tHWvfPyWhHQuKa^b`}Cucs({Rur8 zqR(ahDY}RIQy_W1?22h2UGHV%;My9C$B7&Tpudt~gv~7IQoF(_7Qd+gTJUrS!moor zmS8p!H^9#g^C?ikSWZe6WQUEOE5NXIhA=;e;n#?MU2uzr_P$nNU+Y8^o(79LHQg=X z`R}G_3A>c9Ow(*HeP^1cr^6vl4R^8m{VxAzWBNVj?_@OR_nDuk`2q9ue*6&rh{5vi zhd;p+4Rb$B^b`0~?dh#VbP)bDFZ5sG*Ho7G=ggmC>+Kit>q#~qqud{ZP5!go574DU z!jF&Vx!-{Q?CE+Er+CrmbEfM_Bb8$Q*6D%=2dqr*38fQ6>zKQZ?x04-;jfCtRUf@T zO=@>6tTrbblLDePWk`^WSDaH$NsW8{4PlbDl`RM=$oAJ}90)=F!!n~h86>m9iz;v+Lzw%&O znV{P*B2p9Gv2-#)_g+L4jCSEhkvSJ*9PISlwgq!LGP{z~!NBJE0-}H`S1?E;701=+ zP+n*vnGgl#;)e^^IP)u9Lh*QS5Rxq%+G5vEqUC_Q?-S9dh$xs+W6M_52Gd3Y)LJmD z#*<-Ov&hopu4@N_!&wd@JX_fmkGBd!l-)e-U{LsSG0|s=v-1iw7+VMZLnG0% zXA#|d78=;NY25~<#|;MQ2P~v1FXXSk|FeI%lRdZo@#AX(7#)lKc8O?XGngCtoJ7hyn0gab@^P^X0s zq{3AxL7nOxL@7NTiAAG9ovw8di45D3D%g=Q!oluPkR4_GM+cGZe*`J@bSSLSIn&U| zbsL&!?lhw7o7b*fx2}b%rx7uae;NvEYr$oio8Vs=>wxy_mn>ZGqR&r9cM?G`Ji$=9 zLnD`)C>YWi2b6+8sI?nW+ITkeu4-=a*VfQ{55Dk0OW^Im%^tVGmkuQ&H7n>R$jKSa zfnuVT_1CRyZlW(06J6t5+tlKxZxj;+H~JgfHZ*VgSkSj=(}w1iZJYcXspMRu(}g#k zOLR^1+KrohYa9K+Aa&$_(++&Ku4`&*@zc#05Y9ISg$|0|pM$Hx;&FD3<3G(NYTcAQ zpg{F=^QJyEm!Nj(OecGSI{j7(&T?d~4y&oed2fZCd*(Ehtls5~( zAU&M_O$YELz-PQ@%Cyrbi}N4^Kd4x98_#x$D7I}yZBRE7xWYLS3#%Gk>=vP+bhtAc z`h7QLC%^A3B1mi?r(wnZ_1DTE7C)D?dTpEBDA!ajuUsZCtzNREx@PGLdBG|*l1zu> zMnkidZtRtaDaGeu5Tm{UL+}U8B*fCw}gvnhtn5T9{(P>)2Akq zriltfNd>$lme$Slu-2E`aJ}z&Jfj+2DB+*qjQH|L@?);hF-frvjQI3)F5Gzfz8zg8Fg{ zVtaDh#F*nwyn5vnG??Slmr01UKR>eqU3WYA?cv*?497|-&IX9W9YrqI2>Y`nn;<{f zl_l@ojxS4i*0%unU^~7nfl_o_N(G&A39|0sbLoUW1MpCpio)8lb+d_w{e zN$w^=B09dwiklG(8j)CcS27Zb)sVEsDS^Oru5l6-Ch(2V!bsMaPQi=lvl0oC+MOST zHxeN!%)RL}Nf9R+a8{(6B-Qyj3Em}HZz30($O~PXO>j#!Nl~8dmL*wlJ4qcpu)Qnm z?dc(@+Jz<*oz=C3q;p)XwytX1OLVpiJvavq@<>@eTDsiD#>0kJyq!~QAQ+?M_%s!F z=RVx$hDoY(VZ?Xi?F_>psour9*xgOi70i2X4@nIy_g*48@8h7xpXI1m^1IIeqJszz zTAzQHgJ_0CbpC*Y$R`oa#QQ=QJmes{;9K|)kKSMSq=TqeBD!z{Z$rcLf`e!pqF!+j zt%v7z2hqduyyqZ#0-otkB0Lv6>pUmXbhrHJmT9H;U0CWQs&^7yaG8^+1vROrc1Vr1L_>LkjhPgR~oK$CFefL8yoXKXwxBN54Yp zjxb3@@H;-uKD$XO`d9YpA{XB$3S7_Np)A*PY}ez&is<2d$UFZ#=_P=p=)sc8Fq3+I z<&Z+ZK1~mopob8PA_2(xzeo=g|ARfmmJhk@_YNtv&Uxw_E=3RR1XZrTP!ECD{-@?} zS!I|>o}WCV&<{`3!)53pMAJyn@n7#@-Nitf)128JE?)en()F%Ci>?QpW<{Vmk!fW( zO#ewaClQ`g*aaqqzv)GVE(6*5XAxkhr{&H-`287FzsS@sd2 zRa-vgEC+t&pNy$@E`==1ndR%9D?pbP2tk!=i*zBdu-n;`$KlTg!Q^tTeoG>92ZKG~ zPI6uY@fQDRCucK~fN;Gx*Tj1lU&U?R^ogK|eD_OF%w)_AKw8jqDvMfuo00WYxwX|4| zjkGp0p$x0tm9$veU3OQNP05V|B&E5u!8b`uQxcpTnve$xdG*qS6p}zf+q5NV9;Bs# z5R%fCw7w}x$&>s0pT|5jk~QR#w7oY2*3S9PcmC(~oyVN>o$ve&0xUcJg|#y4mUs^t zSh9!~+Mq{lSz!BNTOt>ra@3dr@f;4~KCuo_AA`qpQIL~BfLxs&wmNVM8Yfsiy6 zrSIff)IxLfxpb+3OEB~{PBTK#D!@%Y`Yzz8t>Jp*Sh-lrSEfn7z`T02n=j<;6~tH~ zoj91D=rAYRP4=A-P|N^P!}CERW$nC5wD$W!`3Gx))TnTs0)3l}*2PG%>k|jlISMFu z*$5~&j(`MGlfv?aJ7n|=?eIO48k-{JaXU1!KoJBa{UYUA%Y)V_GV6tWrcC+{8*6um z(<^q2=-FyPIggxyKUYsMq>G$*lpfO%9|~IM~+c& z>#0dOCIC8YfNoBc2#GW)Ut0-+7kiVkI8XW>8=_-zK9KWM-f4&5-Rbs>&69G_hMGiOuT%IQNH#-ymwEN*K_NXok{mlms3YZd2>3I+Aq+D* zOM15>L^mf&{tw&y&4M4zmGr%i1h(@q@Q58FLnl(WT%uo8rwWBR3Ts%K4r?z4i8i23 zg|&cAv;owO8k$akFKAdX=Te*qF*oGTJ}SpqePG zVdcCU(PG)0byi3L)-a<+7go?iaF}TLMmLXCkmhrFGWJ^O0M~3`p+pAjYgMEKwE0Zx z1Q{1|zObMb@?>1XN%fp`BAY6aaVe)YaoQpax{uSE1s|hb#%Y^5EmzKzD`Z^Gi7m7l z7vvg>G57*Y|8$-${u@JZvI5MM3+61-{2(I^YM}L`5;CXr*ncULaS(e8f!331$jo7F zJVnMRC*7)2H5-@=QCeH*9J#D}hhiL=FzgDu8V(j8bc2l7@Z@QTr%c9g9AUo3xh%2Q zqNoF{w<#3XfL(n(7Fq2`wuCjfHi>0p!^oXxF-@h)Su(DNgT=&7{~Jd|R1{`%*@7LL zM+~C1><`kS?b)Dg+Jfu%aodRjrmB}a-%3_s9%5BG7VsVuxc$h^wTuPoD55uP7c zkm8av$qT~kLFR>U^HWy1W5V+hC2GzJT}fk6B=3s~wVp9vtDa$Xi%w>mjMu5bdXyza z&AixWH%_V%MmtVhg_Ib_)n^T&twJKmcs-L4ipn?+h>ByvkwH&!Q2k9-NgBi@1H+dV z$zUW_bdoC^HFNni86yIxK5Ay?v!$7AK7E3WQFSXzP*c=QFO*8ze8q$fu9-sV1Q`ht zq}}#p@|Gpz)hfnGwY4*9n&nI`lgsBSWK4(vJyFwyG2Q$^k&Hv?0T#u+s9DOE7v?Ht zOsd0-)GJBoh>wWC15vZsRVL$V!88;#p%}^bH;vb*<1FNG)Jz|%z#4;btq7N3B-RW} z(QuMcGoM`~<7V~mShJpt${xmegF0CcQG865w01JysG`RRw0==#^2v2&jo(&tjP=PN zGRrnGjo($VqZw#@n$f1oc(b~|n9c+#ti8t|-c|f-*wt0ANtx&>z7!^E!PanNt&0aF z$@2s7fPbfphr-&1TH-U~{#wy}s@#noSbOl1+hIlHnV;98KP{5+ZL5nbk?}0=6||7K zNXB=#!w8xDk~rhL&$DT4IAlVFm5hJj?z)gUHBH8I*!Wd3?95F~^X~E=IYM*D#N7vE z{4=^q6{AbKP&k^)lJPI-Gu76Xkcs0qWSl_{skTN#CZC`h-$$9Lt=mIpIh#F7#tSGP zwRK0xtNKJn<7I|IMh(ooSHkz^P?#oA`#_9(m_U0kdje+L*YcKQKjG;iS?RDb9W~h zhO(Kp(d$?jeUywE1)KV6YX%*e=v8YK(W_Dm^a2pVF|L3l1p$>86kF-W8U>Yn0pCs! z8|##XHRvz++-5y<@m?oam@1ReEE23mO-|UL@czS~um&j(YuKp2K<yNbKfOEUL* zsz&vphh*+^s2bxUIwg!<^jW3DIm7ZLx-7^s#S~Fcrz;$5c&wAx5DFsWmOWwq0=F#B}DVX{8HP{yFyUB zK*`M&C&Y2TfowTl!kvvJ3jNOz;>P$s70=IROSuYHqNUKgLr~68TMY^>r{xg3Cj`w1 zHrs^8gGl}bmI8rkl2)}vf%Zc*M^#&d2oMD=7En(#pn!l7l>6FMEi6=6!_;HDR(-8l zNu9}7@bSg0J(QX9#H;$R;!6yP_~?N#V(vquOaX>d6mSg2lF6a*SloFM?$ zL`=9e;c~DC1^eOH_(Xhcl*OZi20-)hZgXVp&}fny$DW`n_#B#ujhh2~$v!gROvJ{S z5OaE5 zC*lKUa?HFcKAMOR&|3J!CIOH%2gXMF;-hBY=m0AOYGlDi28QFKF=}Ftp;-Sxb2K>- z>!%0^gR!I;8y_DXGY^c9jQ}+^K0Y>1>!fF5Y$86njI`5w$uTiBGQ7W!nx*?te1L;Z z#0O}Dqz*c%8zpsrd~{@NAV!-&7#bTpNSpE2H$Hfn&cR!3^l*aC#oIt^|Di#1A~t-0 zw!l4cWVD~9cl0o|fY5(rFgZM7Ci(_oA)U@+Ofi(o1XBYsuj(5gjgJn}`O+sb9zSdz zj2)p?L1869QMh80@uZm;AM1}zOwd*tA~u+k-h}&1aYJ<;UKkvbYMIdbI^9tCa0#;z12Tfnu$V~v*l8AX1Pe!KjB{*6q--X ziR;7s!8EQgA;Rk5EVfTN9}_=OlhS$pddE2wLY57 zAA=f8wWd@tN>fzKi>nP~Gov&|*%_GXkg}7xH%H|;j_PVA`M8>yHkb0xy98z_&@T^WLJQ?L5 zgjBsn`7~p^ChAZmt3F@(qYWs-7eQhmCgom-ljy0fn3Bg6=;3y5^t8{9m4ZYC7PR0&1CtvbM;O^ zzDtQ#W-+_7_2;VFm4Dxe=uRVub<@*tk!JkGngELg6~#iz;H74w>i^YD zbXT(&R|B-|BW@@-DXc+*Fsy-(4a86cWCOA8YHm)2z?PczsK-zN%@JQFHO*Y^ZIWqH z%?3`?IG-?5QnQga3BySR_a;scTc~EfLN%Lze-mqTHq~VGb2z=pg@OR*-p2woyF7T9 zE!=A}g*9aI0;gtVQ}|vLRU1tg^85=jeS*U87vE$gB!MsUhd-cVcLCi=kxK~nJd3GP zmcsX`oh*LC@?z_s6#kI#2wNTqkgrhq!@{TjLM4vR&+tc7^Xk#vyB*2vga?*}uir@2 zfOIN!p)#F2zECu$veSi9)?^3r!XNbn-M!bt2B44GKo<$1)O00V5;!08;&gKyn+q@^ zEfm(EYP!QxJT=1aQrkA6IHxH5ZWVHh`6HX#hwout*c1tCP*>%D1J)LKZ3AR}XStH0 zCZ?s@R<{S*!)EtNQ||D+c(KpfH&Hx{f|vV8=&VJ){bu?+6DpO zt&A~*wRdd7(TipF(MX9cL+$Nh3;H;!f=#l!HKL0*6Ln0J5`%87dW!ZekP-v&+Zs`4 z0tZp^*~JA?20?5N5_K&srpoz+xj9mXuzuagPQ~zc*v)nuF2M@2qU?1ZCRJXAennAw z*e5CP-%OL%T%_P*!lGyM88_AH^u1&cuj@p?njH$N4alx@1#5N+`o&A;D)m1MoI`Zi z?hWX*E-@=}WwsVs|Kkg{PM0s~Bn-`p(o@c+ap)pz=5w>u@OKKnH5BF2^deS)xb4Zc z8;8#!s@j0hroFQ`gBPDKCSli`8f&3ejj}P9IiI2IK-`M5PaYakI?!nEgwER<_va09d;vt38^4 zyqA;rEq7u?xfnf>5)3^2VlUCxuogvE;>gx7TgAaT>;iq8Z}!qnPxaDkuo^Bm6Zy`C z`mH9jR_npqyTnBXx^%AK%v`!(svTR%{7tP-(X{cS2Hs zT?>@!HKOXnNi#N*NFL#@%r1-qV!VS?_S;DT{El~$#(sM!h~NGrq~mv>FBzjMyzQSz zj+4P?@rguVvVVv|aPbLrHDkd6hZ?*c?i-KyjV37!$Dz@KqhnW%QY{<rJB)W}$RsEHGLD8dM%Nm|D#qe)tiH+F!b8E-@5v57;&N!kEM zA~{YQ@iNhOAl5fN-gksH!P(E>H{%^&t^=_H@zK}-odd#f0{J|bzg~s+EqEV~_2VQ* z6z}-h0QOcm4oTMqaN)BTt&<*RMZbS|Y(IU5z2Z}&Z-hQ89Ao2sgE9J?!z(smj_toP z)}N$DEFPQoD5C*Sa($jr`VY_-_{%W9{T}0N6UlKN_e(7ChhsQ=MJHR3M4tJRB7sN7 zV+ZKuNhTAxzis?*Y=BOl;`0|GgDBoPCFUfM!IEe?%I z6Gzi9I+D`BBo__#P2cRLlsMrQPLa~UMEVqkr$}jlpsJ^|aN2q|sMZ?hthP@|gB;{6 zTJP=-Vv*eO&0f0xsb2bnAh82;;aO4|(1H*NzwwNe2Al*zO!y#D8U~rSQCG@VM2a@( zP`tFFUhcG=orq<8t>hG+;+<4UCz=e>%SjHcDOU=mY(}g~@mvH0JFe-IKI7~HH<6uS zpxyRKSosPDIA;g``o-!2mp6aEyJ=IGCn20GWA6QhXB0*>@GW-ryEtUDj1u{O^sxp_lgqV%!x^+6 zd%4zL}Eal7`b#Aw`}tRT{(_ni90vW!XN1jsDqqzFZ+? zEs)hyR4p5JBMxV&r?hHVt|%SLW=Me%9#T&kMBl`6Fa6jS3%@FEFYoAzLo?Vu4GVp~ zr+Vq%p6aC&p=IVPr&kgVp^BzypZL!y2bQ8+pblaX)NJK8EqWnTMWk|@w&VNIEwRsE zY8|K=Te(f^K^}FX+!nk}!F^;^ns(qDmhu{DLpa(dHQBT{yeRZpBKk+D`6EPtY7DI( z$KJwH!%d5^(rX2UYq)7wegb0As!>4h2$>bq4g$s2anr_d5YN(U(Icp)T1&4*-|;aP z3;RCQ+u&ev93_1hk5CIsy%tF^!d$OKy2D|n*CL(uVe>fY?SI0cnn=@dEH8v}dN`BE z@`n^Ky%xO_$MeFLUW?vs=MoAlxjgB6t#nv=EjlY^6)CawTJ(!KUs%uzdD1W8q$qLY+ z*P_Qk#hO~!(reKVqClY65|(-``Y0#es!|AY2)$-jT3etO$WO}Nq3A~rXecpWVOPV! z;)7m`{u-V<4e^vo|BYehYt$pL`n4!(rq`lrzz$uj5nY3cHAHR;H7J?}XRTCh(Q|KQ zQL&Fn{dzc9RBUHcKPuuPO@r*NRd9OqPc))N_6Ip={O>wZBlt+ua9*;>(rnQORCq>& zl7fCfOmI8zKB#(&?i;ioO&e*t?Gyf zJP=_@3i{Q8X((bVDd?|JU(LXVBT`90zgC1xFcNm3b(0mL+M0~8r9k~=RcE0lBT`)S zH>eO0C@DxSH;;^C@Fw8P5PVF0%JN8 zBu&E%RMXzB$;wArIVztyMdd%J6RqR?zpsNIhk(E9<_Agge}OR}uu|m&B~5!CdU%ky z^;JT2Rqn?5UAuR&6c_YozKmsIvq<{4EfFq}{wxuSgQ8?64#8O<)HCFm6r6gyMp3DF2(SIbIh*GdfCoje-N)YHKDUhbhu)6%1}_>nyERa0VPf9HIk~ z6b00tE;JYPH418Zz0h3HBg&N_bRxVnT+du8`Vg+Upf`&YYZ0!wpl?ukr(%$%L9{gu z=e*ZjnhW}F54 zbxu`1J*%R(Wspu)J$+gAYXt*WQbsu)kz)@Wpjs-B(`eZ^43p{l1} zuU^VzIuT*2diqfn$JtrkIaT%aIaSmR>dT=Pr_T$IV#KYgr{{&o@rbRerx(=Ut3ls! zQenM}RMpdq>U$XdHYMUx)zfcasm2ZuB6g_i=_Q7bO&;dsOjB8SeUN#%RrU0W@cg)f z6gyS*^abJdAoFso>gmUX=OaqQQq|KJMe@F=PzXI4a>u%x4cv`fF?SVr|FLwhr{**I zP3m`> z4lN_cc5~HFFnhpk#J$~I^%DCEY1Jb9n-<&6RitpD!HH~3vq}-faKzqDWLv^j0R^$C zt@RPH-CU(9rx>LvBI>HjQ0`-t<_Ozvt_mp+G56+(+-|O_R{oZeS|av#b5&S*khT73 zgl#uh)hRz_Oxq)TySZwO0`tUb>y8NDZmy~qg!YJIySb`S;e$yhr(#pJs!7m#BG%3W zRYe4GA0slpb%N9z5!=mG&B`Vg=|DtoH&<;`&SRvZh;zHS>KswClM%7qT(w1+V2sy9 z9NW!R=PNfc>hXx&ZmxWOwkwF@mYK%107u%SJ2FgQum(AG2!jI8OUWeA-% zJDQ$z>siq>aM_!MMg!7$jy!y7FBFi{#Ihk*3pQ2}ojXfP6BB?_bnY}MO)z(&p3=4~ zkg^Vm2?lzxTt|O{K9EjgY#Jp-eo{Uk$vYxcoCMU+nM#hpc^VKY^ z)M)!0=$n9Y8`K}E$tF+4M+b*vsL%N5;8=npwim}RNBWXOw9Y1r5@O`_Hrb9Dg*!pb zUaukHwZZo48yGNS6A81EHhPIYw8dAxVa9E_6^4eM`Hsl8tD45&BgQFT)dW9v7GPr!T!~7 zY+}NkNRExiCaBfzJv`Po&~ENOVkRcX#wluh@`h`U#3x3u6Dp*AtId!Y9~&MUJcPy{ z7s5ps*xs>3+~d8?_MRAuA4u+|?KTB%;{Y@a6Z9&ZilQDj4?$;^7xRV7`t^^E3T562 zy2$1@Fm`C%yzHusfoS;b3B$j zG(I{(?KU|!nKXOa_w?*Va$qVhIYGN^?}?$Y@nme&ob1_)`lk-ts}K9TViObl$IxEg zV|z=<7Y!pma%h-3ZSRTUv8x!-jE{`$=|I&{*9zV})NT8qM9q=i=HYmsIW|svZJ*IG zY-%U^;^Te$hhx;^_Tjs&Ovm-yh~*Tyi4_jt#H`N3UE1;72p)g3V5}Y6}UqxE7)GPV!|U9k4<}&(cH=k z2+Nce*o#nBz`Ijf0d7lK0S-%9fpJP@1vs3_3UE7=6&y}WSphVsvcfB7=*qAR1!@;9 zU@H^G17Y#D8pgI1=tDRy-v&Nt++M?Us1i^2!qaI4H*lZyyyj_cf$2ZZqckX6jmDaQ z(V(nV>amUxrJ9<{YXZ&m|tI-IpK?`HkvMB3_ zW5gSYv_>Uh)YM#3b7@d%BnsAYzhJzvrhJh@3GDnY(%$MXe@kuyIs;(w?L2ZX8z*>60}_ zf<%o$+Rf-qHOe7u-*nRMMxu520sDIPQccucqaXrjLBYMWuw@c8XL$u93Nnc->Oq$D zDl6$V+rl#8hDdl#oF&|@5i25ZC}0NM;WWGMgEBe)e_{EMU=$2d&?%65BbVEnfPqr2 z5@O6G(-30J#4lt!An(8&sv!!?VrLQ?Fd(dTsuHMU?ScWWabk4T5Y^jt z`&+$6ys@KZUl_?~fWUO(%q*9jMi-ytYI0F|$Oxm=q2Y7FIu}#CkyF=0bHCZ+MYMsp zvW@kk)orp`J8-Yt=mIM_jCET?K{B>$u1b8>b_y7qYl$wjG8p`=UQs|7Euj(ZP+c9{&Wm{$ z#WL7t5c1mGNVKbw0>-{DQF|i|Hu6d(+HJw{8syCyiRy4S&^->PPSnYJo-WZ(q4n!T z-JMneUJ*uIdu@MC=&?ICPPo|S*c>FfL^_!~ah6LZE#A1fhG?JdydsQVZkc|mmNLNGTJ)(eOX5CqS0+BM$uF``yfLWXULUHSseBdx$+osw)#Rx z#A=L4cSd`bzD{;-)v|M|k=-ODJM8Snh-$5zGT%CP7qN!_s*>`hvY@c#Pw|Mj^ZTX1wG`fueYb+x1@ z3Y)3Y%hQr15*EG@n1U)yVh7eKxhozr?&JTdDk;i4SZv3ajqR6WA6s5z!VF}Kw80{G zV5@T8!6Un8E<18$_pZx#?b_9Mo~n?dz#^{t%T6GXZR%RF9kVilumK$SUxs2-_FuH) zL@w|@|J%(w1GQ~|8`}aW+Aa%(_qC4(zNEY}aCBcF(spn$@RrwoEzo%LWr6COzY#e3 zx@Ql5=$61|ly_cr*$w4D@{^gXFS+8Q>d0DcR z%ctiSGTB|_6Xn$c=Cg~?)t<{urMEu5%2_w*u@<@=wdFP$7@hFXwJ>kzB7INc-t)LL|jFHzuWCR%_F8NcJ)qq zp(q$m%v9!(G@VG^({B0T_C)TOnJY}C7@tA3j~NTynaf{}@dSsvVUCW1Dh|B{9wp`G znTG<+HwQLO2PWGV7XsClK;6DTZr|Of7Zz^pU07IHINq_auyBG@P1TLH`jcP(v#;a- zKUc3<_i1I+Q`M(-kUq+i*B9~+xr{b;Js&kcSk(m_awTp7aVXi>EGOb>?mgiJ$U5moQ zof?MmPHdd3TR{mJZCLYH2iEGw&C{$i$0czpUGs`$l$Jd>B)TM=3fgcv>(oEZ;=KD6 ziPK+)v|QoJgF^gz9^Rl(xS|!o+yVtv9CZmaDS`TyKyflq-==D$D1QL`Lw1wRe~@(e z%QbKLva9=5b;I&{KwFQ-E5V}g!~I24mU(~Y>DM%g$NMgpI-8g zSQ+nfyh!6cxHnwf=PG&ocoLVzN0=vY^zdbd2`gmXE9*C&UWKf?X8nZ0ohucEtovtW znAk1a8v}u_Db=6r`#j5Af6a<{!?{b0<2d0Y!%vIyK;6I}=c)hJ;XhLih66R~D0_+3 zsD0I8O?$MzW|W0QnIRkwK0}XF;ts4*&b=yGcj3w~tJO_K<;Oy;cm`|F8m5Ja?p4XU zGgrnla7$nY$@`p?<6l23KH^SG_oaZ#S~YRA{QCKS=fUh+rHY1MT)U)F#lY_y+53Wl zU)%`}9%rss3O6sp;TKon0S~|YJE5ZC7h{A<3x*R9V~9%acjNbQ_I~Ob{C=CIEA-Oc zc;Nw0;cJ6ER}sH$S*OHXwDGrSQ$$q25fR~*eCPmi5f&n_aoX_(!5;VzvvA{Y(O&%) z4H&p2QWtI<_y2&y?F@%?ES(O&MZ1cJt2o>U_mIOa!|fwt;Z!;`iMW_u06H~^U!+r^ zS0kCw8vq%m{6rx=W3T4M0BxZ=0 zcoN}pmy=4Tl1M!6m&QB5*ug(KmBcTSV9=?geri~cTE!@{rO;IpNTCUdqtFE4KE)FP zM9j1mngHNdo<00*XRqVU3&YAKPXLm2^u!M2^E|3XNk@ zz|&zR-cA~fbXm_zO^aWo?rt_K@j}$l#PAC>9ly=@ze>2LMHhnKZ?pG`hTkw-t8|wU zrUELRVpD?Ga)|=#9azw$1bz_8A!oQR{V87e4#uD1kRfBVY6~^O(cABqoRCDTDj5hb z{iPl3t3(aq7n3$;4dDh+TzC%}esN(vI#T>zEyCgVI>CeA4+%PcxviIqhTj(i9l!rB z`0*PQC5Yc@QGznvi2n%V-F-KHe}fkWe)zt@?z{1e(|-yj{*Z|NO>pBE=n5t9!-4Gr zsaJ@7StDck!fxad8~Ekl-3tbOH!n%h*$VRIh%AO26eNB_?0vz&FJ_(23OHMQZ6X|g zMa5VJ_h0M5u!qhFeKER1jLqoia0|ROJcw^QKYX~s>8qkaqDlSw`Op2dvAYO}V5#!w zFA>csYH+LwCC}b)o$zy4@)$Vf07g<- z@7}^<53U<+VFPaq*|NbyAz!#Q8|y#z^NYy_R1)1!TZs$V)3C(A;=+!%_rdB59-jBM z>(lItcsr-E4ADdKmXa$@FJg1n{ou-xqR8n=vWiuy6g*p1qVI*Ap*mEe`Dz(Ep379CrPOi*~5|C>tm@j55Y@2W&6q2_MI^>&qL za*Y$`Ju1<+1cl>#L?yZ$7GJHr|EWs!kVS!ElsPk3{5_a?wbK0OD$zOXos_StMAI(H z(<;%sU6g-93NLh~5H-v!s#|H+0z`XYa@dM%4NNa>c2YJ5h&JP7vlR;0E%&<0xg$XI zG@CB7_C9UmE{!rS3bf6w(|Z3Pz)#K ztAfYQ>9;{)vrZ|8unp8Y?Tky+h|ZsNQtC9KkLDyrj(WTYK+iUkC%PXAu^w;F_PEZ! zH0?)@dR8tJHrTix*|YV+bP0>={_}~Ra`nKn*LsuHYcXSt`E14AahH)s05nb_n&QRY$D2pQNl$Q_c^xW-4 zDR()GnT&<3v|~xbU0-4*(;{1?3xPkfPO%uq>vUj^dnQg+ox&(GABp%rv@0@v_93Ug zFUn_`xbVEB5xwEvvJBaVHWA(OURfG4?;Hnt-(OGkHCI$J?`U5<%`R{DyqvrbT`F<@ zsD^071t#VBBUavX#be!WS;kWrBx=9+?0JV7^po$GImNRB6qyS~=?M~@aq)}5!=tpslhV`WDVZHo1x>8HHbw( zF1V*Tw9@d@7&2 zG3(CRb7%#ha?03`f&83Sc+Fd-j(e_psC=yvy_5Ez9R|R)#1aEYrH5SE_vQ;2R&aLG%`9`^HC)!rQW~ z$K!ndRVS+df{>Qw`a{vLavsEmbwT&@O6Ci7F<{ljt2}YxL7i@cNo7h}APZxz_<0j~54PJ6O@-Ydf#ugY}XJYde_#@wJ^T%cciw zJ6O@-YdctG_r`^KN2^<@-tqiM3?XY+`B-}s)+5_amn9qGBElt$eXxvq-D9iE2Iqln z@C_;F^GeIcJT@m-Tsdbn)&tpi7wn)ip8Hl@)BC9<8^5`1IYTzEr^jW3??o?tQ15RE z$a)8l_d&fwvUt6te7tpvdOvE_`|`4ZddH^DO7$-5bi}Gt$2kbc(^N%thmShtJg8H4 z6Oik9rR(%-R-IzY-TRuW_F0C(|C2>4ktB6kfs4vd*tEsQ^VXU0RwQ_y6hgPqzZ~Le(Xy~n0 zUs#t}ZC(9#AN2+0{MFhQwu||AD%#hQCExBUqWgW+7w7ra)K}g|eXXrty}rf*tG6#` zN3K?1yR_Bo>!UvE>tP@D_4cLpg)>c#XRwOsVITFyd44tZ^+_M~^@5N3`jn6Qf)dJV z^)=(8zR*tj7`JkN`1IN8OUyGLXLW%U*R~uM(V}}FsNxDM7NzS!SY&kabYe#2qI3@g zEQquoJ_3fR%BckhwSu4z9Xb4d-beIPdp?^PCSH>?f_3 zo-;mhKI#MKMIShS>;s4XjMviH%K4K%a10+f*j-z#eCmDReAWj}vk#ol`@m`Of%E4+ zaJKuv`70kd?LKg@XSrHA_xQlUta3G+ULQDr>jP)V2hKNr;3RzDJmUjr(g)6Wec)W@ z1LvQ7;LQ5K`4=BJMISid_knZV2hIeBh|+>h0oAA2_-X zoYOvVph>V=JH6KjPMr^&`+eZ7^?~z%4;)+-v0AguJwVF z@PRYs1833)&a@Al>wMr`?*nJn2M$(gR+Gb`4;<*dt%h^l2hK4cI46DJ+~@=6HXk^@ z;{)f8v*CyphC3yXwZiaL!&)ogYYts^s!J%HIDgN0 zZ}%YM*orHKolPF($8BV>Dssw4sahp=meq{6`M^0XOa3f4f8Yb>ULQE`@PTu`51e=T zzjcYkNd!ZF6?SJPx!$3gb$pjec<43)z#AToDZB& z`@lKl1Lre7a9;F*^QaFT`is?PgSZ%Pwem51;QXZzoO&NPU-E&|>;nh7)T`yI#Rtwe zeBf;Nf%Er1aN2#~e9H$;j}M&h_`vD)frF#qyqvL#awC@fUC(3{QG($te=V2RyfIG_ge#-KCAkZ0r7B|-wiLz54 zOCRh(V-sVgJxx5&6@i8b*A?-em%&pIwOq@}5Ei)IkF3+{{z~*e*39Z@&)&_mOXnn= zFv#edw{(BSvv+f$C3Q|CX7+Omnkp>zmSy$T@!VBK1pDXqDS-D@5w*K0pQs|*;i7yF z`Vs<}*XB2>hXj1Qo>>S)SD+rBibufUwNy(&<4E^>g%3%SzkDrw|sp)VAU5l zXR-8QBbtx;dd5e6;hZ5K(av4AzR=!Zu-ZF}87yC?IQzC*oo1{$UAZma@1rfh-oio2 zOnBOIuR-+iS!BapXzRJSr-OQB8?;(C4+Uv~#Q?WX^2?DH3t72$Y2~p8ZS}{Nw7k(< zq+)dVRELz7XK>-E2MeRaiI8mF?_g(Bmp+gdSm5HV8!dPF`44VAT}@vLyGvYJU<=Kg zY)H#!K#mSamQ4@S!8?nz;KAqsV;g*QK&sr2>?Q8CBw=NVf|(+ublK5CtPvTK$6L$R zh>yhZS&Gzw*%4YYN9x*c&yo0=Rp$qn&aAp`w`X4>_WEBacIfiCW@ueIJh9*JiT$)E z_U2zG_NXWJ7EkQ=cw)ca6MM@q6nl#&_RXHyPkUm&#uNMYUnutNp4g+F*zfhkev=)$ znA`mES)_M1pPI+P2|E|lmDz>-Q6fi9h5WS3TzDI#SDu&Sk=7fegfGX#<+%grFqqV_ zd9VA!P0GBTW!8XXUY42K)yOLf9Cme_xgBbE?{7N6`sAFQZ^LyUG7Kb{cBd< zy{A8Zm3ha5kqDPp^LZw$$ax>kTi($xN20IedKnKBMk3rK%};jVe2e$N7c};B`3Taz z;t29yO^zV2ZsUfMWq3zWu6Q`CWMuOhsYg0va1DP*D3{V>#!{OYw-_Ya&dT4XcN#>! ztbM^&gSU2Id(%ChzMOf&*;*VPtXtrm0?Wm6lDX6Z#xgv3K5P&rtzH5W?k-h44;n<* zorOpC0N{0xJDBskD4nn{=c4TWxZV4S-5ejGy0N0eaeAk-sY+Wr4s6p)FF7?)AM_wU z>`4#G(3PHUSVLG1`C$+8BOYYfqH`nT%Vjm>M?A=nd61#S??x{AKz_`F{6!BkR+ikz zu=}uDn!o5le%ync^dR5v1Nm_e@>e{_u%hTr^PN7Bzv4lD!h;Mem2TvFd>}vJL52+% z7fvTm2DvERANPU$qz4(s^ISNc84ohXQ_iz;OTmhm3#SWTe=bTV&gi%(-Ou_!e$IpZ zyayRJdECg)`#^r)gM7w=j8zRc@{2x@&v=ku@F3%?nHw3O0GzUNIltgRe$j(`lLr|# zAXh_v(SwW=bFLJ2;(U{f(p~QZ`KKOa3~Mf&&Radmn|&Z-G2DgIrFoEH$-u?a9rb~X zH9J?RF2jS2l^7RKH|(Ks%E~ne!-K9+U11M0>|(iix_f;fhds#k9%R^Yb0a5xAlG}4 zn>@&{M&d@!_&{#*AUAuE@A4qSIt-6%<#KNJAaC{{8#AMqeR?gJUCr7oPV0T1$H9^@x{AY7 zRd>e2oYBIuG)*9^_6R$k%z0GalsUJjg>nkTV|SSr78_9^|AC zT$kuhGnPhNly2Dk;*^!!;7uOnlOAN)7I!1x;{zGC&Rn6oZuKA=9_0IdAm8di zzRiP-ljE+~yC3j@e47XPb`LUajJuH^@qvu>I9I5yyFAFyJ#g`Kzu*J;E)Vi)4>D}; zx{-hC1NpQE`5q54?ig?*8?ZdZ*8WzOx_dmx*y(fObnfsVH~B!m*Ms~)4>A_xTyb@8 z_JRCC5AyvUByf@tm&Q24P*NEIx}NnQ&w7v_^MU-V z2l+V<@|*|xD?X5)^B_O(L56)}SH8Mo`Ib{wmgna^$Y(sr*q3r6Kkozij0YK-MJ}Aq z;~wM}eIUQ!L4MJLe3J)Rv(`LUE{zvG$UpTULz~5wi|%?K$UpTUW1G)~(|M~0d9x2> znB;Qdbio$6i_!_}_AW~Ib|1)^2N{~@E}YKWJ;3#SVj=q^g<9UkOfAIM=3 za=i!ntsdlIAIS9{d2jUEe+MxycBtFlNCFjKQoBrS3lp6{<=XVzfV;% ziwl+XY^uag1P5{as^-juWP{fWr z=NYOYl50eqaxLR&ais8g4cDZz)BINOSY>F=WGm41<>!}WdfwyW!Sg^3S(aUST%Yyu ze7T0iNhOK%ts1hl_j#y)uOW8FgIzv)n1pT^LZR*8dK+%vM&hi4LZ#3Q;W({f5;kWf zPg|Hseyww!OTr|y4JFTLm`KjPIL~ibs>(R61C1-Mwnl}ibMhXNhq@(9B-o{asJhzmL)9Ov#Z*9PaMVO9zY#bUO^&w$HN9}E-8^*SEvkuZ^* zfpE%~fo%0Hrg?Q{E^&<28y)3q@-x>mU!%1ov@s>+I;e43l8L8OOTzL1c+6ZmRjHg1 zr(b2L*VYorbqOB(Z`TsZH9bywXDyLj2S9yg3dL+*oPv}%_tg@~bH_Z?Cu>RAN0K~W ztR<2sqdCu$t~8rzT=K}3X?ZQ1CUolg4Lf!le7=@Q>Tq%#y^d=R+wEelP{p-FZL1@a zb6VtLv6QQ1g+&gT!mc_ZIcwtmd_G+~!L0#Eo`E_Nny8X8Sx3TRo21OJ*n1tZAFCsh zyKg+rH-pELAJj4|(sIi%66el3BDo66L%pw#*cmz@^YhvHbn%2Zc_%|XP)8)sN%2sB zQAZ>-lsM(b(f%XuU)qLr$&sWoAq4Mkj9J3ZYDs z-*>@JyEDo(pOf%&qnsx-H&;lfq?K=;i_fhgVYiU+lq;o5VNTfG0|n1txnnO^N|}YC zu!ARgo?b&F_cVE^@2w${>k^#ulQkr)K*&&4^-IfVT|EhHXUTIxJqep3pqSIF0}xgz z7$wc}CG3XDQ0?_3EY&a`b9%mz$x>9DW#H-AhwIoai9)`LQ>CNa&XU9#t0$7X?L5?L zT%qv1wVp`MGda(D>xtxAE~k7#gt8_4F&B=RuH>M~%&j5G*#E7bNUp%BWM&qMP%PwU z+a-_EKqU3zcwB36U{94Z5OXSBD4rl;mrsT|zk!5B7fIP6j``WW)^r1r{Kn_V3k}3B zD-}IJDa(qUTS${Qw>6MBpCT!L*gz!L%sI~c8i=GGktm-ABDn^_DUUQPo&S8Jfk=Kk zaGvir5J}AtPWcf+iEmF%(bp2mwNp-staZ*;%~U#_#l?K`lKXnR1}lZR zIev;?rYDTaud7ryG!aR?CXTbUiLAS0ST9#m8a(&O+-?I0<+Un30j2Q2B{47J`opg zi%?g%FY>cZL~@sbBY(Mx*N2_LfAXaHCr!j|p0j)7>IjkC$>KQ85hA%K&hv%F%&l_C z6mE|YN&Q|~I}3B%;-BQX*l}E0UBQa}ScKmhX{RS6Lh-L!b9yF=k1KAoNFpB-Ja$h1 zhllchSM04GSv8O5=Ag~W?STN9wYY3i*r#O_^Xh!cx<3;%3b4C?+MUk)sB}08~9SNI+lJb}9h@>tS&-*u!9#;?Wk0Q-@R3+-E3p_txMImu1)KSq|Ivd30G%QuJ2RtO|K>&nuO&XiPOHGNa{7IboqLsw(P7qUBdaT zwoGoTCJ!@79N3(g>D^&_b zjK*fRGMg=#To`y>^4UdrA=$XTR3w{+KbD$X$jZ!d0M_muff(6jX9-QSyf7tJRC!J~ zu1)U1T0y>&o8j3(Zp)=~uE^Ol+ zB*0uNI-GnL@jt-t7 z;c6GzOQl8jSZ2A)ET&4Sd6~o;v!#N7=U=}(<(1UbT-HuyA(vs5iPD}grb=0}Sjgp( z|6;0C&hl1k7h?G+aWr#kVVYR>*aR4nmLUTDTU0Z zPRNAvlHl`bp2l<`Kb@Nq6nXuql{VWWQeXF7jHGT1p!F0{E~w|HB~m$Iq! zY`2N3=R(jeq=3uS5(X)3GCZWFTQm>h=b=o`6&Aa584+Xlc%^$bQ^KgpUR<$Ro}z6P z7Q4BuGqD%%Ozyh@;J8hY%q5rbp>sNLXtX~W9~(8zwmn@P?V>PPmy%CamU8Uw=$0&^ z@Rw)m5~sZN>vJZPx`wr?gA~7JC@1qkt2v4avXP8k#xwrkCqb9_D;+!=JJvQ9g&N$ zhfGPqZCGeH^M!nGkBk+=-!cp^8G;nf&0)AhITlLUOajdObv&CYBWK(-#5xx{D$A-- z@9qv_u3SEoJ#I7P3we=FH>+99=Jxb-o27+3);`Qq7RytWLWzpy>_VonlM!~ZR@9az zbATt1MI!)Hl}ai-3taM05X2PYXKZx99zBJ_Jv^FeMC=(g%?!wG@GQ4=cXjRQqBfAE z!!&dAMN>}qY*#s3I%dn?_@U8cd?aQjCSr#M#?0~9@L0b!i0AUzikYtzidb<@RZ?ad z6A+%(=2NI(mLRe0AzY@3SW6XidLfSr zU@UwE$~4W&T-lL5<|kHUB`e0SZ0T4wkCw+6`b*hVC3_$@m+kBA=#f-x#*t~3DrT|F z;02v5hv78onUlz)H>W&ziOs+8*CVz@~C4UCEYm3r(?LWxagPLwOz zdGlDdRL&LhT-?&7ig|p_QA3=Pb5UlGmMce5nT$Ip*1g}E&6hx&RurN3BtKvLYo&Zp?20-3lj%sHG` z%r?!bvPU%e=Aa1YC}Vb0uB40gDbqYlE0^7mtd`kqs%TfZlq|js$>#>v;KS-y?4Ak6 z!E7Z_Dx~`|nNqe~?(Jb^vVt>34gkqpOu>q4wM$wWC7TrMhST3E77y1kNN~ti{Yj-$o-`K=lv`{h&WtT{@peW)j z>PWh<1V+mu&SV_}GYgTL$(mECGM9b^z*YuKvz%o!RWmi0o5{~-^SsMt9IULwXwC>? zdsij_MA`G2X1p&cvnqO>T)vVmHhtwJ*LYE4VGvyh~hJ#?}7_^Op%Z&(aRZKhM@ zEL2v^C9yB<>gC`B#+huTl;y*MtJBZjXbom;5pikvnNM9mesH34alTNQEfp5c%8Gp{ zue{x?7s`pLBg=-^=rqx8GfuYUB3lujW64iT?h@N}CZ^U|wH*;uk%i{+{^B7mz`=V{=ZUBY2~@3WS) zM1)vq3<#Kt$U?Jap`2$QI1p7${8!*|h=g*5kU!j?bY8ggvFan7o+ zx`4$wEUVd-CDa9E!MUZ_YWq^+x!Ma$8=DWhGbwwfx!lyzY$>0e+tXoU*5vFbvlzR@ z7;DRpGo5_=^`_t3gUV%KPbyg5F_j^aaG{dHzgG&yN~$y?ybgM0S*PmQ~wL*wl-k z4f}q+=g#b|B-8f&^z(WDdIzk%bLajz_nvdlJ@?#m&o%Db!zvhKKE_y~z}R6Xo(}i- zKYKc4#+I%A{xWuG=^JYfOLxAp=I-dHpJ;yU@kf9E@lSlV`IDb`t-jS9tcwmG3;eal<#B z&0hJ=vls5`eb%AhN1y%mmG3;;_32MWk=6q+tTT3}RLQRU$E(9$+zgYY8fhup@z)Y# zSBuyuMAXHhDl|O&9zAE)U=g36L)OTo?P)wisjV>2JI3a(~O8X2zn|J^s)qVxM4a zmCUHj9qw=W)4^EiI+2W>sbh?NS7L0r`&;&OFgAY2hwr!>QMqcy*s#P{jr&{nG&6SY zy2n5D@S~q(Y#GY=TZ!#(f6Jc^#)9SVczD6&bJ6C5GVAg6$kCmDC^JV1ODuZqbvNo0 zi2BW45{r&|QJsi7hp0nd)EY$nJ)(TyrHqwP2~kH7rFckn1+8RxCu zeN0O%t!7LcG|$@u&%9G8>^zFUyBK5I7w%lj7*F6`8|-tgmsp`S`O@_gHBSxbyPm1x#%?>g?VUm)-N4P=T|EV-_8y6iB@jhDK_Oe;jpmxW?K-P> zH;Y%M{^?q`JCzD!uWjsWKOG<7`o4ap&-hyEcL59Pt+&k`UcEa?_3m)%jg{9sV4_|` ziFy%QT<<3?UT-%K$=$Y*fS#A5<7V|S#d;QZga0U4qQvH^r_b2o_F*ljCrkBnV|MuW~P z^u4yeul+=PcR4uwx_LwfF{f?=H2Pj^Sg{k^0F7He!o6GE{z~HQnHu!@z{3I>eRsI0 z;Cz;#K@>rgM2Lo%0?1_-noWQP^O?QELI}|a!gBKt_>OE)`^a8+Za#ZtPPptJ5OR3?Y7PFbQ{U)N_A zJHl60BAtiJNC)8(>EO*Jod?QE=Y}pI3sHh}5L!$+?_9N*bVNfXG}L1#d)?uFo}2r$ zp`g4rS3t}4Bf#cRM7GXJ+K_&vW)yMSkZ~k&BEB}d1ATGD)94G|g1&h1D#lVRmB7M2 z9`tGB+)(V!dp#OhN?-O`pwnm>og!SKQ@pu!dT%+M-V{O85hdspp~ZAsfu@80OI*#R z)8_vcoqo#a(y44GA1b3$giCaaH6A+#7*-)mWns}$B~G>9a7;BHjxGF*g9gp4%P@p+2}5{u zG1O6xq1Oy_6ru!%5L%3({wo&~OzIL;3=GxV$vew1gm4K%cylpyYdMB=su)oMLkKO# zP#r2>!1Ysq28n9O9PiQw_4DCq2Y6Ob96U>1z_b2!jSHe|Cqrc*B3uFyZ!U;8mxK8A zJJC0Y5+EY97{o_V$3hVQ^*62*1F4!DkRQ3(XN@Y5Pls>k)waU7`0S96Z&B=!!n;&E zta8228gAr`|OC1hZQ@b@DA1PRJoyybwcih7&;atl>pcKxT2llrebfo zJ9S8A%<6rqUVH8@gn&=duwNT8CU(Bf6iB+y6M-M{@jDz;n%>a<;7!)*QKGJ?Fl4BH5ou#Gnt+w04*eP|1? zjVOU_gcf6a$Lht{CNVMyQ7K0Reaw+HHr{bK}6yktUh3Lc@;l$c&o@`krgXP;l3gtBVP^ zexQF3J{1~veMe^P!>RGh(Q%6Pd6mUJ$RVd6;9D94ee1CRU51FDYA2e}4VTlZvc3z* z4f!M7JkaGF*vOdp%qfwr&!v~R3+MDwZp>LDl5Na!^8nZ90zp+ve!GdWvBbuL+lj^j z9;xU099N&SlQ#k-1Nf^AZdpcB=#OSvDkoo;Sxip9GL~5HWuv6pP^8)(XhWt1GFijx z?ZnN6LLq%MPa=9oFr>sg(PkrbzRYBaP_^9l2o3mUImV?A4v?yDpS9`3@mOBi&dt6eHqr<#(C@Q zs@PI2ysZm$@c^kcB1v<)E2$q2YeUA%5pE85X+wH0%#BQhoBPGoA*zcwf8IhUEEEc< z{g-*Y&_xv78gW)#S^WB3`Pcnnhm}74K0&pg#cH^*-%d7yTvVDDTI~eh+{*X>Ub>tg zt|^wf9;FJsg|=%yScSk0mQ#&H4}_>uzdg`|R}f#bovf!%^fy8A)h!AiK!#1#@el9> zeM!=nu&*WJ;|cl}_QkK^Zf5$}sk8(YPBm@nRO0Gbq8_Z4F_x|tVZjg)YY$K_J$-2z z#D6j$Vn2aJr1Pd^52zrPjQ;haCSYWVyao2V^yq>-`q6ISnjrtKZE zlhmS@8);5$ABJK`8yI$zK96WDvxeXAR3O zlQDHHp_YM(uwdc{xpl7xkb~xVckm2_EIhZ&PW|7NjHL#dSBo64!`Rlw-HN_a{8E80#>?6X zJ4qlsSN!6OEfpYE#yeA*v15Sr@8Y%9B(Kl})?|uk9x` z`HMp^eIV810vua2mdLo|+c|RjRMo|5#i**%68~HreOlu0=hMs5xQbC>Co<^4 zYHi5K*-3=E`2hXc1JmSDwyXezMF9x81#I#PXe*mP^h5nc1;9vP z5_q2}D+poHE`;2$DJttn3M8!6sWqIYeGzO)YqPL^h;N9w$Zh34}q8cN0Ke?nkBfnS>b5#W@n zn7j=0_)3_kig*I02?=10Te%nK2?5h(J%ljz&;UX%Pqb1KeivI;m72oMLlAS<&M?LT zh)ll3XujG~>Wlbj;^yHsy)>U71)k+br;k#0M2jD`;Sdm*auWj?BYpv^W??WUyuUd6aN)Wu0A!fNmcEdZfg;f507 z=H4!`b`CqAdjJr4@TT^vj5*0`C0A|^boy4EKK~Q9yPi_PRQ9v@^<3X=ZEIz*Hf|`| zU}U4WaKxI^`7p5tAmEVOTUb;fOqw+3QzI`jKyw9)-aap zt3fyB-NrwSH?h?tAEVz(}~);fx47W4BY0)V;8`3>#H07x`H{XsWT{QW)B{L-Cu z%e;~=TF{Z7&qMmxu;DK{$DJ}s$biD5*du>{G(yB2ipV=JxXmXDvlB0i<`=))1Bl@i zZzoG*NnAxk8Tz{o$h4PVM6Qfw1!^aH`K0qZPr5l6US|FVu6cE^sJV zT}rcV)TTx{YifQbT`&4S6v>2Nmn>^`PEjx0I57Z%N6vr}SNPTk4O=@Zdlf z*XM{)IzRAxoE=!)>=J#F#(Z+WAbK%$hk~-5KnzqT0|?j=ciBqt+z_uLwQ5r>V@#oa zeVT{S0g^7ekoEZo6yBQS4ekG`EpPYgFQ$P1d9vV@De8&L$!fN>S0- z%B`f=L<7gN@d(#J4nAr`#Bi%3k{Ne^T(w z`m%yc$RXUtT3wjU16&F`N80W>HwwmIbE$6@7uFZ!^7|Hb3}QIN+XMT+G)N__4TaQA zNxVP1qDalEH7wZ)M1lq4S13O|eyJD_3(yg}-0cQ^&IX4eExCDs6V$e}K+PUhEl1j< z&-Jb;*R5-VcP#rp7{ZUvwKTZ;^l|9=L-pL8D&b1*cF* zJ>UbI*~^~%6ivJzcZI2s3Q-b)-Ff345^ zSo{OrRCbQSZjFmiie1e^K6{G~TE8u{7a3H=$QS!J{e8qCl}gG4yATD+Z$;#{gNkQC zxQNSa1dPUk2sh`5xjPS{WyQI3;oQ1+(cFp{^h6Q?JM^FM5tsf4<@OU+?oMrB#2Trz zjWdg3`U*Bk|0l!l)7O*_J9Gmin*Na7w`F6gy3~!dK@}xKN7cn*>KuBqobBETS&R58 z1mDDNn&NY$5gxJTVearG)@#HS7u20AF?brqHwmYk>qll`HFUM-b z`HvKMH=YE+(}ywrjIt2hu+4O5VB`~$upEvuY=_mYrR^{m(@}l(uWRekQ%j+6+5t7ORc!N0vuL7E-zLUpzSKV|$)ZBvz|Q z?0A*Lez8PidzVS@PkQ#nAl6=dY}ym?et%u(Y~nev0{zI`6gCdt2rO${sCw2QwNZ_GF{P zzI&O(KE6s~e3isL-XyU>Lz=D#6@3s*?&x2q*KxLRU&Tp_V-4HBEaQevN2Be5@CDY4(Kk=O^Wl-QBWCHBf1iPf}9 z?7>!vy?(XCp1fLO-)oWBzqLs0@7pBy{CbI9wO(Q?ua(%N*Gg=zO=4fXMq=MxFR=$2 zB=+I!BzFIMB=(zDiM`S&v2V9ZtffU_zq&+X!DfkdZIIZ7R*5NVCAQ=$iT!ee#D2b3 zVxQS4F(%0szDl{uw`7U3w7N#EU8ec#mM>pXzr11P%1atAy=+y};FdAdCZ5=@1cHs`F~Ik5c%mc_ku64-l|`m%}ZIWR!m z$XdNwwq4<7HelwrqeW3jo4Ugd$4V`+4QFSsgZ;y&>bU7>gU>zuKC)uC_k9veU(1b* zbwaX@OnNmpGuBDjHZ$pZu4k-qpRH#gpk}NSifv?4A0i72Gt#_6ip(rN^bOi{d9z)KLGoaD?uhk0Uw# zx%miMJ|98P%IPpS=WNsAx??%Atvgn)Q}t9eH=IIi(z%I{0SrjMz-q#P3=Gs027Ex# zQc9rMW+wG}gbdo_RU=Lv#3MpR@(%X(n2@y{5;Hl%t9(A{{;; z!<4aYFdMY4(%3_^f>sXM|!bRn#pM)Ki*Z1+D-;1v=kJpBRV1#z3zlet7Gp^^t(LH@K6Mr`L$;|oM7ECFASIUWN(PqTj6zfZ`w>IO*7~=hi z|C}3N&ubAMiOxV$yq{u~9?41Sz;T}c!aE8^@bxe!rZeXJ>{iC2!zkw(QI40Y^tkO& z$Mh^|ne-f;=&Ho=wuhjXsl<^9a8s`5#yV6A8M(1e|3=1GkIz|k88Du+gY{g`S=;Kd zN-%Of;_q_UWtdfo^~T>*{0h>|@ko7Fq2bU0nME_y{yRu8Jd7iWWGRBKb5;jIX_zu0 z4$dIq+@+MT{RB6&-S!scFcekX$adSEs+d&uY_}b*=0^5-=d#t@%pMPJkX{6WgxSt@ z+{pHIuE*pJp*L$QG>>O7kK+ha)~@4vcC5qiwR9(_h+fRx&QVw)b~*Qm{-|t~84Eih ztT#@?f95FdEK5fdqToEH`t3h}yfF z>seCe_I@zIbWM6G*g}2-Q4R*| zsET>We80p#_I`=o|9**m^!@Ya9z0Zj*|4SeopT2mV=sme%B=l|=qFv}3XdrBjK1SO zv4FLD>m@84_4+6dc=oU)oiB+vYd%22Ex32I`Pi)=;-(7rer-i*(A~$4yfxzIbv7Mx z;+;O5j(zcn;+|LQRNZ5Aclf>2eR;5Eu0))TH%W}s!M>f)dvwHVFnP5Pr*P<(8!C#W zLoj;1r>6JYbXg3hPtDktbMYE|nN7GGr@#Rn<2Ji67ESu||R z%o%Gy%ar!v_&<%&krEmObdJTQlOEPlobXVzFMNT_D)3Th9msb|%sPrgOb{oz1dTI} zpg@nEdS?FXXXm|Io1;g-wJTF53cM&fE_a*5^?C>kkwOFV*i=J$Gj%=>Df3UL#+zMa zakJh!DdxO+`6>moG*oL7Hd$dsPiA%2=B)&fR@MTc77_hbq3s>*O42DdcS2RWoc$8E zn&>!=u39&vz@PoLP)O~BV7+$fD*UgDB2T6|YQv2}-LQ zz1;vgeNCztHEjEBp+MX_aoR)VMj-N?6&@nbT1NpGi(TP1wpNg9Pr>;o%s_@Z2A<0V zS;SUd90xQcxM-r0Yk$Kz6_iL6smEAk9TK~|Lt zOoKly3MmtI{!&AKi4}jfkQVDmqUeEqA8{^+#4pw+@s*GT=3FsTr2PePXW0CL5azm^ zYi^@Ckn3~qvc#Ah>%@K}vW^8C5gH4UqYR|!Xr_n`aWo5Q>A04)8RD|ks|vXpj3~Ww zCq+6HXqJdan45E0UL=MgCeNYi)~IBg4uk`TWLe#@^(=(stk}T37OGW2BHJ(HdVXX^ z#<~X*G!3lo_lqWAJ(q)0!`Dxr)pcfm z>$bP3;KaxmQM>6BoWkks4OGkK97d=h(Ge-a$s$_`J4-MTLHtvA#9sl_D|Xn=4Mm8t z+*HcNRnpq2ScT_YsqbCJMj8F#q#h5c6^1I-!RRO_Tnpl&g>8Ig^dQ8EJs8q+x4N@X zdaKpzXE1MfA@KxT#TBUOG*N}FZqoD5RB}C+e$Rpo3qUUiI`wIsKv+0r1V5q*%Or19 z2w@f#(k`jHj-|BWDQ+@pW`+OL-!8 zrBHJO>v_l*aqeH3*M?<)?g&RDw1_1%D7Jo(8wah_L$-0y>OHtZ`$8wxaOJ3QpKjg0fF>lmxRdLlzTm9G^BF>L0QA0NM`<0AE;WxNWIqw#YT^kqyuG2#CcgH zLe;U#)JiHt;X%JmLXj`tNE`_3Jpuc@KGE#^t=^0h|8Nn>9=C8@Zb5bmHDKEL^OG%; zJI@sgg=cMwE#~2-Q_kzainBCFeyIXv?`{<+);1NINMDaHNl++V&aYW%kX5F((n)`% z{e-nmc>?0PV75-!xu6I_d4C0CJ!+5Y+DUaeugoi8H5D)w)&`BAM7TK#W!#xCky_gZ zQ39kOD#1J^NbAvgCHz#zmV)tj5pEts?g^3mvg<_d*N|K8k(1`I$bJ31++U+LqciUu zD0&i1OdFy+PT2XWD2%#~G!p2(5}!+b43(gl^do`*CJI!$i`!c+QVB*iO2BDDPUfXf zmy^J;P`#`kjNei{ZgJpwz{p`Sllw(osVTtp2V^WgbcS~ijaL`;J%R-s`676^JaeQETuek|7eW#)YG zy)?Ue{V+5ym#$#Fdvso|jmUNH{9Iy*>eXc^kwU}p{JQ+eb>+NV=?`1QECk-c`B^fU z{Qv#Na`4itNN`Xh(P4Z%J@2C{^7^oreCJMybr=%cZb%dvDXP0V&M%sFNwI^}wKC(40VErx9$T)Iq6s)%^;|)7| zGbsIWS3Ga@F_!jQy_wZdx-nJcdS$*)WGZ4dgfg>(L~4{rp1LL~wJ-FOFg$_D7`~?j zClggm@n`ytOrMb+(`TTWadp$s&6=}N4`xX{n8k20vrrFq_8@B-%n9}`icszH`o1pb ze^t;TO-_$ny)&%0iendX28v%}mYX?}zH{mCaDA2volQRlA_i$IUCwuZjag`h>oX98 zmvUp4j(g9NfG`^fs=as6n62mfEDm@ZXRu0sav3+zKz0u3nV6iu3dL!IW*Wzmp>8=7 zaViNa93}K1_y#5sEOS-TQ_rll^|{oiz^){2n? zUp74xaena@Oo^r$t-H)=S9F4#1KMEag{LAC!$05M61(eeiT%ml;=O!rQCuHDe};9V zIBF0xwLuf>(dDG%QiZ+#GVATtv4Hpz)7&_1(DVmR#^GN=wQ^F7a>QIK26dBJ4_g3I zgpl%`c5%c~$5Z>b{Iu2Mpu)|EI+F5xEc6{>p^Y93C9?-BCwZLnmpJ7`j8cl@5c50M zg(6plkCS3Idb6*)R>b*Z_(AEXoub3o^rO%bFH|JLa>^0x?&kSqGw0P`2kpXOaG5q} zyb~CS$>|@6jncWWbGO7;`Vdy5P%X_gbD>(AVH~QZ8JI4N5a~MvMzQj8ax=1lklOpe zd|I1x*ZgQt;ADIqc$}x*7>t0{-U&>`YqoB8HF_OwaU-R!mR!qZQM(ktt+d(Z^lvZ=s^ew z(gxyCX>2Toqx%u{Z|g|_5IO~SSHAQV*T>pW2pjFm+xyqkQdwp3_2ke;=#V;v4hepJ zgbvAb@1u-$2$w(DfUmPITuaJgQXTv3up-9Og8HnYeTF-4TD|JVCoYLLCuQcmpWyWg zP1;6G%rv-4nzSs}vjJU=trjXKwJVz0Ei7=PwkVFXldy(vK! z#m7i=79cnMg!dtdaFF=4s$&b{#2sIX3X}NpSN#q)Y9K2Gy4r){3_Q zk61Nlw_gFp`JfVs?ngDBq-qpVjY-wywLw`Z1V5sEVTi={Ic@Oytq;O{XFz>WVpeZP zidCkTRxp-2OEV?Czm2q{m6rpxtp{cH_-fcg3pIw!%tJF|LwWoi@hK=Z0$<~Cq6G?3d@gQA8aa#wUKnsaqIK$m*?I%I2j z^_Q)4t1CuFa+TJwyh+c*DpS)EW2r;Ly{L?x7hs9{%<5trJ5c1*HDx_?Tr^LL)mgon zidc=?)E7`vkNCDER+)MZ@AtWBpYa;=Fk)|aJE$0Y4`Qzqu~o6k)Ccf>g_|l?nSu#b zYMEPBtTJ^Kc-$ui!fryey9wsfWh*|*>6?mMSt2El>89m$v%40EyCUs>kg|f%^LNna zqCuzxT$0xNSCILP9FF?Y7vpVZeSw`e*Pahd)5w$(&v2PJ|EoN45~aib2EHbp9lcKQ z@hf-qIv;vc+0pCV6_eBT(Syj;O__X$*CGA=zy!v{4t)AhS$XM>)ZRQM=NyaIN4Mhh zdN(J8#q^r?;q>J~2O>)7K$4}DMD&PYImtWNr|*~8@7^b|KfO<4r#~jKzrIgm&)zSw zkKHe^f%_%)$bAyqexJlHdq86U`+kW{+%K`w`z3baeu-)KOYEEXOYGo*O^vG7Rxhir(6kE4 zU%~2&PhDL_eFa;-qQo7G`o?D3h|h8(TVeQZ!{H70VzbrET+GM-79fF$swG#@3c7qh zWY*O%X}hq(oUbFp$u4+)$|i5G_62n3sRzg%lrJJwYuT{#w^tEc1fO+&PP>CMScJsj z_ZT$7&FqUft3syqS?lv~T1@+M%@yE~S-Z2Do7oCj#AV5{aG^SEj_cV9eJ-FoPioN) zaQ_af(g%Xdl4=_pZBTaQBhIZZIA*?7Yu@^N8`YZU!8WQjZ+EtpYW*=R7mg^ z7%00=S3x6-=0ZHKJk@y5M}^LK%o8Zc)wEDVI=`WnDs3pbJCmP~7<(0Li^mn-n|bS- zv{8}i4{Cj#nipQy*SSoD;rJOAKgG9d>?;=Ely19I5pQ&y*yo02TPmh0%fW+K`XbZ9xtEx3zchZgMW&?p_p=zDIZR9Lm#K0#_Htam#>QN2}1vhW6g`tYF zBPDS&+gA-=W4g0_l`yaD60@UDdBlX3UXgmFK*z82OmS1>G0N38!bec}S(*EBeySL)F;NF1{(SJri&4*(pj#XQ>wE7z>iWe#q>! zV@i}&Pn3mPd8iST)zM@JTS=pl;lXCR6Q_rbjH}ygzbNjC?+#=e0FZ?(CU>v_^AL6Q&DqO&#YL$DcgRrY57MO49Ih)bMM z+eK%jAoi;9$`rOh$q>L#!m<(w`C^r+U(uui9`vx4yC!~%Yv}G8!2gIu6P3lA#diH8 ziPNzLoH`r|Jrap-1nSo`lbDijve1;3&R2g;8zOwmz3avkC$?9nzBIpvnqo=uZDecb zh=_-+3vKa6qF$w&M;__6-jv)oJMxITA7W-WjI+tCGGo`JS0V+h zV{IsMZD15zpzea%t6`}NZTfy<>{;?6(;UCWeUk#g*7$~bt!@jPf?F0Wp50cXWRwHA z(kn=NO?I)sYHIMeko2=4yMH8xkz=uI1g?3V4RR`xo!SqhNtf*ySqwZ=A^U$gD~b{} z;o)SNb#6(YnZ|M_z7(oLTc1f+LmNDDRRCxq`8$u5|;k zJFMPmIksVE@3e$Hx);%(dZrmd? zhm%pivWWM#52w~Z%R?+FPzzz?@ulzp0fTtKDefA>20i&}BN`>gL9`x`i|Bmuz!C*Z14{SGeKtk6hnp{yEqE z{h{_g<2%Roml-$x+F-EV%2mZbtPL6atg}+=a&G#q(c8htkHFEmF-#Zy9OGM5+Zfk| z%zf55U+i*%_eRXP2jFbnJm|V;4y(3#INhoZ>HDl13Fhv89%-}9{UXNa#dyvH!plbT1~xfU!q=?pxppLY*s?<<38*il~n{CsQu! ziC?sVUrZ&9GuVgfavq!kmi;``s-3WnsU$6rr^1dtgOf5}!ie*0Ly`4eN%D(=@O52D z{Y*G|kUs9^5g&H;!qGiw)#;UJRrAGLm5!nbJ#B=n)-LCBU`N-3AfUJ*>fee&l2nNL zE`_wfKHn>1`}sm)Q97Ja&$qwfRIU`Z%-+@pJ?{8b@A;@F)2{Sn+ACkgvLH|iRuF4& z;QiH;VxXY7Ow0%o=g^NOT;P#G#!>+ygi?C1Y7-_(>g*v&NcVUB(!D z>zmHpzZB;O96Gv}COf|!@^xct2&Z%H@WXUKX};b)=dQxWg7uh5(PywaeuQi$^LFq7 zs@t6%>-XSfNuJk|yk_R?`kgP5cr+}11HW9)y&DUr{@%G6J&RLAPgajrQrO2Bb+_e6 zEff=5#%Wn#*W!Ene%^pzTQFvK`LV2r(JH}}hD8SG37l`vGWHEX=V5HAwHbJnpOVvl z!QD^2DGE!EmsW#C{Y;4-v|ZID!3}Q>9U2|zVDOG2iLs(PUH(!vvq!e8yNXFKXNOV0(SviuqTH`J5n-mB($5%Sv`~}EJOtCq;6J(UGPpyRo zrm1%ITtlrN&KC*-&!w}>?s#f0t{2OXF7-$~l5-!KAPW;^j3eyMV`2$ueFoIKzL=cG z31#g1;DGZS&PF!837Sl;ptOzFOclJC$nc(v)zTd9wW@3)fnW}*EyVb(af##Ak5?RE zgPkpeh)5gRD!WF?*$4^qJg9`7>y``UiJ|sKv_5loNAE1a`F*Hj;JzP6LXQWRRvpG5 zfq#B(=DY1JGE{Y#PgEZA!6!`KwdG(_|Hm|_{R?w-%G}KL2h~r1zAqtQAm$CeU9m2A_`bwBPp%2BW8jt6V&)0j8iI3G9b zah*X9J8?$tcxNpR^Fk}B&+O=(LEmi^yJ&M=&Z!$PX@RTY)Bz6LsvX?OLn(!~j9Tfv z9S=%=;@aJIXBE1b_+L=QCO|{uL7DYMu-|ClJ9K?m(bkJiK%&1$6sl5Z{|q>>I6P3v z^?X{Rp5Dlz!&TgcYl(Er=Yu9|Gqfr!w%p@2WvUKbQ|T%)l6v0O7wK0@N^~Pfb{aWo z(1~?v)*50bIhT22k1vxZJr`E~pa5;x+r%J>Y799&1FgbfWP^2~Dki5-lO|#7&a<-2 z*v_}{Hzuc#IGM8;v$5R6oUdE@r6eo5__5%Yq&Yw!0mWA$7Q%!!f4O3*a~<2)ggfbcY4O0s~*6xG@aCMpt~4*=OU9hM@M77!Zw_Al}Jvt zwUL3ck0w%QOqgbPN3Mmc#OXW5Sb75bLM0NNiAjt%V8x>SRf8WhcJv^YAuG`5i`2jF zeAVlp{0oWE-3r#W5Q}f@VbLAG2Wd#LM%p5UhL;Y=@I~5)eP3(1EnH}L`2c+$>!e#j z(<`}I-xb}DJYEXqA#|kv4M`$`Nw00f;*|vc)*#X^7pYyOpSQl*%t&&a*haLskffuu+Rjr8>96c zGz(+2R1+br%5bmf7|j%w6ax8)9Oz>ahoK~LU@d~1S$h=G>p1R72P}b>7lDqj_yCtd z<@2)lP`r@yQrdFM03k3sOG)uDUUsHhM7J1!IOvR0<*g&aZSe4)baVg@ByA$n@o|0Zca zTP9-UA!6hqVi0%Jc43ng-X4Y@3+U=oy`&PHdlfbn92*dGZ+%lZE1;7mVb@bjo`-zg zoa^sg))%azu{lR$)7Ep&OFsqEnDdy%Qg@#!?RWaizR-5Y95)<0bT8aWj6Mdp5}$yn zeLH-9E!4Y{;&TZJmzdVT_H22c2;ughUmMcZ&9tfR?l&vKTQvDqyS=~3)^j~~JFoqu z#Nn$C!=^U{m)5k2)o4e;T+bix=s;f`@7$k`j;Q#yYd zjCe`W?@9(!T;A@yo%Xl??2<`z$s||>*C(-7oa2VS#h8OBoYxfBa;wx6v*D!SM3V5_r_b_G zQ{j|14GYsHVR=5UQHODDE=)oH>+T`)X@A3cukvo|xk#xGmWW;bTjzCv5D99d&Ckos z`TiMNZMC0>r*IfD%6j331IWzt$i~9y`G=)k`c%Y0c7br5br46+;MX))-e6(>mv`;| z<`+eeS03p-@@cgjQjIl&%PjNSkeL^jCB0W`Lj;l%aW124VX*0{@H_W3*+wpD=DM8r zHpbE;i)Jvde2;OJHePo2<}to{@9d$2xMZ5u6m|lwFcpp8NcS1%0FasMwnimfIR&Gz zfS&Kgg=(O5rOSbHyYxTP&`bN$Ul%PbQS0ORo6qq`8^#dfEw-HN^@NyAo`t^-9E#2J(8j_k(W0U*QItp6r)6Iqt6zDW-=t z*v_|!qq$Jrz)e-?u}hGst|>SUU`F>`6qNY_tJ}XY0;Mfw_q-mU-{K1>o}Zm31^fTZ zFiZlHcS|a*V4?l)=C}tTj8m)Dw%Zx3UbDwLt6|9x7a+H5<6&p$$BezYh8QNc*SBB` zf;iiat`0rNBVjvChk8RkI=Ps)xA-pBB?NETG)wP0=V0JeB$50WT`&ozjip$#I>4WeMzFo08Cupn^nK10=H7I0hq4i5yn1xs9^74k)*JN`&!J#9(4 zRjsSgu#em^`MH}F&Ju4EIbpIvv7#2T!&ry=c|;}uMauAho-#>Sw%K%Xr`IG|T=&3} zbm>ECgDnC_@w!&~!mpqkpqm%8!RK~xa!+T~WUPWMLuy4pFn%(5@)Ec(U;Y$uchx?iZH!;(}x|7f<%| zf@G5yPxg@o$%ZeU4C@ck1lzq-jqXYV&DV0h8J9}oLbtRgZc`(VD|B5PMTed5onTl? zh{6{j$`-f7QHk16uqrVeyW2VnZ|iMOtaufQr*(8ioSmdwL8`~-G7u7iih07({V&Lj zQ;GMzqC2be1X~hd&T8h{@ZI=($ zsc@!~q#KU9q8p2#6N@i(qn*H=T-uP)lsFOJw(}_7(8MQJd>=pS=vpmt-v)XF_ihlb zs5#v{B)d1WhLcI$gBIZfXlFNP4W(V1e31;aq3D97bI8p3rHXbgU-F@ox&lh0$U(`6On7PsWC2H>(pq!lhT zfO^V{f0amuh{~pGD^NULQ~^>Em*5Ffq1bmpfS)e!D~>_GHW<0SD>__k{haI%kw?nM>7#Ywt|aPrpQ72S%(;F=3q4Au+(S1fkRg3{n59;M+I z4%t}b?Jqd|@Bq6aimc&k368loZ^AB9LL|N*;n4e{}7M_$f zZ}m~!&uXOgfdelWbaq4=l*yF?)-b|&OdG^OXl<}=-6#~TxBmBmR0cYJH_=0?R7X^edaoDPH3;e=xTyTU{|lbR$tdL8mr;@1P|5Q#su8IPLOYg ziS!sZCalld*|s~hKAa#IFb*Ai%va!S>?B;$7LOO7A#|RhL#UHa)Wc8= zh&!XbCI`l2a(Z?8G&d%+!AOmD4x36I5L}-~{R#2@ED^^U?X|l0(Y4@3wmvha&n_W- z(+nIi(TRZVH8@%fFHN)Qf1zVid9n?kGt3zWBgeKz+Hec>T>Koa&p6vk2p_=Bee7xmqn%zV(Sd3 znV_xs3G|^{yfo)8NDX;R8;n%oR8k|?k7=({1vT6}#)C@gk5R}r%B}{Cx!xKNvBPi@ zH3y>=bC?vY$9M=gbxlAg5q5g0muRObb}2Sz%wxRM9|)4cNrnh4lRisZiI>4rR24!L!K5(9gDQ>#z2=i!#xW3}6}8PA)KNKdFOy6E6@rV7O}O>L9~SNZs5I^} zwAJdT4cRPlu8cNV7Z~k@;(AncmnQ?PAV9Y&n z1#CP#F4#VbgJ-W{SV94|B>g%mu@*O-9=HAL-SZ-Io_^Yx^Tz&EptAWD8BDnrzqT<& zK9!b?>B2>;ITbMd&(^-!^oq=^;agK*qH}b9X?qLopRn~;i!LDtQw=IYqf(c%@hvfn z=~Kc7e8BK;Z|3III`S+$R{_3Pi_{f{KjO%4YRXTH0*>zjl}Pa9O4u*F7AYi7M zZq?Fr>7Q{Uw~k5>=k5XI8m{L9m94MH?3tz9n6hgTECT)y#4+-L2E_JW{vv+X>G^OE z^B~DboQHoc;5MghO7|i_=%<4E6yAVN;Ia#P#Q8IFq?M&J`&s_9%HNCR?Za<<3-gjN zb%*(Am1|YU!j)G^wh{rZ*Ly~M7)*%u2@wF zS1z2{uB1K_=Cy!~&bK(97C_NSs5R03e*~L;O6@B*{RS+@h{?=V7*n<}J*LlMg68HN zQ79ompMK&}aRz4R1#nk^0P-D62nZO{F=I?W0~s|9&VA|vIS|NcuPH6Y8CZ_GB%MA- zgBjDZ_S$nBzboV3P~84ZC+u_RF5v>r%&mjDMJB0EVn6$2VI9T;d=4vC?<}sd!?YEt zu};FOsV|HX`)smo*KpWweZlTL>%0Ck3KMGNs@55F$u;GvQhoqoWx|%LgX=t zyTBuUfH=uvQCtrI^jSL5H_OdQx-w#xhg9k+Up0;pz80x&83n1%0_IRXtbk_W_YV%K zXSq3HNBr3Jzu27;E=Ih_{pbSMbA51zjbmz5sydRZ zAafVhI$7X)o>b%D`wBVrgXcdRyQaD0!5Zkhk9XAgU`_}0Vc$Tw8NKLKR?g4ip@861 zY2>0YgA7VF^pl(o&zVw<$rA(Tu3h`{(WZ6bXahqIMO-YOIl z!}0p^xGkOo8ae$XZcGJ?T>R6-PRF@kPh)9{=%k)wTut^zYKUn}lK7G(?h(gDUP;>qLi!nujekf%h+5J_;O;Ut<3LY?CJB$YfxzOz-) z5%kqZU-NcQwN4bcIYr0a^eIpSjlqpHrA!k^O$kFzcb6rr4Tfs0vl4n}Fj!MF!i}lE zPQkEzwmu0g#5}jfliKSM1)}X}HysoLi~%!;u`x+v6MVs#lY|}^#~^v)bnjLGuFr{9 zL(mfbyFN&!{(cs_)lI6su4e+1&uoAMvx&vm!saL2<%GyWZ-UHtCTxYoWh@)4QCy6d z{)_Y$6m&C-1<4)<^>`o2vPbwZ!bY7rp}j7H9s(oJz<$Mvc7qb}oA#O)jbeLCJGmSMC*I04_DpyUadSWKlmglIk;aqi2|n83X%VvuYS zaypzA(oKJ8LKlY>_Fswl-j+bH7vp}#^?vz&AbiA=jEv=CV062?E{>3~DLh1JgK}Uz zewz>!Dj*8uIvK3%*U@BM=cX(!{5=2jfs#K1;?uvFa4pKzAd=# z1EUHkqUAQ&HZJ1>9#%3D4Wc#5yC30lZDE=*{wYt|FdoKMj$yeK_@9 zx;=54#Xdw1oh1$uIsX<)FPY5R*j0p$t4cmHCj~#oB6E^f`ID%L*z?EXitMM{oWyE4 zM$ApIjbpf{)ufemyfTGbr!e>gUy5BT)~5lTJRlvjKCiOv_0j#nNX5Un7)dQbxtozv zpX6JVK*%3kF4Fu=7_X;(Li6D<;TDP;#|Uf3tfy7>Ol9gQK8o=U3GtMT;ZG-pjd5;{ zV_0v}XSY|T;E|t$SI=>CoQD25H^#x{Hkq?ntIq}WGx49&dYP7d$B0ScejI8jUHQ14 zo5up?O#Dj38pl9*eyo3Mi5S7lkGYg6r;j2>ygB+9+PlIv#4mLYP*g*XRVD?U$rP2t zwjA)_voURD2n#e{YP-nZ)0~9Qs*SXq5?&F;X{s78O;zJ`y(djo zn=4Z%)d%#+dFmwk)3hiOPw-i6+R+o-v&hCV zK6R7NkPB>qc!%3Cwx6;ZJn%{ga(-c*uvZ(wT`Ex~ulB|MtEx4vuqi0wSS+k#+$&`6 zR{}i#1Yi)R0Xv1B;6Cgpc}{7b^mGFak*LHZtYcwscAX}wj+r^e;$?p4)= ztrBE}l0CX6j)a4Qt&e(*n0$Q^d=LrK_UNrN{=n42ZUPXA^IlMLkw_Mf_bdjQ;qk7; z3+$7X4g|olB#zGd3^`56`ilES44VY9zTyE93qfYND1}ymuJkVx_UJ72|vL)s=;>>8q<^hjCozi6d0m1;5aN;TGzEBQeG=B`bZ`PZ;N+hS0J#LEjxP0(2*9tsEGM>T= zPf>T9%6*-P^iz1|2S9~BQ+v^3wjFY!Q@L|sF~Qx)Q5DH4T8F0)K8nRSm3^zQrqur7 zMN;wqDIC(T`D_pPYrJ867Cu3+SKkZep0aB$ZpRF(rqa91N`2ovH^)|>koL;Y3tOIgWY z&4idC>&4*VXu$_p0CqK+mKpV_3sy+fayjR5k^yW`fa_=2WFVZBfN>2Fg(uJf<2M9m zxFJ4Cgq@FZ8!QG7BQ-zyTi?@8G(R|yhc6h_4f1cpk&@db=4O1Ox4s>JwH?GBRbOY1f&g-dF?vU#MP?Thq^x23FpGTWo&W8WP3b9{s#b~Y zyM$xiRPBa6;zeDsU(i#zh2k@40l~Sy^^H5pDm|d?@!&KG0#ulHl4o)YNIz#pG*85X zeARannJeL-AYRsAJXjG?^bf$DY!F>sY6?Bki=X^5@410F9+vzx}H9ih{_QUOD!K`3%Y+6{y8#*`+|7@C!E5B&d7=3( zb)lIT9>9eQ$Zm5hIYDo-2U?8`&;=Q04r>7FJeK0A9T=}$e}?gD<`ek9`b~`eAIt+y zq84APmDwrk!~y#`e{dJ&UCXo|M{=r>U7a!>^%$wx!yY5m{;wV*eJk&6O{5L^&D$Wd zna-ffV>Rt3)ico4Ga?&cD)R96QM~)52Zvew9o@D^`{VLc40_pu(5iH(c1`R@6A5`& z)-ZA_b63^% zf{!ZjPKIDF8%6pga~yTXEvoJ;S~gCbF$}~&{%BOqG%kBuBm+b1@h3(lwrW{?75Hsz z6@{c-U!zRROqK4?GKk*+<~+hEBi1)BgDw<+aIT+kT^2_TPT*eYr`neFwDGAnqFR_@ zefzRVJD&n_AK$usS)5X1Y`Oc?ie)`3_|yvbsVkR7uH;i!x=*cK7GKGCt<1eaKj&HI z#ZyQ#We5GspeqEJ7D^zyIpb;5zJw7alFcNALeoAPQhCuf7@{gpSQMU4s5-??WaSn+ zk%L{$us7{O?mqtie?>s*9CV(7!u>S**_h=-jKK6|*w zJT=vMLP66kQU{OqG=OD`D%1cqY z;PlcF)U=sn1l00KfJ=N9%_|X}70uLouwP!_0t_ys5)L<;SQIw19|1G50tEK)XQS$~ zz`7909zM!UNQD-J^|L5^B74QmH4;9Ry~J%}RXDN=7(GfRLIH2(>?%$FO$`GnV2=UK zz}9d?TXpJsz#ePY&`7{Q0#J|&re{J$_*C|KJ>;ryi^4~<@50)C3|LG7OhNcW_DxtY z$$;oy74BID$z1)lGTgHg{i62;{bE(@sz0)x?5jULz9EdSE{`ta$a;f_KlC_OLVUC6 zX>J&zkBk{Y@{+GXo>Cs0OH;-dy+&#ZjQcx30pm71N2Y(lB~(hJ8whWBaTYAL029J< z{)|F-DB5GDMtPtHTW}&Ek}a#2LKi2ZndLQ<9nIA#jy)OV(g>>JfPNAS*ft9Qbc zT&yA==048Fm=ZhhL5vrQ0T)F)gDBJ7bHV=~O$vpCj`I+_)cEROZ~d8Aan zNFSY6MW^RhhKp^s?_6PI-l9glOxjve8AnyU)Jo7%=!;%M-g1g`l)Ijfgdpk9p&2#d zax*@?@fc=m)Z_3#w6tQXj(Qv(2&nGLaKlE>c z`bE6YKH95X3ZiiwD6>OE4r`gj@jh61?X?e}8YgUVW#xD0YNSimDjq=eO?RufzHQ0V z2-Mk$Xa#2v3`TQ(4*LByeN5v|=*CPXsSn=aZ$I*sky(+#eXXJQ;Hbpv$)9;!kWKrY1qIVp!+4`PyasLGb`czxd@*YLK=8j{%sLG?XAwQ^MDx?1#Xd8utFrqIfWMs8o7_jMfh>rD z%>A)ic``1KvMzNVUXNk|-aEPS^&H0>ykx4f)#a@JmCs$O77eREJ>6K{uIa-$Yt+RS z<$>JLF#Q#!;VJE8-;0lVjJF*27%hiAhVQV)c@@rVI@B+NptZt4qepw$+n+?q#`m~WofNM-N8sGOCarwEMF_2}^ zfX__;=b0UCh z{3>8inLzdm*eCr?G@#162JESjg5QG%^8_|n;8k!aV_d%Ae_CD(v|8z}`$j#V;oR=w`Ar$jX;v?N=`h+{7(@jJhd)Ip{)!(ilSH zaS3>Mh}X~gGmR*{L=6(ZS%v}qWB-U37}?@P72U0cdxV1`BAe|y)}X##GBEfY_9a4f zVAgA+xTbQ-E_vKc-0l3dloD5nNNS3nltbx-^)OQCjP4-|`StYz3=8h--h?c#HjG@O z60W2Yu2K*+6}pN1)JgJ6j)_h>KS;4mdJf_LIUAt5zAezdCyA{Lhx2w4Vi}e0lIF7GpvJ(t&aWCCDq%Mrz;pK|Ez8?#1NGH>u$& zi~SG;6EbomqrI)N{WwKNRX47B`2Z=uY%}Q#RRoDIv7fW8O3MkWJhlUW<0qo!F-n;H z13uBscHeTA^2PAtZxLBuIpqph;9!r9xzomiZr=qmOyh{Vpm0z%u+P#;I37wLSNJ$0 z-bY~z(xwtm5re*aB6A_?zos5J;x**gKZb4=?K@&fAXefZ;DsRvg6~8EarrlY1S%|w zo_>3(9rRa>tB2EgSbx@){48vK>a(t_`>bL@{_=SBvs_(6%bws95JKmCmi`_WuRwDK zxMArt%v=e+MPzZs6TO`$v-Q?-f?dVsn_j6@a>vQTXIlK+_G$ky?U&m#%cwwlW2yEp zd5x6uC9ffus(vf+Pl-+@%XxGC-?eaXpbWXgg(mqkQk*HeLcxa{fMIjs36wHE|1!8_ zPl&KKqfHhYK6!D6pggp&kRgJF1$;P6isDaK?{ zRRE@e_#Jb1xoA1AK4%I7)P^5%8r0`JM($Fw833uM89NQAx4M6n#wcTxfH~Yq?Jqfz zUMF@Vb}6{nQ+Q0r)NIkmv0KCO0MtWuB><>F)HY|g@tnz00(~qc(9cV2fZ2k~UeUP2 zRZ4I$=bPqmF7@MlqLXU5x1u)sclBO@#T=81{*0>|+jnhsyUJfozW=34rOxWh_Mj~) z`9!g|U-e>psPdrtAMfY>Fhp4(TISTLZQV@>QmH@+v?5?X*N#+}a!dmDJ~sgZtu?Lb zbJY#_CJb-N*~c(%{b$D62Q-${IEZxw#QGOM#O%`GtoQRj!uORoF6D7KFNCKfMZD~iI4WF-~$<#Ykz1M;)M7O2MX^$kciz7m)HFee160SHZk+cG+Z z(%8-*hJt5qb|kjpylkv!CtC zTvPivv>~GAf%A9V${SHh88;5$!l`GUicI?nCC_1ZK`-!^D_UUyU3t!4 zi-9+??@aB$fT%T z^Nhn+)g;X9J5ybF(*^oX`g4DY?*fn^{EqgsKTvJ&T{bK{g}kU%`8H)=#SYS! zX?J&!E%%^k>pfmW{_F>2xt$}^J9L*27+Sx5_>6wUzkJ*aD+a}1TKmjQd)hd7&k+Ej zp|2^Ui_>C{hT`%o&sQqcEnDtC;x!U!Px@-Cw2@Fu?s}f~Ft*{zyfM{vkJmVOH=0R% zMB~0AOfE6)qpb<~VYC8!_E=Xd)+Ez~=IChlTIyTb<*D`)9wRkA<}p$uKk*ppKHXf} zkYD+*VI0D3B)E;LFej3t1eE|Mng=yQTP|01z56}_7NT}8I13YM)Iu1wLr-zkrmt2T zs@=EI$kN$?Y>tgi_eR&1xUiZ^Y7a>NZOdT6u}r&v-=+$J%Oy!lifl=&`|KuX-JVUk ze}3X}(A0n_vL)i(FT|)5WnDz`VfHr@6fN9@U<$(lse5Bw{)!Rz1$*t+j(834UGG%o zp%gk_vZPc21@*O20YI5?^;J_KsvmzJU)9z*k$noLi^r7$c17n&f<4|nIvg0rPN1^R z?5F(ZK4i?V^3Dv=n(@>7 zP1Rlp{{vjJ00=@@L4dfYD!&O)!6IUIj)bFSolH9eOBp}4AEsb+lkLOQ3K*PdrTc(7 zS&qqTKMD&ZwMAGUae%yuoglrhHsh+I2Vz%^S)ARcs5nxe)!Sd0S<{0IE2i|6=P7tisp zE}r9GT|CFXx_FL%b@3ek>f$;6)x~rCtBdFQR~OInuP*+d{i{kpK~8t}_1eLu@@D9V z-aUcDX4CFlRgJKOXsbMMLHm^j*%U8_jBFf&?;XuXHiEgov(?DHo0r;*>>u$`yTMW& z_MOX(>~daOVPu!`(v_&UjHgx_aFflc6PtT;j!z(Fj1TyE-yAnzy@X488O%c%th#)j z0azxC7_JphziZ6e1xQD_5++4-l6L9Mh;yC{9!71ydr>9fUauk3k8|Ttg3fyuV1-N) z@_(N_u#XDcJ_sYO!uAH-!89hgO4?Jgd*|6KC+(wwguL<>2n}?s(~fnYUomvblUyPW1J=togC}N%&KV$*;B6~sS2>rlgE2} z-s!6lCG<8vRr?4v-R+p}&#;})n6-=by{}|NAtr}44aIy&7MZk1o9psL(#T4Lk4IgJ z%Z7cBd-j6Tllyejg#%tgwyQ2qpJu4ulo8zZx9I1{9fhD64qXAT*_XezH%I0 z`NBV8w9IMNepSzjt2DWG4x!K6R-IY^b$9xbN$J|eR1nsWnQ=!h0 z?7vOF50VyVFPt3Dwmfl(`dE>jgu6Ys3-X2A+*?$J13M7eEaEuY7gHVHfrih17aeZy zJehq)J>$RYYLzqP)1>Id!yvD?NbXg>DlXy}9)FOJw|1V)j*8@7I<7CSy`deq!2FAF z`0QT$xSo!I(lU+xM9F&yEh@fl&e&xzgezSa&L7%WbRlNu*tso9dw9eDYBF9@UcfsTHK7;g1`W8 zB|3ra-?X3g1b08Br|e01Lyh3>Z)qrGe6s5p`HPq)6M9TRCcHWO!E|5R#hH?Kunz$U zSQ<}A{@X^d&3z4Edd_YWgcseX00I%~=HB-9mvCXPGsxzXdv#y3Z-)JKZ%lsv93Rx2 zb_5@6sFzJsPT}|1eJslv-HSQp_qD@qus0!h_)yS@oHsa(!LN1+e0hhFSuO@9?J><5 zvtW$KkSj6Xei8xDkx*{gaB@5W7E+t3O@9pYGU{|=RE^x*nT)xQxxJIeyM3O{3B@~{ zkP}0ZXeSn!{`o7Fihf{@ZHY8O*Y=QW1G9D^F5sEYAIpD!biTL%_s9Lr&bJ;6z}I1w zsn?45I<4$w?xe2=Qszy>5cniT>k9`}y6U{{9*95lx~epu;1Olp2?p3}PwPl0HEC z>2_HCOZL&;gnUaviTzvrdIgn03IK7zCf=Pwg7qMTYWzAUvcIN<5%|}!&B(pjfgl3> z@Q{jsSeGh%+he49|J4m(?4|O8Bx)(wV^x*h=$4W;`)5P2?3b#+4Y|t%%Az1*!Z=7{ z{D|ie{{I8zP2BO&{3?jM>`l z2t==a*o%M7nE2-0H=rQUq+PGzzXQ@tIfCe_`Dl6SM5{5gb_C^l%-%;+eD4I8<<@Ej6~6k(#c9mNSC zjn9#%O0N6oI!d~$AoW1?2U`mshC?EF*c(1EK<`j#mUpOB?;SGjJ60j>^3TAPtA_Y& ziyDf!JU5`JQ*li9#emK($JOYJV|2FtBlp5Fs{m0dm#ps&lVZ@LYpmkHLdMLgDu)N`P4(~cjrX*=jkr(;6EN=NdPG7@|EW+m2{W8D?fxQ{&YzBo?h*)uWgE- zrl(uSEZAy|G3yx!X^_}!QaZ5WSEdct-`b$wPO1($*3@wHe!6u7MsW9+!IsSQO0}%a znEaOv_!fZ9k@FM}>D>GX0T+Ggl9~N5t*)jMy;~(I*dw^*CItW9?P8GJJ=Wz%7(G%30AKZr z2br^X3v+N3@`Omxz$Soegjscqie6(V{M5!TKm0^3w!|KQg5ul);0-2 zoAqvm6;Sx$W7cW#(A-67461Uauh~ixV(|yp&P!S%`c%Z{M2iend9wnPV1eW=ztiK_ zvpabc278jRS>s^dK;#%ss>%zKJ}9Mmb_2C;Ar4_sQ|(Pq385G!rMMf{EE!YR zbl}Z@y$>bV?17>;d+~5mCQ|#(c-)|y30!Mob2#fZ_r3Sc6E(#iu>MhW5_Mn3I{=viewry7kZa zc^z*UV(4^%`+bPvbtPXc1fyTHWZx0+zWcHs5VJYP!vxFnhq@&yG!p_`_-W+>laDK4LAsBaVy z?Cv-DGeL+@Y%L)l1x7%_^e=_d}7w~3pqrfQ{a*2oqca)Jl@?i+i1ukf$Muw9B zmV`U67-oDWaHPUL7{$|g4VXtMA@5cAF&A*0axLg6K<`R%*^9~X=KkR|T*tHMCq(*z z>AM4URe*VM*t{lM?r#Bp#$oU75dzl*AB%f;Pawz~*EQotHcm6TqvJ2Zh93YMKJ_5j za2vxMhah?hLd+X&0_SlkPaixe2dh!yLi2a0vk1K)iR47#YI2XY(r ztL>668zD$vo-H$3IvTOd_(3PAV@m9n1u|)EWrJE==N&5iM8Fl=mvmUFb%rUgq!1~`%51-!(w{;9Ug~OwPAJQ z-hwnR6uO9O9kyO@fhODpg98uCiMQPt8bbmAZrwSGY6gJ6D&Ny730TDM7sowjcS}|Nv8JA39#^p!K$iQ`HQn^qV7}#7# zJQu$k4AU%I^*K6V+jnpD?+ zB8xxZE}qA`3?uh?gy^Xh15`ZIvMOPzi)`{2(>ZNX^Fq3bB~ zk=@Z~tI;(e$rAD|xC`eJb=^QAv@MT>xlPZpJ-%m+gm$XQM41E8@Tps^DVfb5l_4Ae|VlfPq8I9eRgtF)gi z3+oz*rmE(jB7I@ykwLsj@ibFJ^T)fr3%P5;tNuUq{*86LZ>FGFfKwB=K?I8_=bll- zTSo@fpB}GJ)g{41f-#G$OC=il6r?hv^9zFm1xQ+m&MyQX8`}H=qw^y#cnteQWg6zx zF{?~?Ti8DOf)BUAqHyXQ0R)Q&=?!&f^e7({0yvMlj zd5`fI&wGroJ?}BDeV*~`{{QDcUv=vFu^qgJGF@3T9bAbnMawL!SPqYGLt-05$NE&7xhz`uw}!7vSe3Hyibgi*u95KQ zHZ2XpPtSz2e*4+>>_X<4Z7~Rg#7ed(Cm%C{yMb@aG_t;`(L2+O9MGz`arcO0sgi39 z4MT#BvP;E9%aw=~A5jTI9Z#!dp{3&}<7xqv03d4+buohBq`dw0TQ8(^1JO4eJ$oDE zP(+~q$7H3FYsxhqY}46j`2RJws@ItB(6q-$t>Szm)Fm!Iyyky1-`u0re2+})`Nq(x z`Bt&$!8O(SX5@R_eB&NWF^(SKtdPvb%djZ+dH;ihzMdDvcgvWwxub0K_HqxI8Iy*4Mn#k7Zfec zZW0;}UUP~Ry+VXoW3NpyYpgl-2zHp8?!^w{f1Jhh-X;H&^(${Z;x!8AJjPf9?hQ4d z<=kbtR(l}e$u_1v@>Uf8mnhR0Eh^0nkom;a~!OKFTE(j1qCk5lTPDHZjzbeVS3 zzSfg{BZ4V$8$=m-eD(^)y@tH= z0KPRaW--@g8m=Sks*s|1Qvm~#R5wxEZg?}hI;|$a1ll94-H7RUGEW<5?pF2}70K;^ zqPcb9;6QQeD#N&|6$?okXn#wnBGq%^j6)Jpj4k;iUgIDR4^6>6(TKmD#`~)Wi~#%5{o=rt`D@bZ&9v`mGqP}^FqJj*x5zQaD)?j7O=W?2-8?Q5(MZ>26s}98 zajes3>fkQhWh;LAtxztOj)nib9!ta;fk~=9kD$-@-K|(m!*rUq*0KS(D^vG0vJRfK z7WBGvB>Ss5^gxs1!ZGXYBVPuP%9wSQ1!kgWX>CEGFGpt|-t-Q>DTD$cW!OIy3#yKO z)xWSpvszHmY#)<5fN;*CE(P=agS$Lr@kJ3?=S0h_GrM~txGRS-#aR@;RS%yJ+&XF4&&4V?x|1X)YotdTUXkj zUXY68)P9^=p-wfV-hfkg;S{zS-u2>FfE9pK*lN=LbVF(sr#9gf_7(PiKTcUV1*Max zK8{mY;}rBc^^G|7dYppF%2RK^sQ^wv8RV%KF^w;O45O-g-;z3oQ!n7uJ?^Q4IQ0{p zy4yYVX`C9FwRhm>@>k^lRecAu#buo-Bl}J+ zMwGiZMSM#l^~hJ@;Rc~JB32A!7(nyl&kdEeHvI#d4NKr#Fr7%miEZFZx&RE_z0Mwo?B>L~SZg{jdLllnAl7eKf~f1f(-U#lZy^3? z7YeJ!*4Yy<#XFHMC$^3@tp=8>f$Dchvyr(-{%jL0^5t+(^FYJ&FUfC!s$f6cj*w#X zPGtngm4l&S`g^zste@GvE$CdbEV?&_dqUe9rr{OMEpboA!abp_4bzC$)OZ4n;P??= zV?y)GzDYC^`vW3n|P}|8#_<>tb#i>8#_mG;e((W#Ae`sHoM7fb`z9D{b%06pMiL~BF8?d z=Wy<}OZotDtTwWMeL}cS69A-57E2G%F3uQm2Jw#d_#v3oa)&j2t!91*bB0Sg)IsCS z(8R}qMr??PZv>*6!taYI-=iBk6cJWgWh!-aXIOIL>;aXNRT6bMS${pu9H=ib*dB>o zL^(En-5G3?JsBu)rrnn@GM~Z=-$~`|Q3e;Rr2_W^l>#)1EUg2H*oSVANwzjc1K(75 z2uVVyVpCFyNgS6caeXHEaA4o)bjXP+#03lmmXUSZ>B;b>lIYHacOvs@po!VdeZV^D z9GM=%;=!#Yu|5+XLMB%KpSWX#T&ieEIPfTU{+0_fqY}^_+{=&s`@JB)l5nsEcK)_w zbm_mTRI(gU(8hZB7A5k$9%2@uoT4QW%Y^r%Gk3v#BZd$%FtdG2wZGnNAD>j;zS~0+ z@S_3bzftiiB;;Z|!i>3+*ohEm)#1QiC|)Yd%@mP77DqOn^?jU_J|laPydr5B3Y-qf zTm8Ae;0N~|cr+w`E(`-Xc7)rB%dZQ5{X@cil_`4q4>-|rCp+m_Cs?v$GHgB5-vLPc z@o@CSwl}Epp!7VlamI@{KB%3o(nDqiip}JgE}lcx5LSv+T892Xr3)v4pRUYbF8#Mx z?aPcBm+!n_Zfp+BwvE`;hBtaDP79B$LQFpKK}>F;qY(B2*x8F%lISkA&wlC^mfI>sJd2=7r_p*XPT5C=NZ-BT;3>y1of3{5-;u0J` z!ke)6JQR}LWo$jBOm>7r8AgUu7~bn!E0v0Tv0e^p~6*%7Iqcf59_xR)ny2Ig4Qjv8c-rA82iSD+gRf)T-C;Zr7>XR~V!PKFo zlooE!Ceqmui__z`OTkQIY6SAdHJcz`_&ZN#Ct)}r3DwIk`uigv#D)?Okv<2QlFSAb z$w23bediVwHYCe$2GJlnkV z+i(Ga#1lyNz2@fgPT5UO@4kcHq*Vh+($r;r8ODyKBb26wSEbn+~au?9ZEQR%l& zDs;qtWiUT0x>p>)r=f<-(xWjwbH8kZM^qY_%b7;ks+{(yO%nh%7Y$c}Ucu=faevaq zuLw~T8nckfYK&Rftc=`s^voX+1@Q_h6?Ls(ivMYW@@{ctDm&JQ9QGK7@3gQ+mK=?J z@IyDq=XZlhkFiR?F@~0%;HDo?R?-gZv>>q6Qq-83G17<_?%Hxd6nxyl)!x126{xlH zbHA@toGqrKKs z8*A&LbKKc=?CwH;x_0)U=ordVR>vW)F^UhU9c0uPz z=S1!=<^Cvzj05NISOo!Jr9ZCQx7z(~(Q~U>D4|_2JEdT|OT^@5%sWs!ehFUp$d&zV zw6sqB4h(^1JTi+=Dxj;`#|4K#A!Z!U-Gg<1O?g|1hEpe5J_sWpEq{VGK8N-`1T?qM z{AZO9!Sp8@@mEJ9?1G{NXO_}X=rk5+G%UhsSmMR<5wG#6U*2jPhOYrvm+)#w11>M+ zEl z2~bCH+u(N)YAVDo_9Vfs#N_99(z@*=%dU`3#UtDZ)py%v%C``1fif}>ke9xIOaNj% zQX>h|7`yE<(TKN%8=;*H1f=(D^){m6t&)Y`Rw^A07}cd5&$N-gF%gqZe0v_&5e6-7 z4cx8@la#gr+v{dnVrI)nZ3yHpJC+6p&%o-e66dHC_?1RE){Xg2+0<~BWm1Udn3h+kh_OgT5uxQnCd;`HRR+D za*XNyBy!X43tTv$!lwfl_G6Di&CQG0Xhn8z!Vsv9Eqc~bkm=cAY9(3%hp~_ObL;WF z)Ww#^<%^#-jNEEjR*W*W53^PtoD12M!(niN59uFJPW)&{{sDM&{SRfY5HDGybgpe%oKc4 zD5$4ROZOoWZyS8hFbwnj&zDZ%$ZPnHI#yw}Me!i4C0HZ)UxkSQ!zv$>f2xAr8m7;o zis#xcuBl}Rxl65s)qX7kK-|q==ZQ?;>ji&8U|gY^S=8LdB?D`*|M@1z#~2s*3U zRlCZQ1DK&Hq5()&l6poY&xYe|Tib45EKpf$DjaFu7UVOnsBE#mO&9y4$JJ*|DOqBP zDx1NR3N~|=q+SH7_uu?CriV~E(R|pDUcueKT z0gXL=BXdb=2iD!GelA>YcI0Jl?h;%Ussh|R_WL}vfn+`*|M?Xd3v!!hn0V%YU@;a! zx*~JX9^Dl{VZIrJ4EvWChG!+bT`*>yco*m51UKGl=#RVKreMBLN76z0w9+eJY;^tA zcPOeg<8pwLRwndy3H5YGpijI;ZJDkRa$K3BL^jZcz_b|8z_7%Af=T$DSUdWx&{89< z8Y(r`Hcyxm`wLkHwxlaj*Gd_uuI!x1%9>fK`qTGQSfZqqHl+DhKp<6zV8)O4yYVj! z|G9YtakYp5Dns2OfWyrvffVaQvO!t2z({=a#3MKZe@K}KbT^OignEeiWZGgd^QXtZ znd**K=bBLerl6n{y(&tVj8^vpyoSdHc921`76=Ujr=IYad}1 zx@*R)B4TIU+q<0gG10Zo>DkEGSD0X(?oA@G!9o6JLD>+USa0rKV^$GgfysekvCE0| zitE=oksHCj(2Iz(J|(&~5WTlV`{gF5dyDS64~9)-t^EO;i~jz0+7IoKUOIv=8Fn<6Zrt=!yC@P^%$4pobyFxdQ zK$6u46-E;VRJiurnEt`=LjAIAmQWNBqm7IO+S4NS*>pQJG-6Zd8&F{`R%zMskeAuJ zaD1H=Jy$w|ET*jgT;&XI1S$Z`I0`LI*2Oy?>jUS{JKeob{6>OjEa%*|)xa}QOa&0a zsuIc+*7y_yi$Eb$oLwp6=HNMghE=$Ug}Dl}e1}-?NgX#k-K`{qGJqM8eaQ1W!8x4n zTirh)5OHqRQyHf_!%HD2zKQ9bfw;U%QQ1vS4{+QuUyR}n2-9hD?QS#I-Hi1H8{w1( z?%lF|5`}3n+8RF0K7k4zaQr^o1#Vd;at!JkAkCo6)mta?;*jGlRE@Rjj zsf%*L^f2aw4_gJ+U6%;`k4gkBqc&zSmKs0gHBygYXSsbFb`~A9{2^839gp20-7<*b{Zc+lHnpeUxTKax3}(SX}U7tH`oB zl0ofq;L=p+YY58#U3@G9x=_W|avxH0M@(Oh%PvU#)wf=T8CP@x*%QHaG5H@CkuIVo zTVc@>>$g5+Z}ZFZ(}nxf;}Kx}C6sL#ydwZ%FuSIj{>$33FMD7LEDhetsOsAhq7M}U z(6Mp(xfwC<*X6DS804J+1Qs(fL?M0Zi0rL+mT~GN{##zHkC&elmaqG_qUw~QeV$BH z6lYh*7^6)>hFU-KGr@ogN_u?Fm)V5tD%&W9Uf-|~Xv0zYdbo@rCh?87rZ z-CFkyek3!KHm}q6be|JFZ4aFG-@ZsBPgj<^qaW1g0l}sT*>;;xc6*a4Q&iV)BkC*K4t6EElpm7{;QTQ zQunUJy)oWvGAe|*k7ufwwM^vo8=_LU$ZLG}A#s;e}p2M^kLE*J6da@w2j zV@t14|2d-F_bCC!3R;tA+g%aZuOI1ho;uZsd29`qC(Ww6}HNakn23HHRIL70OW$mr6=9?VG_-r976MJ)6j3U~PcQIJSb_EQ|fn>6{pGy74DB*4V0aJAgQ-2r5XF zcvT2&)USNm7Ud&3%+o&z06Pn96w zB+rgM2M)*D#cV5UifsY0rm17i02olSr1UkNciR zUa1t_e%LP&zEBX|0m{f{tKIgE);=N;@SP&iLd1_EcM;QBZ;Gw}M|b8E5)w~dyGBlHfzf85mwD06I_2ahAt1!L^(-8=D zPGo;NdmZZeq&*DtNjU7{9ZTW%NR5EN9sq&e{O2Sv0u?aqyjpH;GpMc4G`3$%eTR>1 z!6QfC#YdD_j#b=@q)u2&QTG{aJsk1(zmC@doL7pghr96bZaxgvk)MU6&l)*YKWoe% zDlptD`)}AilBMBwi;$d5wXGQZJme4-z$|9o3-TE8)EZGFr)k35vF1Xt(d%Ej@j|~d z09P9v_}iO66M5vM@?q8Tj43bazy8paoAw=?nPjO-QetBhGpZv9P;>l?I!|VQ%GmDG zbSDF=^;D4I0vkVU6*KP<(c=Hlmt&Qe7)55rWp{ZtxT+gZq8SFk6|g;P;RZm5W*y4m zJn0QC{e-{-G7C^gG~1jS#}xk2Co%v2&XMU(5B%u?PyfQffdKZMyTBHaD?lw4Sz@PN zt}($^yfr3R^4FN)%Vym@q3S)HmB6W&;h3}vH;+6JG>ijJJiZtO62ew#fD0xWfJ3z4 zSOI2$tW#_*+_ar_7f~@aw-Us56o#m4Vy!BX+Z6FuJr?Ab8aHIjf~?G35)=dv3^xzA zL$HGJpcs?RDhOHhyk=H&GlF~GSq~kBuOhPz5l+qoyQAmxagQ`rUVEwQTX}y28=}+^U_8a&Opo7QMK5wt~fT^&&H4@JO zcj1b{pvlUFh?>hhP=r`Hi>w{FW5T~*;j6HmdEN-_I?81aykZzk!FI}UolKc%atn%@*PixwVz< zY&J5N&g?Q$01>*xn#=)*)$QG&u+8qq>!EP(XP8ktPhx)sc2huE=g=AMD?>RJZmNAs zS!DC>r>GG{H58{Ast7$>vjjRlzX44EB#Z@Bl!#up80JEjEA(&^#kLo2+TLBAQG3mP zkoOs8;{v0O(}QR~Quq~c{3t(9vJ_4h6((Ur?xDHbQI$WnxzP`_jl-mlWkB*6!ro3a zFLz|}BA_kXB%v}%sHn!h9Iqs4KS`dopYvofj*gYjVgG`UQWqhqCy;zNSy$K~;Vek~6n?-!OyyvLYayI@wO6kdnC ztpOp+s#;Y8?VN8{`#-3^C&f?b1C8vV8XVa&E47Y4_kDY!fuV?()^;m&6LBJ7kD4j$ zyYyB6e%f|=6Y@Jhu2kI0S#TP3ew51E3Nn{WpDg$gj!AKx*=(1X85Ou*883YY_t z0EngA{yrVD`)=|GDdH=geZ2kpRSrQs=&f5LqIqBUCNN_hO9WwrIw#J5dJRvl&fTuG zC~1$j$K@CP8>A`G;`)_3E+MgMDXVij(bGDwtp8Gk(4IE7HNjIDS?M6KVU?4d1cj9a z!x?Z+Jq8n1SwzPj^)bmwhhM@w;r8jANW`n5?ayqcn&BJdmpJ%j1e=x}Lf<-j7#(3r zyRX^ErcwO?VB;UJ>oT81m(^$?7~URuMtAu{U6)7LdtX->?GLqFvKJHjY?13Z3_V;2s9ye~g&h6Djsjk06C8@td{KH2; zRZ!VrT~xIK;)2tK8j>vCaXs)dFL#4oX-z}62E;tYL5(AbQ z8C{-X34p($Ni@tDWWSNUI_*L6+3gImxP>T$`LQlk$2G>fRw?5`eykg%nT*bn=^Iq| zkcYRg@xhxzDZp(P&_bAwyFN@;Y5)%1P)B^F=<+Y^UgabKoetHlf2pRPC0v66`0~fa zdcPB$%mwKyU&#}z9H0Q_g*EQ(`XmN162MhYN6$)ey?^QYRmgmZ zal`u1d2#*f&fne;PsC*D!=UNBuY0Aqeif)W z@ARz1*TCgo)INQ+bRBfXUA+bS&R!$?W`=9wK3q!(f;7XI!3En~s8qCIQV>18iVZPX z2v2Z%jl>cv>2)e0KgF&TeG2KBZ$pQQGnZEp-Dig|eLJv{ID;dOb<7?(W^7-9@f|U4 zZ-4C}{LHUO&9t``#eTGr5M0&DX8Ms|S1Qw^OkS4rRN2w=thBFQU2%~@)<0^g5ftEe z*7tJfjk%H@1wU}FjUAB{6z5?#V?NpyIv)+yMpQnUspGp~FL&d+RK%7E*zrsccls0; zQAy~Rl$e4>N9g&qH;a?hCsiXZYsu&NyDs!)w8Ap)?(A?hVRn8bB%$Oi~3#Fjl^_%R!?860$k_g zPF491^XW;4awae*%Xuhe%v`%1FybMS*nkB`=E1-aTdsM$%OF3%y9>W=%&hI zBh$02wokoxMon@3mg)>_;s(i3CeV7X0i-V0302-2l#ffuYtGO9h`OJqM}_~xf?M&F zE8mdT=k1bJRJ2ECgC!nL7Pek;`-LDLZmHpDp0-ugqK9_j3P7x-3E6%N-3eZ)i`W!LAk7-)KEul1eKs0z5RYy@{HYAXvcX9YRGn1TUx;M}C%26e_`v@F=c z13Hd1Sqvx7Ze5A+_yQ1j-;6s*Kf)^e_Cf52(yPwEi4Tu2YRr_?W^|y#DlAPRh)#bv z*8S5jS1P#+rf;Ys-n&bcKYkAgXf;&U1eQnB7}=d#b2Pw)!f`(VxN8CTO1H`(eNqsF zPRX8gY^ZQCA_h&eX zRft^lvKXSgsOwR`kDb98)DidQet`i-F)`l6Y%bko+>gRh0Sp(?*Uj2W$a!;Lhe2~z z_jLcXwMhS$14W;b4i-fh1aR1{tyzEx2bNrLJz3 ziFsoBtnym8akuH1kN3jFv>$IvAkudTH^=4sAdFjZSlm3p=B(oIhEO{ci9Hlu0IXvA zFv>+|y#~gehj`ufVq<@W>+bxsj#Zzggm;u5y;!~)#S7`w$a-@hLEehoiXqS@xS~DU zLL+bIggma&(vaF%UV7At0_R>t<>F`__Sv)agaY)2w4N+>AgZ!>2MW}yb)PMx`}0h7 zZT-^?=tW6E>6wo|*;+oY&L_xC)wZx7$AF=z6o`1VongaI1{%;GM6v zF!WEazg4yUsH9-Ll~V9y=x7Y-Qycm3RqzTG(N-*jjf3sVei)MnUqa{y)9E<``ApLwK`rj3-*&g{PB8+eP)Bd+&DgDN>*XT2W`Qvp)5 zAV*C8H-WcVNI&Y zRH9{fPKfJ6GW&kmYsW=&QdwMjRAEVn}U(GsOK!z!@?rMBjRS z^G}`=ND?V6-Z&UgM-GmXXA^>Dd&?pYP~=if?&828@28+n{E+!W`I+29^B+z6A{vq> z)*FT`J@(Iy^W*0ymRaVqWT0O4aQSHK zK9YaQ4`ir)1pW>cCkvU@HQ}$uY%&SYu7J8qSkiFi$FRQz+(Y>$g-1=ZIs&)hiK^>G z?N`^I4h!y(rO{^a48`jEn_xmI83gxqSGr1rQ0>jJ=(0UUUD3c#rflgsKfcT|tBhX1 zk7nf&4{W~hFUlYBYgF#~RWO{;vj3G=)i+l2ZA-XWbel1`u0s9Io4cA&S9sZTRBDk- z$ikm&;dO{S^Q3)>hRm3Rl7@kBJI?+ff(5022LsC>(l(2zsVE9ZilPFbN!+!Jq{a%* z8wUfmhU)o8T&+)qkp|KH1DwmYnEa1cmqrk%a2L`CMR%*uDtAsi0iWUd7wMX5<+#9* z|C4h(p*DKDmDcSeJ!$q|8&67>vCv|~W0x}@q7oA@vTLgp6GzrID5gevC71I4`}b5V zR5}kBQb=6y=bl~lxy4yO9Aj5+7S!)&oQOxn{f}NO555odS^_yHLyul8_w#Q+nS_(Y z%vxcUI^h=ezEY_?i7Z=jqHgNoM^aPwiB~I?w6|{R;yQt{{`Kzr8H5xKxk4DEqnS3Y z5N%u+Qoup3Khw<_)6^?^R_FzS2Czw-e@;Y0vrWUHnYOEdVv(U)Eb<6*uCeDL#|k1x z0g(-6HpsM)a=6D&idY8wt5h}F6c2a(TJlokHPM1<->d4ihdSUeUK;ZwaA8z@AS9Q+ z7lY4iaIlY77rrQMq}$^$*~H7}8ziTwDb@|P>$+4*hO+|Bx;^cCq6IE1@K8x)9G0hTVG(EM>v@Zvs z`>`6b|E^WsmnasINlLL3bB1huxQGEam1_Sw!t=4&j;zCGiz0tN;78LD0*8tABFc|^ zmz1v^Cf~z0QB}R+j{YXj;3aq?l>*d($S0(i8wedTNN94<32lh|%XQd=@n=L2zzW@FWVS)erKhE4%2(=5C?UhIkP$XaPlM()a*twnc~!4j)bE#IWBFxB z0?Z@Wd$uHyU)J49yKyT+?rm_8D`2HX^+m92wS&qZz06S~2y(Q52`(aP2{cvvD_Xzn zZ+{PVeOPd2?)r?Dm(MG-ff@Z_2v2_Tx;;#BOy-?+djixHS<(X7uZXeLC4J6PmztSd zi67}HPLHP95eGE&SlLdo2)Zih-qPX0BzEXKgSzFHjaR@ zbc!mL>q3z4E^!uK2YOUhNFW@P67tQw5Zr~BcaXF07-S&^`N<^5o7w#+z=pvzWAg3n z-js+=x%;fzJW2^Ud7iJjjEiFm_FlzguMa3MLhfB$UZ^3W;9a`>sxCD>P3$_otjga; zN29X4a7b%fAjdP+h4oui?zPFY>CY>b)Jj|#zW}>B>(w)!W^-H?Z>m(FjL$YB==p)X zrEOzH?fOSbu=dg01EnR~J7=q3u8*|j^fW(#av>ej(vt`_=r{#4X)Kg`YNjouN^eSE zsk6nwa?rEMab?_S8H}~GER-UACTJ7NgtuXzA5s7ObHhHr6J_wK+LGnL zhdCwM7^n@;Gd4$;{%z{R?)Qsm5#~F{C4T}f)f2HmShW<2}9x3QWC9&4W{<_GSF8 znNwB7RN+H0H-rzwRQ2mWIaN^S!$~vq=M>Rz@NjI#TFSATVf_H%C(9X+-e{7I6P4O za%S>_v@&cJ zot|cU?G}Qcyuls_d@8fl9thmZNUFYpAXJ@73ofG~>>KU1fT1@sm-0?TTlMufLTRkD z-~xmg#GawA^+Q$P-!}byqKUO|12NQPlW(V%c2*<-9pHEYL-iWp>*DvNyJUK^0_;B6 z`Yo>!OM6mVz5%Qjcw`%wf6HscMN8YayhZ|gTdEh=9{+u%a&QIi7LDz=BWUGkXnheTilx){STv+1*vwN{;+$xW%I*$?**w4PWQNN zeD`7W(@YsSd!>7GW8e|Au`pEtv9$cYQjv&Yfc3f3()W-W)?_)6dIZ<6zm~)#zkC6f zD3Io7;uQu+;<41!H<0s)7hS?9+&DRw^;M=$gbb3ngEkEQDZZW{B%b9@4XMhk}Tgc(L8t*979_M`#3JD-!OsH#s%k)1yMrfBPIQmgvtv` zwSN=%KdaTaz}e1mVJip;$t+cmVMGC0q?(fF^?gX#S0=)NGXgc z@B`<#*0+?2YO9LvSL}C&2r{R=ayZ$1o3@6pL_&xa+7@I9Ir{Yc-;dSDIS)qV6ekQEI{JWKYK2`o6vw>ss#}xz~)(su|Z|6;WZRvX`lCT6} zrQu6gUmKl61`s(hJE*#AJgHI)2wO@HFMY!vNPg$?prK>Ul+=QmW zPiMWkL!9GWd+uHoje5%5eGWeIP`6=5gaCfGuABPTg9HczwK3K0{6r{ zI02tg_00V|15<)~&jUPz@?i`-Lm8-BMi9E}8{#E~CgbLv_!GL!Ehk&W{%?HS3-3!Y zCcn1|%N*`0UcfuS9MQFRl)o% zxhLWoioSre>;C|l|A>7WDd8eIrkM_R zxbPQ)+O#b$2cCK?Icj@%8S1T3ON(`<1ke9T-Y(8n#U7zwz`By8lH&m&}`yPF@A}@ZR zQjy(tcK60q*WY^$xs?t24`NBg1W7rbGH_*+>P7w1ub=;bc8C3eH8Fr%aU|`cZzsv$ zD&|hZ;v(PYHH<_1Fl=k_uaRxQz}zWX@RyS;{h?M9?r5RO>KXv)C_l*Icjz@xio5aA z>_o}giJSDKB}+ao4`dGCOEzCG&k#?XzC#$HgHNGO<>iX+*e_p2Obarek7XAikKc1u z?q6mw*}9+Nx9T%97p9Ga_(YwalDc&vfiJNht1Muk}JX#{=@j3Y9s;zvHQ!x7>6)H65eU^8dB>F5ppAXXE&p1vJt?q7p@o zIJBf92AJELC>?6?J|a$;lHcRxRp;_#fHmGQer~(VI|A zop4Gk%#mF#ZsRLvV&6qzvXTe7$V?7G9WRTg4DSO;H8^&oU98X~gjQVvM zd}z!lT6kyTQ9wL46D9QB9X%X!O2<2nO-|K!cU?I%RoR`Y?oQRrMDN-{aKrlKP}$5~u!h}T^JgFl zGdWe+jo}cw&1iYu=;A#!Ro@LdIS?3k0}`lVGkpXNHQq%(gs?sYP*r^*v3^_qp3awb zuwCu4_jlFzK*0j@Mu&l8a3ulU=9{W240cuT3#RJ#ZGC5JFHC9C zQ`P(0{|;7N`gyR|yA7X4BnS;NbmKlL1|l?!VC?gqNXVstE!df=-`Q3F8cbu=%#Pjq-ILKTw#0!o{iT zqvL9(w!f1u0vvHPwRlSV+wi>Y_KEQ4`S%MUvh3j$L{d9UuK`E#1%}?UbX6WbrUO6% z+CPq=CksG+ibi4J=Ro88lrqRD6{G6(ND8P@heo^L zj-c4?nh3}%BiF+DrTlEUX}`u|1Le?oaaT>b*pvJVHCm^huY)harT}Rf_`!}sg~ob8 zzZlJWR*a5F?qn z>EhGY0koRUtQ^_8J=-7{^|no6lGml`2RioJsS3;7vqupHjyH5nVCsu5`t*rQAL^=v zi-^ZD1TDhB+XWPAr~s>(T078pAtA?p4ydth051Olexq_^T;-A8O`sHlYY$N2WEijj z139_2WimBa9;WmNNVm4Y^(bi62|of1A?cT3)=tTanOWoNkMvU8cbxK4qR)ibT}J=X zCB?|cpU7-x>^9x1D0%oLh$(YL-MIdNqTLf};2NG&j<+nl(S2MqaD&l8F8yTQ#|<|o zBMS&&WRU*CXjEuJq>EteUO&9mvW0=m-=94@$3@oATXnvivAVdl;(@q90Zc3vJk**6!&lTzXh)zrgFc6nt`kTkxp+j0-Bj~ zHjZ^;lv?J7mwL}KMi%kGG3a9Fea{>I+u3<9vpLstA(g>zT zFI8Qds-Lp0Vj|}qn1bPjsf8n`@$nwK>Yv{^++&P zQyA>3KLNLlZyng$AMC0=QS?;(iS|$N7(N#Si9nkI#-WlMmvM4c57o4gfji!UlWQ2S zkvIpY1S zCY-MpGEh-9wgWTfHkmPi)%RSsQ1n4V+cEYm_-64V_rRXw#P zT{0EvmXQ?bnZTsFuN|(n`VwL0p{o#{BDl~aeVg!Xf{RnV$Y;SR_QN{L?4(NU!0Z5L zcRxIBErAT9Ae>PHKbVH0IFXn?Sk#%uz%(Phx4=DHpvag2aYw!Bk|{_m4gp~Y#;VO1 z14VDp1yqxqiF;wpCyh7M1#v$O1_D`zoKq0xtUbr>f%}$UF4}Bi2-#No9?Fx`B{OjW z28wpqzXz9OzKi=g|ER7WF_G3t$1ms!{pHi0ov>qjj`85x3JxZS;vmSvNZ0nyJHr8N zkh(tgI6cw6@dO^Hm6>lEBt%ZXa**jip%zk=Cysp^xS{{?AeYis{+&UB2W<^(abVig zB{OibPmrQcm^R$Uc6ysAs6;J@YKtkVMY;fE(gA`78i6uwMNh@1jY}4$s)vf6YMVB0 z3#-qE?`9hoAVMrOd~jZ>erU^;7sGF?3xUGB zDkef$iK3@!rr{ulyOtKiopH5b={V#aI6eee4g{}^ekph@CoyVQ&#^xOxl}^&CIsMN zk$W(%#Q?*nG0CtD+~N5}Xz_P62x(pNbQTdRFzp@m^S z1FVMI{MbhfA?+Ir&u18dFY$1K;M<=wx}x2;K;*TKVJ0~vQ*0DfZG7+89l1@NLMUe_ zZRihfeGSUjkMu1-A9gf@E9|NQbP7z%f(lqI2bd3>Ah7xMw^i!_CMgBROtq^C*iC!S3OZ?6VZ(p;SN}O3fMteL3f0 zLH0b%ghLqwK`?dA>Lb_$1WLIZ&iY)w!Az%vZwBD|%c%?jNuxD_K>^-sH^D;4v3GN! z@_z;>cjq?sF93K;2EYx<063Tb7XTb?v-#fuaKn<~-vRKJ|0@9BGc^m~Y^r)HQhH0f z801w(QVYEBIMUk=8wUuL&Y`iOJev@HK%UVDfw6l!HclCzfFP=U%oM`(3|3o1y!JR~oBH$ff% zJ?Q^$gY3**Ij}X8R1w;tkfKhEJPl_p;*QRP$!p*gtt?D!1u9eB0*+$(Lio(}1w>b< z5no{n-&4jM_(+K!;J^!{OE~xeqOO4EIBsF6{q9Zfl=E9nEi4#5t7aAAqlUtZ=m4)7PiG8Pq3|@*izOl%% z52H;9tpMk03j-m-X~CSGpKafWXlkrVvIH<4B`iVemhW8y7l2W1f6w4tN+yDNN@*?d z50vwS0J5fwD?CXM^$XpBvV+U=dztZp7cVX)(BVLtGovZ{zRF>s<_Gbv+yXk*4uwEW zvtjV|8o@yFaF7*rO&qigzIH0zZ<~V0A==9TDhI|cT~bA<4=}x2QbpGM?0$?sj`sULZtKfaT^K3)_-huniCZuThfzE?^Cb(QyOO;KT{bH;x?!WQg zbjb;j$DN9yv3$n*#yDTlez4e#c2HcKE*ZkBXbbx00mero<3$PXhi2)!GDDiP$Vggj$lRlNT~|4n0Veqt0-%|yJnY>@tHeU=C>W>yZwcv~i;11SRd8FCzZCwms%Ct!Ydc(l z37jH)1--7}RutpY5T~A6wvD9lM(3J=W9Jx3kr5Czq)Xn!VUA1y8LW3;?h7Z=VAz)? zq&ZC+?0BADOO!4-k~<@F;Wnn?Q6<4866P+i*krN?%r1n0p8_WmCH_rq00!Hv3 z>DUV(KY)Hs>5`-Hq56V$1xT&rg~*xH9fE)lB65U%2q{Qc^FAE&NbSI~$v7L}kTGQ& zd;sGhkMwQ=j+)Y4z*5&31BWUX(JDZ7wLcHDS(7S}K<}6?8Gw!$=BTj4%PGkRSOG}B z@eqw3+ptZBz19Pfk4;m9vyoGuHklq;@z3B=-NSgz?E7yzp$qJ8;LO zv9Li#3y@9u_yC=>;36zz0YDG|NFl4BG4?B(>!M~RU$U7M67(W>0Zf0c zdlVGV^rAgDtqp0*AjG%NN?eQ?MBC9aoP9WS4~zl`(6doG1A+u#&@FvAQs}U^aN!I` zB-|H(&r_8J?e+{{gN;QNqhpZCswrI)v#X1iBlHspP}@E=?0XT3^h1C0mcv-T4j1e) zqF+dN+cuO&lbsgQHvuzXzB4AbdFfwU|E#SLmd`OBG~gk7p2DqM7`cWrKS(2i2N3nG zDeBmGf+^Yz48}1CL)yM^m;j}JE~@k76`btXhn2Mc$rjZkI;)fF?k znD&js=K{-HhP5wgM+DE12_$|l)|r~JbR7AFK7x5R#8fmwUyMKu&)c?uUgYIL60`6gAWjI|yhCCA-?00lJ+8Zuc4dyBH8Nk{v} zLXa{-kcGlR!ps8^4sJoD;PQh;;-}L{2M%5e4Fa_|ZHyL>YU@Js5&D*I9y)rxGXQV) z?}D8EO)_T7AUMY&C(QK+M_E*)n)D(JAHhIfP^e#GdKVh9ZfaJY+5$qS^h<*cK>UJ= z4ZTCbWE<%{3_JxwA`DzoSUV8=QyQ$iP)Z0YDi8sIh$~&v4I2ZOm)>N#0OJaQf%Yx< z4e;sDM^wY6G;=sd$}?=LV2r|`ZpzUyj#_F=qxKKZ=k%L+Nd>JfVnB?$P_!AWMi7pR zb3~APkT?MmBq$|O;&>cyQ@{Yh@LY%&wI4Ucb|}uP9D>ldb>}&|>I$5>GQKHY6%&ii zMyArs+>DBS6~(0}3IOB@+zv|qP#QPz!J9BP2x-KiqbXb%+QNXo$H2!F8tHPuiVoG# zg+KN?+_)p->W8Ur6Am5F0w*WX@C`8aGrQ{PRj%{`G&Bc42G0ipBl5Q=@U+u7?iS^&Z1KG(4d&AW=AnB`IX=V%T$6hFntIZNfA^8 zmGpAz&(mKS_;;Z7ojd@EX8|M`L@nHK(Qb?=)_G8`$9XlhEJU9Ss97%qjf-v>gun_2 zuz90FJ@TQ!i_FZtUc)8Iur4Fxs)u_q8W8T7d<$R$zR{mK2Sw&WGN>mTP(ATsj(S3T z8C>Oaq|l{ZmBRoZr))7$F{BTPJ?$HZ0oID{=s9*S74M{KijmdYRy|ykHlTi(6m@=p z0Cb{bFN>mXbkhPCUf`$c?F7biAzs~P$i`0~P*}cju z9(&ZWgu{Qy7(4_e11=m8WbTYmt>`FUQ%L#exfvCj#y+A)ctOX;6XW$M5Ejh1h6i-n zU6sRwRwK-+cR)7YdIK*faOnx$rnjIHkPVNJ>Q$`SwC1mpPZ80wOcwD7|)GZ(`Mr9g}?E!(9 zbF5aX3(UjAkO^#s@?eZbvxa9Ws? z1D=!}Ps555ePW9xUGfMF{e5s;*nJC#$Uu6Z&3G^K4O1GL?P<|&q`NzNbO#uOwHrkE z*nOfzIJlC6c)FlwpycCp8i??*iyzw!U7>>g=1^+Weogj$ra8)4}a``C|Fz^Wk&>h{@V1M5P zr~^XuQ!B+<$hK`@w^=h#0`i-Eg?*jyb4Le=eR}AhP4v$$uOGZ;AGM%tCtb2~r-d|g z@U!x`*Z4WF+d`Tvx-Dj_+v<=D{_mcJz(kXoe+?&T(nfTMhoDc}< zk>3N}23PW;-DjicFGg}2WrdN81+xj;GvmLF?igK)0S1>Mxsvu1Ldcxb&kh$1p6C~* zCc#5Zx@3fowQmAujA7C6?~FQ|u)hPrzopan0R!$$m)rxE4-@)w{K(Wv-dz@w9JiN{ zV-pC;HN?j|-qO~(T^5qILaB6er1=xH^7HOAZ$(U(_2fKv=REJqdA>d8d3(2{xjE;#Jo9WOUqsV=A^b1q3$CA&(EWO-(bpJFMsyh1==^{d^e4l*PmlWi zjg49i3+1HI<#m5USWEa?{Tt{sjm|gQizma{Sl?Tx#T%jt%@+=}hTvPH>l^vB@iF@A zPwLT7q|ukqwb)qgMT#(fnw#v3Ytqn^+Ty zu`z!_XSGOxjRsj5MWUPyXpy#1q=}9B8`o%hUj5m#*<@r*B)UGrMq`c9fX0^PeZXkn z%wm&~P-`r#wQ3O^d$QQO=xRY>7kjUg+1YHp(NyIIU5g|_(Fj|m`2$*fW?A5}a#q`* z`{dVe^~CL>Tg+gF5-NJ#flpvPulJq3lWT(*3LcVTuM*gd0D(0O)d zA{mQC<9epkFq!@R{bdOy12Az-U*`|!_KxPaa%?EUE~{UF-K}-?BhXhLIY>nm?`uGK*q@79vm< zzL$?7=Qm;wtpDh$nC6GW8SuoCiTp-rf3o-?5xO2w2)jNWjWkW9>#wk_p+o{c;ctXx z$(ioa^~*EBMVrhmiiv(N5@i>A*U792q@f7AMvF(Z@M+3t`d4mrfo)ADbhbfb!+b&Cz%cw(ReZuG8YdaCAKzNVdjciRpn&Po9b7l=Csr z7V)jow3t5}S_epO^!W+-_z_^ z=sFEoyxhPuS-eZj=bjpYwurwqL?HxEYPKwy-L^(~z-&;fEXmGx(}!|I)PZ<3#wN4` z5Ep>t04Q7ikv0~N^pJMSc(UL32jKjV167ejM`iQt%$9OHn0qu}%9f`zgg+eD{DHPC zDi1^>xmXLz`$Ca~?hl83us24*v$^wW&rE!oh{oe>=KN;PL9CvgDoil58EORfA8eU8 z3v>t`nvGC92_!W=SD<`CkH&DXjw%buEFXybLomT`inBnZQQT(W8>Eo{&Brx=W3v`u zqY-01vMW!MF<-`dve!nUY$(WvBEjg_@!Vx+2IKxFwk)8O1?H6n$`Y4ljxJ33zxw+x zAN9hkVB49uW!Xneix*aVfvz$W{8q}6bIOwRZGDB8&8?I7qrbnOHm{VKCu-fo{PNZF z7v{9y-(SCM$+G2FFU!2E)pCgW{{H@D{`~WIS(B~-?lmhc)AXjeKh|u%%6^%qMU7Eca*siZ!8F9nikU2UckMqEJKjcU|7s`}->lV%99b&}6)fG=CJ6 zRUbhR$TV21wP=kwL#!P|aa4?=XXl6YwVBHO{r$CCFqz2NBk_pO9|*Mi6KfO}{%1q2 zv1lR@Y6!Pw_FgE$>T!)$S{9AWPDVm&lNuX|##{YiHXcptS~;x@L>F)_@eGk%4Q&Ra zaa!!u0`Z71poKMEQ`qJ4ShGK(1z4<87Rzq3oRm|(F`5hqBA4oHFcb-}Ns3BNn;%Wa zS)_aYc_dO!`B0=W8cBo_I-syIieiHO-K_ZonaK&pwH$Jgwx|0Wo1qZF-+&re!GMo= zB!en28NU@a?hk}Eu)$;mNjRVa*Cs=8AkH`V)@W^EEdu0JVibGX-?%1`Y*pB3QU`uC z;Me{62n^A@!JW-q?@x>(Kl&Gj{jFJQzrTM$GVf=9*=(Kznv8ALTBGqcT*`>Ho=t@4 zcTShT7WU0V(!bUh(bk)r5BL|_p0?hXK*TnhM@fY8E70;L7N?+MoN7qo(fr2N0ANc1 zzkK%D$ZzlmSeU`+Y&ZNVqraeq{Pz8^5W7x`BWK+dMGPF#G-%tL)j-tO7>xu&O~#mL zeL5DS2f=7Ek}03xehjb&?SauCZOj)AMb==8w7j+|W|g0EXvMVv z8;(ZTBxCdhF*|CciP;7snmz|4KXXE{Ip*6raV_AZ)qMdirZ<~(yPM^(CE6c2wdj^M z`kP^aXnqjjifwH6N1C)iW;W)P#VF*>qi1Dy{Y`#_&KsZypmBk!&dxMV=6jPy%AZd& zH#?<9|AOW*Ma!>Txst70Ua=f^6(ICrJlbmXT8~0E%nt_>YkYnkHZWaaS|6d5ZH#Mv zz|hdNqxuh9J+J39f3yT47LNu)VSv4{ z^YQ!1u*tOLBwF6w-`R5Xqd?Z=kBE-MgofPxO>?r4K$8Ivm6`{E+DZumYJM znf_4Nz%k*_47`z;NU%NF^x+Uztf;T9zGhivUFLirCGw;5<&QTdQGQC7)`Z^-{F|$w z7%O#pc^PdlTRtl+9$UZ`iunQ&5XBjT%=EV`#;yxY7Lk=<-2-J}~{0^3e3y-^Z!QlN*?6 z?D7DRRLU@Rej;QxcAEUgX0rkFLq;0AJaVJHIFQDpDvVt|+5lXLFBAxCK0VY(Nf%6G zm)ADLLU9f7MjrEW+W9idH?}oqCH4Qj{nO7s^wAfNCiK(HC*}u2!QkiR`vWb>gbv$2 zXO6}mFKtf?>waG%*_u=QpO()pd;0kSstp(e0BVpmW^0YzA1Lo%*Yt0d&!r0gS^EL4 zAxSCXvA-XRntN&Ne4vYc4Q+Z>?`NjZDW3>OLC#3^gk~DMe6v5%Oed-=fro#LO@!F8 zSUC$Q0c15Ml@W;e3?xR!OjUXye=(5*Wo_8?bEDZ;y1!{UE#I)-#j*ZK0EopvNOy9q zCp&rl{h9MwL7pVBJ_G{dvcUAr_YHb~uBJC@@ll$|Yv7xBK#@6US0)`@NK-0BGUCVymq>s##*O`C#L;oW_N__a}NgRsh0AGH6TGh5IO|?H&1)mRdCc(Er%(($R97AzsoPDDs(FU35S|O z4PlLKNb1ISks1L0AhQq5v_2@Tjpb~~s}~71m$U1&P*XGZr?!?|oAgI?6U)}t=458z zF%A<3(py>)cs`!4@7f?rC^CRZ`@5k2in+7cNHj8geKfuX#6ntp9n=qN{vbPRZWgGa zzCr5H^+Ni}APa%a1i~y7S?601^SXg;ipTOO7^t6%aMlLbg2*SV8S@Cgv!m_r_tq|6 z&c@=QXgs8Y;+o2Lvix~#o3Aw*@Wr(z5M;#-ek9MTz*Kc&3dMZUq#jF}U^;8oEVgpP z3QeyAId`p=h=!A}c@%(H;~4>oD*Pj}6IvrXYt}4tMgkEZ^ezJgfrxKy(4g%h1tPw9 zJd=yRaf!`Wfru{{3g*-|Hj|m3X!Bh~tyh95R!X$_Km=}PqdYwG1LWD4Uk-BpxDH$r zDBd%oaungS(Re_MO(thi>y;$@5LGEI~vprS7n*ubvyhfx%44iytn+P=o-P&g3B zB`Zthn+c$Pf_~ZuQk_i0MuPrFfTaLvP}pcB z+y?wfLP6*>m6PRcGC^_6x`d(Q&4W)UZ|rZ_L(@ky{rtl&Mpc=&vJro)mM}0TW#6N% z8jLStYP}69io!P0kJ8>5isN8194=?|=1{_zpY_1*!$dY{puf@r<%Xp|T!W(_6xMJu zjl~H?Kmvq{c9>$Sj0QBG0};zefP_ebTtzezCkYZFQ4%q2#z22TVkCxn3rL7Wuylkp zk%UoZ6{#Rmk{}gCBkM?rG!l&@$SSg!#7K~=&uNJ!D4#8vTaKpEUWOF(GKA{|n?*vl zyugr_7Z_6e0z^{hldk-??KMpb^evl!LK)HhqDLlxK zPY*EUjROqXdw?Mi9bm}z0}Rm*Fr?uCL)-@#GUEV4CLdtP$9)Xxd4VCXzQB-`2N?pv z80vZ%66|HjjlB%HtCt~<^fIKUmmzQTGGtmGL!>^2)b=rCbss}+>SM_5eGGX7+UaA+ zp+1HjrQYD={rwDib3a4&?Pthi`x)}B{S3KfKSMU`XUOXP3|YFLA@2PQ`Raa#T)3Yh z#rqjDem_G#-N%rjeGK{2K8C!xk0FQlF{Ec7Lw4?C$ld!GvS}Yf;`F$d1P>xTd8)p%%W7 z;1+H0;2!#_g>1hpr`ye4h4I5W!aq>HwT2>1P%WC&o1(@uB*=#rVGfu5 zY2GtGz2LbDqxmn=7wL=iMfxIrk-kV@q%YDJ>5KG5`XYUizDWNcOz3ahetZP{wL8bB zK{P~2GXy6esJZcE8e*$Jl!k(uX7F)Nm-IYpAuTtykZpGqq|@ozf$n|jbjQBJ-cI;A zp||s_bUMxSb)Cq($`s@PN#>O;K`Xzrw_HjlVp6SuX7%hi@>|mbUHmR3Qx`O z6oaR5I-QQ;Qw-j1Vn|~69^Ki?J+pt?%2kq_Pw2Z^- z_$3ZjpK$E&FyI}V;hHfRVr{zQb{JzA?rhlZ9r)dU(E(O&pU_)*8)@FY7sAkOsi8jM zsroH=RnRx_W~IBlI(U}f<6Q@Tc5L4Oe;(N027eyegfDk)$3MG{;L9hAZ-l%(JJ!RW z?s-_D{}2qh^3W!1?6qR7aG(cE9$tMD^le-9_L^ph%(d+f7)EWnT^bDh75JPhR;V{L@^ElV_0e@V!7#xH-o zNz=XYXrq=$MB^2)MsmJoiMBZ7XAEyH$$NteQ1S`0L|f>OG-_e`J2k^dllQw(`gw~OpjCWzuF~R3ghB2G`oQ@*aMsA^R<60{r?PM&SDu=H$D`Hw>DA=|T+>8kMBeOUfTo?rpbX}_j3%-O-$i>hLn5z0n z2wd1#=y8cjFevqW2vY+4Au$dwxiiRjV9ns_8UN86x*o@7a|Rzo-3 z6|qnRdO((vCBgZP=;n}lw}2R9^lI@SIG98lHEdstldAbk=LEuGaurz?2qh2#(BYnt ziTK8xhXu)CP>U0CCIjW_!2~-Lp)cp_i{ep$tAAjP6`EeT4h*`;0sLLPLeuB#dOXyS z)U^bRVlBR3Tz!S6S7_@((3yy?ZO{o>W8^H1#@beBk$^dEUM)_$wKx)tlJKZf`ME`y zYxdh5O)UG(g~>R0)X|(3y1#J^If1$6;yi)BsuxEBA@EpTq5Jh@!t4t9=~%hs6Qcz^ z8IRDG6QmK}U7_g!M2q6lR--e8IEPpJL&ijX1gv`jcxe$FTl4yw-AtZr0i>q_?DK5fdaQKTfYOq4DVVUJIEn;@) zYzEpckV5G58w61qk6P48qUwJ$9&v* z*d8IR_-1i+MK0dS8xMq{1(;o2P3JD#&(Y-;W4Q{=H1sh006Ps@sEEb0(@d((clnb- z0{H$4O|R7&wa_}i3E;I#bbP3w4udz!8@O`aT8A-NkalfvapIs0_`$Ex>a=)kDB{<(tKg;EgdiLOi5NNAkuCMN zfj?QM#E{VkYT#mafRMfP%e6*EJsJjA`6Gcad~u!8u9-c$)h?Q!feW*%zszryE(3Xl zzRh;hc)zS-@rpSsu33>w6%YcKN}MNMB3&j4l2fXbmP;$825F6ylx~u?NViGflOB*b zYm;@Me5L%7;}4FvltJY-&ksDHAOqdw4)JmE1u-ctur9VXSqUomrVv7|aqL&`b9vow zy4@ba5dv4rt>doY+xX4=H~9znNBEumF8)b=58uuA@cZ}!d_RAPKg_?zzsVorkMc1= z7d8kt3Y&z@!WQA1!gk?y;V$7GVTbU5@QAQe*d;tE>=C+!9$}wwKuM*ofV4mz89Ex%&y$zRD`nYsh3#?M^R|ihB0Fbqv9Gh=XaB%1IG%R= z$zfA&QGTqPt*%sesVCLzoUP6d=l7hCxZZG0axZZ2cK_a8{g?KS?7ZVHN1x+G$H$Hdili)54l9?cFRJgVBdX|J?YzUe%lRAU2hKuQv1^KJ zs;kt+x@Nd$y2@RgOLEy=PS-qFg{#W7)a7;6xmLPXxn6gj<6i52#{Hg~tR@5^V(#W% z<$l9|TX;(77WN9S3V#re2_Fa}!UVBMoGN}wdfy~(=O`rp>KtnXMY@|p4^S&^@k{~~`X zkFyooUa`Mp{}0Efjx&`>N{KQ}xlEB2r&6I*D=U@t%2s7Sxj?;K zwL|SvzoXux{zUzm+N1WXFR8DpN7ZBMU)5!<6)wLk=nA`j92^>7}a=OGV?5rQ}0a+A3Wxar&#+zM_L zr*W-Zg1doh=f1(+#@)r;%kAWz;GW@nxfi+P+=cv~`R@t0NbgG@N+Z&F)>7+qtJAu~ z`a^3-j>x+Fyxb?hC?A%G<%zcQZI{{Hwk5V3ZFkys*!pZQ*?wnx*Y;Q2-)-aUlkDf) zr`s>LTkRhEmG+hPuiG2#TkW^n@3VK?588igf5Sd(Kg%IHsvOH4D;yEWM#o%5QWT|7 zty5R4H>=-O&vVu}6V98RzjnUkbhsSux7}fY%}sPntGKn??c6=wW8AacOWf<+JKTHR zaW2hG;xFW9@o)1({KLXy!XDvu;e>F8SR&fRE5&QXHRAQ+t>V4nZgIc(mUvtoFP$r0 zE-6y29UTO7NBi4=9F6$lE9o8qT*UGK(tMcFE%WaEnU$cd6uh@oc zv+R}jPWzqqhwV?>Ke3c$vx!OU< zDzMSvm-8+BdSOWTOgK|KTf9gt6X%NWTHm)$l%4Vd`AYfg@)~)q+$MiR{o6_47Z5mLZrfnH(YDF9*|x{0s-_FeX$+n=#tpbk z`-pqGNAj%nT<2-@e8=-W&wZXBdmi`v!2^g7f}&r`1-KS2$|bq`xxaE-_-*_i{yF|E zAu8S?ZWZ^6C&b&NyQPPvpGn=)LFuscx^%Ji%hsUv8`ejxKe6t%zF|FLeb+i@{m?pW z{meQ+K1ZG@tMUqYrTm(FL_Q{;lrOW*vE6Tb#P*o2%3fn{vahq>YyXk`NqdidhvPxV zQs+0Fw>e*NzTy0%bEWG#SEDQBTI*Wpy214yuK#p>*Y!i!Z(J7l4em|uSKYsJ`#nL= zL!PHS&w4(Bbw5PNPD02z-1*#PTn%>>r*m!GVeSKN0zZ*&=0E2D!QUkG3cnIw68`T-zpFr|oaHk8LBisrHNQm)Qlo z-R`n`?O(UI*xT&)I_`J4l!Z!_l2A4%Hz_-npDIr&2bG7^o$6lofcgjZsQQum5A{rE zq4OMPv-5gqjq8xB%rnaq_mCrmOkoJIa<_3d-pRkf|AxO-_(%we7fEv@QJQO&t+iI4 zb-lII`keKU^_Vqnohr|jtK_A!SFV#+$`;$1wn?@M+ugQ7TeCf8-(cTk@3DVi|HS^8 zU2<%7{LXRGF+rK6d`)RowkdZgk1Ib@o>qRTgw&XNquQ?Cr#_?(tDmX$&VaMo8Ft?3 ze8~Bv^I7Ks=gZDFoquu;IX`udcTIAg@0#wq++}rnTve`G*R?Lq6>)8FwYzS0-Ql|1 z^#j*~u18%@x}J0W+VzI(sOv-5CoaZa=)TZB-F>-xk=yIO%6+YSjXUYy?Cx^k>b}$c zpnI45P4@?G;+f!i*t65~U!H@W7d?kz{e}psU;qYJb2o8Yx!bw#azEg9azE$xb1!h? z`H6fHU&24hKh3|+ALWnp!#pp@f>T&5)Cvtklkgqk2f~kpCxmWczwjI3HQ^m$Q20nV zDHPz|pCQf>ZQ^|KO0iD-y4WPf#OuWlahv!ZafkRL@n>Q;?%mhLcf{l3M`Btmkj{}V zlFFnxl3kiFEs^S^>!c>>nDiIvtMXjgC0EL~%lF88Z7WrF%8^&EAoI!(P)EmuX=p}N&Y z>N2%Xy-p3PQB_y3$Mf-4^$zuJ^@r*s>QB|D)MwSV)b~}!d8V_}`4#7U=OX7)=Sk-> z*B*DFXR~K3?g9q!)6E>vR=4tZ@b~f$@jLk^_&xly{62)USNM1M0sb%i3I6YVnjbGr z6wVV$1w~jOTq$^ktAs|ORah@<61s$2g-3+Pgxx~7@EhS3;Vt2hf<-J4UlrdHizHUM zR9Y)NAsv=plirk$NJpgs>9};2b(Pg`4O%1CZ&~lQ?zR3*enEau{!mWKRkk`?ukF{i zbM2+}S@t^nHFlqUz5Ql;r+uq^yS>%1&T-Oljxs~BD$gqSsK?c_oK9zh^Je#E_Z~MG zt}&#U5OODX4|j+=$`A5G{7HV2Fjcrjm>~$lN+BS;Cy3(p;?3ei;-lhz@v!)s_@;P7 zJStu*eJWid&z9rzqw*_qm2IwLsZy@;YC_%S`nIdbwcqub%i`YR*$*(tGGqoJko-NB9LOZgl4P5j;bBmB?# zU+}->-{b$xf53l9C>2D(E_4as5xy_nFZ@aPM3^WRi_=7>c%^u?c%zsSKM@(JK$;>c z(gJC-v`zX?=?BsS(k^MYv{yQS=fFGCfb=)%q;#gW&{|@>$U5D6sg<)fTJN@=B^Sx( z$))mi`BJ%D7G%3TA5Vnq?GoEe+r73m_7nDI#~#PE%00@j zl&Eu~^PqEztIDOheD08Yo%=sM-}mhDJV$Z^BUJ>fVF7Z~RWFHoPB0eGR z5#JTBl62`l={2d)y1;sk^*^k?w7zV$$!FOX+Ny1Dm@(G&7SJW0=ko*#R5d4A=2({lpg zCPvr)8tzW+DeeR}iJ!&0_?7%xzKh?(dxRF@cHs%(7s79aKMNO$cClVuCGHmA5kC}5 zq=@ug=`E?yI?KviueP>Yzh~WP?X`Ypohq~P7Ug$W_vB0sxAu9Ds zk@}HyiOc5xmHRXIcn|Bj+4G`jz>|i)Y+?w++n&l@#x-!aac^^T`Ne#Ue~3TCpCeo* zTp=WcHsL0rLr4j?3HJ&Q3p=rI&k6g57lfCEH-)!__k{7{m&9|#3&d&SOmVho6P@CG z@hb7_q9(2pW8yk-lh`Sy#KYoAalCYvG+8=NnkLPZW=o>vkQPXbrCRA)$u9+^u(VFP zL28#Cm7b7#r9Vl>rB9_Ztmjy#S!Y>g>jLXC>({J7YutL1mF!^9=C#mW?4If_b+hgn z?wM|y$X5CP43O^9qtF*kGOZbpL8E^_q$(nzv({W9&jIb54%U)#53Mg=wUrG zJTpCv)Y1^9lZXzMbE~-^zc7|33c!|0w?i|1{sj|B8Q&{}cab{v&>bA19Ow ZUlH7bSGZbOC1^re$d_S!k^cXg{tuQWB7Fb= literal 0 HcmV?d00001 diff --git a/binary/netipfw.inf b/binary/netipfw.inf new file mode 100644 index 0000000..7159403 --- /dev/null +++ b/binary/netipfw.inf @@ -0,0 +1,81 @@ +; version section +[Version] +Signature = "$Windows NT$" +Class = NetService +ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} +Provider = %Unipi% +DriverVer = 26/02/2010,3.0.0.1 + +; manufacturer section +[Manufacturer] +%Unipi% = UNIPI,NTx86,NTamd64 + +; control flags section +; optional, unused in netipfw.inf inf, used in netipfw_m.inf +[ControlFlags] + +; models section +[UNIPI] ; Win2k +%Desc% = Ipfw.ndi, unipi_ipfw +[UNIPI.NTx86] ;For WinXP and later +%Desc% = Ipfw.ndi, unipi_ipfw +[UNIPI.NTamd64] ;For x64 +%Desc% = Ipfw.ndi, unipi_ipfw + +; ddinstall section +[Ipfw.ndi] +AddReg = Ipfw.ndi.AddReg, Ipfw.AddReg +Characteristics = 0x4410 ; NCF_FILTER | NCF_NDIS_PROTOCOL !--Filter Specific--!! +CopyFiles = Ipfw.Files.Sys +CopyInf = netipfw_m.inf + +; remove section +[Ipfw.ndi.Remove] +DelFiles = Ipfw.Files.Sys + +;ddinstall.services section +[Ipfw.ndi.Services] +AddService = Ipfw,,Ipfw.AddService + +[Ipfw.AddService] +DisplayName = %ServiceDesc% +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ipfw.sys +AddReg = Ipfw.AddService.AddReg + +[Ipfw.AddService.AddReg] + +;file copy related sections +[SourceDisksNames] +1=%DiskDescription%,"",, + +[SourceDisksFiles] +ipfw.sys=1 + +[DestinationDirs] +DefaultDestDir = 12 +Ipfw.Files.Sys = 12 ; %windir%\System32\drivers + +; ddinstall->copyfiles points here +[Ipfw.Files.Sys] +ipfw.sys,,,2 + +; ddinstall->addreg points here +[Ipfw.ndi.AddReg] +HKR, Ndi, HelpText, , %HELP% ; this is displayed at the bottom of the General page of the Connection Properties dialog box +HKR, Ndi, FilterClass, , failover +HKR, Ndi, FilterDeviceInfId, , unipi_ipfwmp +HKR, Ndi, Service, , Ipfw +HKR, Ndi\Interfaces, UpperRange, , noupper +HKR, Ndi\Interfaces, LowerRange, , nolower +HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan" + +;strings section +[Strings] +Unipi = "Unipi" +DiskDescription = "Ipfw Driver Disk" +Desc = "ipfw+dummynet" +HELP = "This is ipfw and dummynet network emulator, developed by unipi.it" +ServiceDesc = "ipfw service" diff --git a/binary/netipfw_m.inf b/binary/netipfw_m.inf new file mode 100644 index 0000000..350e4d1 --- /dev/null +++ b/binary/netipfw_m.inf @@ -0,0 +1,56 @@ +; version section +[Version] +Signature = "$Windows NT$" +Class = Net +ClassGUID = {4D36E972-E325-11CE-BFC1-08002BE10318} +Provider = %Unipi% +DriverVer = 26/02/2010,3.0.0.1 + +; control flags section +; optional, unused in netipfw.inf inf, used in netipfw_m.inf +[ControlFlags] +ExcludeFromSelect = unipi_ipfwmp + +; destinationdirs section, optional +[DestinationDirs] +DefaultDestDir=12 +; No files to copy + +; manufacturer section +[Manufacturer] +%Unipi% = UNIPI,NTx86,NTamd64 + +; models section +[UNIPI] ; Win2k +%Desc% = IpfwMP.ndi, unipi_ipfwmp +[UNIPI.NTx86] ;For WinXP and later +%Desc% = IpfwMP.ndi, unipi_ipfwmp +[UNIPI.NTamd64] ;For x64 +%Desc% = IpfwMP.ndi, unipi_ipfwmp + +; ddinstall section +[IpfwMP.ndi] +AddReg = IpfwMP.ndi.AddReg +Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN + +; ddinstall->addreg points here +[IpfwMP.ndi.AddReg] +HKR, Ndi, Service, 0, IpfwMP + +;ddinstall.services section +[IpfwMP.ndi.Services] +AddService = IpfwMP,0x2, IpfwMP.AddService + +[IpfwMP.AddService] +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ipfw.sys +AddReg = IpfwMP.AddService.AddReg + +[IpfwMP.AddService.AddReg] +; None + +[Strings] +Unipi = "Unipi" +Desc = "Ipfw Miniport" \ No newline at end of file diff --git a/binary/testme.bat b/binary/testme.bat new file mode 100644 index 0000000..5b3de00 --- /dev/null +++ b/binary/testme.bat @@ -0,0 +1,79 @@ +@echo on +@set CYGWIN=nodosfilewarning + +@ipfw -q flush +@ipfw -q pipe flush +@echo ###################################################################### +@echo ## Setting delay to 100ms for both incoming and outgoing ip packets ## +@echo ## and sending 4 echo request to Google ## +@echo ###################################################################### +ipfw pipe 3 config delay 100ms +ipfw add pipe 3 ip from any to any +ipfw pipe show +ping -n 4 www.google.it + +@echo ############################################## +@echo ## Raising delay to 300ms and pinging again ## +@echo ############################################## +ipfw pipe 3 config delay 300ms +ipfw pipe show +ping -n 4 www.google.com + +@echo ################################## +@echo ## Shaping bandwidth to 500kbps ## +@echo ################################## +ipfw pipe 3 config bw 500Kbit/s +ipfw pipe show +wget http://info.iet.unipi.it/~luigi/1m +@del 1m + +@echo ################################### +@echo ## Lowering bandwidth to 250kbps ## +@echo ################################### +ipfw pipe 3 config bw 250Kbit/s +ipfw pipe show +wget http://info.iet.unipi.it/~luigi/1m +@del 1m + +@echo ################################################################### +@echo ## Simulating 50 percent packet loss and sending 15 echo request ## +@echo ################################################################### +@ipfw -q flush +@ipfw -q pipe flush +ipfw add prob 0.5 deny proto icmp in +ping -n 15 -w 300 www.google.it +@ipfw -q flush + +@echo ############################## +@echo ## Showing SYSCTL variables ## +@echo ############################## +ipfw sysctl -a + +@echo ############################################# +@echo ## Inserting rules to test command parsing ## +@echo ############################################# +@echo -- dropping all packets of a specific protocol -- +ipfw add deny proto icmp +@echo -- dropping packets of all protocols except a specific one -- +ipfw add deny not proto tcp +@echo -- dropping all packets from IP x to IP y -- +ipfw add deny src-ip 1.2.3.4 dst-ip 5.6.7.8 +@echo -- dropping all ssh outgoing connections -- +ipfw add deny out dst-port 22 +@echo -- allowing already opened browser connections -- +@echo -- but preventing new ones from being opened -- +ipfw add deny out proto tcp dst-port 80 tcpflags syn +@echo -- another way to do the same thing -- +ipfw add allow out proto tcp dst-port 80 established +ipfw add deny out proto tcp dst-port 80 setup +@echo -- checking what rules have been inserted -- +ipfw -c show +@ipfw -q flush + +@echo ################# +@echo ## Cleaning up ## +@echo ################# +ipfw -q flush +ipfw -q pipe flush + +pause diff --git a/binary/wget.exe b/binary/wget.exe new file mode 100644 index 0000000000000000000000000000000000000000..f2a11c17dd3ef2f605b17f92718980acb88a3fea GIT binary patch literal 401408 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%0D;yD1YsF$w5=hDo}-hzm?ILP-l(s~+{vS`=vp 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

BBZWuBrzN@s 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

s<*J{sW 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%0D|6txK*hL&eav1vQ!npMMl+UTr+gc|E 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%0At)>QVBp~82)NkXETp>le*=%DEz;>~0@#CpE% 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 W41g%URLV``hl=v(Z*SoL1pfu;TcNc8 literal 0 HcmV?d00001 diff --git a/binary64/ipfw.exe b/binary64/ipfw.exe new file mode 100755 index 0000000000000000000000000000000000000000..35c86d9f06a2b5eb2736263156b97c6406f027fc GIT binary patch literal 148202 zcmb@v3wRVo)<0Y`=_C^fbbx?>TmsGtCicjP)G4r6=2z^3P$ljv4

+KnfrF$~&x+kOXn%NnP?!E2yOM3L^=C%;e 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 jJXac<6t5vmZDgyyM`bih^4w~2{Hn^ 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 V09FDO$6^A<<%O~A_$~B?{tum_=tlqm literal 0 HcmV?d00001 diff --git a/binary64/ipfw.sys b/binary64/ipfw.sys new file mode 100755 index 0000000000000000000000000000000000000000..8e2275dab545c7a49040bc5b7301dcad83b31623 GIT binary patch literal 155648 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 I|BK=O0m|z02LJ#7 literal 0 HcmV?d00001 diff --git a/configuration/README b/configuration/README new file mode 100644 index 0000000..778f7aa --- /dev/null +++ b/configuration/README @@ -0,0 +1,14 @@ +This directorty contains some ipfw configurations and a scripts +to safely change the firewall rules. + +The firewall configuration comes from the FreeBSD initial script. +The change_rules_linux.sh allows to change the ipfw rules and +in case os a misconfiguration which prevents to reach the remote +host, to restore the old ruleset. + +To configure the firewall behavior, edit the ipfw.conf file and +execute the ./change_rules_linux.sh script. + +The ipfw program executable should be located in /sbin (XXX) + +XXX seems we use something which is not compatible with dash diff --git a/configuration/change_rules.sh b/configuration/change_rules.sh new file mode 100755 index 0000000..8f23369 --- /dev/null +++ b/configuration/change_rules.sh @@ -0,0 +1,159 @@ +#!/bin/sh +# +# Copyright (c) 2000 Alexandre Peixoto +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. +# +# $FreeBSD: src/share/examples/ipfw/change_rules.sh,v 1.6 2003/09/07 07:52:56 jmg Exp $ + +# Change ipfw(8) rules with safety guarantees for remote operation +# +# Invoke this script to edit ${firewall_script}. It will call ${EDITOR}, +# or vi(1) if the environment variable is not set, for you to edit +# ${firewall_script}, ask for confirmation, and then run +# ${firewall_script}. You can then examine the output of ipfw list and +# confirm whether you want the new version or not. +# +# If no answer is received in 30 seconds, the previous +# ${firewall_script} is run, restoring the old rules (this assumes ipfw +# flush is present in it). +# +# If the new rules are confirmed, they'll replace ${firewall_script} and +# the previous ones will be copied to ${firewall_script}.{date}. Mail +# will also be sent to root with a unified diff of the rule change. +# +# Unapproved rules are kept in ${firewall_script}.new, and you are +# offered the option of changing them instead of the present rules when +# you call this script. +# +# This script could be improved by using version control +# software. + +# XXX on linux /etc/rc.conf defines: +# firewall_type and firewall_script + +if [ -r /etc/defaults/rc.conf ]; then + . /etc/defaults/rc.conf + source_rc_confs +elif [ -r /etc/rc.conf ]; then + . /etc/rc.conf +fi + +EDITOR=${EDITOR:-/usr/bin/vi} +PAGER=${PAGER:-/usr/bin/more} + +# on linux the default mktemp invocation behavior +# is different, we should change the temporary file creation +tempfoo=`basename $0` +#TMPFILE=`mktemp -t ${tempfoo}` || exit 1 +TMPFILE=`mktemp -t ${tempfoo}.XXXXX` || exit 1 + +get_yes_no() { + while true + do + echo -n "$1 (Y/N) ? " + read -t 30 a + if [ $? != 0 ]; then + a="No"; + return; + fi + case $a in + [Yy]) a="Yes"; + return;; + [Nn]) a="No"; + return;; + *);; + esac + done +} + +restore_rules() { + nohup sh ${firewall_script} /dev/null 2>&1 + rm ${TMPFILE} + exit 1 +} + +case "${firewall_type}" in +[Cc][Ll][Ii][Ee][Nn][Tt]|\ +[Cc][Ll][Oo][Ss][Ee][Dd]|\ +[Oo][Pp][Ee][Nn]|\ +[Ss][Ii][Mm][Pp][Ll][Ee]|\ +[Uu][Nn][Kk][Nn][Oo][Ww][Nn]) + edit_file="${firewall_script}" + rules_edit=no + ;; +*) + if [ -r "${firewall_type}" ]; then + edit_file="${firewall_type}" + rules_edit=yes + fi + ;; +esac + +if [ -f ${edit_file}.new ]; then + get_yes_no "A new rules file already exists, do you want to use it" + [ $a = 'No' ] && cp ${edit_file} ${edit_file}.new +else + cp ${edit_file} ${edit_file}.new +fi + +trap restore_rules SIGHUP + +${EDITOR} ${edit_file}.new + +get_yes_no "Do you want to install the new rules" + +[ $a = 'No' ] && exit 1 + +cat < ${TMPFILE} 2>&1 +else + nohup sh ${firewall_script}.new \ + < /dev/null > ${TMPFILE} 2>&1 +fi +sleep 2; +get_yes_no "Would you like to see the resulting new rules" +[ $a = 'Yes' ] && ${PAGER} ${TMPFILE} +get_yes_no "Type y to keep the new rules" +[ $a != 'Yes' ] && restore_rules + +DATE=`date "+%Y%m%d%H%M"` +cp ${edit_file} ${edit_file}.$DATE +mv ${edit_file}.new ${edit_file} +cat </dev/null + fi + ${fwcmd} add deny $log ip from any to any + ;; + +[Cc][Ll][Oo][Ss][Ee][Dd]) + ${fwcmd} add 65000 deny ip from any to any + ;; +[Uu][Nn][Kk][Nn][Oo][Ww][Nn]) + ;; +*) + if [ -r "${firewall_type}" ]; then + ${fwcmd} ${firewall_flags} ${firewall_type} + fi + ;; +esac diff --git a/glue.h b/glue.h new file mode 100644 index 0000000..75216cc --- /dev/null +++ b/glue.h @@ -0,0 +1,589 @@ +/* + * Copyright (c) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ +/* + * $Id: glue.h 12501 2014-01-10 01:09:14Z luigi $ + * + * glue code to adapt the FreeBSD version to linux and windows, + * userland and kernel. + * This is included before any other headers, so we do not have + * a chance to override any #define that should appear in other + * headers. + * First handle headers for userland and kernel. Then common code + * (including headers that require a specific order of inclusion), + * then the user- and kernel- specific parts. + */ + +#if defined __FreeBSD__ +#define _GLUE_H +#endif /* __FreeBSD__ */ +#ifndef _GLUE_H +#define _GLUE_H + + +/* + * common definitions to allow portability + */ +#ifndef __FBSDID +#define __FBSDID(x) +#endif /* FBSDID */ + +#ifndef KERNEL_MODULE /* Userland headers */ + +#if defined(__CYGWIN32__) && !defined(_WIN32) +#define _WIN32 +#endif + +#if defined(TCC) && defined(_WIN32) +#include +#endif /* TCC */ + +#include /* linux needs it in addition to sys/types.h */ +#include /* for size_t */ +#include +#include +#include +#ifdef __linux__ +#include /* linux only 20111031 */ +#endif + +#else /* KERNEL_MODULE, kernel headers */ + +#define INET # want inet support +#ifdef __linux__ + +#include + +#define ifnet net_device /* remap */ +#define _KERNEL # make kernel structure visible +#define KLD_MODULE # add the module glue + +#include /* linux kernel */ +#include /* linux kernel */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) // or 2.4.x +#include /* linux/msg.h require this */ +#include /* just MAX_ADDR_LEN 8 on 2.4 32 on 2.6, also brings in byteorder */ +#endif + +/* on 2.6.22, msg.h requires spinlock_types.h */ +/* XXX spinlock_type.h was introduced in 2.6.14 */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) +#include +#endif +/* XXX m_type define conflict with include/sys/mbuf.h, + * so early include msg.h (to be solved) +*/ +#include + +#include +#include /* struct in_addr */ +#include /* struct in6_addr */ +#include +/* + * LIST_HEAD in queue.h conflict with linux/list.h + * some previous linux include need list.h definition + */ +#undef LIST_HEAD + +#define IF_NAMESIZE (16) +typedef uint32_t in_addr_t; + +#define printf(fmt, arg...) printk(KERN_ERR fmt, ##arg) +#endif /* __linux__ */ + +#endif /* KERNEL_MODULE end of kernel headers */ + + +/* + * Part 2: common userland and kernel definitions + */ + +#ifndef ETHER_ADDR_LEN +#define ETHER_ADDR_LEN (6+0) /* length of an Ethernet address */ +#endif + +#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */ +#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */ +#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */ +#define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */ + +/* + * linux: sysctl are mapped into /sys/module/ipfw_mod parameters + * windows: they are emulated via get/setsockopt + */ +#define CTLFLAG_RD 1 +#define CTLFLAG_RDTUN 1 +#define CTLFLAG_RW 2 +#define CTLFLAG_SECURE3 0 // unsupported +#define CTLFLAG_VNET 0 /* unsupported */ + +/* if needed, queue.h must be included here after list.h */ + +/* + * struct thread is used in linux and windows kernel. + * In windows, we need to emulate the sockopt interface + * so also the userland needs to have the struct sockopt defined. + * In order to achieve 64 bit compatibility, padding has been inserted. + */ +struct thread { + void *sopt_td; + void *td_ucred; +}; + +enum sopt_dir { SOPT_GET, SOPT_SET }; + +struct sockopt { + enum sopt_dir sopt_dir; /* is this a get or a set? */ + int sopt_level; /* second arg of [gs]etsockopt */ + int sopt_name; /* third arg of [gs]etsockopt */ +#ifdef _X64EMU + void* pad1; + void* pad2; +#endif + void *sopt_val; /* fourth arg of [gs]etsockopt */ + size_t sopt_valsize; /* (almost) fifth arg of [gs]etsockopt */ +#ifdef _X64EMU + void* pad3; + void* pad4; +#endif + struct thread *sopt_td; /* calling thread or null if kernel */ +}; + + +#define INET_ADDRSTRLEN (16) /* missing in netinet/in.h */ + +/* + * List of values used for set/getsockopt options. + * The base value on FreeBSD is defined as a macro, + * if not available we will use our own enum. + * The TABLE_BASE value is used in the kernel. + */ +#ifndef IP_FW_TABLE_ADD +#define _IPFW_SOCKOPT_BASE 100 /* 40 on freebsd */ +enum ipfw_msg_type { + IP_FW_TABLE_ADD = _IPFW_SOCKOPT_BASE, + IP_FW_TABLE_DEL, + IP_FW_TABLE_FLUSH, + IP_FW_TABLE_GETSIZE, + IP_FW_TABLE_LIST, + IP_FW_DYN_GET, /* new addition */ + + /* IP_FW3 and IP_DUMMYNET3 are the new API */ + IP_FW3 = _IPFW_SOCKOPT_BASE + 8, + IP_DUMMYNET3, + + IP_FW_ADD = _IPFW_SOCKOPT_BASE + 10, + IP_FW_DEL, + IP_FW_FLUSH, + IP_FW_ZERO, + IP_FW_GET, + IP_FW_RESETLOG, + + IP_FW_NAT_CFG, + IP_FW_NAT_DEL, + IP_FW_NAT_GET_CONFIG, + IP_FW_NAT_GET_LOG, + + IP_DUMMYNET_CONFIGURE, + IP_DUMMYNET_DEL , + IP_DUMMYNET_FLUSH, + /* 63 is missing */ + IP_DUMMYNET_GET = _IPFW_SOCKOPT_BASE + 24, + _IPFW_SOCKOPT_END +}; +#endif /* IP_FW_TABLE_ADD */ + +/* + * Part 3: userland stuff + */ + +#ifndef KERNEL_MODULE + +/* + * internal names in struct in6_addr (netinet/in6.h) differ, + * so we remap the FreeBSD names to the platform-specific ones. + */ +#ifndef _WIN32 +#define __u6_addr in6_u +#define __u6_addr32 u6_addr32 +#define in6_u __in6_u /* missing type for ipv6 (linux 2.6.28) */ +#else /* _WIN32 uses different naming */ +#define __u6_addr __u6 +#define __u6_addr32 __s6_addr32 +#endif /* _WIN32 */ + +/* missing in linux netinet/ip.h */ +#define IPTOS_ECN_ECT0 0x02 /* ECN-capable transport (0) */ +#define IPTOS_ECN_CE 0x03 /* congestion experienced */ + +/* defined in freebsd netinet/icmp6.h */ +#define ICMP6_MAXTYPE 201 + +/* on freebsd sys/socket.h pf specific */ +#define NET_RT_IFLIST 3 /* survey interface list */ + +#if defined(__linux__) || defined(__CYGWIN32__) +/* on freebsd net/if.h XXX used */ +struct if_data { + /* ... */ + u_long ifi_mtu; /* maximum transmission unit */ +}; + +/* + * Message format for use in obtaining information about interfaces + * from getkerninfo and the routing socket. + * This is used in nat.c + */ +struct if_msghdr { + u_short ifm_msglen; /* to skip over unknown messages */ + u_char ifm_version; /* future binary compatibility */ + u_char ifm_type; /* message type */ + int ifm_addrs; /* like rtm_addrs */ + int ifm_flags; /* value of if_flags */ + u_short ifm_index; /* index for associated ifp */ + struct if_data ifm_data;/* stats and other ifdata */ +}; + +/* + * Message format for use in obtaining information about interface + * addresses from getkerninfo and the routing socket + */ +struct ifa_msghdr { + u_short ifam_msglen; /* to skip over unknown messages */ + u_char ifam_version; /* future binary compatibility */ + u_char ifam_type; /* message type */ + int ifam_addrs; /* like rtm_addrs */ + int ifam_flags; /* value of ifa_flags */ + u_short ifam_index; /* index for associated ifp */ + int ifam_metric; /* value of ifa_metric */ +}; + +#ifndef NO_RTM /* conflicting with netlink */ +/* missing in net/route.h */ +#define RTM_VERSION 5 /* Up the ante and ignore older versions */ +#define RTM_IFINFO 0xe /* iface going up/down etc. */ +#define RTM_NEWADDR 0xc /* address being added to iface */ +#define RTA_IFA 0x20 /* interface addr sockaddr present */ +#endif /* NO_RTM */ + +/* SA_SIZE is used in the userland nat.c modified */ +#define SA_SIZE(sa) \ + ( (!(sa) ) ? \ + sizeof(long) : \ + 1 + ( (sizeof(struct sockaddr) - 1) | (sizeof(long) - 1) ) ) + +/* sys/time.h */ +/* + * Getkerninfo clock information structure + */ +struct clockinfo { + int hz; /* clock frequency */ + int tick; /* micro-seconds per hz tick */ + int spare; + int stathz; /* statistics clock frequency */ + int profhz; /* profiling clock frequency */ +}; + +/* no sin_len in sockaddr, we only remap in userland */ +#define sin_len sin_zero[0] + +#endif /* Linux/Win */ + +/* + * linux does not have a reentrant version of qsort, + * so we the FreeBSD stdlib version. + */ +void qsort_r(void *a, size_t n, size_t es, void *thunk, + int cmp_t(void *, const void *, const void *)); + +/* prototypes from libutil */ +/* humanize_number(3) */ +#define HN_DECIMAL 0x01 +#define HN_NOSPACE 0x02 +#define HN_B 0x04 +#define HN_DIVISOR_1000 0x08 + +#define HN_GETSCALE 0x10 +#define HN_AUTOSCALE 0x20 + +int humanize_number(char *_buf, size_t _len, int64_t _number, + const char *_suffix, int _scale, int _flags); +int expand_number(const char *_buf, int64_t *_num); + +#define setprogname(x) /* not present in linux */ + +extern int optreset; /* not present in linux */ + +size_t strlcpy(char * dst, const char * src, size_t siz); +long long int strtonum(const char *nptr, long long minval, + long long maxval, const char **errstr); + +int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, + void *newp, size_t newlen); + + +#else /* KERNEL_MODULE */ + +/* + * Part 4: kernel stuff + */ + +/* linux and windows kernel do not have bcopy ? */ +#define bcopy(_s, _d, _l) memcpy(_d, _s, _l) +/* definitions useful for the kernel side */ +struct route_in6 { + int dummy; +}; + +#ifdef __linux__ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) // or 2.4.x +#include +#endif + +/* skb_dst() and skb_dst_set() was introduced from linux 2.6.31 */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) +void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst); +struct dst_entry *skb_dst(const struct sk_buff *skb); +#endif + +/* The struct flowi changed */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38) // check boundaries +#define flow_daddr fl.u.ip4 +#else +#define flow_daddr fl.nl_u.ip4_u +#endif + +#endif /* __linux__ */ + +/* + * Do not load prio_heap.h header because of conflicting names + * with our heap functions defined in include/netinet/ipfw/dn_heap.h + * However do define struct ptr_heap used in linux 3.12.7 etc. + */ +#define _LINUX_PRIO_HEAP_H +struct ptr_heap; + +/* + * The following define prevent the ipv6.h header to be loaded. + * Starting from the 2.6.38 kernel the ipv6.h file, which is included + * by include/net/inetpeer.h in turn included by net/route.h + * include the system tcp.h file while we want to include + * our include/net/tcp.h instead. + */ +#ifndef _NET_IPV6_H +#define _NET_IPV6_H +static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) +{ + memcpy(a1, a2, sizeof(struct in6_addr)); +} +#endif /* _NET_IPV6_H */ + +#endif /* KERNEL_MODULE */ + +/* + * Part 5: windows specific stuff + */ + +#ifdef _WIN32 +#ifndef KERNEL_MODULE +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 +#define FILE_ANY_ACCESS 0 +#define FILE_READ_DATA ( 0x0001 ) // file & pipe +#define FILE_WRITE_DATA ( 0x0002 ) // file & pipe +#endif /* !KERNEL_MODULE */ + +#define FILE_DEVICE_IPFW 0x00654324 +#define IP_FW_BASE_CTL 0x840 +#define IP_FW_SETSOCKOPT \ + CTL_CODE(FILE_DEVICE_IPFW, IP_FW_BASE_CTL + 1, METHOD_BUFFERED, FILE_WRITE_DATA) +#define IP_FW_GETSOCKOPT \ + CTL_CODE(FILE_DEVICE_IPFW, IP_FW_BASE_CTL + 2, METHOD_BUFFERED, FILE_ANY_ACCESS) + +/********************************* +* missing declarations in altq.c * +**********************************/ + +#define _IOWR(x,y,t) _IOW(x,y,t) + +/********************************** +* missing declarations in ipfw2.c * +***********************************/ + +#define ICMP_UNREACH_NET 0 /* bad net */ +#define ICMP_UNREACH_HOST 1 /* bad host */ +#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ +#define ICMP_UNREACH_PORT 3 /* bad port */ +#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ +#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ +#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ +#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ +#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ +#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ +#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ +#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ +#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ +#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */ +#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */ +#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */ + + +struct ether_addr; +struct ether_addr * ether_aton(const char *a); + +/********************************* +* missing declarations in ipv6.c * +**********************************/ + +struct hostent* gethostbyname2(const char *name, int af); + + +/******************** +* windows wrappings * +*********************/ + +int my_socket(int domain, int ty, int proto); +#define socket(_a, _b, _c) my_socket(_a, _b, _c) + +#endif /* _WIN32 */ +/******************* +* SYSCTL emulation * +********************/ +#if defined (_WIN32) || defined (EMULATE_SYSCTL) +#define STRINGIFY(x) #x + +/* flag is set with the last 2 bits for access, as defined in glue.h + * and the rest for type + */ +enum { + SYSCTLTYPE_INT = 0, + SYSCTLTYPE_UINT, + SYSCTLTYPE_SHORT, + SYSCTLTYPE_USHORT, + SYSCTLTYPE_LONG, + SYSCTLTYPE_ULONG, + SYSCTLTYPE_STRING, +}; + +struct sysctlhead { + uint32_t blocklen; //total size of the entry + uint32_t namelen; //strlen(name) + '\0' + uint32_t flags; //type and access + uint32_t datalen; +}; + +#ifdef _KERNEL + +#ifdef SYSCTL_NODE +#undef SYSCTL_NODE +#endif +#define SYSCTL_NODE(a,b,c,d,e,f) +#define SYSCTL_DECL(a) +#define SYSCTL_VNET_PROC(a,b,c,d,e,f,g,h,i) + +#define GST_HARD_LIMIT 100 + +/* In the module, GST is implemented as an array of + * sysctlentry, but while passing data to the userland + * pointers are useless, the buffer is actually made of: + * - sysctlhead (fixed size, containing lengths) + * - data (typically 32 bit) + * - name (zero-terminated and padded to mod4) + */ + +struct sysctlentry { + struct sysctlhead head; + char* name; + void* data; +}; + +struct sysctltable { + int count; //number of valid tables + int totalsize; //total size of valid entries of al the valid tables + void* namebuffer; //a buffer for all chained names + struct sysctlentry entry[GST_HARD_LIMIT]; +}; + +#ifdef SYSBEGIN +#undef SYSBEGIN +#endif +#define SYSBEGIN(x) void sysctl_addgroup_##x() { +#ifdef SYSEND +#undef SYSEND +#endif +#define SYSEND } + +/* XXX remove duplication */ +#define SYSCTL_INT(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_INT << 2), sizeof(*e), e) + +#define SYSCTL_VNET_INT(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_INT << 2), sizeof(*e), e) + +#define SYSCTL_UINT(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_UINT << 2), sizeof(*e), e) + +#define SYSCTL_VNET_UINT(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_UINT << 2), sizeof(*e), e) + +#define SYSCTL_LONG(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_LONG << 2), sizeof(*e), e) + +#define SYSCTL_ULONG(a,b,c,d,e,f,g) \ + sysctl_pushback(STRINGIFY(a) "." STRINGIFY(c) + 1, \ + (d) | (SYSCTLTYPE_ULONG << 2), sizeof(*e), e) +#define TUNABLE_INT(a,b) + +void keinit_GST(void); +void keexit_GST(void); +int kesysctl_emu_set(void* p, int l); +int kesysctl_emu_get(struct sockopt* sopt); +void sysctl_pushback(char* name, int flags, int datalen, void* data); + +#endif /* _KERNEL */ + +int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, + size_t newlen); +#endif /* _WIN32" || EMULATE_SYSCTL */ +#ifdef _WIN32 +int do_cmd(int optname, void *optval, uintptr_t optlen); + +#endif /* _WIN32 */ + +#define __PAST_END(v, idx) v[idx] +#endif /* !_GLUE_H */ diff --git a/ipfw/Makefile b/ipfw/Makefile new file mode 100644 index 0000000..a32d02a --- /dev/null +++ b/ipfw/Makefile @@ -0,0 +1,128 @@ +# +# $Id: Makefile 11688 2012-08-12 20:58:26Z luigi $ +# +# GNUMakefile to build the userland part of ipfw on Linux and Windows +# +# Do not set with = or := so we can inherit from the caller + +include ../Makefile.inc + +all: $(TARGET) + +#TCC=c:/path/to/tcc + +# common flags +EXTRA_CFLAGS += -O1 +EXTRA_CFLAGS += -Wall +EXTRA_CFLAGS += -include ../glue.h +EXTRA_CFLAGS += -I ./include_e -I ./include + +TARGET := ipfw +ifneq ($(VER),openwrt) +ifeq ($(OSARCH),Linux) + EXTRA_CFLAGS += -D__BSD_VISIBLE + EXTRA_CFLAGS += -Werror + # Required by GCC 4.6 + EXTRA_CFLAGS += -Wno-unused-but-set-variable +endif +ifeq ($(OSARCH),FreeBSD) + EXTRA_CFLAGS += -D__BSD_VISIBLE + EXTRA_CFLAGS += -Werror +endif +ifeq ($(OSARCH),Darwin) + EXTRA_CFLAGS += -D__BSD_VISIBLE + EXTRA_CFLAGS += -Werror +endif + +ifeq ($(OSARCH),Windows) +# we only support Cygwin and tcc as compilers. +ifeq ($(WIN64),1) + EXTRA_CFLAGS += -D_X64EMU +endif + +ifeq ($(TCC),) # cygwin + EXTRA_CFLAGS += -I/cygdrive/c/$(DDKDIR)/inc/ddk + EXTRA_CFLAGS += -I . + EXTRA_CFLAGS += -pipe -Wall +else #-- build with tcc + # TCC points to the root of tcc tree + CC=$(TCC)/tcc.exe + EXTRA_CFLAGS += -DTCC -I.. + EXTRA_CFLAGS += -I$(TCC)/include/winapi -I$(TCC)/include + EXTRA_CFLAGS += -nostdinc + + EFILES_. += err.h grp.h netdb.h pwd.h sysexits.h + EFILES_arpa += inet.h + EFILES_net += if.h + EFILES_netinet += in.h in_systm.h ip.h ip_icmp.h + EFILES_sys += cdefs.h wait.h ioctl.h socket.h + +endif + # EXTRA_CFLAGS += -D_WIN32 # see who defines it + EXTRA_CFLAGS += -Dsetsockopt=wnd_setsockopt + EXTRA_CFLAGS += -Dgetsockopt=wnd_getsockopt + EXTRA_CFLAGS += -DEMULATE_SYSCTL + EFILES_net += ethernet.h route.h + EFILES_netinet += ether.h icmp6.h + EFILES_sys += sysctl.h + TARGET = ipfw.exe +ipfw: $(TARGET) +endif # windows +endif # !openwrt + +CFLAGS += $(EXTRA_CFLAGS) +# Location of OS headers and libraries. After our stuff. +USRDIR?= /usr +ifeq ($(TCC),) + CFLAGS += -I$(USRDIR)/include + LDFLAGS += -L$(USRDIR)/lib +else + LDFLAGS += -L. -L$(TCC)/lib -lws2_32 +endif + +OBJS = ipfw2.o dummynet.o main.o ipv6.o qsort_r.o +OBJS += expand_number.o humanize_number.o glue.o + +# we don't use ALTQ +CFLAGS += -DNO_ALTQ +#OBJS += altq.o + +all: $(TARGET) + -@echo "Done build for $(OSARCH) VER $(VER)" + +$(TARGET): $(OBJS) + $(MSG) " LD $@" + $(HIDE)$(CC) $(LDFLAGS) -o $@ $^ + +$(OBJS) : ipfw2.h ../glue.h include_e + +# support to create empty dirs and files in include_e/ +# EDIRS is the list of directories, EFILES is the list of files. +EFILES_sys += sockio.h +EFILES_. += libutil.h +EFILES_netinet += __emtpy.h + +M ?= $(shell pwd) + +# first make a list of directories from variable names +EDIRS= $(subst EFILES_,,$(filter EFILES_%,$(.VARIABLES))) +# then prepend the directory name to individual files. +# $(empty) serves to interpret the following space literally, +# and the ": = " substitution packs spaces into one. +EFILES = $(foreach i,$(EDIRS),$(subst $(empty) , $(i)/, $(EFILES_$(i): = ))) + +include_e: + $(MSG) "building include_e in $M" + -@rm -rf $(M)/include_e opt_* + -@mkdir -p $(M)/include_e + -@(cd $(M)/include_e; mkdir -p $(EDIRS); touch $(EFILES) ) + -@(cd $(M)/include_e/netinet; \ + for i in ip_fw.h ip_dummynet.h tcp.h; do \ + cp ../../../sys/netinet/$$i .; done; ) + +clean distclean: + -@rm -rf $(OBJS) $(TARGET) include_e + +diff: + -@(diff -upr $(BSD_HEAD)/sbin/ipfw .) + diff --git a/ipfw/add_rules b/ipfw/add_rules new file mode 100755 index 0000000..f7866d7 --- /dev/null +++ b/ipfw/add_rules @@ -0,0 +1,27 @@ +#!/bin/bash +# +# A test script to add rules + +PRG=./ipfw + +myfun() { + $PRG add 10 count icmp from any to 131.114.9.128 + $PRG add 20 count icmp from 131.114.9.128 to any + $PRG add 20 count icmp from any to 131.114.9.130 + $PRG add 30 count icmp from 131.114.9.130 to any + $PRG add 40 count icmp from any to 131.114.9.129 + $PRG add 50 count icmp from 131.114.9.129 to any + $PRG add 60 count icmp from 131.114.9.236 to any + sleep 1 + $PRG del 10 + $PRG del 20 + $PRG del 20 + $PRG del 30 + $PRG del 40 + $PRG del 50 + $PRG del 60 +} + +for ((i=0;i<100;i++)) ; do + myfun +done diff --git a/ipfw/dummynet.c b/ipfw/dummynet.c new file mode 100644 index 0000000..15f00b6 --- /dev/null +++ b/ipfw/dummynet.c @@ -0,0 +1,1459 @@ +/* + * Copyright (c) 2002-2003,2010 Luigi Rizzo + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + * $FreeBSD: head/sbin/ipfw/dummynet.c 206843 2010-04-19 15:11:45Z luigi $ + * + * dummynet support + */ + +#include +#include +/* XXX there are several sysctl leftover here */ +#include + +#include "ipfw2.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include /* inet_ntoa */ + + +static struct _s_x dummynet_params[] = { + { "plr", TOK_PLR }, + { "noerror", TOK_NOERROR }, + { "buckets", TOK_BUCKETS }, + { "dst-ip", TOK_DSTIP }, + { "src-ip", TOK_SRCIP }, + { "dst-port", TOK_DSTPORT }, + { "src-port", TOK_SRCPORT }, + { "proto", TOK_PROTO }, + { "weight", TOK_WEIGHT }, + { "lmax", TOK_LMAX }, + { "maxlen", TOK_LMAX }, + { "all", TOK_ALL }, + { "mask", TOK_MASK }, /* alias for both */ + { "sched_mask", TOK_SCHED_MASK }, + { "flow_mask", TOK_FLOW_MASK }, + { "droptail", TOK_DROPTAIL }, + { "red", TOK_RED }, + { "gred", TOK_GRED }, + { "bw", TOK_BW }, + { "bandwidth", TOK_BW }, + { "delay", TOK_DELAY }, + { "link", TOK_LINK }, + { "pipe", TOK_PIPE }, + { "queue", TOK_QUEUE }, + { "flowset", TOK_FLOWSET }, + { "sched", TOK_SCHED }, + { "pri", TOK_PRI }, + { "priority", TOK_PRI }, + { "type", TOK_TYPE }, + { "flow-id", TOK_FLOWID}, + { "dst-ipv6", TOK_DSTIP6}, + { "dst-ip6", TOK_DSTIP6}, + { "src-ipv6", TOK_SRCIP6}, + { "src-ip6", TOK_SRCIP6}, + { "profile", TOK_PROFILE}, + { "burst", TOK_BURST}, + { "dummynet-params", TOK_NULL }, + { NULL, 0 } /* terminator */ +}; + +#define O_NEXT(p, len) ((void *)((char *)p + len)) + +static void +oid_fill(struct dn_id *oid, int len, int type, uintptr_t id) +{ + oid->len = len; + oid->type = type; + oid->subtype = 0; + oid->id = id; +} + +/* make room in the buffer and move the pointer forward */ +static void * +o_next(struct dn_id **o, int len, int type) +{ + struct dn_id *ret = *o; + oid_fill(ret, len, type, 0); + *o = O_NEXT(*o, len); + return ret; +} + +/* handle variable length structures moving back the pointer and fixing length */ +static void * +o_compact(struct dn_id **o, int len, int real_length, int type) +{ + struct dn_id *ret = *o; + + ret = O_NEXT(*o, -len); + oid_fill(ret, real_length, type, 0); + *o = O_NEXT(ret, real_length); + return ret; +} + +#if 0 +static int +sort_q(void *arg, const void *pa, const void *pb) +{ + int rev = (co.do_sort < 0); + int field = rev ? -co.do_sort : co.do_sort; + long long res = 0; + const struct dn_flow_queue *a = pa; + const struct dn_flow_queue *b = pb; + + switch (field) { + case 1: /* pkts */ + res = a->len - b->len; + break; + case 2: /* bytes */ + res = a->len_bytes - b->len_bytes; + break; + + case 3: /* tot pkts */ + res = a->tot_pkts - b->tot_pkts; + break; + + case 4: /* tot bytes */ + res = a->tot_bytes - b->tot_bytes; + break; + } + if (res < 0) + res = -1; + if (res > 0) + res = 1; + return (int)(rev ? res : -res); +} +#endif + +/* print a mask and header for the subsequent list of flows */ +static void +print_mask(struct ipfw_flow_id *id) +{ + if (!IS_IP6_FLOW_ID(id)) { + printf(" " + "mask: %s 0x%02x 0x%08x/0x%04x -> 0x%08x/0x%04x\n", + id->extra ? "queue," : "", + id->proto, + id->src_ip, id->src_port, + id->dst_ip, id->dst_port); + } else { + char buf[255]; + printf("\n mask: %sproto: 0x%02x, flow_id: 0x%08x, ", + id->extra ? "queue," : "", + id->proto, id->flow_id6); + inet_ntop(AF_INET6, &(id->src_ip6), buf, sizeof(buf)); + printf("%s/0x%04x -> ", buf, id->src_port); + inet_ntop(AF_INET6, &(id->dst_ip6), buf, sizeof(buf)); + printf("%s/0x%04x\n", buf, id->dst_port); + } +} + +static void +print_header(struct ipfw_flow_id *id) +{ + if (!IS_IP6_FLOW_ID(id)) + printf("BKT Prot ___Source IP/port____ " + "____Dest. IP/port____ " + "Tot_pkt/bytes Pkt/Byte Drp\n"); + else + printf("BKT ___Prot___ _flow-id_ " + "______________Source IPv6/port_______________ " + "_______________Dest. IPv6/port_______________ " + "Tot_pkt/bytes Pkt/Byte Drp\n"); +} + +static void +list_flow(struct dn_flow *ni, int *print) +{ + char buff[255]; + struct protoent *pe = NULL; + struct in_addr ina; + struct ipfw_flow_id *id = &ni->fid; + + if (*print) { + print_header(&ni->fid); + *print = 0; + } + pe = getprotobynumber(id->proto); + /* XXX: Should check for IPv4 flows */ + printf("%3u%c", (ni->oid.id) & 0xff, + id->extra ? '*' : ' '); + if (!IS_IP6_FLOW_ID(id)) { + if (pe) + printf("%-4s ", pe->p_name); + else + printf("%4u ", id->proto); + ina.s_addr = htonl(id->src_ip); + printf("%15s/%-5d ", + inet_ntoa(ina), id->src_port); + ina.s_addr = htonl(id->dst_ip); + printf("%15s/%-5d ", + inet_ntoa(ina), id->dst_port); + } else { + /* Print IPv6 flows */ + if (pe != NULL) + printf("%9s ", pe->p_name); + else + printf("%9u ", id->proto); + printf("%7d %39s/%-5d ", id->flow_id6, + inet_ntop(AF_INET6, &(id->src_ip6), buff, sizeof(buff)), + id->src_port); + printf(" %39s/%-5d ", + inet_ntop(AF_INET6, &(id->dst_ip6), buff, sizeof(buff)), + id->dst_port); + } + pr_u64(&ni->tot_pkts, 4); + pr_u64(&ni->tot_bytes, 8); + printf("%2u %4u %3u\n", + ni->length, ni->len_bytes, ni->drops); +} + +static void +print_flowset_parms(struct dn_fs *fs, char *prefix) +{ + int l; + char qs[30]; + char plr[30]; + char red[90]; /* Display RED parameters */ + + l = fs->qsize; + if (fs->flags & DN_QSIZE_BYTES) { + if (l >= 8192) + sprintf(qs, "%d KB", l / 1024); + else + sprintf(qs, "%d B", l); + } else + sprintf(qs, "%3d sl.", l); + if (fs->plr) + sprintf(plr, "plr %f", 1.0 * fs->plr / (double)(0x7fffffff)); + else + plr[0] = '\0'; + + if (fs->flags & DN_IS_RED) /* RED parameters */ + sprintf(red, + "\n\t %cRED w_q %f min_th %d max_th %d max_p %f", + (fs->flags & DN_IS_GENTLE_RED) ? 'G' : ' ', + 1.0 * fs->w_q / (double)(1 << SCALE_RED), + fs->min_th, + fs->max_th, + 1.0 * fs->max_p / (double)(1 << SCALE_RED)); + else + sprintf(red, "droptail"); + + if (prefix[0]) { + printf("%s %s%s %d queues (%d buckets) %s\n", + prefix, qs, plr, fs->oid.id, fs->buckets, red); + prefix[0] = '\0'; + } else { + printf("q%05d %s%s %d flows (%d buckets) sched %d " + "weight %d lmax %d pri %d %s\n", + fs->fs_nr, qs, plr, fs->oid.id, fs->buckets, + fs->sched_nr, fs->par[0], fs->par[1], fs->par[2], red); + if (fs->flags & DN_HAVE_MASK) + print_mask(&fs->flow_mask); + } +} + +static void +print_extra_delay_parms(struct dn_profile *p) +{ + double loss; + if (p->samples_no <= 0) + return; + + loss = p->loss_level; + loss /= p->samples_no; + printf("\t profile: name \"%s\" loss %f samples %d\n", + p->name, loss, p->samples_no); +} + +static void +flush_buf(char *buf) +{ + if (buf[0]) + printf("%s\n", buf); + buf[0] = '\0'; +} + +/* + * generic list routine. We expect objects in a specific order, i.e. + * PIPES AND SCHEDULERS: + * link; scheduler; internal flowset if any; instances + * we can tell a pipe from the number. + * + * FLOWSETS: + * flowset; queues; + * link i (int queue); scheduler i; si(i) { flowsets() : queues } + */ +static void +list_pipes(struct dn_id *oid, struct dn_id *end) +{ + char buf[160]; /* pending buffer */ + int toPrint = 1; /* print header */ + + buf[0] = '\0'; + for (; oid != end; oid = O_NEXT(oid, oid->len)) { + if (oid->len < sizeof(*oid)) + errx(1, "invalid oid len %d\n", oid->len); + + switch (oid->type) { + default: + flush_buf(buf); + printf("unrecognized object %d size %d\n", oid->type, oid->len); + break; + case DN_TEXT: /* list of attached flowsets */ + { + int i, l; + struct { + struct dn_id id; + uint32_t p[0]; + } *d = (void *)oid; + l = (oid->len - sizeof(*oid))/sizeof(d->p[0]); + if (l == 0) + break; + printf(" Children flowsets: "); + for (i = 0; i < l; i++) + printf("%u ", d->p[i]); + printf("\n"); + break; + } + case DN_CMD_GET: + if (co.verbose) + printf("answer for cmd %d, len %d\n", oid->type, oid->id); + break; + case DN_SCH: { + struct dn_sch *s = (struct dn_sch *)oid; + flush_buf(buf); + printf(" sched %d type %s flags 0x%x %d buckets %d active\n", + s->sched_nr, + s->name, s->flags, s->buckets, s->oid.id); + if (s->flags & DN_HAVE_MASK) + print_mask(&s->sched_mask); + } + break; + + case DN_FLOW: + list_flow((struct dn_flow *)oid, &toPrint); + break; + + case DN_LINK: { + struct dn_link *p = (struct dn_link *)oid; + double b = p->bandwidth; + char bwbuf[30]; + char burst[5 + 7]; + + /* This starts a new object so flush buffer */ + flush_buf(buf); + /* data rate */ + if (b == 0) + sprintf(bwbuf, "unlimited "); + else if (b >= 1000000) + sprintf(bwbuf, "%7.3f Mbit/s", b/1000000); + else if (b >= 1000) + sprintf(bwbuf, "%7.3f Kbit/s", b/1000); + else + sprintf(bwbuf, "%7.3f bit/s ", b); + + if (humanize_number(burst, sizeof(burst), p->burst, + "", HN_AUTOSCALE, 0) < 0 || co.verbose) + sprintf(burst, "%d", (int)p->burst); + sprintf(buf, "%05d: %s %4d ms burst %s", + p->link_nr % DN_MAX_ID, bwbuf, p->delay, burst); + } + break; + + case DN_FS: + print_flowset_parms((struct dn_fs *)oid, buf); + break; + case DN_PROFILE: + flush_buf(buf); + print_extra_delay_parms((struct dn_profile *)oid); + } + flush_buf(buf); // XXX does it really go here ? + } +} + +/* + * Delete pipe, queue or scheduler i + */ +int +ipfw_delete_pipe(int do_pipe, int i) +{ + struct { + struct dn_id oid; + uintptr_t a[1]; /* add more if we want a list */ + } cmd; + oid_fill((void *)&cmd, sizeof(cmd), DN_CMD_DELETE, DN_API_VERSION); + cmd.oid.subtype = (do_pipe == 1) ? DN_LINK : + ( (do_pipe == 2) ? DN_FS : DN_SCH); + cmd.a[0] = i; + i = do_cmd(IP_DUMMYNET3, &cmd, cmd.oid.len); + if (i) { + i = 1; + warn("rule %u: setsockopt(IP_DUMMYNET_DEL)", i); + } + return i; +} + +/* + * Code to parse delay profiles. + * + * Some link types introduce extra delays in the transmission + * of a packet, e.g. because of MAC level framing, contention on + * the use of the channel, MAC level retransmissions and so on. + * From our point of view, the channel is effectively unavailable + * for this extra time, which is constant or variable depending + * on the link type. Additionally, packets may be dropped after this + * time (e.g. on a wireless link after too many retransmissions). + * We can model the additional delay with an empirical curve + * that represents its distribution. + * + * cumulative probability + * 1.0 ^ + * | + * L +-- loss-level x + * | ****** + * | * + * | ***** + * | * + * | ** + * | * + * +-------*-------------------> + * delay + * + * The empirical curve may have both vertical and horizontal lines. + * Vertical lines represent constant delay for a range of + * probabilities; horizontal lines correspond to a discontinuty + * in the delay distribution: the link will use the largest delay + * for a given probability. + * + * To pass the curve to dummynet, we must store the parameters + * in a file as described below, and issue the command + * + * ipfw pipe config ... bw XXX profile ... + * + * The file format is the following, with whitespace acting as + * a separator and '#' indicating the beginning a comment: + * + * samples N + * the number of samples used in the internal + * representation (2..1024; default 100); + * + * loss-level L + * The probability above which packets are lost. + * (0.0 <= L <= 1.0, default 1.0 i.e. no loss); + * + * name identifier + * Optional a name (listed by "ipfw pipe show") + * to identify the distribution; + * + * "delay prob" | "prob delay" + * One of these two lines is mandatory and defines + * the format of the following lines with data points. + * + * XXX YYY + * 2 or more lines representing points in the curve, + * with either delay or probability first, according + * to the chosen format. + * The unit for delay is milliseconds. + * + * Data points does not need to be ordered or equal to the number + * specified in the "samples" line. ipfw will sort and interpolate + * the curve as needed. + * + * Example of a profile file: + + name bla_bla_bla + samples 100 + loss-level 0.86 + prob delay + 0 200 # minimum overhead is 200ms + 0.5 200 + 0.5 300 + 0.8 1000 + 0.9 1300 + 1 1300 + + * Internally, we will convert the curve to a fixed number of + * samples, and when it is time to transmit a packet we will + * model the extra delay as extra bits in the packet. + * + */ + +#define ED_MAX_LINE_LEN 256+ED_MAX_NAME_LEN +#define ED_TOK_SAMPLES "samples" +#define ED_TOK_LOSS "loss-level" +#define ED_TOK_NAME "name" +#define ED_TOK_DELAY "delay" +#define ED_TOK_PROB "prob" +#define ED_TOK_BW "bw" +#define ED_SEPARATORS " \t\n" +#define ED_MIN_SAMPLES_NO 2 + +/* + * returns 1 if s is a non-negative number, with at least one '.' + */ +static int +is_valid_number(const char *s) +{ + int i, dots_found = 0; + int len = strlen(s); + + for (i = 0; i 1)) + return 0; + return 1; +} + +/* + * Take as input a string describing a bandwidth value + * and return the numeric bandwidth value. + * set clocking interface or bandwidth value + */ +static void +read_bandwidth(char *arg, int *bandwidth, char *if_name, int namelen) +{ + if (*bandwidth != -1) + warnx("duplicate token, override bandwidth value!"); + + if (arg[0] >= 'a' && arg[0] <= 'z') { + if (!if_name) { + errx(1, "no if support"); + } + if (namelen >= IFNAMSIZ) + warn("interface name truncated"); + namelen--; + /* interface name */ + strncpy(if_name, arg, namelen); + if_name[namelen] = '\0'; + *bandwidth = 0; + } else { /* read bandwidth value */ + int bw; + char *end = NULL; + + bw = strtoul(arg, &end, 0); + if (*end == 'K' || *end == 'k') { + end++; + bw *= 1000; + } else if (*end == 'M' || *end == 'm') { + end++; + bw *= 1000000; + } + if ((*end == 'B' && + _substrcmp2(end, "Bi", "Bit/s") != 0) || + _substrcmp2(end, "by", "bytes") == 0) + bw *= 8; + + if (bw < 0) + errx(EX_DATAERR, "bandwidth too large"); + + *bandwidth = bw; + if (if_name) + if_name[0] = '\0'; + } +} + +struct point { + double prob; + double delay; +}; + +static int +compare_points(const void *vp1, const void *vp2) +{ + const struct point *p1 = vp1; + const struct point *p2 = vp2; + double res = 0; + + res = p1->prob - p2->prob; + if (res == 0) + res = p1->delay - p2->delay; + if (res < 0) + return -1; + else if (res > 0) + return 1; + else + return 0; +} + +#define ED_EFMT(s) EX_DATAERR,"error in %s at line %d: "#s,filename,lineno + +/* + * Interpolate a set of proability-value tuples. + * + * This function takes as input a tuple of values + * and samples the interpolated curve described from the tuples. + * + * The user defined points are stored in the ponts structure. + * The number of points is stored in points_no. + * The user defined sampling value is stored in samples_no. + * The resulting samples are in the "samples" pointer. + * + * We assume that The last point for the '1' value of the + * probability should be defined. (XXX add checks for this) + * + * The input data are points and points_no. + * The output data are s (the array of s_no samples) + * and s_no (the number of samples) + * + */ +static void +interpolate_samples(struct point *p, int points_no, + int *samples, int samples_no, const char *filename) +{ + double dy; /* delta on the y axis */ + double y; /* current value of y */ + double x; /* current value of x */ + double m; /* the y slope */ + int i; /* samples index */ + int curr; /* points current index */ + + /* make sure that there are enough points. */ + /* XXX Duplicated should be removed */ + if (points_no < 3) + errx(EX_DATAERR, "%s too few samples, need at least %d", + filename, 3); + + qsort(p, points_no, sizeof(struct point), compare_points); + + dy = 1.0/samples_no; + y = 0; + + for (i=0, curr = 0; i < samples_no; i++, y+=dy) { + /* This statment move the curr pointer to the next point + * skipping the points with the same x value. We are + * guaranteed to exit from the loop because the + * last possible value of y is stricly less than 1 + * and the last possible value of the y points is 1 */ + while ( y >= p[curr+1].prob ) curr++; + + /* compute the slope of the curve */ + m = (p[curr+1].delay - p[curr].delay) / (p[curr+1].prob - p[curr].prob); + /* compute the x value starting from the current point */ + x = p[curr].delay + (y - p[curr].prob) * m; + samples[i] = x; + } + + /* add the last sample */ + samples[i] = p[curr+1].delay; +} + +/* + * p is the link (old pipe) + * pf is the profile + */ +static void +load_extra_delays(const char *filename, struct dn_profile *p, + struct dn_link *link) +{ + char line[ED_MAX_LINE_LEN]; + FILE *f; + int lineno = 0; + + int samples = -1; + double loss = -1.0; + char profile_name[ED_MAX_NAME_LEN]; + int delay_first = -1; + int do_points = 0; + struct point points[ED_MAX_SAMPLES_NO]; + int points_no = 0; + + /* XXX link never NULL? */ + p->link_nr = link->link_nr; + + profile_name[0] = '\0'; + f = fopen(filename, "r"); + if (f == NULL) + err(EX_UNAVAILABLE, "fopen: %s", filename); + + while (fgets(line, ED_MAX_LINE_LEN, f)) { /* read commands */ + char *s, *cur = line, *name = NULL, *arg = NULL; + + ++lineno; + + /* parse the line */ + while (cur) { + s = strsep(&cur, ED_SEPARATORS); + if (s == NULL || *s == '#') + break; + if (*s == '\0') + continue; + if (arg) + errx(ED_EFMT("too many arguments")); + if (name == NULL) + name = s; + else + arg = s; + } + + if ((name == NULL) || (*name == '#')) /* empty line */ + continue; + if (arg == NULL) + errx(ED_EFMT("missing arg for %s"), name); + + if (!strcasecmp(name, ED_TOK_SAMPLES)) { + if (samples > 0) + errx(ED_EFMT("duplicate ``samples'' line")); + if (atoi(arg) <=0) + errx(ED_EFMT("invalid number of samples")); + samples = atoi(arg); + if (samples>=ED_MAX_SAMPLES_NO-1) + errx(ED_EFMT("too many samples, maximum is %d"), + ED_MAX_SAMPLES_NO-1); + do_points = 0; + } else if (!strcasecmp(name, ED_TOK_BW)) { + char buf[IFNAMSIZ]; + read_bandwidth(arg, &link->bandwidth, buf, sizeof(buf)); + p->bandwidth = link->bandwidth; + } else if (!strcasecmp(name, ED_TOK_LOSS)) { + if (loss != -1.0) + errx(ED_EFMT("duplicated token: %s"), name); + if (!is_valid_number(arg)) + errx(ED_EFMT("invalid %s"), arg); + loss = atof(arg); + if (loss > 1) + errx(ED_EFMT("%s greater than 1.0"), name); + do_points = 0; + } else if (!strcasecmp(name, ED_TOK_NAME)) { + if (profile_name[0] != '\0') + errx(ED_EFMT("duplicated token: %s"), name); + strncpy(profile_name, arg, sizeof(profile_name) - 1); + profile_name[sizeof(profile_name)-1] = '\0'; + do_points = 0; + } else if (!strcasecmp(name, ED_TOK_DELAY)) { + if (do_points) + errx(ED_EFMT("duplicated token: %s"), name); + delay_first = 1; + do_points = 1; + } else if (!strcasecmp(name, ED_TOK_PROB)) { + if (do_points) + errx(ED_EFMT("duplicated token: %s"), name); + delay_first = 0; + do_points = 1; + } else if (do_points) { + if (!is_valid_number(name) || !is_valid_number(arg)) + errx(ED_EFMT("invalid point found")); + if (delay_first) { + points[points_no].delay = atof(name); + points[points_no].prob = atof(arg); + } else { + points[points_no].delay = atof(arg); + points[points_no].prob = atof(name); + } + if (points[points_no].prob > 1.0) + errx(ED_EFMT("probability greater than 1.0")); + ++points_no; + } else { + errx(ED_EFMT("unrecognised command '%s'"), name); + } + } + + fclose (f); + + if (samples == -1) { + warnx("'%s' not found, assuming 100", ED_TOK_SAMPLES); + samples = 100; + } + + if (loss == -1.0) { + warnx("'%s' not found, assuming no loss", ED_TOK_LOSS); + loss = 1; + } + + interpolate_samples(points, points_no, p->samples, samples, filename); + + p->samples_no = samples++; + p->loss_level = loss * samples; + strncpy(p->name, profile_name, sizeof(p->name)); +} + +/* + * configuration of pipes, schedulers, flowsets. + * When we configure a new scheduler, an empty pipe is created, so: + * + * do_pipe = 1 -> "pipe N config ..." only for backward compatibility + * sched N+Delta type fifo sched_mask ... + * pipe N+Delta + * flowset N+Delta pipe N+Delta (no parameters) + * sched N type wf2q+ sched_mask ... + * pipe N + * + * do_pipe = 2 -> flowset N config + * flowset N parameters + * + * do_pipe = 3 -> sched N config + * sched N parameters (default no pipe) + * optional Pipe N config ... + * pipe ==> + */ +void +ipfw_config_pipe(int ac, char **av) +{ + int i; + u_int j; + char *end; + void *par = NULL; + struct dn_id *buf, *base; + struct dn_sch *sch = NULL; + struct dn_link *p = NULL; + struct dn_fs *fs = NULL; + struct dn_profile *pf = NULL; + struct ipfw_flow_id *mask = NULL; + int lmax; + uint32_t _foo = 0, *flags = &_foo , *buckets = &_foo; + size_t max_pf_size = sizeof(struct dn_profile) + ED_MAX_SAMPLES_NO * sizeof(int); + + /* + * allocate space for 1 header, + * 1 scheduler, 1 link, 1 flowset, 1 profile + */ + lmax = sizeof(struct dn_id); /* command header */ + lmax += sizeof(struct dn_sch) + sizeof(struct dn_link) + + sizeof(struct dn_fs); + lmax += max_pf_size; + + av++; ac--; + /* Pipe number */ + if (ac && isdigit(**av)) { + i = atoi(*av); av++; ac--; + } else + i = -1; + if (i <= 0) + errx(EX_USAGE, "need a pipe/flowset/sched number"); + base = buf = safe_calloc(1, lmax); + /* all commands start with a 'CONFIGURE' and a version */ + o_next(&buf, sizeof(struct dn_id), DN_CMD_CONFIG); + base->id = DN_API_VERSION; + + switch (co.do_pipe) { + case 1: /* "pipe N config ..." */ + /* Allocate space for the WF2Q+ scheduler, its link + * and the FIFO flowset. Set the number, but leave + * the scheduler subtype and other parameters to 0 + * so the kernel will use appropriate defaults. + * XXX todo: add a flag to record if a parameter + * is actually configured. + * If we do a 'pipe config' mask -> sched_mask. + * The FIFO scheduler and link are derived from the + * WF2Q+ one in the kernel. + */ + sch = o_next(&buf, sizeof(*sch), DN_SCH); + p = o_next(&buf, sizeof(*p), DN_LINK); + fs = o_next(&buf, sizeof(*fs), DN_FS); + + sch->sched_nr = i; + sch->oid.subtype = 0; /* defaults to WF2Q+ */ + mask = &sch->sched_mask; + flags = &sch->flags; + buckets = &sch->buckets; + *flags |= DN_PIPE_CMD; + + p->link_nr = i; + + /* This flowset is only for the FIFO scheduler */ + fs->fs_nr = i + 2*DN_MAX_ID; + fs->sched_nr = i + DN_MAX_ID; + break; + + case 2: /* "queue N config ... " */ + fs = o_next(&buf, sizeof(*fs), DN_FS); + fs->fs_nr = i; + mask = &fs->flow_mask; + flags = &fs->flags; + buckets = &fs->buckets; + break; + + case 3: /* "sched N config ..." */ + sch = o_next(&buf, sizeof(*sch), DN_SCH); + fs = o_next(&buf, sizeof(*fs), DN_FS); + sch->sched_nr = i; + mask = &sch->sched_mask; + flags = &sch->flags; + buckets = &sch->buckets; + /* fs is used only with !MULTIQUEUE schedulers */ + fs->fs_nr = i + DN_MAX_ID; + fs->sched_nr = i; + break; + } + /* set to -1 those fields for which we want to reuse existing + * values from the kernel. + * Also, *_nr and subtype = 0 mean reuse the value from the kernel. + * XXX todo: support reuse of the mask. + */ + if (p) + p->bandwidth = -1; + for (j = 0; j < sizeof(fs->par)/sizeof(fs->par[0]); j++) + fs->par[j] = -1; + while (ac > 0) { + double d; + int tok = match_token(dummynet_params, *av); + ac--; av++; + + switch(tok) { + case TOK_NOERROR: + NEED(fs, "noerror is only for pipes"); + fs->flags |= DN_NOERROR; + break; + + case TOK_PLR: + NEED(fs, "plr is only for pipes"); + NEED1("plr needs argument 0..1\n"); + d = strtod(av[0], NULL); + if (d > 1) + d = 1; + else if (d < 0) + d = 0; + fs->plr = (int)(d*0x7fffffff); + ac--; av++; + break; + + case TOK_QUEUE: + NEED(fs, "queue is only for pipes or flowsets"); + NEED1("queue needs queue size\n"); + end = NULL; + fs->qsize = strtoul(av[0], &end, 0); + if (*end == 'K' || *end == 'k') { + fs->flags |= DN_QSIZE_BYTES; + fs->qsize *= 1024; + } else if (*end == 'B' || + _substrcmp2(end, "by", "bytes") == 0) { + fs->flags |= DN_QSIZE_BYTES; + } + ac--; av++; + break; + + case TOK_BUCKETS: + NEED(fs, "buckets is only for pipes or flowsets"); + NEED1("buckets needs argument\n"); + *buckets = strtoul(av[0], NULL, 0); + ac--; av++; + break; + + case TOK_FLOW_MASK: + case TOK_SCHED_MASK: + case TOK_MASK: + NEED(mask, "tok_mask"); + NEED1("mask needs mask specifier\n"); + /* + * per-flow queue, mask is dst_ip, dst_port, + * src_ip, src_port, proto measured in bits + */ + par = NULL; + + bzero(mask, sizeof(*mask)); + end = NULL; + + while (ac >= 1) { + uint32_t *p32 = NULL; + uint16_t *p16 = NULL; + uint32_t *p20 = NULL; + struct in6_addr *pa6 = NULL; + uint32_t a; + + tok = match_token(dummynet_params, *av); + ac--; av++; + switch(tok) { + case TOK_ALL: + /* + * special case, all bits significant + * except 'extra' (the queue number) + */ + mask->dst_ip = ~0; + mask->src_ip = ~0; + mask->dst_port = ~0; + mask->src_port = ~0; + mask->proto = ~0; + n2mask(&mask->dst_ip6, 128); + n2mask(&mask->src_ip6, 128); + mask->flow_id6 = ~0; + *flags |= DN_HAVE_MASK; + goto end_mask; + + case TOK_QUEUE: + mask->extra = ~0; + *flags |= DN_HAVE_MASK; + goto end_mask; + + case TOK_DSTIP: + mask->addr_type = 4; + p32 = &mask->dst_ip; + break; + + case TOK_SRCIP: + mask->addr_type = 4; + p32 = &mask->src_ip; + break; + + case TOK_DSTIP6: + mask->addr_type = 6; + pa6 = &mask->dst_ip6; + break; + + case TOK_SRCIP6: + mask->addr_type = 6; + pa6 = &mask->src_ip6; + break; + + case TOK_FLOWID: + mask->addr_type = 6; + p20 = &mask->flow_id6; + break; + + case TOK_DSTPORT: + p16 = &mask->dst_port; + break; + + case TOK_SRCPORT: + p16 = &mask->src_port; + break; + + case TOK_PROTO: + break; + + default: + ac++; av--; /* backtrack */ + goto end_mask; + } + if (ac < 1) + errx(EX_USAGE, "mask: value missing"); + if (*av[0] == '/') { + a = strtoul(av[0]+1, &end, 0); + if (pa6 == NULL) + a = (a == 32) ? ~0 : (1 << a) - 1; + } else + a = strtoul(av[0], &end, 0); + if (p32 != NULL) + *p32 = a; + else if (p16 != NULL) { + if (a > 0xFFFF) + errx(EX_DATAERR, + "port mask must be 16 bit"); + *p16 = (uint16_t)a; + } else if (p20 != NULL) { + if (a > 0xfffff) + errx(EX_DATAERR, + "flow_id mask must be 20 bit"); + *p20 = (uint32_t)a; + } else if (pa6 != NULL) { + if (a > 128) + errx(EX_DATAERR, + "in6addr invalid mask len"); + else + n2mask(pa6, a); + } else { + if (a > 0xFF) + errx(EX_DATAERR, + "proto mask must be 8 bit"); + mask->proto = (uint8_t)a; + } + if (a != 0) + *flags |= DN_HAVE_MASK; + ac--; av++; + } /* end while, config masks */ +end_mask: + break; + + case TOK_RED: + case TOK_GRED: + NEED1("red/gred needs w_q/min_th/max_th/max_p\n"); + fs->flags |= DN_IS_RED; + if (tok == TOK_GRED) + fs->flags |= DN_IS_GENTLE_RED; + /* + * the format for parameters is w_q/min_th/max_th/max_p + */ + if ((end = strsep(&av[0], "/"))) { + double w_q = strtod(end, NULL); + if (w_q > 1 || w_q <= 0) + errx(EX_DATAERR, "0 < w_q <= 1"); + fs->w_q = (int) (w_q * (1 << SCALE_RED)); + } + if ((end = strsep(&av[0], "/"))) { + fs->min_th = strtoul(end, &end, 0); + if (*end == 'K' || *end == 'k') + fs->min_th *= 1024; + } + if ((end = strsep(&av[0], "/"))) { + fs->max_th = strtoul(end, &end, 0); + if (*end == 'K' || *end == 'k') + fs->max_th *= 1024; + } + if ((end = strsep(&av[0], "/"))) { + double max_p = strtod(end, NULL); + if (max_p > 1 || max_p <= 0) + errx(EX_DATAERR, "0 < max_p <= 1"); + fs->max_p = (int)(max_p * (1 << SCALE_RED)); + } + ac--; av++; + break; + + case TOK_DROPTAIL: + NEED(fs, "droptail is only for flowsets"); + fs->flags &= ~(DN_IS_RED|DN_IS_GENTLE_RED); + break; + + case TOK_BW: + NEED(p, "bw is only for links"); + NEED1("bw needs bandwidth or interface\n"); + read_bandwidth(av[0], &p->bandwidth, NULL, 0); + ac--; av++; + break; + + case TOK_DELAY: + NEED(p, "delay is only for links"); + NEED1("delay needs argument 0..10000ms\n"); + p->delay = strtoul(av[0], NULL, 0); + ac--; av++; + break; + + case TOK_TYPE: { + int l; + NEED(sch, "type is only for schedulers"); + NEED1("type needs a string"); + l = strlen(av[0]); + if (l == 0 || l > 15) + errx(1, "type %s too long\n", av[0]); + strcpy(sch->name, av[0]); + sch->oid.subtype = 0; /* use string */ + ac--; av++; + break; + } + + case TOK_WEIGHT: + NEED(fs, "weight is only for flowsets"); + NEED1("weight needs argument\n"); + fs->par[0] = strtol(av[0], &end, 0); + ac--; av++; + break; + + case TOK_LMAX: + NEED(fs, "lmax is only for flowsets"); + NEED1("lmax needs argument\n"); + fs->par[1] = strtol(av[0], &end, 0); + ac--; av++; + break; + + case TOK_PRI: + NEED(fs, "priority is only for flowsets"); + NEED1("priority needs argument\n"); + fs->par[2] = strtol(av[0], &end, 0); + ac--; av++; + break; + + case TOK_SCHED: + case TOK_PIPE: + NEED(fs, "pipe/sched"); + NEED1("pipe/link/sched needs number\n"); + fs->sched_nr = strtoul(av[0], &end, 0); + ac--; av++; + break; + + case TOK_PROFILE: + { + size_t real_length; + + NEED((!pf), "profile already set"); + NEED(p, "profile"); + NEED1("extra delay needs the file name\n"); + + /* load the profile structure using the DN_API */ + pf = o_next(&buf, max_pf_size, DN_PROFILE); + load_extra_delays(av[0], pf, p); //XXX can't fail? + + /* compact the dn_id structure */ + real_length = sizeof(struct dn_profile) + + pf->samples_no * sizeof(int); + o_compact(&buf, max_pf_size, real_length, DN_PROFILE); + --ac; ++av; + } + break; + + case TOK_BURST: + NEED(p, "burst"); + NEED1("burst needs argument\n"); + errno = 0; + if (expand_number(av[0], (int64_t *)&p->burst) < 0) + if (errno != ERANGE) + errx(EX_DATAERR, + "burst: invalid argument"); + if (errno || p->burst > (1ULL << 48) - 1) + errx(EX_DATAERR, + "burst: out of range (0..2^48-1)"); + ac--; av++; + break; + + default: + errx(EX_DATAERR, "unrecognised option ``%s''", av[-1]); + } + } + + /* check validity of parameters */ + if (p) { + if (p->delay > 10000) + errx(EX_DATAERR, "delay must be < 10000"); + if (p->bandwidth == -1) + p->bandwidth = 0; + } + if (fs) { + /* XXX accept a 0 scheduler to keep the default */ + if (fs->flags & DN_QSIZE_BYTES) { + size_t len; + long limit; + + len = sizeof(limit); + if (sysctlbyname("net.inet.ip.dummynet.pipe_byte_limit", + &limit, &len, NULL, 0) == -1) + limit = 1024*1024; + if (fs->qsize > limit) + errx(EX_DATAERR, "queue size must be < %ldB", limit); + } else { + size_t len; + long limit; + + len = sizeof(limit); + if (sysctlbyname("net.inet.ip.dummynet.pipe_slot_limit", + &limit, &len, NULL, 0) == -1) + limit = 100; + if (fs->qsize > limit) + errx(EX_DATAERR, "2 <= queue size <= %ld", limit); + } + + if (fs->flags & DN_IS_RED) { + size_t len; + int lookup_depth, avg_pkt_size; + double w_q; + + if (fs->min_th >= fs->max_th) + errx(EX_DATAERR, "min_th %d must be < than max_th %d", + fs->min_th, fs->max_th); + if (fs->max_th == 0) + errx(EX_DATAERR, "max_th must be > 0"); + + len = sizeof(int); + if (sysctlbyname("net.inet.ip.dummynet.red_lookup_depth", + &lookup_depth, &len, NULL, 0) == -1) + lookup_depth = 256; + if (lookup_depth == 0) + errx(EX_DATAERR, "net.inet.ip.dummynet.red_lookup_depth" + " must be greater than zero"); + + len = sizeof(int); + if (sysctlbyname("net.inet.ip.dummynet.red_avg_pkt_size", + &avg_pkt_size, &len, NULL, 0) == -1) + avg_pkt_size = 512; + + if (avg_pkt_size == 0) + errx(EX_DATAERR, + "net.inet.ip.dummynet.red_avg_pkt_size must" + " be greater than zero"); + + /* + * Ticks needed for sending a medium-sized packet. + * Unfortunately, when we are configuring a WF2Q+ queue, we + * do not have bandwidth information, because that is stored + * in the parent pipe, and also we have multiple queues + * competing for it. So we set s=0, which is not very + * correct. But on the other hand, why do we want RED with + * WF2Q+ ? + */ +#if 0 + if (p.bandwidth==0) /* this is a WF2Q+ queue */ + s = 0; + else + s = (double)ck.hz * avg_pkt_size * 8 / p.bandwidth; +#endif + /* + * max idle time (in ticks) before avg queue size becomes 0. + * NOTA: (3/w_q) is approx the value x so that + * (1-w_q)^x < 10^-3. + */ + w_q = ((double)fs->w_q) / (1 << SCALE_RED); +#if 0 // go in kernel + idle = s * 3. / w_q; + fs->lookup_step = (int)idle / lookup_depth; + if (!fs->lookup_step) + fs->lookup_step = 1; + weight = 1 - w_q; + for (t = fs->lookup_step; t > 1; --t) + weight *= 1 - w_q; + fs->lookup_weight = (int)(weight * (1 << SCALE_RED)); +#endif /* code moved in the kernel */ + } + } + + i = do_cmd(IP_DUMMYNET3, base, (char *)buf - (char *)base); + + if (i) + err(1, "setsockopt(%s)", "IP_DUMMYNET_CONFIGURE"); +} + +void +dummynet_flush(void) +{ + struct dn_id oid; + oid_fill(&oid, sizeof(oid), DN_CMD_FLUSH, DN_API_VERSION); + do_cmd(IP_DUMMYNET3, &oid, oid.len); +} + +/* Parse input for 'ipfw [pipe|sched|queue] show [range list]' + * Returns the number of ranges, and possibly stores them + * in the array v of size len. + */ +static int +parse_range(int ac, char *av[], uint32_t *v, int len) +{ + int n = 0; + char *endptr, *s; + uint32_t base[2]; + + if (v == NULL || len < 2) { + v = base; + len = 2; + } + + for (s = *av; s != NULL; av++, ac--) { + v[0] = strtoul(s, &endptr, 10); + v[1] = (*endptr != '-') ? v[0] : + strtoul(endptr+1, &endptr, 10); + if (*endptr == '\0') { /* prepare for next round */ + s = (ac > 0) ? *(av+1) : NULL; + } else { + if (*endptr != ',') { + warn("invalid number: %s", s); + s = ++endptr; + continue; + } + /* continue processing from here */ + s = ++endptr; + ac++; + av--; + } + if (v[1] < v[0] || + v[1] >= DN_MAX_ID-1 || + v[1] >= DN_MAX_ID-1) { + continue; /* invalid entry */ + } + n++; + /* translate if 'pipe list' */ + if (co.do_pipe == 1) { + v[0] += DN_MAX_ID; + v[1] += DN_MAX_ID; + } + v = (n*2 < len) ? v + 2 : base; + } + return n; +} + +/* main entry point for dummynet list functions. co.do_pipe indicates + * which function we want to support. + * av may contain filtering arguments, either individual entries + * or ranges, or lists (space or commas are valid separators). + * Format for a range can be n1-n2 or n3 n4 n5 ... + * In a range n1 must be <= n2, otherwise the range is ignored. + * A number 'n4' is translate in a range 'n4-n4' + * All number must be > 0 and < DN_MAX_ID-1 + */ +void +dummynet_list(int ac, char *av[], int show_counters) +{ + struct dn_id *oid, *x = NULL; + int ret, i; + int n; /* # of ranges */ + u_int buflen, l; + u_int max_size; /* largest obj passed up */ + + (void)show_counters; // XXX unused, but we should use it. + ac--; + av++; /* skip 'list' | 'show' word */ + + n = parse_range(ac, av, NULL, 0); /* Count # of ranges. */ + + /* Allocate space to store ranges */ + l = sizeof(*oid) + sizeof(uint32_t) * n * 2; + oid = safe_calloc(1, l); + oid_fill(oid, l, DN_CMD_GET, DN_API_VERSION); + + if (n > 0) /* store ranges in idx */ + parse_range(ac, av, (uint32_t *)(oid + 1), n*2); + /* + * Compute the size of the largest object returned. If the + * response leaves at least this much spare space in the + * buffer, then surely the response is complete; otherwise + * there might be a risk of truncation and we will need to + * retry with a larger buffer. + * XXX don't bother with smaller structs. + */ + max_size = sizeof(struct dn_fs); + if (max_size < sizeof(struct dn_sch)) + max_size = sizeof(struct dn_sch); + if (max_size < sizeof(struct dn_flow)) + max_size = sizeof(struct dn_flow); + + switch (co.do_pipe) { + case 1: + oid->subtype = DN_LINK; /* list pipe */ + break; + case 2: + oid->subtype = DN_FS; /* list queue */ + break; + case 3: + oid->subtype = DN_SCH; /* list sched */ + break; + } + + /* + * Ask the kernel an estimate of the required space (result + * in oid.id), unless we are requesting a subset of objects, + * in which case the kernel does not give an exact answer. + * In any case, space might grow in the meantime due to the + * creation of new queues, so we must be prepared to retry. + */ + if (n > 0) { + buflen = 4*1024; + } else { + ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); + if (ret != 0 || oid->id <= sizeof(*oid)) + goto done; + buflen = oid->id + max_size; + oid->len = sizeof(*oid); /* restore */ + } + /* Try a few times, until the buffer fits */ + for (i = 0; i < 20; i++) { + l = buflen; + x = safe_realloc(x, l); + bcopy(oid, x, oid->len); + ret = do_cmd(-IP_DUMMYNET3, x, (uintptr_t)&l); + if (ret != 0 || x->id <= sizeof(*oid)) + goto done; /* no response */ + if (l + max_size <= buflen) + break; /* ok */ + buflen *= 2; /* double for next attempt */ + } + list_pipes(x, O_NEXT(x, l)); +done: + if (x) + free(x); + free(oid); +} diff --git a/ipfw/expand_number.c b/ipfw/expand_number.c new file mode 100644 index 0000000..d557111 --- /dev/null +++ b/ipfw/expand_number.c @@ -0,0 +1,100 @@ +/*- + * Copyright (c) 2007 Eric Anderson + * Copyright (c) 2007 Pawel Jakub Dawidek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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. + */ + +// #include +__FBSDID("$FreeBSD: src/lib/libutil/expand_number.c,v 1.2.4.2 2009/06/10 14:52:34 des Exp $"); + +#include +#include +#include +#include +//#include +#include + +/* + * Convert an expression of the following forms to a int64_t. + * 1) A positive decimal number. + * 2) A positive decimal number followed by a 'b' or 'B' (mult by 1). + * 3) A positive decimal number followed by a 'k' or 'K' (mult by 1 << 10). + * 4) A positive decimal number followed by a 'm' or 'M' (mult by 1 << 20). + * 5) A positive decimal number followed by a 'g' or 'G' (mult by 1 << 30). + * 6) A positive decimal number followed by a 't' or 'T' (mult by 1 << 40). + * 7) A positive decimal number followed by a 'p' or 'P' (mult by 1 << 50). + * 8) A positive decimal number followed by a 'e' or 'E' (mult by 1 << 60). + */ +int +expand_number(const char *buf, int64_t *num) +{ + static const char unit[] = "bkmgtpe"; + char *endptr, s; + int64_t number; + int i; + + number = strtoimax(buf, &endptr, 0); + + if (endptr == buf) { + /* No valid digits. */ + errno = EINVAL; + return (-1); + } + + if (*endptr == '\0') { + /* No unit. */ + *num = number; + return (0); + } + + s = tolower(*endptr); + switch (s) { + case 'b': + case 'k': + case 'm': + case 'g': + case 't': + case 'p': + case 'e': + break; + default: + /* Unrecognized unit. */ + errno = EINVAL; + return (-1); + } + + for (i = 0; unit[i] != '\0'; i++) { + if (s == unit[i]) + break; + if ((number < 0 && (number << 10) > number) || + (number >= 0 && (number << 10) < number)) { + errno = ERANGE; + return (-1); + } + number <<= 10; + } + + *num = number; + return (0); +} diff --git a/ipfw/glue.c b/ipfw/glue.c new file mode 100644 index 0000000..a3ef641 --- /dev/null +++ b/ipfw/glue.c @@ -0,0 +1,852 @@ +/* + * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: glue.c 12264 2013-04-27 20:21:06Z luigi $ + * + * Userland functions missing in linux/Windows + */ + +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#endif /* _WIN32 */ + +#ifndef HAVE_NAT +/* dummy nat functions */ +void +ipfw_show_nat(int ac, char **av) +{ + fprintf(stderr, "%s unsupported\n", __FUNCTION__); +} + +void +ipfw_config_nat(int ac, char **av) +{ + fprintf(stderr, "%s unsupported\n", __FUNCTION__); +} +#endif + +#ifdef __linux__ +int optreset; /* missing in linux */ +#endif + +/* + * not implemented in linux. + * taken from /usr/src/lib/libc/string/strlcpy.c + */ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + + +/* missing in linux and windows */ +long long int +strtonum(const char *nptr, long long minval, long long maxval, + const char **errstr) +{ + long long ret; + int errno_c = errno; /* save actual errno */ + + errno = 0; +#ifdef TCC + ret = strtol(nptr, (char **)errstr, 0); +#else + ret = strtoll(nptr, (char **)errstr, 0); +#endif + /* We accept only a string that represent exactly a number (ie. start + * and end with a digit). + * FreeBSD version wants errstr==NULL if no error occurs, otherwise + * errstr should point to an error string. + * For our purspose, we implement only the invalid error, ranges + * error aren't checked + */ + if (errno != 0 || nptr == *errstr || **errstr != '\0') + *errstr = "invalid"; + else { + *errstr = NULL; + errno = errno_c; + } + return ret; +} + +#if defined (_WIN32) || defined (EMULATE_SYSCTL) +//XXX missing prerequisites +#include //openwrt +#include //openwrt +#include +#include +#endif + +/* + * set or get system information + * XXX lock acquisition/serialize calls + * + * we export this as sys/module/ipfw_mod/parameters/___ + * This function get or/and set the value of the sysctl passed by + * the name parameter. If the old value is not desired, + * oldp and oldlenp should be set to NULL. + * + * XXX + * I do not know how this works in FreeBSD in the case + * where there are no write permission on the sysctl var. + * We read the value and set return variables in any way + * but returns -1 on write failures, regardless the + * read success. + * + * Since there is no information on types, in the following + * code we assume a length of 4 is a int. + * + * Returns 0 on success, -1 on errors. + */ +int +sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, + size_t newlen) +{ +#if defined (_WIN32) || defined (EMULATE_SYSCTL) + /* + * we embed the sysctl request in the usual sockopt mechanics. + * the sockopt buffer il filled with a dn_id with IP_DUMMYNET3 + * command, and the special DN_SYSCTL_GET and DN_SYSCTL_SET + * subcommands. + * the syntax of this function is fully compatible with + * POSIX sysctlby name: + * if newp and newlen are != 0 => this is a set + * else if oldp and oldlen are != 0 => this is a get + * to avoid too much overhead in the module, the whole + * sysctltable is returned, and the parsing is done in userland, + * a probe request is done to retrieve the size needed to + * transfer the table, before the real request + * if both old and new params = 0 => this is a print + * this is a special request, done only by main() + * to implement the extension './ipfw sysctl', + * a command that bypasses the normal getopt, and that + * is available on those platforms that use this + * sysctl emulation. + * in this case, a negative oldlen signals that *oldp + * is actually a FILE* to print somewhere else than stdout + */ + + int l; + int ret; + struct dn_id* oid; + struct sysctlhead* entry; + char* pstring; + char* pdata; + FILE* fp; + + if((oldlenp != NULL) && (*oldlenp < 0)) + fp = (FILE*)oldp; + else + fp = stdout; + if(newp != NULL && newlen != 0) + { + //this is a set + l = sizeof(struct dn_id) + sizeof(struct sysctlhead) + strlen(name)+1 + newlen; + oid = malloc(l); + if (oid == NULL) + return -1; + oid->len = l; + oid->type = DN_SYSCTL_SET; + oid->id = DN_API_VERSION; + + entry = (struct sysctlhead*)(oid+1); + pdata = (char*)(entry+1); + pstring = pdata + newlen; + + entry->blocklen = ((sizeof(struct sysctlhead) + strlen(name)+1 + newlen) + 3) & ~3; + entry->namelen = strlen(name)+1; + entry->flags = 0; + entry->datalen = newlen; + + bcopy(newp, pdata, newlen); + bcopy(name, pstring, strlen(name)+1); + + ret = do_cmd(IP_DUMMYNET3, oid, (uintptr_t)l); + if (ret != 0) + return -1; + } + else + { + //this is a get or a print + l = sizeof(struct dn_id); + oid = malloc(l); + if (oid == NULL) + return -1; + oid->len = l; + oid->type = DN_SYSCTL_GET; + oid->id = DN_API_VERSION; + + ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); + if (ret != 0) + return -1; + + l=oid->id; + free(oid); + oid = malloc(l); + if (oid == NULL) + return -1; + oid->len = l; + oid->type = DN_SYSCTL_GET; + oid->id = DN_API_VERSION; + + ret = do_cmd(-IP_DUMMYNET3, oid, (uintptr_t)&l); + if (ret != 0) + return -1; + + entry = (struct sysctlhead*)(oid+1); + while(entry->blocklen != 0) + { + pdata = (char*)(entry+1); + pstring = pdata+entry->datalen; + + //time to check if this is a get or a print + if(name != NULL && oldp != NULL && *oldlenp > 0) + { + //this is a get + if(strcmp(name,pstring) == 0) + { + //match found, sanity chech on len + if(*oldlenp < entry->datalen) + { + printf("%s error: buffer too small\n",__FUNCTION__); + return -1; + } + *oldlenp = entry->datalen; + bcopy(pdata, oldp, *oldlenp); + return 0; + } + } + else + { + //this is a print + if( name == NULL ) + goto print; + if ( (strncmp(pstring,name,strlen(name)) == 0) && ( pstring[strlen(name)]=='\0' || pstring[strlen(name)]=='.' ) ) + goto print; + else + goto skip; +print: + fprintf(fp, "%s: ",pstring); + switch( entry->flags >> 2 ) + { + case SYSCTLTYPE_LONG: + fprintf(fp, "%li ", *(long*)(pdata)); + break; + case SYSCTLTYPE_UINT: + fprintf(fp, "%u ", *(unsigned int*)(pdata)); + break; + case SYSCTLTYPE_ULONG: + fprintf(fp, "%lu ", *(unsigned long*)(pdata)); + break; + case SYSCTLTYPE_INT: + default: + fprintf(fp, "%i ", *(int*)(pdata)); + } + if( (entry->flags & 0x00000003) == CTLFLAG_RD ) + fprintf(fp, "\t(read only)\n"); + else + fprintf(fp, "\n"); +skip: ; + } + entry = (struct sysctlhead*)((unsigned char*)entry + entry->blocklen); + } + free(oid); + return 0; + } + //fallback for invalid options + return -1; + +#else /* __linux__ */ + FILE *fp; + char *basename = "/sys/module/ipfw_mod/parameters/"; + char filename[256]; /* full filename */ + char *varp; + int ret = 0; /* return value */ + long d; + + if (name == NULL) /* XXX set errno */ + return -1; + + /* locate the filename */ + varp = strrchr(name, '.'); + if (varp == NULL) /* XXX set errno */ + return -1; + + snprintf(filename, sizeof(filename), "%s%s", basename, varp+1); + + /* + * XXX we could open the file here, in rw mode + * but need to check if a file have write + * permissions. + */ + + /* check parameters */ + if (oldp && oldlenp) { /* read mode */ + fp = fopen(filename, "r"); + if (fp == NULL) { + fprintf(stderr, "%s fopen error reading filename %s\n", __FUNCTION__, filename); + return -1; + } + if (fscanf(fp, "%ld", &d) != 1) { + ret = -1; + } else if (*oldlenp == sizeof(int)) { + int dst = d; + memcpy(oldp, &dst, *oldlenp); + } else if (*oldlenp == sizeof(long)) { + memcpy(oldp, &d, *oldlenp); + } else { + fprintf(stderr, "unknown paramerer len %d\n", + (int)*oldlenp); + } + fclose(fp); + } + + if (newp && newlen) { /* write */ + fp = fopen(filename, "w"); + if (fp == NULL) { + fprintf(stderr, "%s fopen error writing filename %s\n", __FUNCTION__, filename); + return -1; + } + if (newlen == sizeof(int)) { + if (fprintf(fp, "%d", *(int *)newp) < 1) + ret = -1; + } else if (newlen == sizeof(long)) { + if (fprintf(fp, "%ld", *(long *)newp) < 1) + ret = -1; + } else { + fprintf(stderr, "unknown paramerer len %d\n", + (int)newlen); + } + + fclose(fp); + } + + return ret; +#endif /* __linux__ */ +} + +#ifdef _WIN32 +/* + * On windows, set/getsockopt are mapped to DeviceIoControl() + */ +int +wnd_setsockopt(int s, int level, int sopt_name, const void *optval, + socklen_t optlen) +{ + size_t len = sizeof (struct sockopt) + optlen; + struct sockopt *sock; + DWORD n; + BOOL result; + HANDLE _dev_h = (HANDLE)s; + + /* allocate a data structure for communication */ + sock = malloc(len); + if (sock == NULL) + return -1; + + sock->sopt_dir = SOPT_SET; + sock->sopt_name = sopt_name; + sock->sopt_valsize = optlen; + sock->sopt_val = (void *)(sock+1); + + memcpy(sock->sopt_val, optval, optlen); + result = DeviceIoControl (_dev_h, IP_FW_SETSOCKOPT, sock, len, + NULL, 0, &n, NULL); + free (sock); + + return (result ? 0 : -1); +} + +int +wnd_getsockopt(int s, int level, int sopt_name, void *optval, + socklen_t *optlen) +{ + size_t len = sizeof (struct sockopt) + *optlen; + struct sockopt *sock; + DWORD n; + BOOL result; + HANDLE _dev_h = (HANDLE)s; + + sock = malloc(len); + if (sock == NULL) + return -1; + + sock->sopt_dir = SOPT_GET; + sock->sopt_name = sopt_name; + sock->sopt_valsize = *optlen; + sock->sopt_val = (void *)(sock+1); + + memcpy (sock->sopt_val, optval, *optlen); + + result = DeviceIoControl (_dev_h, IP_FW_GETSOCKOPT, sock, len, + sock, len, &n, NULL); + //printf("len = %i, returned = %u, valsize = %i\n",len,n,sock->sopt_valsize); + *optlen = sock->sopt_valsize; + memcpy (optval, sock->sopt_val, *optlen); + free (sock); + return (result ? 0 : -1); +} + +int +my_socket(int domain, int ty, int proto) +{ + TCHAR *pcCommPort = TEXT("\\\\.\\Ipfw"); + HANDLE _dev_h = INVALID_HANDLE_VALUE; + + /* Special Handling For Accessing Device On Windows 2000 Terminal Server + See Microsoft KB Article 259131 */ + if (_dev_h == INVALID_HANDLE_VALUE) { + _dev_h = CreateFile (pcCommPort, + GENERIC_READ | GENERIC_WRITE, + 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + } + if (_dev_h == INVALID_HANDLE_VALUE) { + printf("%s failed %u, cannot talk to kernel module\n", + __FUNCTION__, (unsigned)GetLastError()); + return -1; + } + return (int)_dev_h; +} + +struct hostent* gethostbyname2(const char *name, int af) +{ + return gethostbyname(name); +} + +struct ether_addr* ether_aton(const char *a) +{ + fprintf(stderr, "%s empty\n", __FUNCTION__); + return NULL; +} + +#ifdef TCC +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +#define PROGNAME "ipfw" +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(nargc, nargv, ostr) + int nargc; + char * const nargv[]; + const char *ostr; +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || *place == 0) { /* update scanning pointer */ + optreset = 0; + place = nargv[optind]; + if (optind >= nargc || *place++ != '-') { + /* Argument is absent or is not an option */ + place = EMSG; + return (-1); + } + optopt = *place++; + if (optopt == '-' && *place == 0) { + /* "--" => end of options */ + ++optind; + place = EMSG; + return (-1); + } + if (optopt == 0) { + /* Solitary '-', treat as a '-' option + if the program (eg su) is looking for it. */ + place = EMSG; + if (strchr(ostr, '-') == NULL) + return (-1); + optopt = '-'; + } + } else + optopt = *place++; + + /* See if option letter is one the caller wanted... */ + if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { + if (*place == 0) + ++optind; + if (opterr && *ostr != ':') + (void)fprintf(stderr, + "%s: illegal option -- %c\n", PROGNAME, + optopt); + return (BADCH); + } + + /* Does this option need an argument? */ + if (oli[1] != ':') { + /* don't need argument */ + optarg = NULL; + if (*place == 0) + ++optind; + } else { + /* Option-argument is either the rest of this argument or the + entire next argument. */ + if (*place) + optarg = place; + else if (nargc > ++optind) + optarg = nargv[optind]; + else { + /* option-argument absent */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void)fprintf(stderr, + "%s: option requires an argument -- %c\n", + PROGNAME, optopt); + return (BADCH); + } + place = EMSG; + ++optind; + } + return (optopt); /* return option letter */ +} + +//static FILE *err_file = stderr; +void +verrx(int ex, int eval, const char *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", PROGNAME); + if (fmt != NULL) + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + if (ex) + exit(eval); +} +void +errx(int eval, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrx(1, eval, fmt, ap); + va_end(ap); +} + +void +warnx(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrx(0, 0, fmt, ap); + va_end(ap); +} + +char * +strsep(char **stringp, const char *delim) +{ + char *s; + const char *spanp; + int c, sc; + char *tok; + + if ((s = *stringp) == NULL) + return (NULL); + for (tok = s;;) { + c = *s++; + spanp = delim; + do { + if ((sc = *spanp++) == c) { + if (c == 0) + s = NULL; + else + s[-1] = 0; + *stringp = s; + return (tok); + } + } while (sc != 0); + } + /* NOTREACHED */ +} + +static unsigned char +tolower(unsigned char c) +{ + return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c; +} + +static int isdigit(unsigned char c) +{ + return (c >= '0' && c <= '9'); +} + +static int isxdigit(unsigned char c) +{ + return (strchr("0123456789ABCDEFabcdef", c) ? 1 : 0); +} + +static int isspace(unsigned char c) +{ + return (strchr(" \t\n\r", c) ? 1 : 0); +} + +static int isascii(unsigned char c) +{ + return (c < 128); +} + +static int islower(unsigned char c) +{ + return (c >= 'a' && c <= 'z'); +} + +int +strcasecmp(const char *s1, const char *s2) +{ + const unsigned char + *us1 = (const unsigned char *)s1, + *us2 = (const unsigned char *)s2; + + while (tolower(*us1) == tolower(*us2++)) + if (*us1++ == '\0') + return (0); + return (tolower(*us1) - tolower(*--us2)); +} + +intmax_t +strtoimax(const char * restrict nptr, char ** restrict endptr, int base) +{ + return strtol(nptr, endptr,base); +} + +void +setservent(int a) +{ +} + +#define NS_INADDRSZ 128 + +int +inet_pton(int af, const char *src, void *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + u_char tmp[NS_INADDRSZ], *tp; + + if (af != AF_INET) { + errno = EINVAL; + return -1; + } + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + u_int new = *tp * 10 + (pch - digits); + + if (saw_digit && *tp == 0) + return (0); + if (new > 255) + return (0); + *tp = new; + if (!saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + memcpy(dst, tmp, NS_INADDRSZ); + return (1); +} + +const char * +inet_ntop(int af, const void *_src, char *dst, socklen_t size) +{ + static const char fmt[] = "%u.%u.%u.%u"; + char tmp[sizeof "255.255.255.255"]; + const u_char *src = _src; + int l; + if (af != AF_INET) { + errno = EINVAL; + return NULL; + } + + l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); + if (l <= 0 || (socklen_t) l >= size) { + errno = ENOSPC; + return (NULL); + } + strlcpy(dst, tmp, size); + return (dst); +} + +/*% + * Check whether "cp" is a valid ascii representation + * of an Internet address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * This replaces inet_addr, the return value from which + * cannot distinguish between failure and a local broadcast address. + */ +int +inet_aton(const char *cp, struct in_addr *addr) { + u_long val; + int base, n; + char c; + u_int8_t parts[4]; + u_int8_t *pp = parts; + int digit; + + c = *cp; + for (;;) { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, isdigit=decimal. + */ + if (!isdigit((unsigned char)c)) + return (0); + val = 0; base = 10; digit = 0; + if (c == '0') { + c = *++cp; + if (c == 'x' || c == 'X') + base = 16, c = *++cp; + else { + base = 8; + digit = 1 ; + } + } + for (;;) { + if (isascii(c) && isdigit((unsigned char)c)) { + if (base == 8 && (c == '8' || c == '9')) + return (0); + val = (val * base) + (c - '0'); + c = *++cp; + digit = 1; + } else if (base == 16 && isascii(c) && + isxdigit((unsigned char)c)) { + val = (val << 4) | + (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); + c = *++cp; + digit = 1; + } else + break; + } + if (c == '.') { + /* + * Internet format: + * a.b.c.d + * a.b.c (with c treated as 16 bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3 || val > 0xffU) + return (0); + *pp++ = val; + c = *++cp; + } else + break; + } + /* + * Check for trailing characters. + */ + if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) + return (0); + /* + * Did we get a valid digit? + */ + if (!digit) + return (0); + /* + * Concoct the address according to + * the number of parts specified. + */ + n = pp - parts + 1; + switch (n) { + case 1: /*%< a -- 32 bits */ + break; + + case 2: /*%< a.b -- 8.24 bits */ + if (val > 0xffffffU) + return (0); + val |= parts[0] << 24; + break; + + case 3: /*%< a.b.c -- 8.8.16 bits */ + if (val > 0xffffU) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /*%< a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xffU) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + if (addr != NULL) + addr->s_addr = htonl(val); + return (1); +} + +#endif /* TCC */ + +#endif /* _WIN32 */ diff --git a/ipfw/humanize_number.c b/ipfw/humanize_number.c new file mode 100644 index 0000000..90aa18b --- /dev/null +++ b/ipfw/humanize_number.c @@ -0,0 +1,153 @@ +/* $NetBSD: humanize_number.c,v 1.13 2007/12/14 17:26:19 christos Exp $ */ + +/* + * Copyright (c) 1997, 1998, 1999, 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center, by Luke Mewburn and by Tomas Svensson. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +// #include +__FBSDID("$FreeBSD: src/lib/libutil/humanize_number.c,v 1.2.10.1 2008/04/20 16:29:01 antoine Exp $"); + +#include +#include +#include +#include +#include +#include +// #include +//#include + +int +humanize_number(char *buf, size_t len, int64_t bytes, + const char *suffix, int scale, int flags) +{ + const char *prefixes, *sep; + int b, i, r, maxscale, s1, s2, sign; + int64_t divisor, max; + size_t baselen; + + assert(buf != NULL); + assert(suffix != NULL); + assert(scale >= 0); + + if (flags & HN_DIVISOR_1000) { + /* SI for decimal multiplies */ + divisor = 1000; + if (flags & HN_B) + prefixes = "B\0k\0M\0G\0T\0P\0E"; + else + prefixes = "\0\0k\0M\0G\0T\0P\0E"; + } else { + /* + * binary multiplies + * XXX IEC 60027-2 recommends Ki, Mi, Gi... + */ + divisor = 1024; + if (flags & HN_B) + prefixes = "B\0K\0M\0G\0T\0P\0E"; + else + prefixes = "\0\0K\0M\0G\0T\0P\0E"; + } + +#define SCALE2PREFIX(scale) (&prefixes[(scale) << 1]) + maxscale = 7; + + if (scale >= maxscale && + (scale & (HN_AUTOSCALE | HN_GETSCALE)) == 0) + return (-1); + + if (buf == NULL || suffix == NULL) + return (-1); + + if (len > 0) + buf[0] = '\0'; + if (bytes < 0) { + sign = -1; + bytes *= -100; + baselen = 3; /* sign, digit, prefix */ + } else { + sign = 1; + bytes *= 100; + baselen = 2; /* digit, prefix */ + } + if (flags & HN_NOSPACE) + sep = ""; + else { + sep = " "; + baselen++; + } + baselen += strlen(suffix); + + /* Check if enough room for `x y' + suffix + `\0' */ + if (len < baselen + 1) + return (-1); + + if (scale & (HN_AUTOSCALE | HN_GETSCALE)) { + /* See if there is additional columns can be used. */ + for (max = 100, i = len - baselen; i-- > 0;) + max *= 10; + + /* + * Divide the number until it fits the given column. + * If there will be an overflow by the rounding below, + * divide once more. + */ + for (i = 0; bytes >= max - 50 && i < maxscale; i++) + bytes /= divisor; + + if (scale & HN_GETSCALE) + return (i); + } else + for (i = 0; i < scale && i < maxscale; i++) + bytes /= divisor; + + /* If a value <= 9.9 after rounding and ... */ + if (bytes < 995 && i > 0 && flags & HN_DECIMAL) { + /* baselen + \0 + .N */ + if (len < baselen + 1 + 2) + return (-1); + b = ((int)bytes + 5) / 10; + s1 = b / 10; + s2 = b % 10; + r = snprintf(buf, len, "%d%s%d%s%s%s", + sign * s1, ".", s2, + sep, SCALE2PREFIX(i), suffix); + } else + r = snprintf(buf, len, "%" PRId64 "%s%s%s", + sign * ((bytes + 50) / 100), + sep, SCALE2PREFIX(i), suffix); + + return (r); +} diff --git a/ipfw/include/alias.h b/ipfw/include/alias.h new file mode 100644 index 0000000..888bd0d --- /dev/null +++ b/ipfw/include/alias.h @@ -0,0 +1,71 @@ +#ifndef _ALIAS_H_ +#define _ALIAS_H_ + +#define LIBALIAS_BUF_SIZE 128 + +/* + * If PKT_ALIAS_LOG is set, a message will be printed to /var/log/alias.log + * every time a link is created or deleted. This is useful for debugging. + */ +#define PKT_ALIAS_LOG 0x01 + +/* + * If PKT_ALIAS_DENY_INCOMING is set, then incoming connections (e.g. to ftp, + * telnet or web servers will be prevented by the aliasing mechanism. + */ +#define PKT_ALIAS_DENY_INCOMING 0x02 + +/* + * If PKT_ALIAS_SAME_PORTS is set, packets will be attempted sent from the + * same port as they originated on. This allows e.g. rsh to work *99% of the + * time*, but _not_ 100% (it will be slightly flakey instead of not working + * at all). This mode bit is set by PacketAliasInit(), so it is a default + * mode of operation. + */ +#define PKT_ALIAS_SAME_PORTS 0x04 + +/* + * If PKT_ALIAS_USE_SOCKETS is set, then when partially specified links (e.g. + * destination port and/or address is zero), the packet aliasing engine will + * attempt to allocate a socket for the aliasing port it chooses. This will + * avoid interference with the host machine. Fully specified links do not + * require this. This bit is set after a call to PacketAliasInit(), so it is + * a default mode of operation. + */ +#ifndef NO_USE_SOCKETS +#define PKT_ALIAS_USE_SOCKETS 0x08 +#endif +/*- + * If PKT_ALIAS_UNREGISTERED_ONLY is set, then only packets with + * unregistered source addresses will be aliased. Private + * addresses are those in the following ranges: + * + * 10.0.0.0 -> 10.255.255.255 + * 172.16.0.0 -> 172.31.255.255 + * 192.168.0.0 -> 192.168.255.255 + */ +#define PKT_ALIAS_UNREGISTERED_ONLY 0x10 + +/* + * If PKT_ALIAS_RESET_ON_ADDR_CHANGE is set, then the table of dynamic + * aliasing links will be reset whenever PacketAliasSetAddress() changes the + * default aliasing address. If the default aliasing address is left + * unchanged by this function call, then the table of dynamic aliasing links + * will be left intact. This bit is set after a call to PacketAliasInit(). + */ +#define PKT_ALIAS_RESET_ON_ADDR_CHANGE 0x20 + + +/* + * If PKT_ALIAS_PROXY_ONLY is set, then NAT will be disabled and only + * transparent proxying is performed. + */ +#define PKT_ALIAS_PROXY_ONLY 0x40 + +/* + * If PKT_ALIAS_REVERSE is set, the actions of PacketAliasIn() and + * PacketAliasOut() are reversed. + */ +#define PKT_ALIAS_REVERSE 0x80 + +#endif /* !_ALIAS_H_ */ diff --git a/ipfw/include/net/if_dl.h b/ipfw/include/net/if_dl.h new file mode 100644 index 0000000..4d2b4f7 --- /dev/null +++ b/ipfw/include/net/if_dl.h @@ -0,0 +1,82 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)if_dl.h 8.1 (Berkeley) 6/10/93 + * $FreeBSD: src/sys/net/if_dl.h,v 1.14 2005/01/07 01:45:34 imp Exp $ + */ + +#ifndef _NET_IF_DL_H_ +#define _NET_IF_DL_H_ + +/* + * A Link-Level Sockaddr may specify the interface in one of two + * ways: either by means of a system-provided index number (computed + * anew and possibly differently on every reboot), or by a human-readable + * string such as "il0" (for managerial convenience). + * + * Census taking actions, such as something akin to SIOCGCONF would return + * both the index and the human name. + * + * High volume transactions (such as giving a link-level ``from'' address + * in a recvfrom or recvmsg call) may be likely only to provide the indexed + * form, (which requires fewer copy operations and less space). + * + * The form and interpretation of the link-level address is purely a matter + * of convention between the device driver and its consumers; however, it is + * expected that all drivers for an interface of a given if_type will agree. + */ + +/* + * Structure of a Link-Level sockaddr: + */ +struct sockaddr_dl { + u_char sdl_len; /* Total length of sockaddr */ + u_char sdl_family; /* AF_LINK */ + u_short sdl_index; /* if != 0, system given index for interface */ + u_char sdl_type; /* interface type */ + u_char sdl_nlen; /* interface name length, no trailing 0 reqd. */ + u_char sdl_alen; /* link level address length */ + u_char sdl_slen; /* link layer selector length */ + char sdl_data[46]; /* minimum work area, can be larger; + contains both if name and ll address */ +}; + +#define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen)) + +#ifndef _KERNEL + +#include + +__BEGIN_DECLS +void link_addr(const char *, struct sockaddr_dl *); +char *link_ntoa(const struct sockaddr_dl *); +__END_DECLS + +#endif /* !_KERNEL */ + +#endif diff --git a/ipfw/include/net/pfvar.h b/ipfw/include/net/pfvar.h new file mode 100644 index 0000000..304cb16 --- /dev/null +++ b/ipfw/include/net/pfvar.h @@ -0,0 +1,32 @@ +#ifndef _PF_VAR_H_ +#define _PF_VAR_H_ + +/* + * replacement for FreeBSD's pfqueue.h + */ +#include + +#define DIOCSTARTALTQ _IO ('D', 42) +#define DIOCSTOPALTQ _IO ('D', 43) + +struct pf_altq { + TAILQ_ENTRY(pf_altq) entries; + /* ... */ + u_int32_t qid; /* return value */ + +#define PF_QNAME_SIZE 64 + char qname[PF_QNAME_SIZE]; /* queue name */ + +}; + +struct pfioc_altq { + u_int32_t action; + u_int32_t ticket; + u_int32_t nr; + struct pf_altq altq; +}; + +#define DIOCGETALTQS _IOWR('D', 47, struct pfioc_altq) +#define DIOCGETALTQ _IOWR('D', 48, struct pfioc_altq) + +#endif /* !_PF_VAR_H */ diff --git a/ipfw/include/timeconv.h b/ipfw/include/timeconv.h new file mode 100644 index 0000000..5377ebb --- /dev/null +++ b/ipfw/include/timeconv.h @@ -0,0 +1,14 @@ +/* + * simple override for _long_to_time() + */ +#ifndef _TIMECONV_H_ +#define _TIMECONV_H_ +static __inline time_t +_long_to_time(long tlong) +{ + if (sizeof(long) == sizeof(__int32_t)) + return((time_t)(__int32_t)(tlong)); + return((time_t)tlong); +} + +#endif /* _TIMECONV_H_ */ diff --git a/ipfw/ipfw.8 b/ipfw/ipfw.8 new file mode 100644 index 0000000..bc8d819 --- /dev/null +++ b/ipfw/ipfw.8 @@ -0,0 +1,3476 @@ +.\" +.\" $FreeBSD$ +.\" +.Dd October 25, 2012 +.Dt IPFW 8 +.Os +.Sh NAME +.Nm ipfw +.Nd User interface for firewall, traffic shaper, packet scheduler, +in-kernel NAT. +.Sh SYNOPSIS +.Ss FIREWALL CONFIGURATION +.Nm +.Op Fl cq +.Cm add +.Ar rule +.Nm +.Op Fl acdefnNStT +.Op Cm set Ar N +.Brq Cm list | show +.Op Ar rule | first-last ... +.Nm +.Op Fl f | q +.Op Cm set Ar N +.Cm flush +.Nm +.Op Fl q +.Op Cm set Ar N +.Brq Cm delete | zero | resetlog +.Op Ar number ... +.Pp +.Nm +.Cm set Oo Cm disable Ar number ... Oc Op Cm enable Ar number ... +.Nm +.Cm set move +.Op Cm rule +.Ar number Cm to Ar number +.Nm +.Cm set swap Ar number number +.Nm +.Cm set show +.Ss SYSCTL SHORTCUTS +.Nm +.Cm enable +.Brq Cm firewall | altq | one_pass | debug | verbose | dyn_keepalive +.Nm +.Cm disable +.Brq Cm firewall | altq | one_pass | debug | verbose | dyn_keepalive +.Ss LOOKUP TABLES +.Nm +.Cm table Ar number Cm add Ar addr Ns Oo / Ns Ar masklen Oc Op Ar value +.Nm +.Cm table Ar number Cm delete Ar addr Ns Op / Ns Ar masklen +.Nm +.Cm table +.Brq Ar number | all +.Cm flush +.Nm +.Cm table +.Brq Ar number | all +.Cm list +.Ss DUMMYNET CONFIGURATION (TRAFFIC SHAPER AND PACKET SCHEDULER) +.Nm +.Brq Cm pipe | queue | sched +.Ar number +.Cm config +.Ar config-options +.Nm +.Op Fl s Op Ar field +.Brq Cm pipe | queue | sched +.Brq Cm delete | list | show +.Op Ar number ... +.Ss IN-KERNEL NAT +.Nm +.Op Fl q +.Cm nat +.Ar number +.Cm config +.Ar config-options +.Pp +.Nm +.Op Fl cfnNqS +.Oo +.Fl p Ar preproc +.Oo +.Ar preproc-flags +.Oc +.Oc +.Ar pathname +.Sh DESCRIPTION +The +.Nm +utility is the user interface for controlling the +.Xr ipfw 4 +firewall, the +.Xr dummynet 4 +traffic shaper/packet scheduler, and the +in-kernel NAT services. +.Pp +A firewall configuration, or +.Em ruleset , +is made of a list of +.Em rules +numbered from 1 to 65535. +Packets are passed to the firewall +from a number of different places in the protocol stack +(depending on the source and destination of the packet, +it is possible for the firewall to be +invoked multiple times on the same packet). +The packet passed to the firewall is compared +against each of the rules in the +.Em ruleset , +in rule-number order +(multiple rules with the same number are permitted, in which case +they are processed in order of insertion). +When a match is found, the action corresponding to the +matching rule is performed. +.Pp +Depending on the action and certain system settings, packets +can be reinjected into the firewall at some rule after the +matching one for further processing. +.Pp +A ruleset always includes a +.Em default +rule (numbered 65535) which cannot be modified or deleted, +and matches all packets. +The action associated with the +.Em default +rule can be either +.Cm deny +or +.Cm allow +depending on how the kernel is configured. +.Pp +If the ruleset includes one or more rules with the +.Cm keep-state +or +.Cm limit +option, +the firewall will have a +.Em stateful +behaviour, i.e., upon a match it will create +.Em dynamic rules , +i.e., rules that match packets with the same 5-tuple +(protocol, source and destination addresses and ports) +as the packet which caused their creation. +Dynamic rules, which have a limited lifetime, are checked +at the first occurrence of a +.Cm check-state , +.Cm keep-state +or +.Cm limit +rule, and are typically used to open the firewall on-demand to +legitimate traffic only. +See the +.Sx STATEFUL FIREWALL +and +.Sx EXAMPLES +Sections below for more information on the stateful behaviour of +.Nm . +.Pp +All rules (including dynamic ones) have a few associated counters: +a packet count, a byte count, a log count and a timestamp +indicating the time of the last match. +Counters can be displayed or reset with +.Nm +commands. +.Pp +Each rule belongs to one of 32 different +.Em sets +, and there are +.Nm +commands to atomically manipulate sets, such as enable, +disable, swap sets, move all rules in a set to another +one, delete all rules in a set. +These can be useful to +install temporary configurations, or to test them. +See Section +.Sx SETS OF RULES +for more information on +.Em sets . +.Pp +Rules can be added with the +.Cm add +command; deleted individually or in groups with the +.Cm delete +command, and globally (except those in set 31) with the +.Cm flush +command; displayed, optionally with the content of the +counters, using the +.Cm show +and +.Cm list +commands. +Finally, counters can be reset with the +.Cm zero +and +.Cm resetlog +commands. +.Pp +.Ss COMMAND OPTIONS +The following general options are available when invoking +.Nm : +.Bl -tag -width indent +.It Fl a +Show counter values when listing rules. +The +.Cm show +command implies this option. +.It Fl b +Only show the action and the comment, not the body of a rule. +Implies +.Fl c . +.It Fl c +When entering or showing rules, print them in compact form, +i.e., omitting the "ip from any to any" string +when this does not carry any additional information. +.It Fl d +When listing, show dynamic rules in addition to static ones. +.It Fl e +When listing and +.Fl d +is specified, also show expired dynamic rules. +.It Fl f +Do not ask for confirmation for commands that can cause problems +if misused, i.e., +.Cm flush . +If there is no tty associated with the process, this is implied. +.It Fl i +When listing a table (see the +.Sx LOOKUP TABLES +section below for more information on lookup tables), format values +as IP addresses. +By default, values are shown as integers. +.It Fl n +Only check syntax of the command strings, without actually passing +them to the kernel. +.It Fl N +Try to resolve addresses and service names in output. +.It Fl q +Be quiet when executing the +.Cm add , +.Cm nat , +.Cm zero , +.Cm resetlog +or +.Cm flush +commands; +(implies +.Fl f ) . +This is useful when updating rulesets by executing multiple +.Nm +commands in a script +(e.g., +.Ql sh\ /etc/rc.firewall ) , +or by processing a file with many +.Nm +rules across a remote login session. +It also stops a table add or delete +from failing if the entry already exists or is not present. +.Pp +The reason why this option may be important is that +for some of these actions, +.Nm +may print a message; if the action results in blocking the +traffic to the remote client, +the remote login session will be closed +and the rest of the ruleset will not be processed. +Access to the console would then be required to recover. +.It Fl S +When listing rules, show the +.Em set +each rule belongs to. +If this flag is not specified, disabled rules will not be +listed. +.It Fl s Op Ar field +When listing pipes, sort according to one of the four +counters (total or current packets or bytes). +.It Fl t +When listing, show last match timestamp converted with ctime(). +.It Fl T +When listing, show last match timestamp as seconds from the epoch. +This form can be more convenient for postprocessing by scripts. +.El +.Ss LIST OF RULES AND PREPROCESSING +To ease configuration, rules can be put into a file which is +processed using +.Nm +as shown in the last synopsis line. +An absolute +.Ar pathname +must be used. +The file will be read line by line and applied as arguments to the +.Nm +utility. +.Pp +Optionally, a preprocessor can be specified using +.Fl p Ar preproc +where +.Ar pathname +is to be piped through. +Useful preprocessors include +.Xr cpp 1 +and +.Xr m4 1 . +If +.Ar preproc +does not start with a slash +.Pq Ql / +as its first character, the usual +.Ev PATH +name search is performed. +Care should be taken with this in environments where not all +file systems are mounted (yet) by the time +.Nm +is being run (e.g.\& when they are mounted over NFS). +Once +.Fl p +has been specified, any additional arguments are passed on to the preprocessor +for interpretation. +This allows for flexible configuration files (like conditionalizing +them on the local hostname) and the use of macros to centralize +frequently required arguments like IP addresses. +.Ss TRAFFIC SHAPER CONFIGURATION +The +.Nm +.Cm pipe , queue +and +.Cm sched +commands are used to configure the traffic shaper and packet scheduler. +See the +.Sx TRAFFIC SHAPER (DUMMYNET) CONFIGURATION +Section below for details. +.Pp +If the world and the kernel get out of sync the +.Nm +ABI may break, preventing you from being able to add any rules. +This can adversely affect the booting process. +You can use +.Nm +.Cm disable +.Cm firewall +to temporarily disable the firewall to regain access to the network, +allowing you to fix the problem. +.Sh PACKET FLOW +A packet is checked against the active ruleset in multiple places +in the protocol stack, under control of several sysctl variables. +These places and variables are shown below, and it is important to +have this picture in mind in order to design a correct ruleset. +.Bd -literal -offset indent + ^ to upper layers V + | | + +----------->-----------+ + ^ V + [ip(6)_input] [ip(6)_output] net.inet(6).ip(6).fw.enable=1 + | | + ^ V + [ether_demux] [ether_output_frame] net.link.ether.ipfw=1 + | | + +-->--[bdg_forward]-->--+ net.link.bridge.ipfw=1 + ^ V + | to devices | +.Ed +.Pp +The number of +times the same packet goes through the firewall can +vary between 0 and 4 depending on packet source and +destination, and system configuration. +.Pp +Note that as packets flow through the stack, headers can be +stripped or added to it, and so they may or may not be available +for inspection. +E.g., incoming packets will include the MAC header when +.Nm +is invoked from +.Cm ether_demux() , +but the same packets will have the MAC header stripped off when +.Nm +is invoked from +.Cm ip_input() +or +.Cm ip6_input() . +.Pp +Also note that each packet is always checked against the complete ruleset, +irrespective of the place where the check occurs, or the source of the packet. +If a rule contains some match patterns or actions which are not valid +for the place of invocation (e.g.\& trying to match a MAC header within +.Cm ip_input +or +.Cm ip6_input ), +the match pattern will not match, but a +.Cm not +operator in front of such patterns +.Em will +cause the pattern to +.Em always +match on those packets. +It is thus the responsibility of +the programmer, if necessary, to write a suitable ruleset to +differentiate among the possible places. +.Cm skipto +rules can be useful here, as an example: +.Bd -literal -offset indent +# packets from ether_demux or bdg_forward +ipfw add 10 skipto 1000 all from any to any layer2 in +# packets from ip_input +ipfw add 10 skipto 2000 all from any to any not layer2 in +# packets from ip_output +ipfw add 10 skipto 3000 all from any to any not layer2 out +# packets from ether_output_frame +ipfw add 10 skipto 4000 all from any to any layer2 out +.Ed +.Pp +(yes, at the moment there is no way to differentiate between +ether_demux and bdg_forward). +.Sh SYNTAX +In general, each keyword or argument must be provided as +a separate command line argument, with no leading or trailing +spaces. +Keywords are case-sensitive, whereas arguments may +or may not be case-sensitive depending on their nature +(e.g.\& uid's are, hostnames are not). +.Pp +Some arguments (e.g., port or address lists) are comma-separated +lists of values. +In this case, spaces after commas ',' are allowed to make +the line more readable. +You can also put the entire +command (including flags) into a single argument. +E.g., the following forms are equivalent: +.Bd -literal -offset indent +ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8 +ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8 +ipfw "-q add deny src-ip 10.0.0.0/24, 127.0.0.1/8" +.Ed +.Sh RULE FORMAT +The format of firewall rules is the following: +.Bd -ragged -offset indent +.Bk -words +.Op Ar rule_number +.Op Cm set Ar set_number +.Op Cm prob Ar match_probability +.Ar action +.Op Cm log Op Cm logamount Ar number +.Op Cm altq Ar queue +.Oo +.Bro Cm tag | untag +.Brc Ar number +.Oc +.Ar body +.Ek +.Ed +.Pp +where the body of the rule specifies which information is used +for filtering packets, among the following: +.Pp +.Bl -tag -width "Source and dest. addresses and ports" -offset XXX -compact +.It Layer-2 header fields +When available +.It IPv4 and IPv6 Protocol +TCP, UDP, ICMP, etc. +.It Source and dest. addresses and ports +.It Direction +See Section +.Sx PACKET FLOW +.It Transmit and receive interface +By name or address +.It Misc. IP header fields +Version, type of service, datagram length, identification, +fragment flag (non-zero IP offset), +Time To Live +.It IP options +.It IPv6 Extension headers +Fragmentation, Hop-by-Hop options, +Routing Headers, Source routing rthdr0, Mobile IPv6 rthdr2, IPSec options. +.It IPv6 Flow-ID +.It Misc. TCP header fields +TCP flags (SYN, FIN, ACK, RST, etc.), +sequence number, acknowledgment number, +window +.It TCP options +.It ICMP types +for ICMP packets +.It ICMP6 types +for ICMP6 packets +.It User/group ID +When the packet can be associated with a local socket. +.It Divert status +Whether a packet came from a divert socket (e.g., +.Xr natd 8 ) . +.It Fib annotation state +Whether a packet has been tagged for using a specific FIB (routing table) +in future forwarding decisions. +.El +.Pp +Note that some of the above information, e.g.\& source MAC or IP addresses and +TCP/UDP ports, can be easily spoofed, so filtering on those fields +alone might not guarantee the desired results. +.Bl -tag -width indent +.It Ar rule_number +Each rule is associated with a +.Ar rule_number +in the range 1..65535, with the latter reserved for the +.Em default +rule. +Rules are checked sequentially by rule number. +Multiple rules can have the same number, in which case they are +checked (and listed) according to the order in which they have +been added. +If a rule is entered without specifying a number, the kernel will +assign one in such a way that the rule becomes the last one +before the +.Em default +rule. +Automatic rule numbers are assigned by incrementing the last +non-default rule number by the value of the sysctl variable +.Ar net.inet.ip.fw.autoinc_step +which defaults to 100. +If this is not possible (e.g.\& because we would go beyond the +maximum allowed rule number), the number of the last +non-default value is used instead. +.It Cm set Ar set_number +Each rule is associated with a +.Ar set_number +in the range 0..31. +Sets can be individually disabled and enabled, so this parameter +is of fundamental importance for atomic ruleset manipulation. +It can be also used to simplify deletion of groups of rules. +If a rule is entered without specifying a set number, +set 0 will be used. +.br +Set 31 is special in that it cannot be disabled, +and rules in set 31 are not deleted by the +.Nm ipfw flush +command (but you can delete them with the +.Nm ipfw delete set 31 +command). +Set 31 is also used for the +.Em default +rule. +.It Cm prob Ar match_probability +A match is only declared with the specified probability +(floating point number between 0 and 1). +This can be useful for a number of applications such as +random packet drop or +(in conjunction with +.Nm dummynet ) +to simulate the effect of multiple paths leading to out-of-order +packet delivery. +.Pp +Note: this condition is checked before any other condition, including +ones such as keep-state or check-state which might have side effects. +.It Cm log Op Cm logamount Ar number +Packets matching a rule with the +.Cm log +keyword will be made available for logging in two ways: +if the sysctl variable +.Va net.inet.ip.fw.verbose +is set to 0 (default), one can use +.Xr bpf 4 +attached to the +.Li ipfw0 +pseudo interface. +This pseudo interface can be created after a boot +manually by using the following command: +.Bd -literal -offset indent +# ifconfig ipfw0 create +.Ed +.Pp +Or, automatically at boot time by adding the following +line to the +.Xr rc.conf 5 +file: +.Bd -literal -offset indent +firewall_logif="YES" +.Ed +.Pp +There is no overhead if no +.Xr bpf 4 +is attached to the pseudo interface. +.Pp +If +.Va net.inet.ip.fw.verbose +is set to 1, packets will be logged to +.Xr syslogd 8 +with a +.Dv LOG_SECURITY +facility up to a maximum of +.Cm logamount +packets. +If no +.Cm logamount +is specified, the limit is taken from the sysctl variable +.Va net.inet.ip.fw.verbose_limit . +In both cases, a value of 0 means unlimited logging. +.Pp +Once the limit is reached, logging can be re-enabled by +clearing the logging counter or the packet counter for that entry, see the +.Cm resetlog +command. +.Pp +Note: logging is done after all other packet matching conditions +have been successfully verified, and before performing the final +action (accept, deny, etc.) on the packet. +.It Cm tag Ar number +When a packet matches a rule with the +.Cm tag +keyword, the numeric tag for the given +.Ar number +in the range 1..65534 will be attached to the packet. +The tag acts as an internal marker (it is not sent out over +the wire) that can be used to identify these packets later on. +This can be used, for example, to provide trust between interfaces +and to start doing policy-based filtering. +A packet can have multiple tags at the same time. +Tags are "sticky", meaning once a tag is applied to a packet by a +matching rule it exists until explicit removal. +Tags are kept with the packet everywhere within the kernel, but are +lost when packet leaves the kernel, for example, on transmitting +packet out to the network or sending packet to a +.Xr divert 4 +socket. +.Pp +To check for previously applied tags, use the +.Cm tagged +rule option. +To delete previously applied tag, use the +.Cm untag +keyword. +.Pp +Note: since tags are kept with the packet everywhere in kernelspace, +they can be set and unset anywhere in the kernel network subsystem +(using the +.Xr mbuf_tags 9 +facility), not only by means of the +.Xr ipfw 4 +.Cm tag +and +.Cm untag +keywords. +For example, there can be a specialized +.Xr netgraph 4 +node doing traffic analyzing and tagging for later inspecting +in firewall. +.It Cm untag Ar number +When a packet matches a rule with the +.Cm untag +keyword, the tag with the number +.Ar number +is searched among the tags attached to this packet and, +if found, removed from it. +Other tags bound to packet, if present, are left untouched. +.It Cm altq Ar queue +When a packet matches a rule with the +.Cm altq +keyword, the ALTQ identifier for the given +.Ar queue +(see +.Xr altq 4 ) +will be attached. +Note that this ALTQ tag is only meaningful for packets going "out" of IPFW, +and not being rejected or going to divert sockets. +Note that if there is insufficient memory at the time the packet is +processed, it will not be tagged, so it is wise to make your ALTQ +"default" queue policy account for this. +If multiple +.Cm altq +rules match a single packet, only the first one adds the ALTQ classification +tag. +In doing so, traffic may be shaped by using +.Cm count Cm altq Ar queue +rules for classification early in the ruleset, then later applying +the filtering decision. +For example, +.Cm check-state +and +.Cm keep-state +rules may come later and provide the actual filtering decisions in +addition to the fallback ALTQ tag. +.Pp +You must run +.Xr pfctl 8 +to set up the queues before IPFW will be able to look them up by name, +and if the ALTQ disciplines are rearranged, the rules in containing the +queue identifiers in the kernel will likely have gone stale and need +to be reloaded. +Stale queue identifiers will probably result in misclassification. +.Pp +All system ALTQ processing can be turned on or off via +.Nm +.Cm enable Ar altq +and +.Nm +.Cm disable Ar altq . +The usage of +.Va net.inet.ip.fw.one_pass +is irrelevant to ALTQ traffic shaping, as the actual rule action is followed +always after adding an ALTQ tag. +.El +.Ss RULE ACTIONS +A rule can be associated with one of the following actions, which +will be executed when the packet matches the body of the rule. +.Bl -tag -width indent +.It Cm allow | accept | pass | permit +Allow packets that match rule. +The search terminates. +.It Cm check-state +Checks the packet against the dynamic ruleset. +If a match is found, execute the action associated with +the rule which generated this dynamic rule, otherwise +move to the next rule. +.br +.Cm Check-state +rules do not have a body. +If no +.Cm check-state +rule is found, the dynamic ruleset is checked at the first +.Cm keep-state +or +.Cm limit +rule. +.It Cm count +Update counters for all packets that match rule. +The search continues with the next rule. +.It Cm deny | drop +Discard packets that match this rule. +The search terminates. +.It Cm divert Ar port +Divert packets that match this rule to the +.Xr divert 4 +socket bound to port +.Ar port . +The search terminates. +.It Cm fwd | forward Ar ipaddr | tablearg Ns Op , Ns Ar port +Change the next-hop on matching packets to +.Ar ipaddr , +which can be an IP address or a host name. +For IPv4, the next hop can also be supplied by the last table +looked up for the packet by using the +.Cm tablearg +keyword instead of an explicit address. +The search terminates if this rule matches. +.Pp +If +.Ar ipaddr +is a local address, then matching packets will be forwarded to +.Ar port +(or the port number in the packet if one is not specified in the rule) +on the local machine. +.br +If +.Ar ipaddr +is not a local address, then the port number +(if specified) is ignored, and the packet will be +forwarded to the remote address, using the route as found in +the local routing table for that IP. +.br +A +.Ar fwd +rule will not match layer-2 packets (those received +on ether_input, ether_output, or bridged). +.br +The +.Cm fwd +action does not change the contents of the packet at all. +In particular, the destination address remains unmodified, so +packets forwarded to another system will usually be rejected by that system +unless there is a matching rule on that system to capture them. +For packets forwarded locally, +the local address of the socket will be +set to the original destination address of the packet. +This makes the +.Xr netstat 1 +entry look rather weird but is intended for +use with transparent proxy servers. +.It Cm nat Ar nat_nr | tablearg +Pass packet to a +nat instance +(for network address translation, address redirect, etc.): +see the +.Sx NETWORK ADDRESS TRANSLATION (NAT) +Section for further information. +.It Cm pipe Ar pipe_nr +Pass packet to a +.Nm dummynet +.Dq pipe +(for bandwidth limitation, delay, etc.). +See the +.Sx TRAFFIC SHAPER (DUMMYNET) CONFIGURATION +Section for further information. +The search terminates; however, on exit from the pipe and if +the +.Xr sysctl 8 +variable +.Va net.inet.ip.fw.one_pass +is not set, the packet is passed again to the firewall code +starting from the next rule. +.It Cm queue Ar queue_nr +Pass packet to a +.Nm dummynet +.Dq queue +(for bandwidth limitation using WF2Q+). +.It Cm reject +(Deprecated). +Synonym for +.Cm unreach host . +.It Cm reset +Discard packets that match this rule, and if the +packet is a TCP packet, try to send a TCP reset (RST) notice. +The search terminates. +.It Cm reset6 +Discard packets that match this rule, and if the +packet is a TCP packet, try to send a TCP reset (RST) notice. +The search terminates. +.It Cm skipto Ar number | tablearg +Skip all subsequent rules numbered less than +.Ar number . +The search continues with the first rule numbered +.Ar number +or higher. +It is possible to use the +.Cm tablearg +keyword with a skipto for a +.Em computed +skipto, but care should be used, as no destination caching +is possible in this case so the rules are always walked to find it, +starting from the +.Cm skipto . +.It Cm call Ar number | tablearg +The current rule number is saved in the internal stack and +ruleset processing continues with the first rule numbered +.Ar number +or higher. +If later a rule with the +.Cm return +action is encountered, the processing returns to the first rule +with number of this +.Cm call +rule plus one or higher +(the same behaviour as with packets returning from +.Xr divert 4 +socket after a +.Cm divert +action). +This could be used to make somewhat like an assembly language +.Dq subroutine +calls to rules with common checks for different interfaces, etc. +.Pp +Rule with any number could be called, not just forward jumps as with +.Cm skipto . +So, to prevent endless loops in case of mistakes, both +.Cm call +and +.Cm return +actions don't do any jumps and simply go to the next rule if memory +cannot be allocated or stack overflowed/underflowed. +.Pp +Internally stack for rule numbers is implemented using +.Xr mbuf_tags 9 +facility and currently has size of 16 entries. +As mbuf tags are lost when packet leaves the kernel, +.Cm divert +should not be used in subroutines to avoid endless loops +and other undesired effects. +.It Cm return +Takes rule number saved to internal stack by the last +.Cm call +action and returns ruleset processing to the first rule +with number greater than number of corresponding +.Cm call +rule. +See description of the +.Cm call +action for more details. +.Pp +Note that +.Cm return +rules usually end a +.Dq subroutine +and thus are unconditional, but +.Nm +command-line utility currently requires every action except +.Cm check-state +to have body. +While it is sometimes useful to return only on some packets, +usually you want to print just +.Dq return +for readability. +A workaround for this is to use new syntax and +.Fl c +switch: +.Bd -literal -offset indent +# Add a rule without actual body +ipfw add 2999 return via any + +# List rules without "from any to any" part +ipfw -c list +.Ed +.Pp +This cosmetic annoyance may be fixed in future releases. +.It Cm tee Ar port +Send a copy of packets matching this rule to the +.Xr divert 4 +socket bound to port +.Ar port . +The search continues with the next rule. +.It Cm unreach Ar code +Discard packets that match this rule, and try to send an ICMP +unreachable notice with code +.Ar code , +where +.Ar code +is a number from 0 to 255, or one of these aliases: +.Cm net , host , protocol , port , +.Cm needfrag , srcfail , net-unknown , host-unknown , +.Cm isolated , net-prohib , host-prohib , tosnet , +.Cm toshost , filter-prohib , host-precedence +or +.Cm precedence-cutoff . +The search terminates. +.It Cm unreach6 Ar code +Discard packets that match this rule, and try to send an ICMPv6 +unreachable notice with code +.Ar code , +where +.Ar code +is a number from 0, 1, 3 or 4, or one of these aliases: +.Cm no-route, admin-prohib, address +or +.Cm port . +The search terminates. +.It Cm netgraph Ar cookie +Divert packet into netgraph with given +.Ar cookie . +The search terminates. +If packet is later returned from netgraph it is either +accepted or continues with the next rule, depending on +.Va net.inet.ip.fw.one_pass +sysctl variable. +.It Cm ngtee Ar cookie +A copy of packet is diverted into netgraph, original +packet continues with the next rule. +See +.Xr ng_ipfw 4 +for more information on +.Cm netgraph +and +.Cm ngtee +actions. +.It Cm setfib Ar fibnum | tablearg +The packet is tagged so as to use the FIB (routing table) +.Ar fibnum +in any subsequent forwarding decisions. +In the current implementation, this is limited to the values 0 through 15, see +.Xr setfib 2 . +Processing continues at the next rule. +It is possible to use the +.Cm tablearg +keyword with setfib. +If the tablearg value is not within the compiled range of fibs, +the packet's fib is set to 0. +.It Cm setdscp Ar DSCP | number | tablearg +Set specified DiffServ codepoint for an IPv4/IPv6 packet. +Processing continues at the next rule. +Supported values are: +.Pp +.Cm CS0 +.Pq Dv 000000 , +.Cm CS1 +.Pq Dv 001000 , +.Cm CS2 +.Pq Dv 010000 , +.Cm CS3 +.Pq Dv 011000 , +.Cm CS4 +.Pq Dv 100000 , +.Cm CS5 +.Pq Dv 101000 , +.Cm CS6 +.Pq Dv 110000 , +.Cm CS7 +.Pq Dv 111000 , +.Cm AF11 +.Pq Dv 001010 , +.Cm AF12 +.Pq Dv 001100 , +.Cm AF13 +.Pq Dv 001110 , +.Cm AF21 +.Pq Dv 010010 , +.Cm AF22 +.Pq Dv 010100 , +.Cm AF23 +.Pq Dv 010110 , +.Cm AF31 +.Pq Dv 011010 , +.Cm AF32 +.Pq Dv 011100 , +.Cm AF33 +.Pq Dv 011110 , +.Cm AF41 +.Pq Dv 100010 , +.Cm AF42 +.Pq Dv 100100 , +.Cm AF43 +.Pq Dv 100110 , +.Cm EF +.Pq Dv 101110 , +.Cm BE +.Pq Dv 000000 . +Additionally, DSCP value can be specified by number (0..64). +It is also possible to use the +.Cm tablearg +keyword with setdscp. +If the tablearg value is not within the 0..64 range, lower 6 bits of supplied +value are used. +.It Cm reass +Queue and reassemble IP fragments. +If the packet is not fragmented, counters are updated and +processing continues with the next rule. +If the packet is the last logical fragment, the packet is reassembled and, if +.Va net.inet.ip.fw.one_pass +is set to 0, processing continues with the next rule. +Otherwise, the packet is allowed to pass and the search terminates. +If the packet is a fragment in the middle of a logical group of fragments, +it is consumed and +processing stops immediately. +.Pp +Fragment handling can be tuned via +.Va net.inet.ip.maxfragpackets +and +.Va net.inet.ip.maxfragsperpacket +which limit, respectively, the maximum number of processable +fragments (default: 800) and +the maximum number of fragments per packet (default: 16). +.Pp +NOTA BENE: since fragments do not contain port numbers, +they should be avoided with the +.Nm reass +rule. +Alternatively, direction-based (like +.Nm in +/ +.Nm out +) and source-based (like +.Nm via +) match patterns can be used to select fragments. +.Pp +Usually a simple rule like: +.Bd -literal -offset indent +# reassemble incoming fragments +ipfw add reass all from any to any in +.Ed +.Pp +is all you need at the beginning of your ruleset. +.El +.Ss RULE BODY +The body of a rule contains zero or more patterns (such as +specific source and destination addresses or ports, +protocol options, incoming or outgoing interfaces, etc.) +that the packet must match in order to be recognised. +In general, the patterns are connected by (implicit) +.Cm and +operators -- i.e., all must match in order for the +rule to match. +Individual patterns can be prefixed by the +.Cm not +operator to reverse the result of the match, as in +.Pp +.Dl "ipfw add 100 allow ip from not 1.2.3.4 to any" +.Pp +Additionally, sets of alternative match patterns +.Pq Em or-blocks +can be constructed by putting the patterns in +lists enclosed between parentheses ( ) or braces { }, and +using the +.Cm or +operator as follows: +.Pp +.Dl "ipfw add 100 allow ip from { x or not y or z } to any" +.Pp +Only one level of parentheses is allowed. +Beware that most shells have special meanings for parentheses +or braces, so it is advisable to put a backslash \\ in front of them +to prevent such interpretations. +.Pp +The body of a rule must in general include a source and destination +address specifier. +The keyword +.Ar any +can be used in various places to specify that the content of +a required field is irrelevant. +.Pp +The rule body has the following format: +.Bd -ragged -offset indent +.Op Ar proto Cm from Ar src Cm to Ar dst +.Op Ar options +.Ed +.Pp +The first part (proto from src to dst) is for backward +compatibility with earlier versions of +.Fx . +In modern +.Fx +any match pattern (including MAC headers, IP protocols, +addresses and ports) can be specified in the +.Ar options +section. +.Pp +Rule fields have the following meaning: +.Bl -tag -width indent +.It Ar proto : protocol | Cm { Ar protocol Cm or ... } +.It Ar protocol : Oo Cm not Oc Ar protocol-name | protocol-number +An IP protocol specified by number or name +(for a complete list see +.Pa /etc/protocols ) , +or one of the following keywords: +.Bl -tag -width indent +.It Cm ip4 | ipv4 +Matches IPv4 packets. +.It Cm ip6 | ipv6 +Matches IPv6 packets. +.It Cm ip | all +Matches any packet. +.El +.Pp +The +.Cm ipv6 +in +.Cm proto +option will be treated as inner protocol. +And, the +.Cm ipv4 +is not available in +.Cm proto +option. +.Pp +The +.Cm { Ar protocol Cm or ... } +format (an +.Em or-block ) +is provided for convenience only but its use is deprecated. +.It Ar src No and Ar dst : Bro Cm addr | Cm { Ar addr Cm or ... } Brc Op Oo Cm not Oc Ar ports +An address (or a list, see below) +optionally followed by +.Ar ports +specifiers. +.Pp +The second format +.Em ( or-block +with multiple addresses) is provided for convenience only and +its use is discouraged. +.It Ar addr : Oo Cm not Oc Bro +.Cm any | me | me6 | +.Cm table Ns Pq Ar number Ns Op , Ns Ar value +.Ar | addr-list | addr-set +.Brc +.Bl -tag -width indent +.It Cm any +matches any IP address. +.It Cm me +matches any IP address configured on an interface in the system. +.It Cm me6 +matches any IPv6 address configured on an interface in the system. +The address list is evaluated at the time the packet is +analysed. +.It Cm table Ns Pq Ar number Ns Op , Ns Ar value +Matches any IPv4 address for which an entry exists in the lookup table +.Ar number . +If an optional 32-bit unsigned +.Ar value +is also specified, an entry will match only if it has this value. +See the +.Sx LOOKUP TABLES +section below for more information on lookup tables. +.El +.It Ar addr-list : ip-addr Ns Op Ns , Ns Ar addr-list +.It Ar ip-addr : +A host or subnet address specified in one of the following ways: +.Bl -tag -width indent +.It Ar numeric-ip | hostname +Matches a single IPv4 address, specified as dotted-quad or a hostname. +Hostnames are resolved at the time the rule is added to the firewall list. +.It Ar addr Ns / Ns Ar masklen +Matches all addresses with base +.Ar addr +(specified as an IP address, a network number, or a hostname) +and mask width of +.Cm masklen +bits. +As an example, 1.2.3.4/25 or 1.2.3.0/25 will match +all IP numbers from 1.2.3.0 to 1.2.3.127 . +.It Ar addr Ns : Ns Ar mask +Matches all addresses with base +.Ar addr +(specified as an IP address, a network number, or a hostname) +and the mask of +.Ar mask , +specified as a dotted quad. +As an example, 1.2.3.4:255.0.255.0 or 1.0.3.0:255.0.255.0 will match +1.*.3.*. +This form is advised only for non-contiguous +masks. +It is better to resort to the +.Ar addr Ns / Ns Ar masklen +format for contiguous masks, which is more compact and less +error-prone. +.El +.It Ar addr-set : addr Ns Oo Ns / Ns Ar masklen Oc Ns Cm { Ns Ar list Ns Cm } +.It Ar list : Bro Ar num | num-num Brc Ns Op Ns , Ns Ar list +Matches all addresses with base address +.Ar addr +(specified as an IP address, a network number, or a hostname) +and whose last byte is in the list between braces { } . +Note that there must be no spaces between braces and +numbers (spaces after commas are allowed). +Elements of the list can be specified as single entries +or ranges. +The +.Ar masklen +field is used to limit the size of the set of addresses, +and can have any value between 24 and 32. +If not specified, +it will be assumed as 24. +.br +This format is particularly useful to handle sparse address sets +within a single rule. +Because the matching occurs using a +bitmask, it takes constant time and dramatically reduces +the complexity of rulesets. +.br +As an example, an address specified as 1.2.3.4/24{128,35-55,89} +or 1.2.3.0/24{128,35-55,89} +will match the following IP addresses: +.br +1.2.3.128, 1.2.3.35 to 1.2.3.55, 1.2.3.89 . +.It Ar addr6-list : ip6-addr Ns Op Ns , Ns Ar addr6-list +.It Ar ip6-addr : +A host or subnet specified one of the following ways: +.Bl -tag -width indent +.It Ar numeric-ip | hostname +Matches a single IPv6 address as allowed by +.Xr inet_pton 3 +or a hostname. +Hostnames are resolved at the time the rule is added to the firewall +list. +.It Ar addr Ns / Ns Ar masklen +Matches all IPv6 addresses with base +.Ar addr +(specified as allowed by +.Xr inet_pton +or a hostname) +and mask width of +.Cm masklen +bits. +.El +.Pp +No support for sets of IPv6 addresses is provided because IPv6 addresses +are typically random past the initial prefix. +.It Ar ports : Bro Ar port | port Ns \&- Ns Ar port Ns Brc Ns Op , Ns Ar ports +For protocols which support port numbers (such as TCP and UDP), optional +.Cm ports +may be specified as one or more ports or port ranges, separated +by commas but no spaces, and an optional +.Cm not +operator. +The +.Ql \&- +notation specifies a range of ports (including boundaries). +.Pp +Service names (from +.Pa /etc/services ) +may be used instead of numeric port values. +The length of the port list is limited to 30 ports or ranges, +though one can specify larger ranges by using an +.Em or-block +in the +.Cm options +section of the rule. +.Pp +A backslash +.Pq Ql \e +can be used to escape the dash +.Pq Ql - +character in a service name (from a shell, the backslash must be +typed twice to avoid the shell itself interpreting it as an escape +character). +.Pp +.Dl "ipfw add count tcp from any ftp\e\e-data-ftp to any" +.Pp +Fragmented packets which have a non-zero offset (i.e., not the first +fragment) will never match a rule which has one or more port +specifications. +See the +.Cm frag +option for details on matching fragmented packets. +.El +.Ss RULE OPTIONS (MATCH PATTERNS) +Additional match patterns can be used within +rules. +Zero or more of these so-called +.Em options +can be present in a rule, optionally prefixed by the +.Cm not +operand, and possibly grouped into +.Em or-blocks . +.Pp +The following match patterns can be used (listed in alphabetical order): +.Bl -tag -width indent +.It Cm // this is a comment. +Inserts the specified text as a comment in the rule. +Everything following // is considered as a comment and stored in the rule. +You can have comment-only rules, which are listed as having a +.Cm count +action followed by the comment. +.It Cm bridged +Alias for +.Cm layer2 . +.It Cm diverted +Matches only packets generated by a divert socket. +.It Cm diverted-loopback +Matches only packets coming from a divert socket back into the IP stack +input for delivery. +.It Cm diverted-output +Matches only packets going from a divert socket back outward to the IP +stack output for delivery. +.It Cm dst-ip Ar ip-address +Matches IPv4 packets whose destination IP is one of the address(es) +specified as argument. +.It Bro Cm dst-ip6 | dst-ipv6 Brc Ar ip6-address +Matches IPv6 packets whose destination IP is one of the address(es) +specified as argument. +.It Cm dst-port Ar ports +Matches IP packets whose destination port is one of the port(s) +specified as argument. +.It Cm established +Matches TCP packets that have the RST or ACK bits set. +.It Cm ext6hdr Ar header +Matches IPv6 packets containing the extended header given by +.Ar header . +Supported headers are: +.Pp +Fragment, +.Pq Cm frag , +Hop-to-hop options +.Pq Cm hopopt , +any type of Routing Header +.Pq Cm route , +Source routing Routing Header Type 0 +.Pq Cm rthdr0 , +Mobile IPv6 Routing Header Type 2 +.Pq Cm rthdr2 , +Destination options +.Pq Cm dstopt , +IPSec authentication headers +.Pq Cm ah , +and IPsec encapsulated security payload headers +.Pq Cm esp . +.It Cm fib Ar fibnum +Matches a packet that has been tagged to use +the given FIB (routing table) number. +.It Cm flow-id Ar labels +Matches IPv6 packets containing any of the flow labels given in +.Ar labels . +.Ar labels +is a comma separated list of numeric flow labels. +.It Cm frag +Matches packets that are fragments and not the first +fragment of an IP datagram. +Note that these packets will not have +the next protocol header (e.g.\& TCP, UDP) so options that look into +these headers cannot match. +.It Cm gid Ar group +Matches all TCP or UDP packets sent by or received for a +.Ar group . +A +.Ar group +may be specified by name or number. +.It Cm jail Ar prisonID +Matches all TCP or UDP packets sent by or received for the +jail whos prison ID is +.Ar prisonID . +.It Cm icmptypes Ar types +Matches ICMP packets whose ICMP type is in the list +.Ar types . +The list may be specified as any combination of +individual types (numeric) separated by commas. +.Em Ranges are not allowed . +The supported ICMP types are: +.Pp +echo reply +.Pq Cm 0 , +destination unreachable +.Pq Cm 3 , +source quench +.Pq Cm 4 , +redirect +.Pq Cm 5 , +echo request +.Pq Cm 8 , +router advertisement +.Pq Cm 9 , +router solicitation +.Pq Cm 10 , +time-to-live exceeded +.Pq Cm 11 , +IP header bad +.Pq Cm 12 , +timestamp request +.Pq Cm 13 , +timestamp reply +.Pq Cm 14 , +information request +.Pq Cm 15 , +information reply +.Pq Cm 16 , +address mask request +.Pq Cm 17 +and address mask reply +.Pq Cm 18 . +.It Cm icmp6types Ar types +Matches ICMP6 packets whose ICMP6 type is in the list of +.Ar types . +The list may be specified as any combination of +individual types (numeric) separated by commas. +.Em Ranges are not allowed . +.It Cm in | out +Matches incoming or outgoing packets, respectively. +.Cm in +and +.Cm out +are mutually exclusive (in fact, +.Cm out +is implemented as +.Cm not in Ns No ). +.It Cm ipid Ar id-list +Matches IPv4 packets whose +.Cm ip_id +field has value included in +.Ar id-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +.It Cm iplen Ar len-list +Matches IP packets whose total length, including header and data, is +in the set +.Ar len-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +.It Cm ipoptions Ar spec +Matches packets whose IPv4 header contains the comma separated list of +options specified in +.Ar spec . +The supported IP options are: +.Pp +.Cm ssrr +(strict source route), +.Cm lsrr +(loose source route), +.Cm rr +(record packet route) and +.Cm ts +(timestamp). +The absence of a particular option may be denoted +with a +.Ql \&! . +.It Cm ipprecedence Ar precedence +Matches IPv4 packets whose precedence field is equal to +.Ar precedence . +.It Cm ipsec +Matches packets that have IPSEC history associated with them +(i.e., the packet comes encapsulated in IPSEC, the kernel +has IPSEC support and IPSEC_FILTERTUNNEL option, and can correctly +decapsulate it). +.Pp +Note that specifying +.Cm ipsec +is different from specifying +.Cm proto Ar ipsec +as the latter will only look at the specific IP protocol field, +irrespective of IPSEC kernel support and the validity of the IPSEC data. +.Pp +Further note that this flag is silently ignored in kernels without +IPSEC support. +It does not affect rule processing when given and the +rules are handled as if with no +.Cm ipsec +flag. +.It Cm iptos Ar spec +Matches IPv4 packets whose +.Cm tos +field contains the comma separated list of +service types specified in +.Ar spec . +The supported IP types of service are: +.Pp +.Cm lowdelay +.Pq Dv IPTOS_LOWDELAY , +.Cm throughput +.Pq Dv IPTOS_THROUGHPUT , +.Cm reliability +.Pq Dv IPTOS_RELIABILITY , +.Cm mincost +.Pq Dv IPTOS_MINCOST , +.Cm congestion +.Pq Dv IPTOS_ECN_CE . +The absence of a particular type may be denoted +with a +.Ql \&! . +.It Cm dscp spec Ns Op , Ns Ar spec +Matches IPv4/IPv6 packets whose +.Cm DS +field value is contained in +.Ar spec +mask. +Multiple values can be specified via +the comma separated list. +Value can be one of keywords used in +.Cm setdscp +action or exact number. +.It Cm ipttl Ar ttl-list +Matches IPv4 packets whose time to live is included in +.Ar ttl-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +.It Cm ipversion Ar ver +Matches IP packets whose IP version field is +.Ar ver . +.It Cm keep-state +Upon a match, the firewall will create a dynamic rule, whose +default behaviour is to match bidirectional traffic between +source and destination IP/port using the same protocol. +The rule has a limited lifetime (controlled by a set of +.Xr sysctl 8 +variables), and the lifetime is refreshed every time a matching +packet is found. +.It Cm layer2 +Matches only layer2 packets, i.e., those passed to +.Nm +from ether_demux() and ether_output_frame(). +.It Cm limit Bro Cm src-addr | src-port | dst-addr | dst-port Brc Ar N +The firewall will only allow +.Ar N +connections with the same +set of parameters as specified in the rule. +One or more +of source and destination addresses and ports can be +specified. +Currently, +only IPv4 flows are supported. +.It Cm lookup Bro Cm dst-ip | dst-port | src-ip | src-port | uid | jail Brc Ar N +Search an entry in lookup table +.Ar N +that matches the field specified as argument. +If not found, the match fails. +Otherwise, the match succeeds and +.Cm tablearg +is set to the value extracted from the table. +.Pp +This option can be useful to quickly dispatch traffic based on +certain packet fields. +See the +.Sx LOOKUP TABLES +section below for more information on lookup tables. +.It Cm { MAC | mac } Ar dst-mac src-mac +Match packets with a given +.Ar dst-mac +and +.Ar src-mac +addresses, specified as the +.Cm any +keyword (matching any MAC address), or six groups of hex digits +separated by colons, +and optionally followed by a mask indicating the significant bits. +The mask may be specified using either of the following methods: +.Bl -enum -width indent +.It +A slash +.Pq / +followed by the number of significant bits. +For example, an address with 33 significant bits could be specified as: +.Pp +.Dl "MAC 10:20:30:40:50:60/33 any" +.Pp +.It +An ampersand +.Pq & +followed by a bitmask specified as six groups of hex digits separated +by colons. +For example, an address in which the last 16 bits are significant could +be specified as: +.Pp +.Dl "MAC 10:20:30:40:50:60&00:00:00:00:ff:ff any" +.Pp +Note that the ampersand character has a special meaning in many shells +and should generally be escaped. +.Pp +.El +Note that the order of MAC addresses (destination first, +source second) is +the same as on the wire, but the opposite of the one used for +IP addresses. +.It Cm mac-type Ar mac-type +Matches packets whose Ethernet Type field +corresponds to one of those specified as argument. +.Ar mac-type +is specified in the same way as +.Cm port numbers +(i.e., one or more comma-separated single values or ranges). +You can use symbolic names for known values such as +.Em vlan , ipv4, ipv6 . +Values can be entered as decimal or hexadecimal (if prefixed by 0x), +and they are always printed as hexadecimal (unless the +.Cm -N +option is used, in which case symbolic resolution will be attempted). +.It Cm proto Ar protocol +Matches packets with the corresponding IP protocol. +.It Cm recv | xmit | via Brq Ar ifX | Ar if Ns Cm * | Ar table Ns Pq Ar number Ns Op , Ns Ar value | Ar ipno | Ar any +Matches packets received, transmitted or going through, +respectively, the interface specified by exact name +.Po Ar ifX Pc , +by device name +.Po Ar if* Pc , +by IP address, or through some interface. +.Pp +The +.Cm via +keyword causes the interface to always be checked. +If +.Cm recv +or +.Cm xmit +is used instead of +.Cm via , +then only the receive or transmit interface (respectively) +is checked. +By specifying both, it is possible to match packets based on +both receive and transmit interface, e.g.: +.Pp +.Dl "ipfw add deny ip from any to any out recv ed0 xmit ed1" +.Pp +The +.Cm recv +interface can be tested on either incoming or outgoing packets, +while the +.Cm xmit +interface can only be tested on outgoing packets. +So +.Cm out +is required (and +.Cm in +is invalid) whenever +.Cm xmit +is used. +.Pp +A packet might not have a receive or transmit interface: packets +originating from the local host have no receive interface, +while packets destined for the local host have no transmit +interface. +.It Cm setup +Matches TCP packets that have the SYN bit set but no ACK bit. +This is the short form of +.Dq Li tcpflags\ syn,!ack . +.It Cm sockarg +Matches packets that are associated to a local socket and +for which the SO_USER_COOKIE socket option has been set +to a non-zero value. +As a side effect, the value of the +option is made available as +.Cm tablearg +value, which in turn can be used as +.Cm skipto +or +.Cm pipe +number. +.It Cm src-ip Ar ip-address +Matches IPv4 packets whose source IP is one of the address(es) +specified as an argument. +.It Cm src-ip6 Ar ip6-address +Matches IPv6 packets whose source IP is one of the address(es) +specified as an argument. +.It Cm src-port Ar ports +Matches IP packets whose source port is one of the port(s) +specified as argument. +.It Cm tagged Ar tag-list +Matches packets whose tags are included in +.Ar tag-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +Tags can be applied to the packet using +.Cm tag +rule action parameter (see it's description for details on tags). +.It Cm tcpack Ar ack +TCP packets only. +Match if the TCP header acknowledgment number field is set to +.Ar ack . +.It Cm tcpdatalen Ar tcpdatalen-list +Matches TCP packets whose length of TCP data is +.Ar tcpdatalen-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +.It Cm tcpflags Ar spec +TCP packets only. +Match if the TCP header contains the comma separated list of +flags specified in +.Ar spec . +The supported TCP flags are: +.Pp +.Cm fin , +.Cm syn , +.Cm rst , +.Cm psh , +.Cm ack +and +.Cm urg . +The absence of a particular flag may be denoted +with a +.Ql \&! . +A rule which contains a +.Cm tcpflags +specification can never match a fragmented packet which has +a non-zero offset. +See the +.Cm frag +option for details on matching fragmented packets. +.It Cm tcpseq Ar seq +TCP packets only. +Match if the TCP header sequence number field is set to +.Ar seq . +.It Cm tcpwin Ar tcpwin-list +Matches TCP packets whose header window field is set to +.Ar tcpwin-list , +which is either a single value or a list of values or ranges +specified in the same way as +.Ar ports . +.It Cm tcpoptions Ar spec +TCP packets only. +Match if the TCP header contains the comma separated list of +options specified in +.Ar spec . +The supported TCP options are: +.Pp +.Cm mss +(maximum segment size), +.Cm window +(tcp window advertisement), +.Cm sack +(selective ack), +.Cm ts +(rfc1323 timestamp) and +.Cm cc +(rfc1644 t/tcp connection count). +The absence of a particular option may be denoted +with a +.Ql \&! . +.It Cm uid Ar user +Match all TCP or UDP packets sent by or received for a +.Ar user . +A +.Ar user +may be matched by name or identification number. +.It Cm verrevpath +For incoming packets, +a routing table lookup is done on the packet's source address. +If the interface on which the packet entered the system matches the +outgoing interface for the route, +the packet matches. +If the interfaces do not match up, +the packet does not match. +All outgoing packets or packets with no incoming interface match. +.Pp +The name and functionality of the option is intentionally similar to +the Cisco IOS command: +.Pp +.Dl ip verify unicast reverse-path +.Pp +This option can be used to make anti-spoofing rules to reject all +packets with source addresses not from this interface. +See also the option +.Cm antispoof . +.It Cm versrcreach +For incoming packets, +a routing table lookup is done on the packet's source address. +If a route to the source address exists, but not the default route +or a blackhole/reject route, the packet matches. +Otherwise, the packet does not match. +All outgoing packets match. +.Pp +The name and functionality of the option is intentionally similar to +the Cisco IOS command: +.Pp +.Dl ip verify unicast source reachable-via any +.Pp +This option can be used to make anti-spoofing rules to reject all +packets whose source address is unreachable. +.It Cm antispoof +For incoming packets, the packet's source address is checked if it +belongs to a directly connected network. +If the network is directly connected, then the interface the packet +came on in is compared to the interface the network is connected to. +When incoming interface and directly connected interface are not the +same, the packet does not match. +Otherwise, the packet does match. +All outgoing packets match. +.Pp +This option can be used to make anti-spoofing rules to reject all +packets that pretend to be from a directly connected network but do +not come in through that interface. +This option is similar to but more restricted than +.Cm verrevpath +because it engages only on packets with source addresses of directly +connected networks instead of all source addresses. +.El +.Sh LOOKUP TABLES +Lookup tables are useful to handle large sparse sets of +addresses or other search keys (e.g., ports, jail IDs, interface names). +In the rest of this section we will use the term ``address''. +There may be up to 65535 different lookup tables, numbered 0 to 65534. +.Pp +Each entry is represented by an +.Ar addr Ns Op / Ns Ar masklen +and will match all addresses with base +.Ar addr +(specified as an IPv4/IPv6 address, a hostname or an unsigned integer) +and mask width of +.Ar masklen +bits. +If +.Ar masklen +is not specified, it defaults to 32 for IPv4 and 128 for IPv6. +When looking up an IP address in a table, the most specific +entry will match. +Associated with each entry is a 32-bit unsigned +.Ar value , +which can optionally be checked by a rule matching code. +When adding an entry, if +.Ar value +is not specified, it defaults to 0. +.Pp +An entry can be added to a table +.Pq Cm add , +or removed from a table +.Pq Cm delete . +A table can be examined +.Pq Cm list +or flushed +.Pq Cm flush . +.Pp +Internally, each table is stored in a Radix tree, the same way as +the routing table (see +.Xr route 4 ) . +.Pp +Lookup tables currently support only ports, jail IDs, IPv4/IPv6 addresses +and interface names. +Wildcards is not supported for interface names. +.Pp +The +.Cm tablearg +feature provides the ability to use a value, looked up in the table, as +the argument for a rule action, action parameter or rule option. +This can significantly reduce number of rules in some configurations. +If two tables are used in a rule, the result of the second (destination) +is used. +The +.Cm tablearg +argument can be used with the following actions: +.Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto, setfib, +action parameters: +.Cm tag, untag, +rule options: +.Cm limit, tagged. +.Pp +When used with +.Cm fwd +it is possible to supply table entries with values +that are in the form of IP addresses or hostnames. +See the +.Sx EXAMPLES +Section for example usage of tables and the tablearg keyword. +.Pp +When used with the +.Cm skipto +action, the user should be aware that the code will walk the ruleset +up to a rule equal to, or past, the given number, +and should therefore try keep the +ruleset compact between the skipto and the target rules. +.Sh SETS OF RULES +Each rule belongs to one of 32 different +.Em sets +, numbered 0 to 31. +Set 31 is reserved for the default rule. +.Pp +By default, rules are put in set 0, unless you use the +.Cm set N +attribute when entering a new rule. +Sets can be individually and atomically enabled or disabled, +so this mechanism permits an easy way to store multiple configurations +of the firewall and quickly (and atomically) switch between them. +The command to enable/disable sets is +.Bd -ragged -offset indent +.Nm +.Cm set Oo Cm disable Ar number ... Oc Op Cm enable Ar number ... +.Ed +.Pp +where multiple +.Cm enable +or +.Cm disable +sections can be specified. +Command execution is atomic on all the sets specified in the command. +By default, all sets are enabled. +.Pp +When you disable a set, its rules behave as if they do not exist +in the firewall configuration, with only one exception: +.Bd -ragged -offset indent +dynamic rules created from a rule before it had been disabled +will still be active until they expire. +In order to delete +dynamic rules you have to explicitly delete the parent rule +which generated them. +.Ed +.Pp +The set number of rules can be changed with the command +.Bd -ragged -offset indent +.Nm +.Cm set move +.Brq Cm rule Ar rule-number | old-set +.Cm to Ar new-set +.Ed +.Pp +Also, you can atomically swap two rulesets with the command +.Bd -ragged -offset indent +.Nm +.Cm set swap Ar first-set second-set +.Ed +.Pp +See the +.Sx EXAMPLES +Section on some possible uses of sets of rules. +.Sh STATEFUL FIREWALL +Stateful operation is a way for the firewall to dynamically +create rules for specific flows when packets that +match a given pattern are detected. +Support for stateful +operation comes through the +.Cm check-state , keep-state +and +.Cm limit +options of +.Nm rules . +.Pp +Dynamic rules are created when a packet matches a +.Cm keep-state +or +.Cm limit +rule, causing the creation of a +.Em dynamic +rule which will match all and only packets with +a given +.Em protocol +between a +.Em src-ip/src-port dst-ip/dst-port +pair of addresses +.Em ( src +and +.Em dst +are used here only to denote the initial match addresses, but they +are completely equivalent afterwards). +Dynamic rules will be checked at the first +.Cm check-state, keep-state +or +.Cm limit +occurrence, and the action performed upon a match will be the same +as in the parent rule. +.Pp +Note that no additional attributes other than protocol and IP addresses +and ports are checked on dynamic rules. +.Pp +The typical use of dynamic rules is to keep a closed firewall configuration, +but let the first TCP SYN packet from the inside network install a +dynamic rule for the flow so that packets belonging to that session +will be allowed through the firewall: +.Pp +.Dl "ipfw add check-state" +.Dl "ipfw add allow tcp from my-subnet to any setup keep-state" +.Dl "ipfw add deny tcp from any to any" +.Pp +A similar approach can be used for UDP, where an UDP packet coming +from the inside will install a dynamic rule to let the response through +the firewall: +.Pp +.Dl "ipfw add check-state" +.Dl "ipfw add allow udp from my-subnet to any keep-state" +.Dl "ipfw add deny udp from any to any" +.Pp +Dynamic rules expire after some time, which depends on the status +of the flow and the setting of some +.Cm sysctl +variables. +See Section +.Sx SYSCTL VARIABLES +for more details. +For TCP sessions, dynamic rules can be instructed to periodically +send keepalive packets to refresh the state of the rule when it is +about to expire. +.Pp +See Section +.Sx EXAMPLES +for more examples on how to use dynamic rules. +.Sh TRAFFIC SHAPER (DUMMYNET) CONFIGURATION +.Nm +is also the user interface for the +.Nm dummynet +traffic shaper, packet scheduler and network emulator, a subsystem that +can artificially queue, delay or drop packets +emulating the behaviour of certain network links +or queueing systems. +.Pp +.Nm dummynet +operates by first using the firewall to select packets +using any match pattern that can be used in +.Nm +rules. +Matching packets are then passed to either of two +different objects, which implement the traffic regulation: +.Bl -hang -offset XXXX +.It Em pipe +A +.Em pipe +emulates a +.Em link +with given bandwidth and propagation delay, +driven by a FIFO scheduler and a single queue with programmable +queue size and packet loss rate. +Packets are appended to the queue as they come out from +.Nm ipfw , +and then transferred in FIFO order to the link at the desired rate. +.It Em queue +A +.Em queue +is an abstraction used to implement packet scheduling +using one of several packet scheduling algorithms. +Packets sent to a +.Em queue +are first grouped into flows according to a mask on the 5-tuple. +Flows are then passed to the scheduler associated to the +.Em queue , +and each flow uses scheduling parameters (weight and others) +as configured in the +.Em queue +itself. +A scheduler in turn is connected to an emulated link, +and arbitrates the link's bandwidth among backlogged flows according to +weights and to the features of the scheduling algorithm in use. +.El +.Pp +In practice, +.Em pipes +can be used to set hard limits to the bandwidth that a flow can use, whereas +.Em queues +can be used to determine how different flows share the available bandwidth. +.Pp +A graphical representation of the binding of queues, +flows, schedulers and links is below. +.Bd -literal -offset indent + (flow_mask|sched_mask) sched_mask + +---------+ weight Wx +-------------+ + | |->-[flow]-->--| |-+ + -->--| QUEUE x | ... | | | + | |->-[flow]-->--| SCHEDuler N | | + +---------+ | | | + ... | +--[LINK N]-->-- + +---------+ weight Wy | | +--[LINK N]-->-- + | |->-[flow]-->--| | | + -->--| QUEUE y | ... | | | + | |->-[flow]-->--| | | + +---------+ +-------------+ | + +-------------+ +.Ed +It is important to understand the role of the SCHED_MASK +and FLOW_MASK, which are configured through the commands +.Dl "ipfw sched N config mask SCHED_MASK ..." +and +.Dl "ipfw queue X config mask FLOW_MASK ..." . +.Pp +The SCHED_MASK is used to assign flows to one or more +scheduler instances, one for each +value of the packet's 5-tuple after applying SCHED_MASK. +As an example, using ``src-ip 0xffffff00'' creates one instance +for each /24 destination subnet. +.Pp +The FLOW_MASK, together with the SCHED_MASK, is used to split +packets into flows. +As an example, using +``src-ip 0x000000ff'' +together with the previous SCHED_MASK makes a flow for +each individual source address. +In turn, flows for each /24 +subnet will be sent to the same scheduler instance. +.Pp +The above diagram holds even for the +.Em pipe +case, with the only restriction that a +.Em pipe +only supports a SCHED_MASK, and forces the use of a FIFO +scheduler (these are for backward compatibility reasons; +in fact, internally, a +.Nm dummynet's +pipe is implemented exactly as above). +.Pp +There are two modes of +.Nm dummynet +operation: +.Dq normal +and +.Dq fast . +The +.Dq normal +mode tries to emulate a real link: the +.Nm dummynet +scheduler ensures that the packet will not leave the pipe faster than it +would on the real link with a given bandwidth. +The +.Dq fast +mode allows certain packets to bypass the +.Nm dummynet +scheduler (if packet flow does not exceed pipe's bandwidth). +This is the reason why the +.Dq fast +mode requires less CPU cycles per packet (on average) and packet latency +can be significantly lower in comparison to a real link with the same +bandwidth. +The default mode is +.Dq normal . +The +.Dq fast +mode can be enabled by setting the +.Va net.inet.ip.dummynet.io_fast +.Xr sysctl 8 +variable to a non-zero value. +.Pp +.Ss PIPE, QUEUE AND SCHEDULER CONFIGURATION +The +.Em pipe , +.Em queue +and +.Em scheduler +configuration commands are the following: +.Bd -ragged -offset indent +.Cm pipe Ar number Cm config Ar pipe-configuration +.Pp +.Cm queue Ar number Cm config Ar queue-configuration +.Pp +.Cm sched Ar number Cm config Ar sched-configuration +.Ed +.Pp +The following parameters can be configured for a pipe: +.Pp +.Bl -tag -width indent -compact +.It Cm bw Ar bandwidth | device +Bandwidth, measured in +.Sm off +.Op Cm K | M +.Brq Cm bit/s | Byte/s . +.Sm on +.Pp +A value of 0 (default) means unlimited bandwidth. +The unit must immediately follow the number, as in +.Pp +.Dl "ipfw pipe 1 config bw 300Kbit/s" +.Pp +If a device name is specified instead of a numeric value, as in +.Pp +.Dl "ipfw pipe 1 config bw tun0" +.Pp +then the transmit clock is supplied by the specified device. +At the moment only the +.Xr tun 4 +device supports this +functionality, for use in conjunction with +.Xr ppp 8 . +.Pp +.It Cm delay Ar ms-delay +Propagation delay, measured in milliseconds. +The value is rounded to the next multiple of the clock tick +(typically 10ms, but it is a good practice to run kernels +with +.Dq "options HZ=1000" +to reduce +the granularity to 1ms or less). +The default value is 0, meaning no delay. +.Pp +.It Cm burst Ar size +If the data to be sent exceeds the pipe's bandwidth limit +(and the pipe was previously idle), up to +.Ar size +bytes of data are allowed to bypass the +.Nm dummynet +scheduler, and will be sent as fast as the physical link allows. +Any additional data will be transmitted at the rate specified +by the +.Nm pipe +bandwidth. +The burst size depends on how long the pipe has been idle; +the effective burst size is calculated as follows: +MAX( +.Ar size +, +.Nm bw +* pipe_idle_time). +.Pp +.It Cm profile Ar filename +A file specifying the additional overhead incurred in the transmission +of a packet on the link. +.Pp +Some link types introduce extra delays in the transmission +of a packet, e.g., because of MAC level framing, contention on +the use of the channel, MAC level retransmissions and so on. +From our point of view, the channel is effectively unavailable +for this extra time, which is constant or variable depending +on the link type. +Additionally, packets may be dropped after this +time (e.g., on a wireless link after too many retransmissions). +We can model the additional delay with an empirical curve +that represents its distribution. +.Bd -literal -offset indent + cumulative probability + 1.0 ^ + | + L +-- loss-level x + | ****** + | * + | ***** + | * + | ** + | * + +-------*-------------------> + delay +.Ed +The empirical curve may have both vertical and horizontal lines. +Vertical lines represent constant delay for a range of +probabilities. +Horizontal lines correspond to a discontinuity in the delay +distribution: the pipe will use the largest delay for a +given probability. +.Pp +The file format is the following, with whitespace acting as +a separator and '#' indicating the beginning a comment: +.Bl -tag -width indent +.It Cm name Ar identifier +optional name (listed by "ipfw pipe show") +to identify the delay distribution; +.It Cm bw Ar value +the bandwidth used for the pipe. +If not specified here, it must be present +explicitly as a configuration parameter for the pipe; +.It Cm loss-level Ar L +the probability above which packets are lost. +(0.0 <= L <= 1.0, default 1.0 i.e., no loss); +.It Cm samples Ar N +the number of samples used in the internal +representation of the curve (2..1024; default 100); +.It Cm "delay prob" | "prob delay" +One of these two lines is mandatory and defines +the format of the following lines with data points. +.It Ar XXX Ar YYY +2 or more lines representing points in the curve, +with either delay or probability first, according +to the chosen format. +The unit for delay is milliseconds. +Data points do not need to be sorted. +Also, the number of actual lines can be different +from the value of the "samples" parameter: +.Nm +utility will sort and interpolate +the curve as needed. +.El +.Pp +Example of a profile file: +.Bd -literal -offset indent +name bla_bla_bla +samples 100 +loss-level 0.86 +prob delay +0 200 # minimum overhead is 200ms +0.5 200 +0.5 300 +0.8 1000 +0.9 1300 +1 1300 +#configuration file end +.Ed +.El +.Pp +The following parameters can be configured for a queue: +.Pp +.Bl -tag -width indent -compact +.It Cm pipe Ar pipe_nr +Connects a queue to the specified pipe. +Multiple queues (with the same or different weights) can be connected to +the same pipe, which specifies the aggregate rate for the set of queues. +.Pp +.It Cm weight Ar weight +Specifies the weight to be used for flows matching this queue. +The weight must be in the range 1..100, and defaults to 1. +.El +.Pp +The following case-insensitive parameters can be configured for a +scheduler: +.Pp +.Bl -tag -width indent -compact +.It Cm type Ar {fifo | wf2q+ | rr | qfq} +specifies the scheduling algorithm to use. +.Bl -tag -width indent -compact +.It Cm fifo +is just a FIFO scheduler (which means that all packets +are stored in the same queue as they arrive to the scheduler). +FIFO has O(1) per-packet time complexity, with very low +constants (estimate 60-80ns on a 2GHz desktop machine) +but gives no service guarantees. +.It Cm wf2q+ +implements the WF2Q+ algorithm, which is a Weighted Fair Queueing +algorithm which permits flows to share bandwidth according to +their weights. +Note that weights are not priorities; even a flow +with a minuscule weight will never starve. +WF2Q+ has O(log N) per-packet processing cost, where N is the number +of flows, and is the default algorithm used by previous versions +dummynet's queues. +.It Cm rr +implements the Deficit Round Robin algorithm, which has O(1) processing +costs (roughly, 100-150ns per packet) +and permits bandwidth allocation according to weights, but +with poor service guarantees. +.It Cm qfq +implements the QFQ algorithm, which is a very fast variant of +WF2Q+, with similar service guarantees and O(1) processing +costs (roughly, 200-250ns per packet). +.El +.El +.Pp +In addition to the type, all parameters allowed for a pipe can also +be specified for a scheduler. +.Pp +Finally, the following parameters can be configured for both +pipes and queues: +.Pp +.Bl -tag -width XXXX -compact +.It Cm buckets Ar hash-table-size +Specifies the size of the hash table used for storing the +various queues. +Default value is 64 controlled by the +.Xr sysctl 8 +variable +.Va net.inet.ip.dummynet.hash_size , +allowed range is 16 to 65536. +.Pp +.It Cm mask Ar mask-specifier +Packets sent to a given pipe or queue by an +.Nm +rule can be further classified into multiple flows, each of which is then +sent to a different +.Em dynamic +pipe or queue. +A flow identifier is constructed by masking the IP addresses, +ports and protocol types as specified with the +.Cm mask +options in the configuration of the pipe or queue. +For each different flow identifier, a new pipe or queue is created +with the same parameters as the original object, and matching packets +are sent to it. +.Pp +Thus, when +.Em dynamic pipes +are used, each flow will get the same bandwidth as defined by the pipe, +whereas when +.Em dynamic queues +are used, each flow will share the parent's pipe bandwidth evenly +with other flows generated by the same queue (note that other queues +with different weights might be connected to the same pipe). +.br +Available mask specifiers are a combination of one or more of the following: +.Pp +.Cm dst-ip Ar mask , +.Cm dst-ip6 Ar mask , +.Cm src-ip Ar mask , +.Cm src-ip6 Ar mask , +.Cm dst-port Ar mask , +.Cm src-port Ar mask , +.Cm flow-id Ar mask , +.Cm proto Ar mask +or +.Cm all , +.Pp +where the latter means all bits in all fields are significant. +.Pp +.It Cm noerror +When a packet is dropped by a +.Nm dummynet +queue or pipe, the error +is normally reported to the caller routine in the kernel, in the +same way as it happens when a device queue fills up. +Setting this +option reports the packet as successfully delivered, which can be +needed for some experimental setups where you want to simulate +loss or congestion at a remote router. +.Pp +.It Cm plr Ar packet-loss-rate +Packet loss rate. +Argument +.Ar packet-loss-rate +is a floating-point number between 0 and 1, with 0 meaning no +loss, 1 meaning 100% loss. +The loss rate is internally represented on 31 bits. +.Pp +.It Cm queue Brq Ar slots | size Ns Cm Kbytes +Queue size, in +.Ar slots +or +.Cm KBytes . +Default value is 50 slots, which +is the typical queue size for Ethernet devices. +Note that for slow speed links you should keep the queue +size short or your traffic might be affected by a significant +queueing delay. +E.g., 50 max-sized ethernet packets (1500 bytes) mean 600Kbit +or 20s of queue on a 30Kbit/s pipe. +Even worse effects can result if you get packets from an +interface with a much larger MTU, e.g.\& the loopback interface +with its 16KB packets. +The +.Xr sysctl 8 +variables +.Em net.inet.ip.dummynet.pipe_byte_limit +and +.Em net.inet.ip.dummynet.pipe_slot_limit +control the maximum lengths that can be specified. +.Pp +.It Cm red | gred Ar w_q Ns / Ns Ar min_th Ns / Ns Ar max_th Ns / Ns Ar max_p +Make use of the RED (Random Early Detection) queue management algorithm. +.Ar w_q +and +.Ar max_p +are floating +point numbers between 0 and 1 (0 not included), while +.Ar min_th +and +.Ar max_th +are integer numbers specifying thresholds for queue management +(thresholds are computed in bytes if the queue has been defined +in bytes, in slots otherwise). +The +.Nm dummynet +also supports the gentle RED variant (gred). +Three +.Xr sysctl 8 +variables can be used to control the RED behaviour: +.Bl -tag -width indent +.It Va net.inet.ip.dummynet.red_lookup_depth +specifies the accuracy in computing the average queue +when the link is idle (defaults to 256, must be greater than zero) +.It Va net.inet.ip.dummynet.red_avg_pkt_size +specifies the expected average packet size (defaults to 512, must be +greater than zero) +.It Va net.inet.ip.dummynet.red_max_pkt_size +specifies the expected maximum packet size, only used when queue +thresholds are in bytes (defaults to 1500, must be greater than zero). +.El +.El +.Pp +When used with IPv6 data, +.Nm dummynet +currently has several limitations. +Information necessary to route link-local packets to an +interface is not available after processing by +.Nm dummynet +so those packets are dropped in the output path. +Care should be taken to ensure that link-local packets are not passed to +.Nm dummynet . +.Sh CHECKLIST +Here are some important points to consider when designing your +rules: +.Bl -bullet +.It +Remember that you filter both packets going +.Cm in +and +.Cm out . +Most connections need packets going in both directions. +.It +Remember to test very carefully. +It is a good idea to be near the console when doing this. +If you cannot be near the console, +use an auto-recovery script such as the one in +.Pa /usr/share/examples/ipfw/change_rules.sh . +.It +Do not forget the loopback interface. +.El +.Sh FINE POINTS +.Bl -bullet +.It +There are circumstances where fragmented datagrams are unconditionally +dropped. +TCP packets are dropped if they do not contain at least 20 bytes of +TCP header, UDP packets are dropped if they do not contain a full 8 +byte UDP header, and ICMP packets are dropped if they do not contain +4 bytes of ICMP header, enough to specify the ICMP type, code, and +checksum. +These packets are simply logged as +.Dq pullup failed +since there may not be enough good data in the packet to produce a +meaningful log entry. +.It +Another type of packet is unconditionally dropped, a TCP packet with a +fragment offset of one. +This is a valid packet, but it only has one use, to try +to circumvent firewalls. +When logging is enabled, these packets are +reported as being dropped by rule -1. +.It +If you are logged in over a network, loading the +.Xr kld 4 +version of +.Nm +is probably not as straightforward as you would think. +The following command line is recommended: +.Bd -literal -offset indent +kldload ipfw && \e +ipfw add 32000 allow ip from any to any +.Ed +.Pp +Along the same lines, doing an +.Bd -literal -offset indent +ipfw flush +.Ed +.Pp +in similar surroundings is also a bad idea. +.It +The +.Nm +filter list may not be modified if the system security level +is set to 3 or higher +(see +.Xr init 8 +for information on system security levels). +.El +.Sh PACKET DIVERSION +A +.Xr divert 4 +socket bound to the specified port will receive all packets +diverted to that port. +If no socket is bound to the destination port, or if the divert module is +not loaded, or if the kernel was not compiled with divert socket support, +the packets are dropped. +.Sh NETWORK ADDRESS TRANSLATION (NAT) +.Nm +support in-kernel NAT using the kernel version of +.Xr libalias 3 . +.Pp +The nat configuration command is the following: +.Bd -ragged -offset indent +.Bk -words +.Cm nat +.Ar nat_number +.Cm config +.Ar nat-configuration +.Ek +.Ed +.Pp +The following parameters can be configured: +.Bl -tag -width indent +.It Cm ip Ar ip_address +Define an ip address to use for aliasing. +.It Cm if Ar nic +Use ip address of NIC for aliasing, dynamically changing +it if NIC's ip address changes. +.It Cm log +Enable logging on this nat instance. +.It Cm deny_in +Deny any incoming connection from outside world. +.It Cm same_ports +Try to leave the alias port numbers unchanged from +the actual local port numbers. +.It Cm unreg_only +Traffic on the local network not originating from an +unregistered address spaces will be ignored. +.It Cm reset +Reset table of the packet aliasing engine on address change. +.It Cm reverse +Reverse the way libalias handles aliasing. +.It Cm proxy_only +Obey transparent proxy rules only, packet aliasing is not performed. +.It Cm skip_global +Skip instance in case of global state lookup (see below). +.El +.Pp +Some specials value can be supplied instead of +.Va nat_number: +.Bl -tag -width indent +.It Cm global +Looks up translation state in all configured nat instances. +If an entry is found, packet is aliased according to that entry. +If no entry was found in any of the instances, packet is passed unchanged, +and no new entry will be created. +See section +.Sx MULTIPLE INSTANCES +in +.Xr natd 8 +for more information. +.It Cm tablearg +Uses argument supplied in lookup table. +See +.Sx LOOKUP TABLES +section below for more information on lookup tables. +.El +.Pp +To let the packet continue after being (de)aliased, set the sysctl variable +.Va net.inet.ip.fw.one_pass +to 0. +For more information about aliasing modes, refer to +.Xr libalias 3 . +See Section +.Sx EXAMPLES +for some examples about nat usage. +.Ss REDIRECT AND LSNAT SUPPORT IN IPFW +Redirect and LSNAT support follow closely the syntax used in +.Xr natd 8 . +See Section +.Sx EXAMPLES +for some examples on how to do redirect and lsnat. +.Ss SCTP NAT SUPPORT +SCTP nat can be configured in a similar manner to TCP through the +.Nm +command line tool. +The main difference is that +.Nm sctp nat +does not do port translation. +Since the local and global side ports will be the same, +there is no need to specify both. +Ports are redirected as follows: +.Bd -ragged -offset indent +.Bk -words +.Cm nat +.Ar nat_number +.Cm config if +.Ar nic +.Cm redirect_port sctp +.Ar ip_address [,addr_list] {[port | port-port] [,ports]} +.Ek +.Ed +.Pp +Most +.Nm sctp nat +configuration can be done in real-time through the +.Xr sysctl 8 +interface. +All may be changed dynamically, though the hash_table size will only +change for new +.Nm nat +instances. +See +.Sx SYSCTL VARIABLES +for more info. +.Sh LOADER TUNABLES +Tunables can be set in +.Xr loader 8 +prompt, +.Xr loader.conf 5 +or +.Xr kenv 1 +before ipfw module gets loaded. +.Bl -tag -width indent +.It Va net.inet.ip.fw.default_to_accept: No 0 +Defines ipfw last rule behavior. +This value overrides +.Cd "options IPFW_DEFAULT_TO_(ACCEPT|DENY)" +from kernel configuration file. +.It Va net.inet.ip.fw.tables_max: No 128 +Defines number of tables available in ipfw. +Number cannot exceed 65534. +.El +.Sh SYSCTL VARIABLES +A set of +.Xr sysctl 8 +variables controls the behaviour of the firewall and +associated modules +.Pq Nm dummynet , bridge , sctp nat . +These are shown below together with their default value +(but always check with the +.Xr sysctl 8 +command what value is actually in use) and meaning: +.Bl -tag -width indent +.It Va net.inet.ip.alias.sctp.accept_global_ootb_addip: No 0 +Defines how the +.Nm nat +responds to receipt of global OOTB ASCONF-AddIP: +.Bl -tag -width indent +.It Cm 0 +No response (unless a partially matching association exists - +ports and vtags match but global address does not) +.It Cm 1 +.Nm nat +will accept and process all OOTB global AddIP messages. +.El +.Pp +Option 1 should never be selected as this forms a security risk. +An attacker can +establish multiple fake associations by sending AddIP messages. +.It Va net.inet.ip.alias.sctp.chunk_proc_limit: No 5 +Defines the maximum number of chunks in an SCTP packet that will be +parsed for a +packet that matches an existing association. +This value is enforced to be greater or equal than +.Cm net.inet.ip.alias.sctp.initialising_chunk_proc_limit . +A high value is +a DoS risk yet setting too low a value may result in +important control chunks in +the packet not being located and parsed. +.It Va net.inet.ip.alias.sctp.error_on_ootb: No 1 +Defines when the +.Nm nat +responds to any Out-of-the-Blue (OOTB) packets with ErrorM packets. +An OOTB packet is a packet that arrives with no existing association +registered in the +.Nm nat +and is not an INIT or ASCONF-AddIP packet: +.Bl -tag -width indent +.It Cm 0 +ErrorM is never sent in response to OOTB packets. +.It Cm 1 +ErrorM is only sent to OOTB packets received on the local side. +.It Cm 2 +ErrorM is sent to the local side and on the global side ONLY if there is a +partial match (ports and vtags match but the source global IP does not). +This value is only useful if the +.Nm nat +is tracking global IP addresses. +.It Cm 3 +ErrorM is sent in response to all OOTB packets on both +the local and global side +(DoS risk). +.El +.Pp +At the moment the default is 0, since the ErrorM packet is not yet +supported by most SCTP stacks. +When it is supported, and if not tracking +global addresses, we recommend setting this value to 1 to allow +multi-homed local hosts to function with the +.Nm nat . +To track global addresses, we recommend setting this value to 2 to +allow global hosts to be informed when they need to (re)send an +ASCONF-AddIP. +Value 3 should never be chosen (except for debugging) as the +.Nm nat +will respond to all OOTB global packets (a DoS risk). +.It Va net.inet.ip.alias.sctp.hashtable_size: No 2003 +Size of hash tables used for +.Nm nat +lookups (100 < prime_number > 1000001). +This value sets the +.Nm hash table +size for any future created +.Nm nat +instance and therefore must be set prior to creating a +.Nm nat +instance. +The table sizes may be changed to suit specific needs. +If there will be few +concurrent associations, and memory is scarce, you may make these smaller. +If there will be many thousands (or millions) of concurrent associations, you +should make these larger. +A prime number is best for the table size. +The sysctl +update function will adjust your input value to the next highest prime number. +.It Va net.inet.ip.alias.sctp.holddown_time: No 0 +Hold association in table for this many seconds after receiving a +SHUTDOWN-COMPLETE. +This allows endpoints to correct shutdown gracefully if a +shutdown_complete is lost and retransmissions are required. +.It Va net.inet.ip.alias.sctp.init_timer: No 15 +Timeout value while waiting for (INIT-ACK|AddIP-ACK). +This value cannot be 0. +.It Va net.inet.ip.alias.sctp.initialising_chunk_proc_limit: No 2 +Defines the maximum number of chunks in an SCTP packet that will be parsed when +no existing association exists that matches that packet. +Ideally this packet +will only be an INIT or ASCONF-AddIP packet. +A higher value may become a DoS +risk as malformed packets can consume processing resources. +.It Va net.inet.ip.alias.sctp.param_proc_limit: No 25 +Defines the maximum number of parameters within a chunk that will be +parsed in a +packet. +As for other similar sysctl variables, larger values pose a DoS risk. +.It Va net.inet.ip.alias.sctp.log_level: No 0 +Level of detail in the system log messages (0 \- minimal, 1 \- event, +2 \- info, 3 \- detail, 4 \- debug, 5 \- max debug). +May be a good +option in high loss environments. +.It Va net.inet.ip.alias.sctp.shutdown_time: No 15 +Timeout value while waiting for SHUTDOWN-COMPLETE. +This value cannot be 0. +.It Va net.inet.ip.alias.sctp.track_global_addresses: No 0 +Enables/disables global IP address tracking within the +.Nm nat +and places an +upper limit on the number of addresses tracked for each association: +.Bl -tag -width indent +.It Cm 0 +Global tracking is disabled +.It Cm >1 +Enables tracking, the maximum number of addresses tracked for each +association is limited to this value +.El +.Pp +This variable is fully dynamic, the new value will be adopted for all newly +arriving associations, existing associations are treated +as they were previously. +Global tracking will decrease the number of collisions within the +.Nm nat +at a cost +of increased processing load, memory usage, complexity, and possible +.Nm nat +state +problems in complex networks with multiple +.Nm nats . +We recommend not tracking +global IP addresses, this will still result in a fully functional +.Nm nat . +.It Va net.inet.ip.alias.sctp.up_timer: No 300 +Timeout value to keep an association up with no traffic. +This value cannot be 0. +.It Va net.inet.ip.dummynet.expire : No 1 +Lazily delete dynamic pipes/queue once they have no pending traffic. +You can disable this by setting the variable to 0, in which case +the pipes/queues will only be deleted when the threshold is reached. +.It Va net.inet.ip.dummynet.hash_size : No 64 +Default size of the hash table used for dynamic pipes/queues. +This value is used when no +.Cm buckets +option is specified when configuring a pipe/queue. +.It Va net.inet.ip.dummynet.io_fast : No 0 +If set to a non-zero value, +the +.Dq fast +mode of +.Nm dummynet +operation (see above) is enabled. +.It Va net.inet.ip.dummynet.io_pkt +Number of packets passed to +.Nm dummynet . +.It Va net.inet.ip.dummynet.io_pkt_drop +Number of packets dropped by +.Nm dummynet . +.It Va net.inet.ip.dummynet.io_pkt_fast +Number of packets bypassed by the +.Nm dummynet +scheduler. +.It Va net.inet.ip.dummynet.max_chain_len : No 16 +Target value for the maximum number of pipes/queues in a hash bucket. +The product +.Cm max_chain_len*hash_size +is used to determine the threshold over which empty pipes/queues +will be expired even when +.Cm net.inet.ip.dummynet.expire=0 . +.It Va net.inet.ip.dummynet.red_lookup_depth : No 256 +.It Va net.inet.ip.dummynet.red_avg_pkt_size : No 512 +.It Va net.inet.ip.dummynet.red_max_pkt_size : No 1500 +Parameters used in the computations of the drop probability +for the RED algorithm. +.It Va net.inet.ip.dummynet.pipe_byte_limit : No 1048576 +.It Va net.inet.ip.dummynet.pipe_slot_limit : No 100 +The maximum queue size that can be specified in bytes or packets. +These limits prevent accidental exhaustion of resources such as mbufs. +If you raise these limits, +you should make sure the system is configured so that sufficient resources +are available. +.It Va net.inet.ip.fw.autoinc_step : No 100 +Delta between rule numbers when auto-generating them. +The value must be in the range 1..1000. +.It Va net.inet.ip.fw.curr_dyn_buckets : Va net.inet.ip.fw.dyn_buckets +The current number of buckets in the hash table for dynamic rules +(readonly). +.It Va net.inet.ip.fw.debug : No 1 +Controls debugging messages produced by +.Nm . +.It Va net.inet.ip.fw.default_rule : No 65535 +The default rule number (read-only). +By the design of +.Nm , the default rule is the last one, so its number +can also serve as the highest number allowed for a rule. +.It Va net.inet.ip.fw.dyn_buckets : No 256 +The number of buckets in the hash table for dynamic rules. +Must be a power of 2, up to 65536. +It only takes effect when all dynamic rules have expired, so you +are advised to use a +.Cm flush +command to make sure that the hash table is resized. +.It Va net.inet.ip.fw.dyn_count : No 3 +Current number of dynamic rules +(read-only). +.It Va net.inet.ip.fw.dyn_keepalive : No 1 +Enables generation of keepalive packets for +.Cm keep-state +rules on TCP sessions. +A keepalive is generated to both +sides of the connection every 5 seconds for the last 20 +seconds of the lifetime of the rule. +.It Va net.inet.ip.fw.dyn_max : No 8192 +Maximum number of dynamic rules. +When you hit this limit, no more dynamic rules can be +installed until old ones expire. +.It Va net.inet.ip.fw.dyn_ack_lifetime : No 300 +.It Va net.inet.ip.fw.dyn_syn_lifetime : No 20 +.It Va net.inet.ip.fw.dyn_fin_lifetime : No 1 +.It Va net.inet.ip.fw.dyn_rst_lifetime : No 1 +.It Va net.inet.ip.fw.dyn_udp_lifetime : No 5 +.It Va net.inet.ip.fw.dyn_short_lifetime : No 30 +These variables control the lifetime, in seconds, of dynamic +rules. +Upon the initial SYN exchange the lifetime is kept short, +then increased after both SYN have been seen, then decreased +again during the final FIN exchange or when a RST is received. +Both +.Em dyn_fin_lifetime +and +.Em dyn_rst_lifetime +must be strictly lower than 5 seconds, the period of +repetition of keepalives. +The firewall enforces that. +.It Va net.inet.ip.fw.dyn_keep_states: No 0 +Keep dynamic states on rule/set deletion. +States are relinked to default rule (65535). +This can be handly for ruleset reload. +Turned off by default. +.It Va net.inet.ip.fw.enable : No 1 +Enables the firewall. +Setting this variable to 0 lets you run your machine without +firewall even if compiled in. +.It Va net.inet6.ip6.fw.enable : No 1 +provides the same functionality as above for the IPv6 case. +.It Va net.inet.ip.fw.one_pass : No 1 +When set, the packet exiting from the +.Nm dummynet +pipe or from +.Xr ng_ipfw 4 +node is not passed though the firewall again. +Otherwise, after an action, the packet is +reinjected into the firewall at the next rule. +.It Va net.inet.ip.fw.tables_max : No 128 +Maximum number of tables. +.It Va net.inet.ip.fw.verbose : No 1 +Enables verbose messages. +.It Va net.inet.ip.fw.verbose_limit : No 0 +Limits the number of messages produced by a verbose firewall. +.It Va net.inet6.ip6.fw.deny_unknown_exthdrs : No 1 +If enabled packets with unknown IPv6 Extension Headers will be denied. +.It Va net.link.ether.ipfw : No 0 +Controls whether layer-2 packets are passed to +.Nm . +Default is no. +.It Va net.link.bridge.ipfw : No 0 +Controls whether bridged packets are passed to +.Nm . +Default is no. +.El +.Sh EXAMPLES +There are far too many possible uses of +.Nm +so this Section will only give a small set of examples. +.Pp +.Ss BASIC PACKET FILTERING +This command adds an entry which denies all tcp packets from +.Em cracker.evil.org +to the telnet port of +.Em wolf.tambov.su +from being forwarded by the host: +.Pp +.Dl "ipfw add deny tcp from cracker.evil.org to wolf.tambov.su telnet" +.Pp +This one disallows any connection from the entire cracker's +network to my host: +.Pp +.Dl "ipfw add deny ip from 123.45.67.0/24 to my.host.org" +.Pp +A first and efficient way to limit access (not using dynamic rules) +is the use of the following rules: +.Pp +.Dl "ipfw add allow tcp from any to any established" +.Dl "ipfw add allow tcp from net1 portlist1 to net2 portlist2 setup" +.Dl "ipfw add allow tcp from net3 portlist3 to net3 portlist3 setup" +.Dl "..." +.Dl "ipfw add deny tcp from any to any" +.Pp +The first rule will be a quick match for normal TCP packets, +but it will not match the initial SYN packet, which will be +matched by the +.Cm setup +rules only for selected source/destination pairs. +All other SYN packets will be rejected by the final +.Cm deny +rule. +.Pp +If you administer one or more subnets, you can take advantage +of the address sets and or-blocks and write extremely +compact rulesets which selectively enable services to blocks +of clients, as below: +.Pp +.Dl "goodguys=\*q{ 10.1.2.0/24{20,35,66,18} or 10.2.3.0/28{6,3,11} }\*q" +.Dl "badguys=\*q10.1.2.0/24{8,38,60}\*q" +.Dl "" +.Dl "ipfw add allow ip from ${goodguys} to any" +.Dl "ipfw add deny ip from ${badguys} to any" +.Dl "... normal policies ..." +.Pp +The +.Cm verrevpath +option could be used to do automated anti-spoofing by adding the +following to the top of a ruleset: +.Pp +.Dl "ipfw add deny ip from any to any not verrevpath in" +.Pp +This rule drops all incoming packets that appear to be coming to the +system on the wrong interface. +For example, a packet with a source +address belonging to a host on a protected internal network would be +dropped if it tried to enter the system from an external interface. +.Pp +The +.Cm antispoof +option could be used to do similar but more restricted anti-spoofing +by adding the following to the top of a ruleset: +.Pp +.Dl "ipfw add deny ip from any to any not antispoof in" +.Pp +This rule drops all incoming packets that appear to be coming from another +directly connected system but on the wrong interface. +For example, a packet with a source address of +.Li 192.168.0.0/24 , +configured on +.Li fxp0 , +but coming in on +.Li fxp1 +would be dropped. +.Pp +The +.Cm setdscp +option could be used to (re)mark user traffic, +by adding the following to the appropriate place in ruleset: +.Pp +.Dl "ipfw add setdscp be ip from any to any dscp af11,af21" +.Ss DYNAMIC RULES +In order to protect a site from flood attacks involving fake +TCP packets, it is safer to use dynamic rules: +.Pp +.Dl "ipfw add check-state" +.Dl "ipfw add deny tcp from any to any established" +.Dl "ipfw add allow tcp from my-net to any setup keep-state" +.Pp +This will let the firewall install dynamic rules only for +those connection which start with a regular SYN packet coming +from the inside of our network. +Dynamic rules are checked when encountering the first +occurrence of a +.Cm check-state , +.Cm keep-state +or +.Cm limit +rule. +A +.Cm check-state +rule should usually be placed near the beginning of the +ruleset to minimize the amount of work scanning the ruleset. +Your mileage may vary. +.Pp +To limit the number of connections a user can open +you can use the following type of rules: +.Pp +.Dl "ipfw add allow tcp from my-net/24 to any setup limit src-addr 10" +.Dl "ipfw add allow tcp from any to me setup limit src-addr 4" +.Pp +The former (assuming it runs on a gateway) will allow each host +on a /24 network to open at most 10 TCP connections. +The latter can be placed on a server to make sure that a single +client does not use more than 4 simultaneous connections. +.Pp +.Em BEWARE : +stateful rules can be subject to denial-of-service attacks +by a SYN-flood which opens a huge number of dynamic rules. +The effects of such attacks can be partially limited by +acting on a set of +.Xr sysctl 8 +variables which control the operation of the firewall. +.Pp +Here is a good usage of the +.Cm list +command to see accounting records and timestamp information: +.Pp +.Dl ipfw -at list +.Pp +or in short form without timestamps: +.Pp +.Dl ipfw -a list +.Pp +which is equivalent to: +.Pp +.Dl ipfw show +.Pp +Next rule diverts all incoming packets from 192.168.2.0/24 +to divert port 5000: +.Pp +.Dl ipfw divert 5000 ip from 192.168.2.0/24 to any in +.Ss TRAFFIC SHAPING +The following rules show some of the applications of +.Nm +and +.Nm dummynet +for simulations and the like. +.Pp +This rule drops random incoming packets with a probability +of 5%: +.Pp +.Dl "ipfw add prob 0.05 deny ip from any to any in" +.Pp +A similar effect can be achieved making use of +.Nm dummynet +pipes: +.Pp +.Dl "ipfw add pipe 10 ip from any to any" +.Dl "ipfw pipe 10 config plr 0.05" +.Pp +We can use pipes to artificially limit bandwidth, e.g.\& on a +machine acting as a router, if we want to limit traffic from +local clients on 192.168.2.0/24 we do: +.Pp +.Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" +.Dl "ipfw pipe 1 config bw 300Kbit/s queue 50KBytes" +.Pp +note that we use the +.Cm out +modifier so that the rule is not used twice. +Remember in fact that +.Nm +rules are checked both on incoming and outgoing packets. +.Pp +Should we want to simulate a bidirectional link with bandwidth +limitations, the correct way is the following: +.Pp +.Dl "ipfw add pipe 1 ip from any to any out" +.Dl "ipfw add pipe 2 ip from any to any in" +.Dl "ipfw pipe 1 config bw 64Kbit/s queue 10Kbytes" +.Dl "ipfw pipe 2 config bw 64Kbit/s queue 10Kbytes" +.Pp +The above can be very useful, e.g.\& if you want to see how +your fancy Web page will look for a residential user who +is connected only through a slow link. +You should not use only one pipe for both directions, unless +you want to simulate a half-duplex medium (e.g.\& AppleTalk, +Ethernet, IRDA). +It is not necessary that both pipes have the same configuration, +so we can also simulate asymmetric links. +.Pp +Should we want to verify network performance with the RED queue +management algorithm: +.Pp +.Dl "ipfw add pipe 1 ip from any to any" +.Dl "ipfw pipe 1 config bw 500Kbit/s queue 100 red 0.002/30/80/0.1" +.Pp +Another typical application of the traffic shaper is to +introduce some delay in the communication. +This can significantly affect applications which do a lot of Remote +Procedure Calls, and where the round-trip-time of the +connection often becomes a limiting factor much more than +bandwidth: +.Pp +.Dl "ipfw add pipe 1 ip from any to any out" +.Dl "ipfw add pipe 2 ip from any to any in" +.Dl "ipfw pipe 1 config delay 250ms bw 1Mbit/s" +.Dl "ipfw pipe 2 config delay 250ms bw 1Mbit/s" +.Pp +Per-flow queueing can be useful for a variety of purposes. +A very simple one is counting traffic: +.Pp +.Dl "ipfw add pipe 1 tcp from any to any" +.Dl "ipfw add pipe 1 udp from any to any" +.Dl "ipfw add pipe 1 ip from any to any" +.Dl "ipfw pipe 1 config mask all" +.Pp +The above set of rules will create queues (and collect +statistics) for all traffic. +Because the pipes have no limitations, the only effect is +collecting statistics. +Note that we need 3 rules, not just the last one, because +when +.Nm +tries to match IP packets it will not consider ports, so we +would not see connections on separate ports as different +ones. +.Pp +A more sophisticated example is limiting the outbound traffic +on a net with per-host limits, rather than per-network limits: +.Pp +.Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" +.Dl "ipfw add pipe 2 ip from any to 192.168.2.0/24 in" +.Dl "ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" +.Dl "ipfw pipe 2 config mask dst-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" +.Ss LOOKUP TABLES +In the following example, we need to create several traffic bandwidth +classes and we need different hosts/networks to fall into different classes. +We create one pipe for each class and configure them accordingly. +Then we create a single table and fill it with IP subnets and addresses. +For each subnet/host we set the argument equal to the number of the pipe +that it should use. +Then we classify traffic using a single rule: +.Pp +.Dl "ipfw pipe 1 config bw 1000Kbyte/s" +.Dl "ipfw pipe 4 config bw 4000Kbyte/s" +.Dl "..." +.Dl "ipfw table 1 add 192.168.2.0/24 1" +.Dl "ipfw table 1 add 192.168.0.0/27 4" +.Dl "ipfw table 1 add 192.168.0.2 1" +.Dl "..." +.Dl "ipfw add pipe tablearg ip from table(1) to any" +.Pp +Using the +.Cm fwd +action, the table entries may include hostnames and IP addresses. +.Pp +.Dl "ipfw table 1 add 192.168.2.0/24 10.23.2.1" +.Dl "ipfw table 1 add 192.168.0.0/27 router1.dmz" +.Dl "..." +.Dl "ipfw add 100 fwd tablearg ip from any to table(1)" +.Pp +In the following example per-interface firewall is created: +.Pp +.Dl "ipfw table 10 add vlan20 12000" +.Dl "ipfw table 10 add vlan30 13000" +.Dl "ipfw table 20 add vlan20 22000" +.Dl "ipfw table 20 add vlan30 23000" +.Dl ".." +.Dl "ipfw add 100 ipfw skipto tablearg ip from any to any recv 'table(10)' in" +.Dl "ipfw add 200 ipfw skipto tablearg ip from any to any xmit 'table(10)' out" +.Ss SETS OF RULES +To add a set of rules atomically, e.g.\& set 18: +.Pp +.Dl "ipfw set disable 18" +.Dl "ipfw add NN set 18 ... # repeat as needed" +.Dl "ipfw set enable 18" +.Pp +To delete a set of rules atomically the command is simply: +.Pp +.Dl "ipfw delete set 18" +.Pp +To test a ruleset and disable it and regain control if something goes wrong: +.Pp +.Dl "ipfw set disable 18" +.Dl "ipfw add NN set 18 ... # repeat as needed" +.Dl "ipfw set enable 18; echo done; sleep 30 && ipfw set disable 18" +.Pp +Here if everything goes well, you press control-C before the "sleep" +terminates, and your ruleset will be left active. +Otherwise, e.g.\& if +you cannot access your box, the ruleset will be disabled after +the sleep terminates thus restoring the previous situation. +.Pp +To show rules of the specific set: +.Pp +.Dl "ipfw set 18 show" +.Pp +To show rules of the disabled set: +.Pp +.Dl "ipfw -S set 18 show" +.Pp +To clear a specific rule counters of the specific set: +.Pp +.Dl "ipfw set 18 zero NN" +.Pp +To delete a specific rule of the specific set: +.Pp +.Dl "ipfw set 18 delete NN" +.Ss NAT, REDIRECT AND LSNAT +First redirect all the traffic to nat instance 123: +.Pp +.Dl "ipfw add nat 123 all from any to any" +.Pp +Then to configure nat instance 123 to alias all the outgoing traffic with ip +192.168.0.123, blocking all incoming connections, trying to keep +same ports on both sides, clearing aliasing table on address change +and keeping a log of traffic/link statistics: +.Pp +.Dl "ipfw nat 123 config ip 192.168.0.123 log deny_in reset same_ports" +.Pp +Or to change address of instance 123, aliasing table will be cleared (see +reset option): +.Pp +.Dl "ipfw nat 123 config ip 10.0.0.1" +.Pp +To see configuration of nat instance 123: +.Pp +.Dl "ipfw nat 123 show config" +.Pp +To show logs of all the instances in range 111-999: +.Pp +.Dl "ipfw nat 111-999 show" +.Pp +To see configurations of all instances: +.Pp +.Dl "ipfw nat show config" +.Pp +Or a redirect rule with mixed modes could looks like: +.Pp +.Dl "ipfw nat 123 config redirect_addr 10.0.0.1 10.0.0.66" +.Dl " redirect_port tcp 192.168.0.1:80 500" +.Dl " redirect_proto udp 192.168.1.43 192.168.1.1" +.Dl " redirect_addr 192.168.0.10,192.168.0.11" +.Dl " 10.0.0.100 # LSNAT" +.Dl " redirect_port tcp 192.168.0.1:80,192.168.0.10:22" +.Dl " 500 # LSNAT" +.Pp +or it could be split in: +.Pp +.Dl "ipfw nat 1 config redirect_addr 10.0.0.1 10.0.0.66" +.Dl "ipfw nat 2 config redirect_port tcp 192.168.0.1:80 500" +.Dl "ipfw nat 3 config redirect_proto udp 192.168.1.43 192.168.1.1" +.Dl "ipfw nat 4 config redirect_addr 192.168.0.10,192.168.0.11,192.168.0.12" +.Dl " 10.0.0.100" +.Dl "ipfw nat 5 config redirect_port tcp" +.Dl " 192.168.0.1:80,192.168.0.10:22,192.168.0.20:25 500" +.Sh SEE ALSO +.Xr cpp 1 , +.Xr m4 1 , +.Xr altq 4 , +.Xr divert 4 , +.Xr dummynet 4 , +.Xr if_bridge 4 , +.Xr ip 4 , +.Xr ipfirewall 4 , +.Xr ng_ipfw 4 , +.Xr protocols 5 , +.Xr services 5 , +.Xr init 8 , +.Xr kldload 8 , +.Xr reboot 8 , +.Xr sysctl 8 , +.Xr syslogd 8 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 2.0 . +.Nm dummynet +was introduced in +.Fx 2.2.8 . +Stateful extensions were introduced in +.Fx 4.0 . +.Nm ipfw2 +was introduced in Summer 2002. +.Sh AUTHORS +.An Ugen J. S. Antsilevich , +.An Poul-Henning Kamp , +.An Alex Nash , +.An Archie Cobbs , +.An Luigi Rizzo . +.Pp +.An -nosplit +API based upon code written by +.An Daniel Boulet +for BSDI. +.Pp +Dummynet has been introduced by Luigi Rizzo in 1997-1998. +.Pp +Some early work (1999-2000) on the +.Nm dummynet +traffic shaper supported by Akamba Corp. +.Pp +The ipfw core (ipfw2) has been completely redesigned and +reimplemented by Luigi Rizzo in summer 2002. +Further +actions and +options have been added by various developer over the years. +.Pp +.An -nosplit +In-kernel NAT support written by +.An Paolo Pisati Aq piso@FreeBSD.org +as part of a Summer of Code 2005 project. +.Pp +SCTP +.Nm nat +support has been developed by +.An The Centre for Advanced Internet Architectures (CAIA) Aq http://www.caia.swin.edu.au . +The primary developers and maintainers are David Hayes and Jason But. +For further information visit: +.Aq http://www.caia.swin.edu.au/urp/SONATA +.Pp +Delay profiles have been developed by Alessandro Cerri and +Luigi Rizzo, supported by the +European Commission within Projects Onelab and Onelab2. +.Sh BUGS +The syntax has grown over the years and sometimes it might be confusing. +Unfortunately, backward compatibility prevents cleaning up mistakes +made in the definition of the syntax. +.Pp +.Em !!! WARNING !!! +.Pp +Misconfiguring the firewall can put your computer in an unusable state, +possibly shutting down network services and requiring console access to +regain control of it. +.Pp +Incoming packet fragments diverted by +.Cm divert +are reassembled before delivery to the socket. +The action used on those packet is the one from the +rule which matches the first fragment of the packet. +.Pp +Packets diverted to userland, and then reinserted by a userland process +may lose various packet attributes. +The packet source interface name +will be preserved if it is shorter than 8 bytes and the userland process +saves and reuses the sockaddr_in +(as does +.Xr natd 8 ) ; +otherwise, it may be lost. +If a packet is reinserted in this manner, later rules may be incorrectly +applied, making the order of +.Cm divert +rules in the rule sequence very important. +.Pp +Dummynet drops all packets with IPv6 link-local addresses. +.Pp +Rules using +.Cm uid +or +.Cm gid +may not behave as expected. +In particular, incoming SYN packets may +have no uid or gid associated with them since they do not yet belong +to a TCP connection, and the uid/gid associated with a packet may not +be as expected if the associated process calls +.Xr setuid 2 +or similar system calls. +.Pp +Rule syntax is subject to the command line environment and some patterns +may need to be escaped with the backslash character +or quoted appropriately. +.Pp +Due to the architecture of +.Xr libalias 3 , +ipfw nat is not compatible with the TCP segmentation offloading (TSO). +Thus, to reliably nat your network traffic, please disable TSO +on your NICs using +.Xr ifconfig 8 . +.Pp +ICMP error messages are not implicitly matched by dynamic rules +for the respective conversations. +To avoid failures of network error detection and path MTU discovery, +ICMP error messages may need to be allowed explicitly through static +rules. +.Pp +Rules using +.Cm call +and +.Cm return +actions may lead to confusing behaviour if ruleset has mistakes, +and/or interaction with other subsystems (netgraph, dummynet, etc.) is used. +One possible case for this is packet leaving +.Nm +in subroutine on the input pass, while later on output encountering unpaired +.Cm return +first. +As the call stack is kept intact after input pass, packet will suddenly +return to the rule number used on input pass, not on output one. +Order of processing should be checked carefully to avoid such mistakes. diff --git a/ipfw/ipfw2.c b/ipfw/ipfw2.c new file mode 100644 index 0000000..5dbfd4a --- /dev/null +++ b/ipfw/ipfw2.c @@ -0,0 +1,3994 @@ +/* + * Copyright (c) 2002-2003 Luigi Rizzo + * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Idea and grammar partially left from: + * Copyright (c) 1993 Daniel Boulet + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + * NEW command line interface for IP firewall facility + * + * $FreeBSD: head/sbin/ipfw/ipfw2.c 206843 2010-04-19 15:11:45Z luigi $ + */ + +#include +#include +#include +#include +#include + +#include "ipfw2.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* ctime */ +#include /* _long_to_time */ +#include +#include +#include /* offsetof */ + +#include +#include /* only IFNAMSIZ */ +#include +#include /* only n_short, n_long */ +#include +#include +#include +#include +#include + +struct cmdline_opts co; /* global options */ + +int resvd_set_number = RESVD_SET; + +int ipfw_socket = -1; + +#ifndef s6_addr32 +#define s6_addr32 __u6_addr.__u6_addr32 +#endif + +#define GET_UINT_ARG(arg, min, max, tok, s_x) do { \ + if (!av[0]) \ + errx(EX_USAGE, "%s: missing argument", match_value(s_x, tok)); \ + if (_substrcmp(*av, "tablearg") == 0) { \ + arg = IP_FW_TABLEARG; \ + break; \ + } \ + \ + { \ + long _xval; \ + char *end; \ + \ + _xval = strtol(*av, &end, 10); \ + \ + if (!isdigit(**av) || *end != '\0' || (_xval == 0 && errno == EINVAL)) \ + errx(EX_DATAERR, "%s: invalid argument: %s", \ + match_value(s_x, tok), *av); \ + \ + if (errno == ERANGE || _xval < min || _xval > max) \ + errx(EX_DATAERR, "%s: argument is out of range (%u..%u): %s", \ + match_value(s_x, tok), min, max, *av); \ + \ + if (_xval == IP_FW_TABLEARG) \ + errx(EX_DATAERR, "%s: illegal argument value: %s", \ + match_value(s_x, tok), *av); \ + arg = _xval; \ + } \ +} while (0) + +static void +PRINT_UINT_ARG(const char *str, uint32_t arg) +{ + if (str != NULL) + printf("%s",str); + if (arg == IP_FW_TABLEARG) + printf("tablearg"); + else + printf("%u", arg); +} + +static struct _s_x f_tcpflags[] = { + { "syn", TH_SYN }, + { "fin", TH_FIN }, + { "ack", TH_ACK }, + { "psh", TH_PUSH }, + { "rst", TH_RST }, + { "urg", TH_URG }, + { "tcp flag", 0 }, + { NULL, 0 } +}; + +static struct _s_x f_tcpopts[] = { + { "mss", IP_FW_TCPOPT_MSS }, + { "maxseg", IP_FW_TCPOPT_MSS }, + { "window", IP_FW_TCPOPT_WINDOW }, + { "sack", IP_FW_TCPOPT_SACK }, + { "ts", IP_FW_TCPOPT_TS }, + { "timestamp", IP_FW_TCPOPT_TS }, + { "cc", IP_FW_TCPOPT_CC }, + { "tcp option", 0 }, + { NULL, 0 } +}; + +/* + * IP options span the range 0 to 255 so we need to remap them + * (though in fact only the low 5 bits are significant). + */ +static struct _s_x f_ipopts[] = { + { "ssrr", IP_FW_IPOPT_SSRR}, + { "lsrr", IP_FW_IPOPT_LSRR}, + { "rr", IP_FW_IPOPT_RR}, + { "ts", IP_FW_IPOPT_TS}, + { "ip option", 0 }, + { NULL, 0 } +}; + +static struct _s_x f_iptos[] = { + { "lowdelay", IPTOS_LOWDELAY}, + { "throughput", IPTOS_THROUGHPUT}, + { "reliability", IPTOS_RELIABILITY}, + { "mincost", IPTOS_MINCOST}, + { "congestion", IPTOS_ECN_CE}, + { "ecntransport", IPTOS_ECN_ECT0}, + { "ip tos option", 0}, + { NULL, 0 } +}; + +static struct _s_x limit_masks[] = { + {"all", DYN_SRC_ADDR|DYN_SRC_PORT|DYN_DST_ADDR|DYN_DST_PORT}, + {"src-addr", DYN_SRC_ADDR}, + {"src-port", DYN_SRC_PORT}, + {"dst-addr", DYN_DST_ADDR}, + {"dst-port", DYN_DST_PORT}, + {NULL, 0} +}; + +/* + * we use IPPROTO_ETHERTYPE as a fake protocol id to call the print routines + * This is only used in this code. + */ +#define IPPROTO_ETHERTYPE 0x1000 +static struct _s_x ether_types[] = { + /* + * Note, we cannot use "-:&/" in the names because they are field + * separators in the type specifications. Also, we use s = NULL as + * end-delimiter, because a type of 0 can be legal. + */ + { "ip", 0x0800 }, + { "ipv4", 0x0800 }, + { "ipv6", 0x86dd }, + { "arp", 0x0806 }, + { "rarp", 0x8035 }, + { "vlan", 0x8100 }, + { "loop", 0x9000 }, + { "trail", 0x1000 }, + { "at", 0x809b }, + { "atalk", 0x809b }, + { "aarp", 0x80f3 }, + { "pppoe_disc", 0x8863 }, + { "pppoe_sess", 0x8864 }, + { "ipx_8022", 0x00E0 }, + { "ipx_8023", 0x0000 }, + { "ipx_ii", 0x8137 }, + { "ipx_snap", 0x8137 }, + { "ipx", 0x8137 }, + { "ns", 0x0600 }, + { NULL, 0 } +}; + + +static struct _s_x rule_actions[] = { + { "accept", TOK_ACCEPT }, + { "pass", TOK_ACCEPT }, + { "allow", TOK_ACCEPT }, + { "permit", TOK_ACCEPT }, + { "count", TOK_COUNT }, + { "pipe", TOK_PIPE }, + { "queue", TOK_QUEUE }, + { "divert", TOK_DIVERT }, + { "tee", TOK_TEE }, + { "netgraph", TOK_NETGRAPH }, + { "ngtee", TOK_NGTEE }, + { "fwd", TOK_FORWARD }, + { "forward", TOK_FORWARD }, + { "skipto", TOK_SKIPTO }, + { "deny", TOK_DENY }, + { "drop", TOK_DENY }, + { "reject", TOK_REJECT }, + { "reset6", TOK_RESET6 }, + { "reset", TOK_RESET }, + { "unreach6", TOK_UNREACH6 }, + { "unreach", TOK_UNREACH }, + { "check-state", TOK_CHECKSTATE }, + { "//", TOK_COMMENT }, + { "nat", TOK_NAT }, + { "reass", TOK_REASS }, + { "setfib", TOK_SETFIB }, + { "call", TOK_CALL }, + { "return", TOK_RETURN }, + { NULL, 0 } /* terminator */ +}; + +static struct _s_x rule_action_params[] = { + { "altq", TOK_ALTQ }, + { "log", TOK_LOG }, + { "tag", TOK_TAG }, + { "untag", TOK_UNTAG }, + { NULL, 0 } /* terminator */ +}; + +/* + * The 'lookup' instruction accepts one of the following arguments. + * -1 is a terminator for the list. + * Arguments are passed as v[1] in O_DST_LOOKUP options. + */ +static int lookup_key[] = { + TOK_DSTIP, TOK_SRCIP, TOK_DSTPORT, TOK_SRCPORT, + TOK_UID, TOK_JAIL, TOK_DSCP, -1 }; + +static struct _s_x rule_options[] = { + { "tagged", TOK_TAGGED }, + { "uid", TOK_UID }, + { "gid", TOK_GID }, + { "jail", TOK_JAIL }, + { "in", TOK_IN }, + { "limit", TOK_LIMIT }, + { "keep-state", TOK_KEEPSTATE }, + { "bridged", TOK_LAYER2 }, + { "layer2", TOK_LAYER2 }, + { "out", TOK_OUT }, + { "diverted", TOK_DIVERTED }, + { "diverted-loopback", TOK_DIVERTEDLOOPBACK }, + { "diverted-output", TOK_DIVERTEDOUTPUT }, + { "xmit", TOK_XMIT }, + { "recv", TOK_RECV }, + { "via", TOK_VIA }, + { "fragment", TOK_FRAG }, + { "frag", TOK_FRAG }, + { "fib", TOK_FIB }, + { "ipoptions", TOK_IPOPTS }, + { "ipopts", TOK_IPOPTS }, + { "iplen", TOK_IPLEN }, + { "ipid", TOK_IPID }, + { "ipprecedence", TOK_IPPRECEDENCE }, + { "dscp", TOK_DSCP }, + { "iptos", TOK_IPTOS }, + { "ipttl", TOK_IPTTL }, + { "ipversion", TOK_IPVER }, + { "ipver", TOK_IPVER }, + { "estab", TOK_ESTAB }, + { "established", TOK_ESTAB }, + { "setup", TOK_SETUP }, + { "sockarg", TOK_SOCKARG }, + { "tcpdatalen", TOK_TCPDATALEN }, + { "tcpflags", TOK_TCPFLAGS }, + { "tcpflgs", TOK_TCPFLAGS }, + { "tcpoptions", TOK_TCPOPTS }, + { "tcpopts", TOK_TCPOPTS }, + { "tcpseq", TOK_TCPSEQ }, + { "tcpack", TOK_TCPACK }, + { "tcpwin", TOK_TCPWIN }, + { "icmptype", TOK_ICMPTYPES }, + { "icmptypes", TOK_ICMPTYPES }, + { "dst-ip", TOK_DSTIP }, + { "src-ip", TOK_SRCIP }, + { "dst-port", TOK_DSTPORT }, + { "src-port", TOK_SRCPORT }, + { "proto", TOK_PROTO }, + { "MAC", TOK_MAC }, + { "mac", TOK_MAC }, + { "mac-type", TOK_MACTYPE }, + { "verrevpath", TOK_VERREVPATH }, + { "versrcreach", TOK_VERSRCREACH }, + { "antispoof", TOK_ANTISPOOF }, + { "ipsec", TOK_IPSEC }, + { "icmp6type", TOK_ICMP6TYPES }, + { "icmp6types", TOK_ICMP6TYPES }, + { "ext6hdr", TOK_EXT6HDR}, + { "flow-id", TOK_FLOWID}, + { "ipv6", TOK_IPV6}, + { "ip6", TOK_IPV6}, + { "ipv4", TOK_IPV4}, + { "ip4", TOK_IPV4}, + { "dst-ipv6", TOK_DSTIP6}, + { "dst-ip6", TOK_DSTIP6}, + { "src-ipv6", TOK_SRCIP6}, + { "src-ip6", TOK_SRCIP6}, + { "lookup", TOK_LOOKUP}, + { "//", TOK_COMMENT }, + + { "not", TOK_NOT }, /* pseudo option */ + { "!", /* escape ? */ TOK_NOT }, /* pseudo option */ + { "or", TOK_OR }, /* pseudo option */ + { "|", /* escape */ TOK_OR }, /* pseudo option */ + { "{", TOK_STARTBRACE }, /* pseudo option */ + { "(", TOK_STARTBRACE }, /* pseudo option */ + { "}", TOK_ENDBRACE }, /* pseudo option */ + { ")", TOK_ENDBRACE }, /* pseudo option */ + { NULL, 0 } /* terminator */ +}; + +/* + * Helper routine to print a possibly unaligned uint64_t on + * various platform. If width > 0, print the value with + * the desired width, followed by a space; + * otherwise, return the required width. + */ +int +pr_u64(uint64_t *pd, int width) +{ +#ifdef TCC +#define U64_FMT "I64" +#else +#define U64_FMT "llu" +#endif + uint64_t u; + unsigned long long d; + + bcopy (pd, &u, sizeof(u)); + d = u; + return (width > 0) ? + printf("%*" U64_FMT " ", width, d) : + snprintf(NULL, 0, "%" U64_FMT, d) ; +#undef U64_FMT +} + +void * +safe_calloc(size_t number, size_t size) +{ + void *ret = calloc(number, size); + + if (ret == NULL) + err(EX_OSERR, "calloc"); + return ret; +} + +void * +safe_realloc(void *ptr, size_t size) +{ + void *ret = realloc(ptr, size); + + if (ret == NULL) + err(EX_OSERR, "realloc"); + return ret; +} + +/* + * conditionally runs the command. + * Selected options or negative -> getsockopt + */ +int +do_cmd(int optname, void *optval, uintptr_t optlen) +{ + int i; + + if (co.test_only) + return 0; + + if (ipfw_socket == -1) + ipfw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + if (ipfw_socket < 0) + err(EX_UNAVAILABLE, "socket"); + + if (optname == IP_FW_GET || optname == IP_DUMMYNET_GET || + optname == IP_FW_ADD || optname == IP_FW_TABLE_LIST || + optname == IP_FW_TABLE_GETSIZE || + optname == IP_FW_NAT_GET_CONFIG || + optname < 0 || + optname == IP_FW_NAT_GET_LOG) { + if (optname < 0) + optname = -optname; + i = getsockopt(ipfw_socket, IPPROTO_IP, optname, optval, + (socklen_t *)optlen); + } else { + i = setsockopt(ipfw_socket, IPPROTO_IP, optname, optval, optlen); + } + return i; +} + +#if 0 // XXX still unused +/* + * do_setcmd3 - pass ipfw control cmd to kernel + * @optname: option name + * @optval: pointer to option data + * @optlen: option length + * + * Function encapsulates option value in IP_FW3 socket option + * and calls setsockopt(). + * Function returns 0 on success or -1 otherwise. + */ +static int +do_setcmd3(int optname, void *optval, socklen_t optlen) +{ + socklen_t len; + ip_fw3_opheader *op3; + + if (co.test_only) + return (0); + + if (ipfw_socket == -1) + ipfw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + if (ipfw_socket < 0) + err(EX_UNAVAILABLE, "socket"); + + len = sizeof(ip_fw3_opheader) + optlen; + op3 = alloca(len); + /* Zero reserved fields */ + memset(op3, 0, sizeof(ip_fw3_opheader)); + memcpy(op3 + 1, optval, optlen); + op3->opcode = optname; + + return setsockopt(ipfw_socket, IPPROTO_IP, IP_FW3, op3, len); +} +#endif // XXX still unused + +/** + * match_token takes a table and a string, returns the value associated + * with the string (-1 in case of failure). + */ +int +match_token(struct _s_x *table, char *string) +{ + struct _s_x *pt; + uint i = strlen(string); + + for (pt = table ; i && pt->s != NULL ; pt++) + if (strlen(pt->s) == i && !bcmp(string, pt->s, i)) + return pt->x; + return -1; +} + +/** + * match_value takes a table and a value, returns the string associated + * with the value (NULL in case of failure). + */ +char const * +match_value(struct _s_x *p, int value) +{ + for (; p->s != NULL; p++) + if (p->x == value) + return p->s; + return NULL; +} + +/* + * _substrcmp takes two strings and returns 1 if they do not match, + * and 0 if they match exactly or the first string is a sub-string + * of the second. A warning is printed to stderr in the case that the + * first string is a sub-string of the second. + * + * This function will be removed in the future through the usual + * deprecation process. + */ +int +_substrcmp(const char *str1, const char* str2) +{ + + if (strncmp(str1, str2, strlen(str1)) != 0) + return 1; + + if (strlen(str1) != strlen(str2)) + warnx("DEPRECATED: '%s' matched '%s' as a sub-string", + str1, str2); + return 0; +} + +/* + * _substrcmp2 takes three strings and returns 1 if the first two do not match, + * and 0 if they match exactly or the second string is a sub-string + * of the first. A warning is printed to stderr in the case that the + * first string does not match the third. + * + * This function exists to warn about the bizarre construction + * strncmp(str, "by", 2) which is used to allow people to use a shortcut + * for "bytes". The problem is that in addition to accepting "by", + * "byt", "byte", and "bytes", it also excepts "by_rabid_dogs" and any + * other string beginning with "by". + * + * This function will be removed in the future through the usual + * deprecation process. + */ +int +_substrcmp2(const char *str1, const char* str2, const char* str3) +{ + + if (strncmp(str1, str2, strlen(str2)) != 0) + return 1; + + if (strcmp(str1, str3) != 0) + warnx("DEPRECATED: '%s' matched '%s'", + str1, str3); + return 0; +} + +/* + * prints one port, symbolic or numeric + */ +static void +print_port(int proto, uint16_t port) +{ + + if (proto == IPPROTO_ETHERTYPE) { + char const *s; + + if (co.do_resolv && (s = match_value(ether_types, port)) ) + printf("%s", s); + else + printf("0x%04x", port); + } else { + struct servent *se = NULL; + if (co.do_resolv) { + struct protoent *pe = getprotobynumber(proto); + + se = getservbyport(htons(port), pe ? pe->p_name : NULL); + } + if (se) + printf("%s", se->s_name); + else + printf("%d", port); + } +} + +static struct _s_x _port_name[] = { + {"dst-port", O_IP_DSTPORT}, + {"src-port", O_IP_SRCPORT}, + {"ipid", O_IPID}, + {"iplen", O_IPLEN}, + {"ipttl", O_IPTTL}, + {"mac-type", O_MAC_TYPE}, + {"tcpdatalen", O_TCPDATALEN}, + {"tcpwin", O_TCPWIN}, + {"tagged", O_TAGGED}, + {NULL, 0} +}; + +/* + * Print the values in a list 16-bit items of the types above. + * XXX todo: add support for mask. + */ +static void +print_newports(ipfw_insn_u16 *cmd, int proto, int opcode) +{ + uint16_t *p = cmd->ports; + int i; + char const *sep; + + if (opcode != 0) { + sep = match_value(_port_name, opcode); + if (sep == NULL) + sep = "???"; + printf (" %s", sep); + } + sep = " "; + for (i = F_LEN((ipfw_insn *)cmd) - 1; i > 0; i--, p += 2) { + printf("%s", sep); + print_port(proto, p[0]); + if (p[0] != p[1]) { + printf("-"); + print_port(proto, p[1]); + } + sep = ","; + } +} + +/* + * Like strtol, but also translates service names into port numbers + * for some protocols. + * In particular: + * proto == -1 disables the protocol check; + * proto == IPPROTO_ETHERTYPE looks up an internal table + * proto == matches the values there. + * Returns *end == s in case the parameter is not found. + */ +static int +strtoport(char *s, char **end, int base, int proto) +{ + char *p, *buf; + char *s1; + int i; + + *end = s; /* default - not found */ + if (*s == '\0') + return 0; /* not found */ + + if (isdigit(*s)) + return strtol(s, end, base); + + /* + * find separator. '\\' escapes the next char. + */ + for (s1 = s; *s1 && (isalnum(*s1) || *s1 == '\\') ; s1++) + if (*s1 == '\\' && s1[1] != '\0') + s1++; + + buf = safe_calloc(s1 - s + 1, 1); + + /* + * copy into a buffer skipping backslashes + */ + for (p = s, i = 0; p != s1 ; p++) + if (*p != '\\') + buf[i++] = *p; + buf[i++] = '\0'; + + if (proto == IPPROTO_ETHERTYPE) { + i = match_token(ether_types, buf); + free(buf); + if (i != -1) { /* found */ + *end = s1; + return i; + } + } else { + struct protoent *pe = NULL; + struct servent *se; + + if (proto != 0) + pe = getprotobynumber(proto); + setservent(1); + se = getservbyname(buf, pe ? pe->p_name : NULL); + free(buf); + if (se != NULL) { + *end = s1; + return ntohs(se->s_port); + } + } + return 0; /* not found */ +} + +/* + * Fill the body of the command with the list of port ranges. + */ +static int +fill_newports(ipfw_insn_u16 *cmd, char *av, int proto) +{ + uint16_t a, b, *p = cmd->ports; + int i = 0; + char *s = av; + + while (*s) { + a = strtoport(av, &s, 0, proto); + if (s == av) /* empty or invalid argument */ + return (0); + + switch (*s) { + case '-': /* a range */ + av = s + 1; + b = strtoport(av, &s, 0, proto); + /* Reject expressions like '1-abc' or '1-2-3'. */ + if (s == av || (*s != ',' && *s != '\0')) + return (0); + p[0] = a; + p[1] = b; + break; + case ',': /* comma separated list */ + case '\0': + p[0] = p[1] = a; + break; + default: + warnx("port list: invalid separator <%c> in <%s>", + *s, av); + return (0); + } + + i++; + p += 2; + av = s + 1; + } + if (i > 0) { + if (i + 1 > F_LEN_MASK) + errx(EX_DATAERR, "too many ports/ranges\n"); + cmd->o.len |= i + 1; /* leave F_NOT and F_OR untouched */ + } + return (i); +} + +static struct _s_x icmpcodes[] = { + { "net", ICMP_UNREACH_NET }, + { "host", ICMP_UNREACH_HOST }, + { "protocol", ICMP_UNREACH_PROTOCOL }, + { "port", ICMP_UNREACH_PORT }, + { "needfrag", ICMP_UNREACH_NEEDFRAG }, + { "srcfail", ICMP_UNREACH_SRCFAIL }, + { "net-unknown", ICMP_UNREACH_NET_UNKNOWN }, + { "host-unknown", ICMP_UNREACH_HOST_UNKNOWN }, + { "isolated", ICMP_UNREACH_ISOLATED }, + { "net-prohib", ICMP_UNREACH_NET_PROHIB }, + { "host-prohib", ICMP_UNREACH_HOST_PROHIB }, + { "tosnet", ICMP_UNREACH_TOSNET }, + { "toshost", ICMP_UNREACH_TOSHOST }, + { "filter-prohib", ICMP_UNREACH_FILTER_PROHIB }, + { "host-precedence", ICMP_UNREACH_HOST_PRECEDENCE }, + { "precedence-cutoff", ICMP_UNREACH_PRECEDENCE_CUTOFF }, + { NULL, 0 } +}; + +static void +fill_reject_code(u_short *codep, char *str) +{ + int val; + char *s; + + val = strtoul(str, &s, 0); + if (s == str || *s != '\0' || val >= 0x100) + val = match_token(icmpcodes, str); + if (val < 0) + errx(EX_DATAERR, "unknown ICMP unreachable code ``%s''", str); + *codep = val; + return; +} + +static void +print_reject_code(uint16_t code) +{ + char const *s = match_value(icmpcodes, code); + + if (s != NULL) + printf("unreach %s", s); + else + printf("unreach %u", code); +} + +/* + * Returns the number of bits set (from left) in a contiguous bitmask, + * or -1 if the mask is not contiguous. + * XXX this needs a proper fix. + * This effectively works on masks in big-endian (network) format. + * when compiled on little endian architectures. + * + * First bit is bit 7 of the first byte -- note, for MAC addresses, + * the first bit on the wire is bit 0 of the first byte. + * len is the max length in bits. + */ +int +contigmask(uint8_t *p, int len) +{ + int i, n; + + for (i=0; iarg1 & 0xff; + uint8_t clear = (cmd->arg1 >> 8) & 0xff; + + if (list == f_tcpflags && set == TH_SYN && clear == TH_ACK) { + printf(" setup"); + return; + } + + printf(" %s ", name); + for (i=0; list[i].x != 0; i++) { + if (set & list[i].x) { + set &= ~list[i].x; + printf("%s%s", comma, list[i].s); + comma = ","; + } + if (clear & list[i].x) { + clear &= ~list[i].x; + printf("%s!%s", comma, list[i].s); + comma = ","; + } + } +} + +/* + * Print the ip address contained in a command. + */ +static void +print_ip(ipfw_insn_ip *cmd, char const *s) +{ + struct hostent *he = NULL; + uint32_t len = F_LEN((ipfw_insn *)cmd); + uint32_t *a = ((ipfw_insn_u32 *)cmd)->d; + + if (cmd->o.opcode == O_IP_DST_LOOKUP && len > F_INSN_SIZE(ipfw_insn_u32)) { + uint32_t d = a[1]; + const char *arg = ""; + + if (d < sizeof(lookup_key)/sizeof(lookup_key[0])) + arg = match_value(rule_options, lookup_key[d]); + printf("%s lookup %s %d", cmd->o.len & F_NOT ? " not": "", + arg, cmd->o.arg1); + return; + } + printf("%s%s ", cmd->o.len & F_NOT ? " not": "", s); + + if (cmd->o.opcode == O_IP_SRC_ME || cmd->o.opcode == O_IP_DST_ME) { + printf("me"); + return; + } + if (cmd->o.opcode == O_IP_SRC_LOOKUP || + cmd->o.opcode == O_IP_DST_LOOKUP) { + printf("table(%u", ((ipfw_insn *)cmd)->arg1); + if (len == F_INSN_SIZE(ipfw_insn_u32)) + printf(",%u", *a); + printf(")"); + return; + } + if (cmd->o.opcode == O_IP_SRC_SET || cmd->o.opcode == O_IP_DST_SET) { + uint32_t x, *map = (uint32_t *)&(cmd->mask); + int i, j; + char comma = '{'; + + x = cmd->o.arg1 - 1; + x = htonl( ~x ); + cmd->addr.s_addr = htonl(cmd->addr.s_addr); + printf("%s/%d", inet_ntoa(cmd->addr), + contigmask((uint8_t *)&x, 32)); + x = cmd->addr.s_addr = htonl(cmd->addr.s_addr); + x &= 0xff; /* base */ + /* + * Print bits and ranges. + * Locate first bit set (i), then locate first bit unset (j). + * If we have 3+ consecutive bits set, then print them as a + * range, otherwise only print the initial bit and rescan. + */ + for (i=0; i < cmd->o.arg1; i++) + if (map[i/32] & (1<<(i & 31))) { + for (j=i+1; j < cmd->o.arg1; j++) + if (!(map[ j/32] & (1<<(j & 31)))) + break; + printf("%c%d", comma, i+x); + if (j>i+2) { /* range has at least 3 elements */ + printf("-%d", j-1+x); + i = j-1; + } + comma = ','; + } + printf("}"); + return; + } + /* + * len == 2 indicates a single IP, whereas lists of 1 or more + * addr/mask pairs have len = (2n+1). We convert len to n so we + * use that to count the number of entries. + */ + for (len = len / 2; len > 0; len--, a += 2) { + int mb = /* mask length */ + (cmd->o.opcode == O_IP_SRC || cmd->o.opcode == O_IP_DST) ? + 32 : contigmask((uint8_t *)&(a[1]), 32); + if (mb == 32 && co.do_resolv) + he = gethostbyaddr((char *)&(a[0]), sizeof(u_long), AF_INET); + if (he != NULL) /* resolved to name */ + printf("%s", he->h_name); + else if (mb == 0) /* any */ + printf("any"); + else { /* numeric IP followed by some kind of mask */ + printf("%s", inet_ntoa( *((struct in_addr *)&a[0]) ) ); + if (mb < 0) + printf(":%s", inet_ntoa( *((struct in_addr *)&a[1]) ) ); + else if (mb < 32) + printf("/%d", mb); + } + if (len > 1) + printf(","); + } +} + +/* + * prints a MAC address/mask pair + */ +static void +print_mac(uint8_t *addr, uint8_t *mask) +{ + int l = contigmask(mask, 48); + + if (l == 0) + printf(" any"); + else { + printf(" %02x:%02x:%02x:%02x:%02x:%02x", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + if (l == -1) + printf("&%02x:%02x:%02x:%02x:%02x:%02x", + mask[0], mask[1], mask[2], + mask[3], mask[4], mask[5]); + else if (l < 48) + printf("/%d", l); + } +} + +static void +fill_icmptypes(ipfw_insn_u32 *cmd, char *av) +{ + uint8_t type; + + cmd->d[0] = 0; + while (*av) { + if (*av == ',') + av++; + + type = strtoul(av, &av, 0); + + if (*av != ',' && *av != '\0') + errx(EX_DATAERR, "invalid ICMP type"); + + if (type > 31) + errx(EX_DATAERR, "ICMP type out of range"); + + cmd->d[0] |= 1 << type; + } + cmd->o.opcode = O_ICMPTYPE; + cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); +} + +static void +print_icmptypes(ipfw_insn_u32 *cmd) +{ + int i; + char sep= ' '; + + printf(" icmptypes"); + for (i = 0; i < 32; i++) { + if ( (cmd->d[0] & (1 << (i))) == 0) + continue; + printf("%c%d", sep, i); + sep = ','; + } +} + +/* + * show_ipfw() prints the body of an ipfw rule. + * Because the standard rule has at least proto src_ip dst_ip, we use + * a helper function to produce these entries if not provided explicitly. + * The first argument is the list of fields we have, the second is + * the list of fields we want to be printed. + * + * Special cases if we have provided a MAC header: + * + if the rule does not contain IP addresses/ports, do not print them; + * + if the rule does not contain an IP proto, print "all" instead of "ip"; + * + * Once we have 'have_options', IP header fields are printed as options. + */ +#define HAVE_PROTO 0x0001 +#define HAVE_SRCIP 0x0002 +#define HAVE_DSTIP 0x0004 +#define HAVE_PROTO4 0x0008 +#define HAVE_PROTO6 0x0010 +#define HAVE_IP 0x0100 +#define HAVE_OPTIONS 0x8000 + +static void +show_prerequisites(int *flags, int want, int cmd) +{ + (void)cmd; /* UNUSED */ + if (co.comment_only) + return; + if ( (*flags & HAVE_IP) == HAVE_IP) + *flags |= HAVE_OPTIONS; + + if ( !(*flags & HAVE_OPTIONS)) { + if ( !(*flags & HAVE_PROTO) && (want & HAVE_PROTO)) { + if ( (*flags & HAVE_PROTO4)) + printf(" ip4"); + else if ( (*flags & HAVE_PROTO6)) + printf(" ip6"); + else + printf(" ip"); + } + if ( !(*flags & HAVE_SRCIP) && (want & HAVE_SRCIP)) + printf(" from any"); + if ( !(*flags & HAVE_DSTIP) && (want & HAVE_DSTIP)) + printf(" to any"); + } + *flags |= want; +} + +static void +show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth) +{ + static int twidth = 0; + int l; + ipfw_insn *cmd, *tagptr = NULL; + const char *comment = NULL; /* ptr to comment if we have one */ + int proto = 0; /* default */ + int flags = 0; /* prerequisites */ + ipfw_insn_log *logptr = NULL; /* set if we find an O_LOG */ + ipfw_insn_altq *altqptr = NULL; /* set if we find an O_ALTQ */ + int or_block = 0; /* we are in an or block */ + uint32_t set_disable; + + bcopy(&rule->next_rule, &set_disable, sizeof(set_disable)); + + if (set_disable & (1 << rule->set)) { /* disabled */ + if (!co.show_sets) + return; + else + printf("# DISABLED "); + } + printf("%05u ", rule->rulenum); + + if (pcwidth > 0 || bcwidth > 0) { + pr_u64(&rule->pcnt, pcwidth); + pr_u64(&rule->bcnt, bcwidth); + } + + if (co.do_time == 2) + printf("%10u ", rule->timestamp); + else if (co.do_time == 1) { + char timestr[30]; + time_t t = (time_t)0; + + if (twidth == 0) { + strcpy(timestr, ctime(&t)); + *strchr(timestr, '\n') = '\0'; + twidth = strlen(timestr); + } + if (rule->timestamp) { + t = _long_to_time(rule->timestamp); + + strcpy(timestr, ctime(&t)); + *strchr(timestr, '\n') = '\0'; + printf("%s ", timestr); + } else { + printf("%*s", twidth, " "); + } + } + + if (co.show_sets) + printf("set %d ", rule->set); + + /* + * print the optional "match probability" + */ + if (rule->cmd_len > 0) { + cmd = rule->cmd ; + if (cmd->opcode == O_PROB) { + ipfw_insn_u32 *p = (ipfw_insn_u32 *)cmd; + double d = 1.0 * p->d[0]; + + d = (d / 0x7fffffff); + printf("prob %f ", d); + } + } + + /* + * first print actions + */ + for (l = rule->cmd_len - rule->act_ofs, cmd = ACTION_PTR(rule); + l > 0 ; l -= F_LEN(cmd), cmd += F_LEN(cmd)) { + switch(cmd->opcode) { + case O_CHECK_STATE: + printf("check-state"); + /* avoid printing anything else */ + flags = HAVE_PROTO | HAVE_SRCIP | + HAVE_DSTIP | HAVE_IP; + break; + + case O_ACCEPT: + printf("allow"); + break; + + case O_COUNT: + printf("count"); + break; + + case O_DENY: + printf("deny"); + break; + + case O_REJECT: + if (cmd->arg1 == ICMP_REJECT_RST) + printf("reset"); + else if (cmd->arg1 == ICMP_UNREACH_HOST) + printf("reject"); + else + print_reject_code(cmd->arg1); + break; + + case O_UNREACH6: + if (cmd->arg1 == ICMP6_UNREACH_RST) + printf("reset6"); + else + print_unreach6_code(cmd->arg1); + break; + + case O_SKIPTO: + PRINT_UINT_ARG("skipto ", cmd->arg1); + break; + + case O_PIPE: + PRINT_UINT_ARG("pipe ", cmd->arg1); + break; + + case O_QUEUE: + PRINT_UINT_ARG("queue ", cmd->arg1); + break; + + case O_DIVERT: + PRINT_UINT_ARG("divert ", cmd->arg1); + break; + + case O_TEE: + PRINT_UINT_ARG("tee ", cmd->arg1); + break; + + case O_NETGRAPH: + PRINT_UINT_ARG("netgraph ", cmd->arg1); + break; + + case O_NGTEE: + PRINT_UINT_ARG("ngtee ", cmd->arg1); + break; + + case O_FORWARD_IP: + { + ipfw_insn_sa *s = (ipfw_insn_sa *)cmd; + + if (s->sa.sin_addr.s_addr == INADDR_ANY) { + printf("fwd tablearg"); + } else { + printf("fwd %s", inet_ntoa(s->sa.sin_addr)); + } + if (s->sa.sin_port) + printf(",%d", s->sa.sin_port); + } + break; + +#if 0 // XXX unused yet + case O_FORWARD_IP6: + { + char buf[4 + INET6_ADDRSTRLEN + 1]; + ipfw_insn_sa6 *s = (ipfw_insn_sa6 *)cmd; + + printf("fwd %s", inet_ntop(AF_INET6, &s->sa.sin6_addr, + buf, sizeof(buf))); + if (s->sa.sin6_port) + printf(",%d", s->sa.sin6_port); + } + break; +#endif // XXX unused yet + + + case O_LOG: /* O_LOG is printed last */ + logptr = (ipfw_insn_log *)cmd; + break; + + case O_ALTQ: /* O_ALTQ is printed after O_LOG */ + altqptr = (ipfw_insn_altq *)cmd; + break; + + case O_TAG: + tagptr = cmd; + break; + + case O_NAT: + if (cmd->arg1 != 0) + PRINT_UINT_ARG("nat ", cmd->arg1); + else + printf("nat global"); + break; + + case O_SETFIB: + PRINT_UINT_ARG("setfib ", cmd->arg1); + break; + + case O_REASS: + printf("reass"); + break; + + case O_CALLRETURN: + if (cmd->len & F_NOT) + printf("return"); + else + PRINT_UINT_ARG("call ", cmd->arg1); + break; + + default: + printf("** unrecognized action %d len %d ", + cmd->opcode, cmd->len); + } + } + if (logptr) { + if (logptr->max_log > 0) + printf(" log logamount %d", logptr->max_log); + else + printf(" log"); + } +#ifndef NO_ALTQ + if (altqptr) { + print_altq_cmd(altqptr); + } +#endif + if (tagptr) { + if (tagptr->len & F_NOT) + PRINT_UINT_ARG(" untag ", tagptr->arg1); + else + PRINT_UINT_ARG(" tag ", tagptr->arg1); + } + + /* + * then print the body. + */ + for (l = rule->act_ofs, cmd = rule->cmd ; + l > 0 ; l -= F_LEN(cmd) , cmd += F_LEN(cmd)) { + if ((cmd->len & F_OR) || (cmd->len & F_NOT)) + continue; + if (cmd->opcode == O_IP4) { + flags |= HAVE_PROTO4; + break; + } else if (cmd->opcode == O_IP6) { + flags |= HAVE_PROTO6; + break; + } + } + if (rule->_pad & 1) { /* empty rules before options */ + if (!co.do_compact) { + show_prerequisites(&flags, HAVE_PROTO, 0); + printf(" from any to any"); + } + flags |= HAVE_IP | HAVE_OPTIONS | HAVE_PROTO | + HAVE_SRCIP | HAVE_DSTIP; + } + + if (co.comment_only) + comment = "..."; + + for (l = rule->act_ofs, cmd = rule->cmd ; + l > 0 ; l -= F_LEN(cmd) , cmd += F_LEN(cmd)) { + /* useful alias */ + ipfw_insn_u32 *cmd32 = (ipfw_insn_u32 *)cmd; + + if (co.comment_only) { + if (cmd->opcode != O_NOP) + continue; + printf(" // %s\n", (char *)(cmd + 1)); + return; + } + + show_prerequisites(&flags, 0, cmd->opcode); + + switch(cmd->opcode) { + case O_PROB: + break; /* done already */ + + case O_PROBE_STATE: + break; /* no need to print anything here */ + + case O_IP_SRC: + case O_IP_SRC_LOOKUP: + case O_IP_SRC_MASK: + case O_IP_SRC_ME: + case O_IP_SRC_SET: + show_prerequisites(&flags, HAVE_PROTO, 0); + if (!(flags & HAVE_SRCIP)) + printf(" from"); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + print_ip((ipfw_insn_ip *)cmd, + (flags & HAVE_OPTIONS) ? " src-ip" : ""); + flags |= HAVE_SRCIP; + break; + + case O_IP_DST: + case O_IP_DST_LOOKUP: + case O_IP_DST_MASK: + case O_IP_DST_ME: + case O_IP_DST_SET: + show_prerequisites(&flags, HAVE_PROTO|HAVE_SRCIP, 0); + if (!(flags & HAVE_DSTIP)) + printf(" to"); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + print_ip((ipfw_insn_ip *)cmd, + (flags & HAVE_OPTIONS) ? " dst-ip" : ""); + flags |= HAVE_DSTIP; + break; + + case O_IP6_SRC: + case O_IP6_SRC_MASK: + case O_IP6_SRC_ME: + show_prerequisites(&flags, HAVE_PROTO, 0); + if (!(flags & HAVE_SRCIP)) + printf(" from"); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + print_ip6((ipfw_insn_ip6 *)cmd, + (flags & HAVE_OPTIONS) ? " src-ip6" : ""); + flags |= HAVE_SRCIP | HAVE_PROTO; + break; + + case O_IP6_DST: + case O_IP6_DST_MASK: + case O_IP6_DST_ME: + show_prerequisites(&flags, HAVE_PROTO|HAVE_SRCIP, 0); + if (!(flags & HAVE_DSTIP)) + printf(" to"); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + print_ip6((ipfw_insn_ip6 *)cmd, + (flags & HAVE_OPTIONS) ? " dst-ip6" : ""); + flags |= HAVE_DSTIP; + break; + + case O_FLOW6ID: + print_flow6id( (ipfw_insn_u32 *) cmd ); + flags |= HAVE_OPTIONS; + break; + + case O_IP_DSTPORT: + show_prerequisites(&flags, + HAVE_PROTO | HAVE_SRCIP | + HAVE_DSTIP | HAVE_IP, 0); + case O_IP_SRCPORT: + if (flags & HAVE_DSTIP) + flags |= HAVE_IP; + show_prerequisites(&flags, + HAVE_PROTO | HAVE_SRCIP, 0); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + if (cmd->len & F_NOT) + printf(" not"); + print_newports((ipfw_insn_u16 *)cmd, proto, + (flags & HAVE_OPTIONS) ? cmd->opcode : 0); + break; + + case O_PROTO: { + struct protoent *pe = NULL; + + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + if (cmd->len & F_NOT) + printf(" not"); + proto = cmd->arg1; + pe = getprotobynumber(cmd->arg1); + if ((flags & (HAVE_PROTO4 | HAVE_PROTO6)) && + !(flags & HAVE_PROTO)) + show_prerequisites(&flags, + HAVE_PROTO | HAVE_IP | HAVE_SRCIP | + HAVE_DSTIP | HAVE_OPTIONS, 0); + if (flags & HAVE_OPTIONS) + printf(" proto"); + if (pe) + printf(" %s", pe->p_name); + else + printf(" %u", cmd->arg1); + } + flags |= HAVE_PROTO; + break; + + default: /*options ... */ + if (!(cmd->len & (F_OR|F_NOT))) + if (((cmd->opcode == O_IP6) && + (flags & HAVE_PROTO6)) || + ((cmd->opcode == O_IP4) && + (flags & HAVE_PROTO4))) + break; + show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP | + HAVE_DSTIP | HAVE_IP | HAVE_OPTIONS, 0); + if ((cmd->len & F_OR) && !or_block) + printf(" {"); + if (cmd->len & F_NOT && cmd->opcode != O_IN) + printf(" not"); + switch(cmd->opcode) { + case O_MACADDR2: { + ipfw_insn_mac *m = (ipfw_insn_mac *)cmd; + + printf(" MAC"); + print_mac(m->addr, m->mask); + print_mac(m->addr + 6, m->mask + 6); + } + break; + + case O_MAC_TYPE: + print_newports((ipfw_insn_u16 *)cmd, + IPPROTO_ETHERTYPE, cmd->opcode); + break; + + + case O_FRAG: + printf(" frag"); + break; + + case O_FIB: + printf(" fib %u", cmd->arg1 ); + break; + case O_SOCKARG: + printf(" sockarg"); + break; + + case O_IN: + printf(cmd->len & F_NOT ? " out" : " in"); + break; + + case O_DIVERTED: + switch (cmd->arg1) { + case 3: + printf(" diverted"); + break; + case 1: + printf(" diverted-loopback"); + break; + case 2: + printf(" diverted-output"); + break; + default: + printf(" diverted-?<%u>", cmd->arg1); + break; + } + break; + + case O_LAYER2: + printf(" layer2"); + break; + case O_XMIT: + case O_RECV: + case O_VIA: + { + char const *s; + ipfw_insn_if *cmdif = (ipfw_insn_if *)cmd; + + if (cmd->opcode == O_XMIT) + s = "xmit"; + else if (cmd->opcode == O_RECV) + s = "recv"; + else /* if (cmd->opcode == O_VIA) */ + s = "via"; + if (cmdif->name[0] == '\0') + printf(" %s %s", s, + inet_ntoa(cmdif->p.ip)); + else + printf(" %s %s", s, cmdif->name); + + break; + } + case O_IPID: + if (F_LEN(cmd) == 1) + printf(" ipid %u", cmd->arg1 ); + else + print_newports((ipfw_insn_u16 *)cmd, 0, + O_IPID); + break; + + case O_IPTTL: + if (F_LEN(cmd) == 1) + printf(" ipttl %u", cmd->arg1 ); + else + print_newports((ipfw_insn_u16 *)cmd, 0, + O_IPTTL); + break; + + case O_IPVER: + printf(" ipver %u", cmd->arg1 ); + break; + + case O_IPPRECEDENCE: + printf(" ipprecedence %u", (cmd->arg1) >> 5 ); + break; + + case O_IPLEN: + if (F_LEN(cmd) == 1) + printf(" iplen %u", cmd->arg1 ); + else + print_newports((ipfw_insn_u16 *)cmd, 0, + O_IPLEN); + break; + + case O_IPOPT: + print_flags("ipoptions", cmd, f_ipopts); + break; + + case O_IPTOS: + print_flags("iptos", cmd, f_iptos); + break; + + case O_ICMPTYPE: + print_icmptypes((ipfw_insn_u32 *)cmd); + break; + + case O_ESTAB: + printf(" established"); + break; + + case O_TCPDATALEN: + if (F_LEN(cmd) == 1) + printf(" tcpdatalen %u", cmd->arg1 ); + else + print_newports((ipfw_insn_u16 *)cmd, 0, + O_TCPDATALEN); + break; + + case O_TCPFLAGS: + print_flags("tcpflags", cmd, f_tcpflags); + break; + + case O_TCPOPTS: + print_flags("tcpoptions", cmd, f_tcpopts); + break; + + case O_TCPWIN: + printf(" tcpwin %d", ntohs(cmd->arg1)); + break; + + case O_TCPACK: + printf(" tcpack %d", ntohl(cmd32->d[0])); + break; + + case O_TCPSEQ: + printf(" tcpseq %d", ntohl(cmd32->d[0])); + break; + + case O_UID: + { + struct passwd *pwd = getpwuid(cmd32->d[0]); + + if (pwd) + printf(" uid %s", pwd->pw_name); + else + printf(" uid %u", cmd32->d[0]); + } + break; + + case O_GID: + { + struct group *grp = getgrgid(cmd32->d[0]); + + if (grp) + printf(" gid %s", grp->gr_name); + else + printf(" gid %u", cmd32->d[0]); + } + break; + + case O_JAIL: + printf(" jail %d", cmd32->d[0]); + break; + + case O_VERREVPATH: + printf(" verrevpath"); + break; + + case O_VERSRCREACH: + printf(" versrcreach"); + break; + + case O_ANTISPOOF: + printf(" antispoof"); + break; + + case O_IPSEC: + printf(" ipsec"); + break; + + case O_NOP: + comment = (char *)(cmd + 1); + break; + + case O_KEEP_STATE: + printf(" keep-state"); + break; + + case O_LIMIT: { + struct _s_x *p = limit_masks; + ipfw_insn_limit *c = (ipfw_insn_limit *)cmd; + uint8_t x = c->limit_mask; + char const *comma = " "; + + printf(" limit"); + for (; p->x != 0 ; p++) + if ((x & p->x) == p->x) { + x &= ~p->x; + printf("%s%s", comma, p->s); + comma = ","; + } + PRINT_UINT_ARG(" ", c->conn_limit); + break; + } + + case O_IP6: + printf(" ip6"); + break; + + case O_IP4: + printf(" ip4"); + break; + + case O_ICMP6TYPE: + print_icmp6types((ipfw_insn_u32 *)cmd); + break; + + case O_EXT_HDR: + print_ext6hdr( (ipfw_insn *) cmd ); + break; + + case O_TAGGED: + if (F_LEN(cmd) == 1) + PRINT_UINT_ARG(" tagged ", cmd->arg1); + else + print_newports((ipfw_insn_u16 *)cmd, 0, + O_TAGGED); + break; + + default: + printf(" [opcode %d len %d]", + cmd->opcode, cmd->len); + } + } + if (cmd->len & F_OR) { + printf(" or"); + or_block = 1; + } else if (or_block) { + printf(" }"); + or_block = 0; + } + } + show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP + | HAVE_IP, 0); + if (comment) + printf(" // %s", comment); + printf("\n"); +} + +static void +show_dyn_ipfw(ipfw_dyn_rule *d, int pcwidth, int bcwidth) +{ + struct protoent *pe; + struct in_addr a; + uint16_t rulenum; + char buf[INET6_ADDRSTRLEN]; + + if (!co.do_expired) { + if (!d->expire && !(d->dyn_type == O_LIMIT_PARENT)) + return; + } + bcopy(&d->rule, &rulenum, sizeof(rulenum)); + printf("%05d", rulenum); + if (pcwidth > 0 || bcwidth > 0) { + printf(" "); + pr_u64(&d->pcnt, pcwidth); + pr_u64(&d->bcnt, bcwidth); + printf("(%ds)", d->expire); + } + switch (d->dyn_type) { + case O_LIMIT_PARENT: + printf(" PARENT %d", d->count); + break; + case O_LIMIT: + printf(" LIMIT"); + break; + case O_KEEP_STATE: /* bidir, no mask */ + printf(" STATE"); + break; + } + + if ((pe = getprotobynumber(d->id.proto)) != NULL) + printf(" %s", pe->p_name); + else + printf(" proto %u", d->id.proto); + + if (d->id.addr_type == 4) { + a.s_addr = htonl(d->id.src_ip); + printf(" %s %d", inet_ntoa(a), d->id.src_port); + + a.s_addr = htonl(d->id.dst_ip); + printf(" <-> %s %d", inet_ntoa(a), d->id.dst_port); + } else if (d->id.addr_type == 6) { + printf(" %s %d", inet_ntop(AF_INET6, &d->id.src_ip6, buf, + sizeof(buf)), d->id.src_port); + printf(" <-> %s %d", inet_ntop(AF_INET6, &d->id.dst_ip6, buf, + sizeof(buf)), d->id.dst_port); + } else + printf(" UNKNOWN <-> UNKNOWN\n"); + + printf("\n"); +} + +/* + * This one handles all set-related commands + * ipfw set { show | enable | disable } + * ipfw set swap X Y + * ipfw set move X to Y + * ipfw set move rule X to Y + */ +void +ipfw_sets_handler(char *av[]) +{ + uint32_t set_disable, masks[2]; + int i, nbytes; + uint16_t rulenum; + uint8_t cmd, new_set; + + av++; + + if (av[0] == NULL) + errx(EX_USAGE, "set needs command"); + if (_substrcmp(*av, "show") == 0) { + void *data = NULL; + char const *msg; + int nalloc; + + nalloc = nbytes = sizeof(struct ip_fw); + while (nbytes >= nalloc) { + if (data) + free(data); + nalloc = nalloc * 2 + 200; + nbytes = nalloc; + data = safe_calloc(1, nbytes); + if (do_cmd(IP_FW_GET, data, (uintptr_t)&nbytes) < 0) + err(EX_OSERR, "getsockopt(IP_FW_GET)"); + } + + bcopy(&((struct ip_fw *)data)->next_rule, + &set_disable, sizeof(set_disable)); + + for (i = 0, msg = "disable" ; i < RESVD_SET; i++) + if ((set_disable & (1< RESVD_SET) + errx(EX_DATAERR, "invalid set number %s\n", av[0]); + if (!isdigit(*(av[1])) || new_set > RESVD_SET) + errx(EX_DATAERR, "invalid set number %s\n", av[1]); + masks[0] = (4 << 24) | (new_set << 16) | (rulenum); + i = do_cmd(IP_FW_DEL, masks, sizeof(uint32_t)); + } else if (_substrcmp(*av, "move") == 0) { + av++; + if (av[0] && _substrcmp(*av, "rule") == 0) { + cmd = 2; + av++; + } else + cmd = 3; + if (av[0] == NULL || av[1] == NULL || av[2] == NULL || + av[3] != NULL || _substrcmp(av[1], "to") != 0) + errx(EX_USAGE, "syntax: set move [rule] X to Y\n"); + rulenum = atoi(av[0]); + new_set = atoi(av[2]); + if (!isdigit(*(av[0])) || (cmd == 3 && rulenum > RESVD_SET) || + (cmd == 2 && rulenum == IPFW_DEFAULT_RULE) ) + errx(EX_DATAERR, "invalid source number %s\n", av[0]); + if (!isdigit(*(av[2])) || new_set > RESVD_SET) + errx(EX_DATAERR, "invalid dest. set %s\n", av[1]); + masks[0] = (cmd << 24) | (new_set << 16) | (rulenum); + i = do_cmd(IP_FW_DEL, masks, sizeof(uint32_t)); + } else if (_substrcmp(*av, "disable") == 0 || + _substrcmp(*av, "enable") == 0 ) { + int which = _substrcmp(*av, "enable") == 0 ? 1 : 0; + + av++; + masks[0] = masks[1] = 0; + + while (av[0]) { + if (isdigit(**av)) { + i = atoi(*av); + if (i < 0 || i > RESVD_SET) + errx(EX_DATAERR, + "invalid set number %d\n", i); + masks[which] |= (1<= nalloc) { + nalloc = nalloc * 2 + 200; + nbytes = nalloc; + data = safe_realloc(data, nbytes); + if (do_cmd(ocmd, data, (uintptr_t)&nbytes) < 0) + err(EX_OSERR, "getsockopt(IP_%s_GET)", + co.do_pipe ? "DUMMYNET" : "FW"); + } + + /* + * Count static rules. They have variable size so we + * need to scan the list to count them. + */ + for (nstat = 1, r = data, lim = (char *)data + nbytes; + r->rulenum < IPFW_DEFAULT_RULE && (char *)r < lim; + ++nstat, r = NEXT(r) ) + ; /* nothing */ + + /* + * Count dynamic rules. This is easier as they have + * fixed size. + */ + r = NEXT(r); + dynrules = (ipfw_dyn_rule *)r ; + n = (char *)r - (char *)data; + ndyn = (nbytes - n) / sizeof *dynrules; + + /* if showing stats, figure out column widths ahead of time */ + bcwidth = pcwidth = 0; + if (show_counters) { + for (n = 0, r = data; n < nstat; n++, r = NEXT(r)) { + /* skip rules from another set */ + if (co.use_set && r->set != co.use_set - 1) + continue; + + /* packet counter */ + width = pr_u64(&r->pcnt, 0); + if (width > pcwidth) + pcwidth = width; + + /* byte counter */ + width = pr_u64(&r->bcnt, 0); + if (width > bcwidth) + bcwidth = width; + } + } + if (co.do_dynamic && ndyn) { + for (n = 0, d = dynrules; n < ndyn; n++, d++) { + if (co.use_set) { + /* skip rules from another set */ + bcopy((char *)&d->rule + sizeof(uint16_t), + &set, sizeof(uint8_t)); + if (set != co.use_set - 1) + continue; + } + width = pr_u64(&d->pcnt, 0); + if (width > pcwidth) + pcwidth = width; + + width = pr_u64(&d->bcnt, 0); + if (width > bcwidth) + bcwidth = width; + } + } + /* if no rule numbers were specified, list all rules */ + if (ac == 0) { + for (n = 0, r = data; n < nstat; n++, r = NEXT(r)) { + if (co.use_set && r->set != co.use_set - 1) + continue; + show_ipfw(r, pcwidth, bcwidth); + } + + if (co.do_dynamic && ndyn) { + printf("## Dynamic rules (%d):\n", ndyn); + for (n = 0, d = dynrules; n < ndyn; n++, d++) { + if (co.use_set) { + bcopy((char *)&d->rule + sizeof(uint16_t), + &set, sizeof(uint8_t)); + if (set != co.use_set - 1) + continue; + } + show_dyn_ipfw(d, pcwidth, bcwidth); + } + } + goto done; + } + + /* display specific rules requested on command line */ + + for (lac = ac, lav = av; lac != 0; lac--) { + /* convert command line rule # */ + last = rnum = strtoul(*lav++, &endptr, 10); + if (*endptr == '-') + last = strtoul(endptr+1, &endptr, 10); + if (*endptr) { + exitval = EX_USAGE; + warnx("invalid rule number: %s", *(lav - 1)); + continue; + } + for (n = seen = 0, r = data; n < nstat; n++, r = NEXT(r) ) { + if (r->rulenum > last) + break; + if (co.use_set && r->set != co.use_set - 1) + continue; + if (r->rulenum >= rnum && r->rulenum <= last) { + show_ipfw(r, pcwidth, bcwidth); + seen = 1; + } + } + if (!seen) { + /* give precedence to other error(s) */ + if (exitval == EX_OK) + exitval = EX_UNAVAILABLE; + warnx("rule %lu does not exist", rnum); + } + } + + if (co.do_dynamic && ndyn) { + printf("## Dynamic rules:\n"); + for (lac = ac, lav = av; lac != 0; lac--) { + last = rnum = strtoul(*lav++, &endptr, 10); + if (*endptr == '-') + last = strtoul(endptr+1, &endptr, 10); + if (*endptr) + /* already warned */ + continue; + for (n = 0, d = dynrules; n < ndyn; n++, d++) { + uint16_t rulenum; + + bcopy(&d->rule, &rulenum, sizeof(rulenum)); + if (rulenum > rnum) + break; + if (co.use_set) { + bcopy((char *)&d->rule + sizeof(uint16_t), + &set, sizeof(uint8_t)); + if (set != co.use_set - 1) + continue; + } + if (r->rulenum >= rnum && r->rulenum <= last) + show_dyn_ipfw(d, pcwidth, bcwidth); + } + } + } + + ac = 0; + +done: + free(data); + + if (exitval != EX_OK) + exit(exitval); +#undef NEXT +} + +static int +lookup_host (char *host, struct in_addr *ipaddr) +{ + struct hostent *he; + + if (!inet_aton(host, ipaddr)) { + if ((he = gethostbyname(host)) == NULL) + return(-1); + *ipaddr = *(struct in_addr *)he->h_addr_list[0]; + } + return(0); +} + +/* + * fills the addr and mask fields in the instruction as appropriate from av. + * Update length as appropriate. + * The following formats are allowed: + * me returns O_IP_*_ME + * 1.2.3.4 single IP address + * 1.2.3.4:5.6.7.8 address:mask + * 1.2.3.4/24 address/mask + * 1.2.3.4/26{1,6,5,4,23} set of addresses in a subnet + * We can have multiple comma-separated address/mask entries. + */ +static void +fill_ip(ipfw_insn_ip *cmd, char *av) +{ + int len = 0; + uint32_t *d = ((ipfw_insn_u32 *)cmd)->d; + + cmd->o.len &= ~F_LEN_MASK; /* zero len */ + + if (_substrcmp(av, "any") == 0) + return; + + if (_substrcmp(av, "me") == 0) { + cmd->o.len |= F_INSN_SIZE(ipfw_insn); + return; + } + + if (strncmp(av, "table(", 6) == 0) { + char *p = strchr(av + 6, ','); + + if (p) + *p++ = '\0'; + cmd->o.opcode = O_IP_DST_LOOKUP; + cmd->o.arg1 = strtoul(av + 6, NULL, 0); + if (p) { + cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); + d[0] = strtoul(p, NULL, 0); + } else + cmd->o.len |= F_INSN_SIZE(ipfw_insn); + return; + } + + while (av) { + /* + * After the address we can have '/' or ':' indicating a mask, + * ',' indicating another address follows, '{' indicating a + * set of addresses of unspecified size. + */ + char *t = NULL, *p = strpbrk(av, "/:,{"); + int masklen; + char md, nd = '\0'; + + if (p) { + md = *p; + *p++ = '\0'; + if ((t = strpbrk(p, ",{")) != NULL) { + nd = *t; + *t = '\0'; + } + } else + md = '\0'; + + if (lookup_host(av, (struct in_addr *)&d[0]) != 0) + errx(EX_NOHOST, "hostname ``%s'' unknown", av); + switch (md) { + case ':': + if (!inet_aton(p, (struct in_addr *)&d[1])) + errx(EX_DATAERR, "bad netmask ``%s''", p); + break; + case '/': + masklen = atoi(p); + if (masklen == 0) + d[1] = htonl(0); /* mask */ + else if (masklen > 32) + errx(EX_DATAERR, "bad width ``%s''", p); + else + d[1] = htonl(~0 << (32 - masklen)); + break; + case '{': /* no mask, assume /24 and put back the '{' */ + d[1] = htonl(~0 << (32 - 24)); + *(--p) = md; + break; + + case ',': /* single address plus continuation */ + *(--p) = md; + /* FALLTHROUGH */ + case 0: /* initialization value */ + default: + d[1] = htonl(~0); /* force /32 */ + break; + } + d[0] &= d[1]; /* mask base address with mask */ + if (t) + *t = nd; + /* find next separator */ + if (p) + p = strpbrk(p, ",{"); + if (p && *p == '{') { + /* + * We have a set of addresses. They are stored as follows: + * arg1 is the set size (powers of 2, 2..256) + * addr is the base address IN HOST FORMAT + * mask.. is an array of arg1 bits (rounded up to + * the next multiple of 32) with bits set + * for each host in the map. + */ + uint32_t *map = (uint32_t *)&cmd->mask; + int low, high; + int i = contigmask((uint8_t *)&(d[1]), 32); + + if (len > 0) + errx(EX_DATAERR, "address set cannot be in a list"); + if (i < 24 || i > 31) + errx(EX_DATAERR, "invalid set with mask %d\n", i); + cmd->o.arg1 = 1<<(32-i); /* map length */ + d[0] = ntohl(d[0]); /* base addr in host format */ + cmd->o.opcode = O_IP_DST_SET; /* default */ + cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32) + (cmd->o.arg1+31)/32; + for (i = 0; i < (cmd->o.arg1+31)/32 ; i++) + map[i] = 0; /* clear map */ + + av = p + 1; + low = d[0] & 0xff; + high = low + cmd->o.arg1 - 1; + /* + * Here, i stores the previous value when we specify a range + * of addresses within a mask, e.g. 45-63. i = -1 means we + * have no previous value. + */ + i = -1; /* previous value in a range */ + while (isdigit(*av)) { + char *s; + int a = strtol(av, &s, 0); + + if (s == av) { /* no parameter */ + if (*av != '}') + errx(EX_DATAERR, "set not closed\n"); + if (i != -1) + errx(EX_DATAERR, "incomplete range %d-", i); + break; + } + if (a < low || a > high) + errx(EX_DATAERR, "addr %d out of range [%d-%d]\n", + a, low, high); + a -= low; + if (i == -1) /* no previous in range */ + i = a; + else { /* check that range is valid */ + if (i > a) + errx(EX_DATAERR, "invalid range %d-%d", + i+low, a+low); + if (*s == '-') + errx(EX_DATAERR, "double '-' in range"); + } + for (; i <= a; i++) + map[i/32] |= 1<<(i & 31); + i = -1; + if (*s == '-') + i = a; + else if (*s == '}') + break; + av = s+1; + } + return; + } + av = p; + if (av) /* then *av must be a ',' */ + av++; + + /* Check this entry */ + if (d[1] == 0) { /* "any", specified as x.x.x.x/0 */ + /* + * 'any' turns the entire list into a NOP. + * 'not any' never matches, so it is removed from the + * list unless it is the only item, in which case we + * report an error. + */ + if (cmd->o.len & F_NOT) { /* "not any" never matches */ + if (av == NULL && len == 0) /* only this entry */ + errx(EX_DATAERR, "not any never matches"); + } + /* else do nothing and skip this entry */ + return; + } + /* A single IP can be stored in an optimized format */ + if (d[1] == (uint32_t)~0 && av == NULL && len == 0) { + cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); + return; + } + len += 2; /* two words... */ + d += 2; + } /* end while */ + if (len + 1 > F_LEN_MASK) + errx(EX_DATAERR, "address list too long"); + cmd->o.len |= len+1; +} + + +/* n2mask sets n bits of the mask */ +void +n2mask(struct in6_addr *mask, int n) +{ + static int minimask[9] = + { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; + u_char *p; + + memset(mask, 0, sizeof(struct in6_addr)); + p = (u_char *) mask; + for (; n > 0; p++, n -= 8) { + if (n >= 8) + *p = 0xff; + else + *p = minimask[n]; + } + return; +} + +/* + * helper function to process a set of flags and set bits in the + * appropriate masks. + */ +static void +fill_flags(ipfw_insn *cmd, enum ipfw_opcodes opcode, + struct _s_x *flags, char *p) +{ + uint8_t set=0, clear=0; + + while (p && *p) { + char *q; /* points to the separator */ + int val; + uint8_t *which; /* mask we are working on */ + + if (*p == '!') { + p++; + which = &clear; + } else + which = &set; + q = strchr(p, ','); + if (q) + *q++ = '\0'; + val = match_token(flags, p); + if (val <= 0) + errx(EX_DATAERR, "invalid flag %s", p); + *which |= (uint8_t)val; + p = q; + } + cmd->opcode = opcode; + cmd->len = (cmd->len & (F_NOT | F_OR)) | 1; + cmd->arg1 = (set & 0xff) | ( (clear & 0xff) << 8); +} + + +void +ipfw_delete(char *av[]) +{ + uint32_t rulenum; + int i; + int exitval = EX_OK; + int do_set = 0; + + av++; + NEED1("missing rule specification"); + if ( *av && _substrcmp(*av, "set") == 0) { + /* Do not allow using the following syntax: + * ipfw set N delete set M + */ + if (co.use_set) + errx(EX_DATAERR, "invalid syntax"); + do_set = 1; /* delete set */ + av++; + } + + /* Rule number */ + while (*av && isdigit(**av)) { + i = atoi(*av); av++; + if (co.do_nat) { + exitval = do_cmd(IP_FW_NAT_DEL, &i, sizeof i); + if (exitval) { + exitval = EX_UNAVAILABLE; + warn("rule %u not available", i); + } + } else if (co.do_pipe) { + exitval = ipfw_delete_pipe(co.do_pipe, i); + } else { + if (co.use_set) + rulenum = (i & 0xffff) | (5 << 24) | + ((co.use_set - 1) << 16); + else + rulenum = (i & 0xffff) | (do_set << 24); + i = do_cmd(IP_FW_DEL, &rulenum, sizeof rulenum); + if (i) { + exitval = EX_UNAVAILABLE; + warn("rule %u: setsockopt(IP_FW_DEL)", + rulenum); + } + } + } + if (exitval != EX_OK) + exit(exitval); +} + + +/* + * fill the interface structure. We do not check the name as we can + * create interfaces dynamically, so checking them at insert time + * makes relatively little sense. + * Interface names containing '*', '?', or '[' are assumed to be shell + * patterns which match interfaces. + */ +static void +fill_iface(ipfw_insn_if *cmd, char *arg) +{ + cmd->name[0] = '\0'; + cmd->o.len |= F_INSN_SIZE(ipfw_insn_if); + + /* Parse the interface or address */ + if (strcmp(arg, "any") == 0) + cmd->o.len = 0; /* effectively ignore this command */ + else if (!isdigit(*arg)) { + strlcpy(cmd->name, arg, sizeof(cmd->name)); + cmd->p.glob = strpbrk(arg, "*?[") != NULL ? 1 : 0; + } else if (!inet_aton(arg, &cmd->p.ip)) + errx(EX_DATAERR, "bad ip address ``%s''", arg); +} + +static void +get_mac_addr_mask(const char *p, uint8_t *addr, uint8_t *mask) +{ + int i; + size_t l; + char *ap, *ptr, *optr; + struct ether_addr *mac; + const char *macset = "0123456789abcdefABCDEF:"; + + if (strcmp(p, "any") == 0) { + for (i = 0; i < ETHER_ADDR_LEN; i++) + addr[i] = mask[i] = 0; + return; + } + + optr = ptr = strdup(p); + if ((ap = strsep(&ptr, "&/")) != NULL && *ap != 0) { + l = strlen(ap); + if (strspn(ap, macset) != l || (mac = ether_aton(ap)) == NULL) + errx(EX_DATAERR, "Incorrect MAC address"); + bcopy(mac, addr, ETHER_ADDR_LEN); + } else + errx(EX_DATAERR, "Incorrect MAC address"); + + if (ptr != NULL) { /* we have mask? */ + if (p[ptr - optr - 1] == '/') { /* mask len */ + long ml = strtol(ptr, &ap, 10); + if (*ap != 0 || ml > ETHER_ADDR_LEN * 8 || ml < 0) + errx(EX_DATAERR, "Incorrect mask length"); + for (i = 0; ml > 0 && i < ETHER_ADDR_LEN; ml -= 8, i++) + mask[i] = (ml >= 8) ? 0xff: (~0) << (8 - ml); + } else { /* mask */ + l = strlen(ptr); + if (strspn(ptr, macset) != l || + (mac = ether_aton(ptr)) == NULL) + errx(EX_DATAERR, "Incorrect mask"); + bcopy(mac, mask, ETHER_ADDR_LEN); + } + } else { /* default mask: ff:ff:ff:ff:ff:ff */ + for (i = 0; i < ETHER_ADDR_LEN; i++) + mask[i] = 0xff; + } + for (i = 0; i < ETHER_ADDR_LEN; i++) + addr[i] &= mask[i]; + + free(optr); +} + +/* + * helper function, updates the pointer to cmd with the length + * of the current command, and also cleans up the first word of + * the new command in case it has been clobbered before. + */ +static ipfw_insn * +next_cmd(ipfw_insn *cmd) +{ + cmd += F_LEN(cmd); + bzero(cmd, sizeof(*cmd)); + return cmd; +} + +/* + * Takes arguments and copies them into a comment + */ +static void +fill_comment(ipfw_insn *cmd, char **av) +{ + int i, l; + char *p = (char *)(cmd + 1); + + cmd->opcode = O_NOP; + cmd->len = (cmd->len & (F_NOT | F_OR)); + + /* Compute length of comment string. */ + for (i = 0, l = 0; av[i] != NULL; i++) + l += strlen(av[i]) + 1; + if (l == 0) + return; + if (l > 84) + errx(EX_DATAERR, + "comment too long (max 80 chars)"); + l = 1 + (l+3)/4; + cmd->len = (cmd->len & (F_NOT | F_OR)) | l; + for (i = 0; av[i] != NULL; i++) { + strcpy(p, av[i]); + p += strlen(av[i]); + *p++ = ' '; + } + *(--p) = '\0'; +} + +/* + * A function to fill simple commands of size 1. + * Existing flags are preserved. + */ +static void +fill_cmd(ipfw_insn *cmd, enum ipfw_opcodes opcode, int flags, uint16_t arg) +{ + cmd->opcode = opcode; + cmd->len = ((cmd->len | flags) & (F_NOT | F_OR)) | 1; + cmd->arg1 = arg; +} + +/* + * Fetch and add the MAC address and type, with masks. This generates one or + * two microinstructions, and returns the pointer to the last one. + */ +static ipfw_insn * +add_mac(ipfw_insn *cmd, char *av[]) +{ + ipfw_insn_mac *mac; + + if ( ( av[0] == NULL ) || ( av[1] == NULL ) ) + errx(EX_DATAERR, "MAC dst src"); + + cmd->opcode = O_MACADDR2; + cmd->len = (cmd->len & (F_NOT | F_OR)) | F_INSN_SIZE(ipfw_insn_mac); + + mac = (ipfw_insn_mac *)cmd; + get_mac_addr_mask(av[0], mac->addr, mac->mask); /* dst */ + get_mac_addr_mask(av[1], &(mac->addr[ETHER_ADDR_LEN]), + &(mac->mask[ETHER_ADDR_LEN])); /* src */ + return cmd; +} + +static ipfw_insn * +add_mactype(ipfw_insn *cmd, char *av) +{ + if (!av) + errx(EX_DATAERR, "missing MAC type"); + if (strcmp(av, "any") != 0) { /* we have a non-null type */ + fill_newports((ipfw_insn_u16 *)cmd, av, IPPROTO_ETHERTYPE); + cmd->opcode = O_MAC_TYPE; + return cmd; + } else + return NULL; +} + +static ipfw_insn * +add_proto0(ipfw_insn *cmd, char *av, u_char *protop) +{ + struct protoent *pe; + char *ep; + int proto; + + proto = strtol(av, &ep, 10); + if (*ep != '\0' || proto <= 0) { + if ((pe = getprotobyname(av)) == NULL) + return NULL; + proto = pe->p_proto; + } + + fill_cmd(cmd, O_PROTO, 0, proto); + *protop = proto; + return cmd; +} + +static ipfw_insn * +add_proto(ipfw_insn *cmd, char *av, u_char *protop) +{ + u_char proto = IPPROTO_IP; + + if (_substrcmp(av, "all") == 0 || strcmp(av, "ip") == 0) + ; /* do not set O_IP4 nor O_IP6 */ + else if (strcmp(av, "ip4") == 0) + /* explicit "just IPv4" rule */ + fill_cmd(cmd, O_IP4, 0, 0); + else if (strcmp(av, "ip6") == 0) { + /* explicit "just IPv6" rule */ + proto = IPPROTO_IPV6; + fill_cmd(cmd, O_IP6, 0, 0); + } else + return add_proto0(cmd, av, protop); + + *protop = proto; + return cmd; +} + +static ipfw_insn * +add_proto_compat(ipfw_insn *cmd, char *av, u_char *protop) +{ + u_char proto = IPPROTO_IP; + + if (_substrcmp(av, "all") == 0 || strcmp(av, "ip") == 0) + ; /* do not set O_IP4 nor O_IP6 */ + else if (strcmp(av, "ipv4") == 0 || strcmp(av, "ip4") == 0) + /* explicit "just IPv4" rule */ + fill_cmd(cmd, O_IP4, 0, 0); + else if (strcmp(av, "ipv6") == 0 || strcmp(av, "ip6") == 0) { + /* explicit "just IPv6" rule */ + proto = IPPROTO_IPV6; + fill_cmd(cmd, O_IP6, 0, 0); + } else + return add_proto0(cmd, av, protop); + + *protop = proto; + return cmd; +} + +static ipfw_insn * +add_srcip(ipfw_insn *cmd, char *av) +{ + fill_ip((ipfw_insn_ip *)cmd, av); + if (cmd->opcode == O_IP_DST_SET) /* set */ + cmd->opcode = O_IP_SRC_SET; + else if (cmd->opcode == O_IP_DST_LOOKUP) /* table */ + cmd->opcode = O_IP_SRC_LOOKUP; + else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) /* me */ + cmd->opcode = O_IP_SRC_ME; + else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn_u32)) /* one IP */ + cmd->opcode = O_IP_SRC; + else /* addr/mask */ + cmd->opcode = O_IP_SRC_MASK; + return cmd; +} + +static ipfw_insn * +add_dstip(ipfw_insn *cmd, char *av) +{ + fill_ip((ipfw_insn_ip *)cmd, av); + if (cmd->opcode == O_IP_DST_SET) /* set */ + ; + else if (cmd->opcode == O_IP_DST_LOOKUP) /* table */ + ; + else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) /* me */ + cmd->opcode = O_IP_DST_ME; + else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn_u32)) /* one IP */ + cmd->opcode = O_IP_DST; + else /* addr/mask */ + cmd->opcode = O_IP_DST_MASK; + return cmd; +} + +static ipfw_insn * +add_ports(ipfw_insn *cmd, char *av, u_char proto, int opcode) +{ + /* XXX "any" is trapped before. Perhaps "to" */ + if (_substrcmp(av, "any") == 0) { + return NULL; + } else if (fill_newports((ipfw_insn_u16 *)cmd, av, proto)) { + /* XXX todo: check that we have a protocol with ports */ + cmd->opcode = opcode; + return cmd; + } + return NULL; +} + +static ipfw_insn * +add_src(ipfw_insn *cmd, char *av, u_char proto) +{ + struct in6_addr a; + char *host, *ch; + ipfw_insn *ret = NULL; + + if ((host = strdup(av)) == NULL) + return NULL; + if ((ch = strrchr(host, '/')) != NULL) + *ch = '\0'; + + if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 || + inet_pton(AF_INET6, host, &a) == 1) + ret = add_srcip6(cmd, av); + /* XXX: should check for IPv4, not !IPv6 */ + if (ret == NULL && (proto == IPPROTO_IP || strcmp(av, "me") == 0 || + inet_pton(AF_INET6, host, &a) != 1)) + ret = add_srcip(cmd, av); + if (ret == NULL && strcmp(av, "any") != 0) + ret = cmd; + + free(host); + return ret; +} + +static ipfw_insn * +add_dst(ipfw_insn *cmd, char *av, u_char proto) +{ + struct in6_addr a; + char *host, *ch; + ipfw_insn *ret = NULL; + + if ((host = strdup(av)) == NULL) + return NULL; + if ((ch = strrchr(host, '/')) != NULL) + *ch = '\0'; + + if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 || + inet_pton(AF_INET6, host, &a) == 1) + ret = add_dstip6(cmd, av); + /* XXX: should check for IPv4, not !IPv6 */ + if (ret == NULL && (proto == IPPROTO_IP || strcmp(av, "me") == 0 || + inet_pton(AF_INET6, host, &a) != 1)) + ret = add_dstip(cmd, av); + if (ret == NULL && strcmp(av, "any") != 0) + ret = cmd; + + free(host); + return ret; +} + +/* + * Parse arguments and assemble the microinstructions which make up a rule. + * Rules are added into the 'rulebuf' and then copied in the correct order + * into the actual rule. + * + * The syntax for a rule starts with the action, followed by + * optional action parameters, and the various match patterns. + * In the assembled microcode, the first opcode must be an O_PROBE_STATE + * (generated if the rule includes a keep-state option), then the + * various match patterns, log/altq actions, and the actual action. + * + */ +void +ipfw_add(char *av[]) +{ + /* + * rules are added into the 'rulebuf' and then copied in + * the correct order into the actual rule. + * Some things that need to go out of order (prob, action etc.) + * go into actbuf[]. + */ + static uint32_t rulebuf[255], actbuf[255], cmdbuf[255]; + + ipfw_insn *src, *dst, *cmd, *action, *prev=NULL; + ipfw_insn *first_cmd; /* first match pattern */ + + struct ip_fw *rule; + + /* + * various flags used to record that we entered some fields. + */ + ipfw_insn *have_state = NULL; /* check-state or keep-state */ + ipfw_insn *have_log = NULL, *have_altq = NULL, *have_tag = NULL; + size_t len; + + int i; + + int open_par = 0; /* open parenthesis ( */ + + /* proto is here because it is used to fetch ports */ + u_char proto = IPPROTO_IP; /* default protocol */ + + double match_prob = 1; /* match probability, default is always match */ + + bzero(actbuf, sizeof(actbuf)); /* actions go here */ + bzero(cmdbuf, sizeof(cmdbuf)); + bzero(rulebuf, sizeof(rulebuf)); + + rule = (struct ip_fw *)rulebuf; + cmd = (ipfw_insn *)cmdbuf; + action = (ipfw_insn *)actbuf; + + av++; + + /* [rule N] -- Rule number optional */ + if (av[0] && isdigit(**av)) { + rule->rulenum = atoi(*av); + av++; + } + + /* [set N] -- set number (0..RESVD_SET), optional */ + if (av[0] && av[1] && _substrcmp(*av, "set") == 0) { + int set = strtoul(av[1], NULL, 10); + if (set < 0 || set > RESVD_SET) + errx(EX_DATAERR, "illegal set %s", av[1]); + rule->set = set; + av += 2; + } + + /* [prob D] -- match probability, optional */ + if (av[0] && av[1] && _substrcmp(*av, "prob") == 0) { + match_prob = strtod(av[1], NULL); + + if (match_prob <= 0 || match_prob > 1) + errx(EX_DATAERR, "illegal match prob. %s", av[1]); + av += 2; + } + + /* action -- mandatory */ + NEED1("missing action"); + i = match_token(rule_actions, *av); + av++; + action->len = 1; /* default */ + switch(i) { + case TOK_CHECKSTATE: + have_state = action; + action->opcode = O_CHECK_STATE; + break; + + case TOK_ACCEPT: + action->opcode = O_ACCEPT; + break; + + case TOK_DENY: + action->opcode = O_DENY; + action->arg1 = 0; + break; + + case TOK_REJECT: + action->opcode = O_REJECT; + action->arg1 = ICMP_UNREACH_HOST; + break; + + case TOK_RESET: + action->opcode = O_REJECT; + action->arg1 = ICMP_REJECT_RST; + break; + + case TOK_RESET6: + action->opcode = O_UNREACH6; + action->arg1 = ICMP6_UNREACH_RST; + break; + + case TOK_UNREACH: + action->opcode = O_REJECT; + NEED1("missing reject code"); + fill_reject_code(&action->arg1, *av); + av++; + break; + + case TOK_UNREACH6: + action->opcode = O_UNREACH6; + NEED1("missing unreach code"); + fill_unreach6_code(&action->arg1, *av); + av++; + break; + + case TOK_COUNT: + action->opcode = O_COUNT; + break; + + case TOK_NAT: + action->opcode = O_NAT; + action->len = F_INSN_SIZE(ipfw_insn_nat); + goto chkarg; + + case TOK_QUEUE: + action->opcode = O_QUEUE; + goto chkarg; + case TOK_PIPE: + action->opcode = O_PIPE; + goto chkarg; + case TOK_SKIPTO: + action->opcode = O_SKIPTO; + goto chkarg; + case TOK_NETGRAPH: + action->opcode = O_NETGRAPH; + goto chkarg; + case TOK_NGTEE: + action->opcode = O_NGTEE; + goto chkarg; + case TOK_DIVERT: + action->opcode = O_DIVERT; + goto chkarg; + case TOK_TEE: + action->opcode = O_TEE; + goto chkarg; + case TOK_CALL: + action->opcode = O_CALLRETURN; +chkarg: + if (!av[0]) + errx(EX_USAGE, "missing argument for %s", *(av - 1)); + if (isdigit(**av)) { + action->arg1 = strtoul(*av, NULL, 10); + if (action->arg1 <= 0 || action->arg1 >= IP_FW_TABLEARG) + errx(EX_DATAERR, "illegal argument for %s", + *(av - 1)); + } else if (_substrcmp(*av, "tablearg") == 0) { + action->arg1 = IP_FW_TABLEARG; + } else if (i == TOK_DIVERT || i == TOK_TEE) { + struct servent *s; + setservent(1); + s = getservbyname(av[0], "divert"); + if (s != NULL) + action->arg1 = ntohs(s->s_port); + else + errx(EX_DATAERR, "illegal divert/tee port"); + } else + errx(EX_DATAERR, "illegal argument for %s", *(av - 1)); + av++; + break; + + case TOK_FORWARD: { + ipfw_insn_sa *p = (ipfw_insn_sa *)action; + char *s, *end; + + NEED1("missing forward address[:port]"); + + action->opcode = O_FORWARD_IP; + action->len = F_INSN_SIZE(ipfw_insn_sa); + + /* + * In the kernel we assume AF_INET and use only + * sin_port and sin_addr. Remember to set sin_len as + * the routing code seems to use it too. + */ + p->sa.sin_family = AF_INET; + p->sa.sin_len = sizeof(struct sockaddr_in); + p->sa.sin_port = 0; + /* + * locate the address-port separator (':' or ',') + */ + s = strchr(*av, ':'); + if (s == NULL) + s = strchr(*av, ','); + if (s != NULL) { + *(s++) = '\0'; + i = strtoport(s, &end, 0 /* base */, 0 /* proto */); + if (s == end) + errx(EX_DATAERR, + "illegal forwarding port ``%s''", s); + p->sa.sin_port = (u_short)i; + } + if (_substrcmp(*av, "tablearg") == 0) + p->sa.sin_addr.s_addr = INADDR_ANY; + else + lookup_host(*av, &(p->sa.sin_addr)); + av++; + break; + } + case TOK_COMMENT: + /* pretend it is a 'count' rule followed by the comment */ + action->opcode = O_COUNT; + av--; /* go back... */ + break; + + case TOK_SETFIB: + { + int numfibs; + size_t intsize = sizeof(int); + + action->opcode = O_SETFIB; + NEED1("missing fib number"); + action->arg1 = strtoul(*av, NULL, 10); + if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) + errx(EX_DATAERR, "fibs not suported.\n"); + if (action->arg1 >= numfibs) /* Temporary */ + errx(EX_DATAERR, "fib too large.\n"); + av++; + break; + } + + case TOK_REASS: + action->opcode = O_REASS; + break; + + case TOK_RETURN: + fill_cmd(action, O_CALLRETURN, F_NOT, 0); + break; + + default: + errx(EX_DATAERR, "invalid action %s\n", av[-1]); + } + action = next_cmd(action); + + /* + * [altq queuename] -- altq tag, optional + * [log [logamount N]] -- log, optional + * + * If they exist, it go first in the cmdbuf, but then it is + * skipped in the copy section to the end of the buffer. + */ + while (av[0] != NULL && (i = match_token(rule_action_params, *av)) != -1) { + av++; + switch (i) { + case TOK_LOG: + { + ipfw_insn_log *c = (ipfw_insn_log *)cmd; + int l; + + if (have_log) + errx(EX_DATAERR, + "log cannot be specified more than once"); + have_log = (ipfw_insn *)c; + cmd->len = F_INSN_SIZE(ipfw_insn_log); + cmd->opcode = O_LOG; + if (av[0] && _substrcmp(*av, "logamount") == 0) { + av++; + NEED1("logamount requires argument"); + l = atoi(*av); + if (l < 0) + errx(EX_DATAERR, + "logamount must be positive"); + c->max_log = l; + av++; + } else { + len = sizeof(c->max_log); + if (sysctlbyname("net.inet.ip.fw.verbose_limit", + &c->max_log, &len, NULL, 0) == -1) + errx(1, "sysctlbyname(\"%s\")", + "net.inet.ip.fw.verbose_limit"); + } + } + break; + +#ifndef NO_ALTQ + case TOK_ALTQ: + { + ipfw_insn_altq *a = (ipfw_insn_altq *)cmd; + + NEED1("missing altq queue name"); + if (have_altq) + errx(EX_DATAERR, + "altq cannot be specified more than once"); + have_altq = (ipfw_insn *)a; + cmd->len = F_INSN_SIZE(ipfw_insn_altq); + cmd->opcode = O_ALTQ; + a->qid = altq_name_to_qid(*av); + av++; + } + break; +#endif + + case TOK_TAG: + case TOK_UNTAG: { + uint16_t tag; + + if (have_tag) + errx(EX_USAGE, "tag and untag cannot be " + "specified more than once"); + GET_UINT_ARG(tag, IPFW_ARG_MIN, IPFW_ARG_MAX, i, + rule_action_params); + have_tag = cmd; + fill_cmd(cmd, O_TAG, (i == TOK_TAG) ? 0: F_NOT, tag); + av++; + break; + } + + default: + abort(); + } + cmd = next_cmd(cmd); + } + + if (have_state) /* must be a check-state, we are done */ + goto done; + +#define OR_START(target) \ + if (av[0] && (*av[0] == '(' || *av[0] == '{')) { \ + if (open_par) \ + errx(EX_USAGE, "nested \"(\" not allowed\n"); \ + prev = NULL; \ + open_par = 1; \ + if ( (av[0])[1] == '\0') { \ + av++; \ + } else \ + (*av)++; \ + } \ + target: \ + + +#define CLOSE_PAR \ + if (open_par) { \ + if (av[0] && ( \ + strcmp(*av, ")") == 0 || \ + strcmp(*av, "}") == 0)) { \ + prev = NULL; \ + open_par = 0; \ + av++; \ + } else \ + errx(EX_USAGE, "missing \")\"\n"); \ + } + +#define NOT_BLOCK \ + if (av[0] && _substrcmp(*av, "not") == 0) { \ + if (cmd->len & F_NOT) \ + errx(EX_USAGE, "double \"not\" not allowed\n"); \ + cmd->len |= F_NOT; \ + av++; \ + } + +#define OR_BLOCK(target) \ + if (av[0] && _substrcmp(*av, "or") == 0) { \ + if (prev == NULL || open_par == 0) \ + errx(EX_DATAERR, "invalid OR block"); \ + prev->len |= F_OR; \ + av++; \ + goto target; \ + } \ + CLOSE_PAR; + + first_cmd = cmd; + +#if 0 + /* + * MAC addresses, optional. + * If we have this, we skip the part "proto from src to dst" + * and jump straight to the option parsing. + */ + NOT_BLOCK; + NEED1("missing protocol"); + if (_substrcmp(*av, "MAC") == 0 || + _substrcmp(*av, "mac") == 0) { + av++; /* the "MAC" keyword */ + add_mac(cmd, av); /* exits in case of errors */ + cmd = next_cmd(cmd); + av += 2; /* dst-mac and src-mac */ + NOT_BLOCK; + NEED1("missing mac type"); + if (add_mactype(cmd, av[0])) + cmd = next_cmd(cmd); + av++; /* any or mac-type */ + goto read_options; + } +#endif + + /* + * protocol, mandatory + */ + OR_START(get_proto); + NOT_BLOCK; + NEED1("missing protocol"); + if (add_proto_compat(cmd, *av, &proto)) { + av++; + if (F_LEN(cmd) != 0) { + prev = cmd; + cmd = next_cmd(cmd); + } + } else if (first_cmd != cmd) { + errx(EX_DATAERR, "invalid protocol ``%s''", *av); + } else + goto read_options; + OR_BLOCK(get_proto); + + /* + * "from", mandatory + */ + if ((av[0] == NULL) || _substrcmp(*av, "from") != 0) + errx(EX_USAGE, "missing ``from''"); + av++; + + /* + * source IP, mandatory + */ + OR_START(source_ip); + NOT_BLOCK; /* optional "not" */ + NEED1("missing source address"); + if (add_src(cmd, *av, proto)) { + av++; + if (F_LEN(cmd) != 0) { /* ! any */ + prev = cmd; + cmd = next_cmd(cmd); + } + } else + errx(EX_USAGE, "bad source address %s", *av); + OR_BLOCK(source_ip); + + /* + * source ports, optional + */ + NOT_BLOCK; /* optional "not" */ + if ( av[0] != NULL ) { + if (_substrcmp(*av, "any") == 0 || + add_ports(cmd, *av, proto, O_IP_SRCPORT)) { + av++; + if (F_LEN(cmd) != 0) + cmd = next_cmd(cmd); + } + } + + /* + * "to", mandatory + */ + if ( (av[0] == NULL) || _substrcmp(*av, "to") != 0 ) + errx(EX_USAGE, "missing ``to''"); + av++; + + /* + * destination, mandatory + */ + OR_START(dest_ip); + NOT_BLOCK; /* optional "not" */ + NEED1("missing dst address"); + if (add_dst(cmd, *av, proto)) { + av++; + if (F_LEN(cmd) != 0) { /* ! any */ + prev = cmd; + cmd = next_cmd(cmd); + } + } else + errx( EX_USAGE, "bad destination address %s", *av); + OR_BLOCK(dest_ip); + + /* + * dest. ports, optional + */ + NOT_BLOCK; /* optional "not" */ + if (av[0]) { + if (_substrcmp(*av, "any") == 0 || + add_ports(cmd, *av, proto, O_IP_DSTPORT)) { + av++; + if (F_LEN(cmd) != 0) + cmd = next_cmd(cmd); + } + } + +read_options: + if (av[0] && first_cmd == cmd) { + /* + * nothing specified so far, store in the rule to ease + * printout later. + */ + rule->_pad = 1; + } + prev = NULL; + while ( av[0] != NULL ) { + char *s; + ipfw_insn_u32 *cmd32; /* alias for cmd */ + + s = *av; + cmd32 = (ipfw_insn_u32 *)cmd; + + if (*s == '!') { /* alternate syntax for NOT */ + if (cmd->len & F_NOT) + errx(EX_USAGE, "double \"not\" not allowed\n"); + cmd->len = F_NOT; + s++; + } + i = match_token(rule_options, s); + av++; + switch(i) { + case TOK_NOT: + if (cmd->len & F_NOT) + errx(EX_USAGE, "double \"not\" not allowed\n"); + cmd->len = F_NOT; + break; + + case TOK_OR: + if (open_par == 0 || prev == NULL) + errx(EX_USAGE, "invalid \"or\" block\n"); + prev->len |= F_OR; + break; + + case TOK_STARTBRACE: + if (open_par) + errx(EX_USAGE, "+nested \"(\" not allowed\n"); + open_par = 1; + break; + + case TOK_ENDBRACE: + if (!open_par) + errx(EX_USAGE, "+missing \")\"\n"); + open_par = 0; + prev = NULL; + break; + + case TOK_IN: + fill_cmd(cmd, O_IN, 0, 0); + break; + + case TOK_OUT: + cmd->len ^= F_NOT; /* toggle F_NOT */ + fill_cmd(cmd, O_IN, 0, 0); + break; + + case TOK_DIVERTED: + fill_cmd(cmd, O_DIVERTED, 0, 3); + break; + + case TOK_DIVERTEDLOOPBACK: + fill_cmd(cmd, O_DIVERTED, 0, 1); + break; + + case TOK_DIVERTEDOUTPUT: + fill_cmd(cmd, O_DIVERTED, 0, 2); + break; + + case TOK_FRAG: + fill_cmd(cmd, O_FRAG, 0, 0); + break; + + case TOK_LAYER2: + fill_cmd(cmd, O_LAYER2, 0, 0); + break; + + case TOK_XMIT: + case TOK_RECV: + case TOK_VIA: + NEED1("recv, xmit, via require interface name" + " or address"); + fill_iface((ipfw_insn_if *)cmd, av[0]); + av++; + if (F_LEN(cmd) == 0) /* not a valid address */ + break; + if (i == TOK_XMIT) + cmd->opcode = O_XMIT; + else if (i == TOK_RECV) + cmd->opcode = O_RECV; + else if (i == TOK_VIA) + cmd->opcode = O_VIA; + break; + + case TOK_ICMPTYPES: + NEED1("icmptypes requires list of types"); + fill_icmptypes((ipfw_insn_u32 *)cmd, *av); + av++; + break; + + case TOK_ICMP6TYPES: + NEED1("icmptypes requires list of types"); + fill_icmp6types((ipfw_insn_icmp6 *)cmd, *av); + av++; + break; + + case TOK_IPTTL: + NEED1("ipttl requires TTL"); + if (strpbrk(*av, "-,")) { + if (!add_ports(cmd, *av, 0, O_IPTTL)) + errx(EX_DATAERR, "invalid ipttl %s", *av); + } else + fill_cmd(cmd, O_IPTTL, 0, strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_IPID: + NEED1("ipid requires id"); + if (strpbrk(*av, "-,")) { + if (!add_ports(cmd, *av, 0, O_IPID)) + errx(EX_DATAERR, "invalid ipid %s", *av); + } else + fill_cmd(cmd, O_IPID, 0, strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_IPLEN: + NEED1("iplen requires length"); + if (strpbrk(*av, "-,")) { + if (!add_ports(cmd, *av, 0, O_IPLEN)) + errx(EX_DATAERR, "invalid ip len %s", *av); + } else + fill_cmd(cmd, O_IPLEN, 0, strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_IPVER: + NEED1("ipver requires version"); + fill_cmd(cmd, O_IPVER, 0, strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_IPPRECEDENCE: + NEED1("ipprecedence requires value"); + fill_cmd(cmd, O_IPPRECEDENCE, 0, + (strtoul(*av, NULL, 0) & 7) << 5); + av++; + break; + + case TOK_IPOPTS: + NEED1("missing argument for ipoptions"); + fill_flags(cmd, O_IPOPT, f_ipopts, *av); + av++; + break; + + case TOK_IPTOS: + NEED1("missing argument for iptos"); + fill_flags(cmd, O_IPTOS, f_iptos, *av); + av++; + break; + + case TOK_UID: + NEED1("uid requires argument"); + { + char *end; + uid_t uid; + struct passwd *pwd; + + cmd->opcode = O_UID; + uid = strtoul(*av, &end, 0); + pwd = (*end == '\0') ? getpwuid(uid) : getpwnam(*av); + if (pwd == NULL) + errx(EX_DATAERR, "uid \"%s\" nonexistent", *av); + cmd32->d[0] = pwd->pw_uid; + cmd->len |= F_INSN_SIZE(ipfw_insn_u32); + av++; + } + break; + + case TOK_GID: + NEED1("gid requires argument"); + { + char *end; + gid_t gid; + struct group *grp; + + cmd->opcode = O_GID; + gid = strtoul(*av, &end, 0); + grp = (*end == '\0') ? getgrgid(gid) : getgrnam(*av); + if (grp == NULL) + errx(EX_DATAERR, "gid \"%s\" nonexistent", *av); + cmd32->d[0] = grp->gr_gid; + cmd->len |= F_INSN_SIZE(ipfw_insn_u32); + av++; + } + break; + + case TOK_JAIL: + NEED1("jail requires argument"); + { + char *end; + int jid; + + cmd->opcode = O_JAIL; + jid = (int)strtol(*av, &end, 0); + if (jid < 0 || *end != '\0') + errx(EX_DATAERR, "jail requires prison ID"); + cmd32->d[0] = (uint32_t)jid; + cmd->len |= F_INSN_SIZE(ipfw_insn_u32); + av++; + } + break; + + case TOK_ESTAB: + fill_cmd(cmd, O_ESTAB, 0, 0); + break; + + case TOK_SETUP: + fill_cmd(cmd, O_TCPFLAGS, 0, + (TH_SYN) | ( (TH_ACK) & 0xff) <<8 ); + break; + + case TOK_TCPDATALEN: + NEED1("tcpdatalen requires length"); + if (strpbrk(*av, "-,")) { + if (!add_ports(cmd, *av, 0, O_TCPDATALEN)) + errx(EX_DATAERR, "invalid tcpdata len %s", *av); + } else + fill_cmd(cmd, O_TCPDATALEN, 0, + strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_TCPOPTS: + NEED1("missing argument for tcpoptions"); + fill_flags(cmd, O_TCPOPTS, f_tcpopts, *av); + av++; + break; + + case TOK_TCPSEQ: + case TOK_TCPACK: + NEED1("tcpseq/tcpack requires argument"); + cmd->len = F_INSN_SIZE(ipfw_insn_u32); + cmd->opcode = (i == TOK_TCPSEQ) ? O_TCPSEQ : O_TCPACK; + cmd32->d[0] = htonl(strtoul(*av, NULL, 0)); + av++; + break; + + case TOK_TCPWIN: + NEED1("tcpwin requires length"); + fill_cmd(cmd, O_TCPWIN, 0, + htons(strtoul(*av, NULL, 0))); + av++; + break; + + case TOK_TCPFLAGS: + NEED1("missing argument for tcpflags"); + cmd->opcode = O_TCPFLAGS; + fill_flags(cmd, O_TCPFLAGS, f_tcpflags, *av); + av++; + break; + + case TOK_KEEPSTATE: + if (open_par) + errx(EX_USAGE, "keep-state cannot be part " + "of an or block"); + if (have_state) + errx(EX_USAGE, "only one of keep-state " + "and limit is allowed"); + have_state = cmd; + fill_cmd(cmd, O_KEEP_STATE, 0, 0); + break; + + case TOK_LIMIT: { + ipfw_insn_limit *c = (ipfw_insn_limit *)cmd; + int val; + + if (open_par) + errx(EX_USAGE, + "limit cannot be part of an or block"); + if (have_state) + errx(EX_USAGE, "only one of keep-state and " + "limit is allowed"); + have_state = cmd; + + cmd->len = F_INSN_SIZE(ipfw_insn_limit); + cmd->opcode = O_LIMIT; + c->limit_mask = c->conn_limit = 0; + + while ( av[0] != NULL ) { + if ((val = match_token(limit_masks, *av)) <= 0) + break; + c->limit_mask |= val; + av++; + } + + if (c->limit_mask == 0) + errx(EX_USAGE, "limit: missing limit mask"); + + GET_UINT_ARG(c->conn_limit, IPFW_ARG_MIN, IPFW_ARG_MAX, + TOK_LIMIT, rule_options); + + av++; + break; + } + + case TOK_PROTO: + NEED1("missing protocol"); + if (add_proto(cmd, *av, &proto)) { + av++; + } else + errx(EX_DATAERR, "invalid protocol ``%s''", + *av); + break; + + case TOK_SRCIP: + NEED1("missing source IP"); + if (add_srcip(cmd, *av)) { + av++; + } + break; + + case TOK_DSTIP: + NEED1("missing destination IP"); + if (add_dstip(cmd, *av)) { + av++; + } + break; + + case TOK_SRCIP6: + NEED1("missing source IP6"); + if (add_srcip6(cmd, *av)) { + av++; + } + break; + + case TOK_DSTIP6: + NEED1("missing destination IP6"); + if (add_dstip6(cmd, *av)) { + av++; + } + break; + + case TOK_SRCPORT: + NEED1("missing source port"); + if (_substrcmp(*av, "any") == 0 || + add_ports(cmd, *av, proto, O_IP_SRCPORT)) { + av++; + } else + errx(EX_DATAERR, "invalid source port %s", *av); + break; + + case TOK_DSTPORT: + NEED1("missing destination port"); + if (_substrcmp(*av, "any") == 0 || + add_ports(cmd, *av, proto, O_IP_DSTPORT)) { + av++; + } else + errx(EX_DATAERR, "invalid destination port %s", + *av); + break; + + case TOK_MAC: + if (add_mac(cmd, av)) + av += 2; + break; + + case TOK_MACTYPE: + NEED1("missing mac type"); + if (!add_mactype(cmd, *av)) + errx(EX_DATAERR, "invalid mac type %s", *av); + av++; + break; + + case TOK_VERREVPATH: + fill_cmd(cmd, O_VERREVPATH, 0, 0); + break; + + case TOK_VERSRCREACH: + fill_cmd(cmd, O_VERSRCREACH, 0, 0); + break; + + case TOK_ANTISPOOF: + fill_cmd(cmd, O_ANTISPOOF, 0, 0); + break; + + case TOK_IPSEC: + fill_cmd(cmd, O_IPSEC, 0, 0); + break; + + case TOK_IPV6: + fill_cmd(cmd, O_IP6, 0, 0); + break; + + case TOK_IPV4: + fill_cmd(cmd, O_IP4, 0, 0); + break; + + case TOK_EXT6HDR: + fill_ext6hdr( cmd, *av ); + av++; + break; + + case TOK_FLOWID: + if (proto != IPPROTO_IPV6 ) + errx( EX_USAGE, "flow-id filter is active " + "only for ipv6 protocol\n"); + fill_flow6( (ipfw_insn_u32 *) cmd, *av ); + av++; + break; + + case TOK_COMMENT: + fill_comment(cmd, av); + av[0]=NULL; + break; + + case TOK_TAGGED: + if (av[0] && strpbrk(*av, "-,")) { + if (!add_ports(cmd, *av, 0, O_TAGGED)) + errx(EX_DATAERR, "tagged: invalid tag" + " list: %s", *av); + } + else { + uint16_t tag; + + GET_UINT_ARG(tag, IPFW_ARG_MIN, IPFW_ARG_MAX, + TOK_TAGGED, rule_options); + fill_cmd(cmd, O_TAGGED, 0, tag); + } + av++; + break; + + case TOK_FIB: + NEED1("fib requires fib number"); + fill_cmd(cmd, O_FIB, 0, strtoul(*av, NULL, 0)); + av++; + break; + case TOK_SOCKARG: + fill_cmd(cmd, O_SOCKARG, 0, 0); + break; + + case TOK_LOOKUP: { + ipfw_insn_u32 *c = (ipfw_insn_u32 *)cmd; + char *p; + int j; + + if (!av[0] || !av[1]) + errx(EX_USAGE, "format: lookup argument tablenum"); + cmd->opcode = O_IP_DST_LOOKUP; + cmd->len |= F_INSN_SIZE(ipfw_insn) + 2; + i = match_token(rule_options, *av); + for (j = 0; lookup_key[j] >= 0 ; j++) { + if (i == lookup_key[j]) + break; + } + if (lookup_key[j] <= 0) + errx(EX_USAGE, "format: cannot lookup on %s", *av); + __PAST_END(c->d, 1) = j; // i converted to option + av++; + cmd->arg1 = strtoul(*av, &p, 0); + if (p && *p) + errx(EX_USAGE, "format: lookup argument tablenum"); + av++; + } + break; + + default: + errx(EX_USAGE, "unrecognised option [%d] %s\n", i, s); + } + if (F_LEN(cmd) > 0) { /* prepare to advance */ + prev = cmd; + cmd = next_cmd(cmd); + } + } + +done: + /* + * Now copy stuff into the rule. + * If we have a keep-state option, the first instruction + * must be a PROBE_STATE (which is generated here). + * If we have a LOG option, it was stored as the first command, + * and now must be moved to the top of the action part. + */ + dst = (ipfw_insn *)rule->cmd; + + /* + * First thing to write into the command stream is the match probability. + */ + if (match_prob != 1) { /* 1 means always match */ + dst->opcode = O_PROB; + dst->len = 2; + *((int32_t *)(dst+1)) = (int32_t)(match_prob * 0x7fffffff); + dst += dst->len; + } + + /* + * generate O_PROBE_STATE if necessary + */ + if (have_state && have_state->opcode != O_CHECK_STATE) { + fill_cmd(dst, O_PROBE_STATE, 0, 0); + dst = next_cmd(dst); + } + + /* copy all commands but O_LOG, O_KEEP_STATE, O_LIMIT, O_ALTQ, O_TAG */ + for (src = (ipfw_insn *)cmdbuf; src != cmd; src += i) { + i = F_LEN(src); + + switch (src->opcode) { + case O_LOG: + case O_KEEP_STATE: + case O_LIMIT: + case O_ALTQ: + case O_TAG: + break; + default: + bcopy(src, dst, i * sizeof(uint32_t)); + dst += i; + } + } + + /* + * put back the have_state command as last opcode + */ + if (have_state && have_state->opcode != O_CHECK_STATE) { + i = F_LEN(have_state); + bcopy(have_state, dst, i * sizeof(uint32_t)); + dst += i; + } + /* + * start action section + */ + rule->act_ofs = dst - rule->cmd; + + /* put back O_LOG, O_ALTQ, O_TAG if necessary */ + if (have_log) { + i = F_LEN(have_log); + bcopy(have_log, dst, i * sizeof(uint32_t)); + dst += i; + } + if (have_altq) { + i = F_LEN(have_altq); + bcopy(have_altq, dst, i * sizeof(uint32_t)); + dst += i; + } + if (have_tag) { + i = F_LEN(have_tag); + bcopy(have_tag, dst, i * sizeof(uint32_t)); + dst += i; + } + /* + * copy all other actions + */ + for (src = (ipfw_insn *)actbuf; src != action; src += i) { + i = F_LEN(src); + bcopy(src, dst, i * sizeof(uint32_t)); + dst += i; + } + + rule->cmd_len = (uint32_t *)dst - (uint32_t *)(rule->cmd); + i = (char *)dst - (char *)rule; + if (do_cmd(IP_FW_ADD, rule, (uintptr_t)&i) == -1) + err(EX_UNAVAILABLE, "getsockopt(%s)", "IP_FW_ADD"); + if (!co.do_quiet) + show_ipfw(rule, 0, 0); +} + +/* + * clear the counters or the log counters. + */ +void +ipfw_zero(int ac, char *av[], int optname /* 0 = IP_FW_ZERO, 1 = IP_FW_RESETLOG */) +{ + uint32_t arg, saved_arg; + int failed = EX_OK; + char const *errstr; + char const *name = optname ? "RESETLOG" : "ZERO"; + + optname = optname ? IP_FW_RESETLOG : IP_FW_ZERO; + + av++; ac--; + + if (!ac) { + /* clear all entries */ + if (do_cmd(optname, NULL, 0) < 0) + err(EX_UNAVAILABLE, "setsockopt(IP_FW_%s)", name); + if (!co.do_quiet) + printf("%s.\n", optname == IP_FW_ZERO ? + "Accounting cleared":"Logging counts reset"); + + return; + } + + while (ac) { + /* Rule number */ + if (isdigit(**av)) { + arg = strtonum(*av, 0, 0xffff, &errstr); + if (errstr) + errx(EX_DATAERR, + "invalid rule number %s\n", *av); + saved_arg = arg; + if (co.use_set) + arg |= (1 << 24) | ((co.use_set - 1) << 16); + av++; + ac--; + if (do_cmd(optname, &arg, sizeof(arg))) { + warn("rule %u: setsockopt(IP_FW_%s)", + saved_arg, name); + failed = EX_UNAVAILABLE; + } else if (!co.do_quiet) + printf("Entry %d %s.\n", saved_arg, + optname == IP_FW_ZERO ? + "cleared" : "logging count reset"); + } else { + errx(EX_USAGE, "invalid rule number ``%s''", *av); + } + } + if (failed != EX_OK) + exit(failed); +} + +void +ipfw_flush(int force) +{ + int cmd = co.do_pipe ? IP_DUMMYNET_FLUSH : IP_FW_FLUSH; + + if (!force && !co.do_quiet) { /* need to ask user */ + int c; + + printf("Are you sure? [yn] "); + fflush(stdout); + do { + c = toupper(getc(stdin)); + while (c != '\n' && getc(stdin) != '\n') + if (feof(stdin)) + return; /* and do not flush */ + } while (c != 'Y' && c != 'N'); + printf("\n"); + if (c == 'N') /* user said no */ + return; + } + if (co.do_pipe) { + dummynet_flush(); + return; + } + /* `ipfw set N flush` - is the same that `ipfw delete set N` */ + if (co.use_set) { + uint32_t arg = ((co.use_set - 1) & 0xffff) | (1 << 24); + if (do_cmd(IP_FW_DEL, &arg, sizeof(arg)) < 0) + err(EX_UNAVAILABLE, "setsockopt(IP_FW_DEL)"); + } else if (do_cmd(cmd, NULL, 0) < 0) + err(EX_UNAVAILABLE, "setsockopt(IP_%s_FLUSH)", + co.do_pipe ? "DUMMYNET" : "FW"); + if (!co.do_quiet) + printf("Flushed all %s.\n", co.do_pipe ? "pipes" : "rules"); +} + + +static void table_list(ipfw_table_entry ent, int need_header); + +/* + * This one handles all table-related commands + * ipfw table N add addr[/masklen] [value] + * ipfw table N delete addr[/masklen] + * ipfw table {N | all} flush + * ipfw table {N | all} list + */ +void +ipfw_table_handler(int ac, char *av[]) +{ + ipfw_table_entry ent; + int do_add; + int is_all; + size_t len; + char *p; + uint32_t a; + uint32_t tables_max; + + len = sizeof(tables_max); + if (sysctlbyname("net.inet.ip.fw.tables_max", &tables_max, &len, + NULL, 0) == -1) { +#ifdef IPFW_TABLES_MAX + warn("Warn: Failed to get the max tables number via sysctl. " + "Using the compiled in defaults. \nThe reason was"); + tables_max = IPFW_TABLES_MAX; +#else + errx(1, "Failed sysctlbyname(\"net.inet.ip.fw.tables_max\")"); +#endif + } + + ac--; av++; + if (ac && isdigit(**av)) { + ent.tbl = atoi(*av); + is_all = 0; + ac--; av++; + } else if (ac && _substrcmp(*av, "all") == 0) { + ent.tbl = 0; + is_all = 1; + ac--; av++; + } else + errx(EX_USAGE, "table number or 'all' keyword required"); + if (ent.tbl >= tables_max) + errx(EX_USAGE, "The table number exceeds the maximum allowed " + "value (%d)", tables_max - 1); + NEED1("table needs command"); + if (is_all && _substrcmp(*av, "list") != 0 + && _substrcmp(*av, "flush") != 0) + errx(EX_USAGE, "table number required"); + + if (_substrcmp(*av, "add") == 0 || + _substrcmp(*av, "delete") == 0) { + do_add = **av == 'a'; + ac--; av++; + if (!ac) + errx(EX_USAGE, "IP address required"); + p = strchr(*av, '/'); + if (p) { + *p++ = '\0'; + ent.masklen = atoi(p); + if (ent.masklen > 32) + errx(EX_DATAERR, "bad width ``%s''", p); + } else + ent.masklen = 32; + if (lookup_host(*av, (struct in_addr *)&ent.addr) != 0) + errx(EX_NOHOST, "hostname ``%s'' unknown", *av); + ac--; av++; + if (do_add && ac) { + unsigned int tval; + /* isdigit is a bit of a hack here.. */ + if (strchr(*av, (int)'.') == NULL && isdigit(**av)) { + ent.value = strtoul(*av, NULL, 0); + } else { + if (lookup_host(*av, (struct in_addr *)&tval) == 0) { + /* The value must be stored in host order * + * so that the values < 65k can be distinguished */ + ent.value = ntohl(tval); + } else { + errx(EX_NOHOST, "hostname ``%s'' unknown", *av); + } + } + } else + ent.value = 0; + if (do_cmd(do_add ? IP_FW_TABLE_ADD : IP_FW_TABLE_DEL, + &ent, sizeof(ent)) < 0) { + /* If running silent, don't bomb out on these errors. */ + if (!(co.do_quiet && (errno == (do_add ? EEXIST : ESRCH)))) + err(EX_OSERR, "setsockopt(IP_FW_TABLE_%s)", + do_add ? "ADD" : "DEL"); + /* In silent mode, react to a failed add by deleting */ + if (do_add) { + do_cmd(IP_FW_TABLE_DEL, &ent, sizeof(ent)); + if (do_cmd(IP_FW_TABLE_ADD, + &ent, sizeof(ent)) < 0) + err(EX_OSERR, + "setsockopt(IP_FW_TABLE_ADD)"); + } + } + } else if (_substrcmp(*av, "flush") == 0) { + a = is_all ? tables_max : (uint32_t)(ent.tbl + 1); + do { + if (do_cmd(IP_FW_TABLE_FLUSH, &ent.tbl, + sizeof(ent.tbl)) < 0) + err(EX_OSERR, "setsockopt(IP_FW_TABLE_FLUSH)"); + } while (++ent.tbl < a); + } else if (_substrcmp(*av, "list") == 0) { + a = is_all ? tables_max : (uint32_t)(ent.tbl + 1); + do { + table_list(ent, is_all); + } while (++ent.tbl < a); + } else + errx(EX_USAGE, "invalid table command %s", *av); +} + +static void +table_list(ipfw_table_entry ent, int need_header) +{ + ipfw_table *tbl; + socklen_t l; + uint32_t a; + + a = ent.tbl; + l = sizeof(a); + if (do_cmd(IP_FW_TABLE_GETSIZE, &a, (uintptr_t)&l) < 0) + err(EX_OSERR, "getsockopt(IP_FW_TABLE_GETSIZE)"); + + /* If a is zero we have nothing to do, the table is empty. */ + if (a == 0) + return; + + l = sizeof(*tbl) + a * sizeof(ipfw_table_entry); + tbl = safe_calloc(1, l); + tbl->tbl = ent.tbl; + if (do_cmd(IP_FW_TABLE_LIST, tbl, (uintptr_t)&l) < 0) + err(EX_OSERR, "getsockopt(IP_FW_TABLE_LIST)"); + if (tbl->cnt && need_header) + printf("---table(%d)---\n", tbl->tbl); + for (a = 0; a < tbl->cnt; a++) { + unsigned int tval; + tval = tbl->ent[a].value; + if (co.do_value_as_ip) { + char tbuf[128]; + strncpy(tbuf, inet_ntoa(*(struct in_addr *) + &tbl->ent[a].addr), 127); + /* inet_ntoa expects network order */ + tval = htonl(tval); + printf("%s/%u %s\n", tbuf, tbl->ent[a].masklen, + inet_ntoa(*(struct in_addr *)&tval)); + } else { + printf("%s/%u %u\n", + inet_ntoa(*(struct in_addr *)&tbl->ent[a].addr), + tbl->ent[a].masklen, tval); + } + } + free(tbl); +} diff --git a/ipfw/ipfw2.h b/ipfw/ipfw2.h new file mode 100644 index 0000000..1f280f5 --- /dev/null +++ b/ipfw/ipfw2.h @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2002-2003 Luigi Rizzo + * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Idea and grammar partially left from: + * Copyright (c) 1993 Daniel Boulet + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + * NEW command line interface for IP firewall facility + * + * $FreeBSD: head/sbin/ipfw/ipfw2.h 206843 2010-04-19 15:11:45Z luigi $ + */ + +/* + * Options that can be set on the command line. + * When reading commands from a file, a subset of the options can also + * be applied globally by specifying them before the file name. + * After that, each line can contain its own option that changes + * the global value. + * XXX The context is not restored after each line. + */ + +struct cmdline_opts { + /* boolean options: */ + int do_value_as_ip; /* show table value as IP */ + int do_resolv; /* try to resolve all ip to names */ + int do_time; /* Show time stamps */ + int do_quiet; /* Be quiet in add and flush */ + int do_pipe; /* this cmd refers to a pipe/queue/sched */ + int do_nat; /* this cmd refers to a nat config */ + int do_dynamic; /* display dynamic rules */ + int do_expired; /* display expired dynamic rules */ + int do_compact; /* show rules in compact mode */ + int do_force; /* do not ask for confirmation */ + int show_sets; /* display the set each rule belongs to */ + int test_only; /* only check syntax */ + int comment_only; /* only print action and comment */ + int verbose; /* be verbose on some commands */ + + /* The options below can have multiple values. */ + + int do_sort; /* field to sort results (0 = no) */ + /* valid fields are 1 and above */ + + int use_set; /* work with specified set number */ + /* 0 means all sets, otherwise apply to set use_set - 1 */ + +}; + +extern struct cmdline_opts co; + +/* + * _s_x is a structure that stores a string <-> token pairs, used in + * various places in the parser. Entries are stored in arrays, + * with an entry with s=NULL as terminator. + * The search routines are match_token() and match_value(). + * Often, an element with x=0 contains an error string. + * + */ +struct _s_x { + char const *s; + int x; +}; + +enum tokens { + TOK_NULL=0, + + TOK_OR, + TOK_NOT, + TOK_STARTBRACE, + TOK_ENDBRACE, + + TOK_ACCEPT, + TOK_COUNT, + TOK_PIPE, + TOK_LINK, + TOK_QUEUE, + TOK_FLOWSET, + TOK_SCHED, + TOK_DIVERT, + TOK_TEE, + TOK_NETGRAPH, + TOK_NGTEE, + TOK_FORWARD, + TOK_SKIPTO, + TOK_DENY, + TOK_REJECT, + TOK_RESET, + TOK_UNREACH, + TOK_CHECKSTATE, + TOK_NAT, + TOK_REASS, + TOK_CALL, + TOK_RETURN, + + TOK_ALTQ, + TOK_LOG, + TOK_TAG, + TOK_UNTAG, + + TOK_TAGGED, + TOK_UID, + TOK_GID, + TOK_JAIL, + TOK_IN, + TOK_LIMIT, + TOK_KEEPSTATE, + TOK_LAYER2, + TOK_OUT, + TOK_DIVERTED, + TOK_DIVERTEDLOOPBACK, + TOK_DIVERTEDOUTPUT, + TOK_XMIT, + TOK_RECV, + TOK_VIA, + TOK_FRAG, + TOK_IPOPTS, + TOK_IPLEN, + TOK_IPID, + TOK_IPPRECEDENCE, + TOK_DSCP, + TOK_IPTOS, + TOK_IPTTL, + TOK_IPVER, + TOK_ESTAB, + TOK_SETUP, + TOK_TCPDATALEN, + TOK_TCPFLAGS, + TOK_TCPOPTS, + TOK_TCPSEQ, + TOK_TCPACK, + TOK_TCPWIN, + TOK_ICMPTYPES, + TOK_MAC, + TOK_MACTYPE, + TOK_VERREVPATH, + TOK_VERSRCREACH, + TOK_ANTISPOOF, + TOK_IPSEC, + TOK_COMMENT, + + TOK_PLR, + TOK_NOERROR, + TOK_BUCKETS, + TOK_DSTIP, + TOK_SRCIP, + TOK_DSTPORT, + TOK_SRCPORT, + TOK_ALL, + TOK_MASK, + TOK_FLOW_MASK, + TOK_SCHED_MASK, + TOK_BW, + TOK_DELAY, + TOK_PROFILE, + TOK_BURST, + TOK_RED, + TOK_GRED, + TOK_DROPTAIL, + TOK_PROTO, + /* dummynet tokens */ + TOK_WEIGHT, + TOK_LMAX, + TOK_PRI, + TOK_TYPE, + TOK_SLOTSIZE, + + TOK_IP, + TOK_IF, + TOK_ALOG, + TOK_DENY_INC, + TOK_SAME_PORTS, + TOK_UNREG_ONLY, + TOK_SKIP_GLOBAL, + TOK_RESET_ADDR, + TOK_ALIAS_REV, + TOK_PROXY_ONLY, + TOK_REDIR_ADDR, + TOK_REDIR_PORT, + TOK_REDIR_PROTO, + + TOK_IPV6, + TOK_FLOWID, + TOK_ICMP6TYPES, + TOK_EXT6HDR, + TOK_DSTIP6, + TOK_SRCIP6, + + TOK_IPV4, + TOK_UNREACH6, + TOK_RESET6, + + TOK_FIB, + TOK_SETFIB, + TOK_LOOKUP, + TOK_SOCKARG, +}; +/* + * the following macro returns an error message if we run out of + * arguments. + */ +#define NEED(_p, msg) {if (!_p) errx(EX_USAGE, msg);} +#define NEED1(msg) {if (!(*av)) errx(EX_USAGE, msg);} + +int pr_u64(uint64_t *pd, int width); + +/* memory allocation support */ +void *safe_calloc(size_t number, size_t size); +void *safe_realloc(void *ptr, size_t size); + +/* string comparison functions used for historical compatibility */ +int _substrcmp(const char *str1, const char* str2); +int _substrcmp2(const char *str1, const char* str2, const char* str3); + +/* utility functions */ +int match_token(struct _s_x *table, char *string); +char const *match_value(struct _s_x *p, int value); + +int do_cmd(int optname, void *optval, uintptr_t optlen); + +struct in6_addr; +void n2mask(struct in6_addr *mask, int n); +int contigmask(uint8_t *p, int len); + +/* + * Forward declarations to avoid include way too many headers. + * C does not allow duplicated typedefs, so we use the base struct + * that the typedef points to. + * Should the typedefs use a different type, the compiler will + * still detect the change when compiling the body of the + * functions involved, so we do not lose error checking. + */ +struct _ipfw_insn; +struct _ipfw_insn_altq; +struct _ipfw_insn_u32; +struct _ipfw_insn_ip6; +struct _ipfw_insn_icmp6; + +/* + * The reserved set numer. This is a constant in ip_fw.h + * but we store it in a variable so other files do not depend + * in that header just for one constant. + */ +extern int resvd_set_number; + +/* first-level command handlers */ +void ipfw_add(char *av[]); +void ipfw_show_nat(int ac, char **av); +void ipfw_config_pipe(int ac, char **av); +void ipfw_config_nat(int ac, char **av); +void ipfw_sets_handler(char *av[]); +void ipfw_table_handler(int ac, char *av[]); +void ipfw_sysctl_handler(char *av[], int which); +void ipfw_delete(char *av[]); +void ipfw_flush(int force); +void ipfw_zero(int ac, char *av[], int optname); +void ipfw_list(int ac, char *av[], int show_counters); + +/* altq.c */ +void altq_set_enabled(int enabled); +u_int32_t altq_name_to_qid(const char *name); + +void print_altq_cmd(struct _ipfw_insn_altq *altqptr); + +/* dummynet.c */ +void dummynet_list(int ac, char *av[], int show_counters); +void dummynet_flush(void); +int ipfw_delete_pipe(int pipe_or_queue, int n); + +/* ipv6.c */ +void print_unreach6_code(uint16_t code); +void print_ip6(struct _ipfw_insn_ip6 *cmd, char const *s); +void print_flow6id(struct _ipfw_insn_u32 *cmd); +void print_icmp6types(struct _ipfw_insn_u32 *cmd); +void print_ext6hdr(struct _ipfw_insn *cmd ); + +struct _ipfw_insn *add_srcip6(struct _ipfw_insn *cmd, char *av); +struct _ipfw_insn *add_dstip6(struct _ipfw_insn *cmd, char *av); + +void fill_flow6(struct _ipfw_insn_u32 *cmd, char *av ); +void fill_unreach6_code(u_short *codep, char *str); +void fill_icmp6types(struct _ipfw_insn_icmp6 *cmd, char *av); +int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); diff --git a/ipfw/ipv6.c b/ipfw/ipv6.c new file mode 100644 index 0000000..3cfc4df --- /dev/null +++ b/ipfw/ipv6.c @@ -0,0 +1,501 @@ +/* + * Copyright (c) 2002-2003 Luigi Rizzo + * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Idea and grammar partially left from: + * Copyright (c) 1993 Daniel Boulet + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + * NEW command line interface for IP firewall facility + * + * $FreeBSD: user/luigi/ipfw3-head/sbin/ipfw/ipv6.c 187770 2009-01-27 12:01:30Z luigi $ + * + * ipv6 support + */ + +#include +#include + +#include "ipfw2.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static struct _s_x icmp6codes[] = { + { "no-route", ICMP6_DST_UNREACH_NOROUTE }, + { "admin-prohib", ICMP6_DST_UNREACH_ADMIN }, + { "address", ICMP6_DST_UNREACH_ADDR }, + { "port", ICMP6_DST_UNREACH_NOPORT }, + { NULL, 0 } +}; + +void +fill_unreach6_code(u_short *codep, char *str) +{ + int val; + char *s; + + val = strtoul(str, &s, 0); + if (s == str || *s != '\0' || val >= 0x100) + val = match_token(icmp6codes, str); + if (val < 0) + errx(EX_DATAERR, "unknown ICMPv6 unreachable code ``%s''", str); + *codep = val; + return; +} + +void +print_unreach6_code(uint16_t code) +{ + char const *s = match_value(icmp6codes, code); + + if (s != NULL) + printf("unreach6 %s", s); + else + printf("unreach6 %u", code); +} + +/* + * Print the ip address contained in a command. + */ +void +print_ip6(ipfw_insn_ip6 *cmd, char const *s) +{ + struct hostent *he = NULL; + int len = F_LEN((ipfw_insn *) cmd) - 1; + struct in6_addr *a = &(cmd->addr6); + char trad[255]; + + printf("%s%s ", cmd->o.len & F_NOT ? " not": "", s); + + if (cmd->o.opcode == O_IP6_SRC_ME || cmd->o.opcode == O_IP6_DST_ME) { + printf("me6"); + return; + } + if (cmd->o.opcode == O_IP6) { + printf(" ip6"); + return; + } + + /* + * len == 4 indicates a single IP, whereas lists of 1 or more + * addr/mask pairs have len = (2n+1). We convert len to n so we + * use that to count the number of entries. + */ + + for (len = len / 4; len > 0; len -= 2, a += 2) { + int mb = /* mask length */ + (cmd->o.opcode == O_IP6_SRC || cmd->o.opcode == O_IP6_DST) ? + 128 : contigmask((uint8_t *)&(a[1]), 128); + + if (mb == 128 && co.do_resolv) + he = gethostbyaddr((char *)a, sizeof(*a), AF_INET6); + if (he != NULL) /* resolved to name */ + printf("%s", he->h_name); + else if (mb == 0) /* any */ + printf("any"); + else { /* numeric IP followed by some kind of mask */ + if (inet_ntop(AF_INET6, a, trad, sizeof( trad ) ) == NULL) + printf("Error ntop in print_ip6\n"); + printf("%s", trad ); + if (mb < 0) /* XXX not really legal... */ + printf(":%s", + inet_ntop(AF_INET6, &a[1], trad, sizeof(trad))); + else if (mb < 128) + printf("/%d", mb); + } + if (len > 2) + printf(","); + } +} + +void +fill_icmp6types(ipfw_insn_icmp6 *cmd, char *av) +{ + uint8_t type; + + bzero(cmd, sizeof(*cmd)); + while (*av) { + if (*av == ',') + av++; + type = strtoul(av, &av, 0); + if (*av != ',' && *av != '\0') + errx(EX_DATAERR, "invalid ICMP6 type"); + /* + * XXX: shouldn't this be 0xFF? I can't see any reason why + * we shouldn't be able to filter all possiable values + * regardless of the ability of the rest of the kernel to do + * anything useful with them. + */ + if (type > ICMP6_MAXTYPE) + errx(EX_DATAERR, "ICMP6 type out of range"); + cmd->d[type / 32] |= ( 1 << (type % 32)); + } + cmd->o.opcode = O_ICMP6TYPE; + cmd->o.len |= F_INSN_SIZE(ipfw_insn_icmp6); +} + + +void +print_icmp6types(ipfw_insn_u32 *cmd) +{ + int i, j; + char sep= ' '; + + printf(" ip6 icmp6types"); + for (i = 0; i < 7; i++) + for (j=0; j < 32; ++j) { + if ( (cmd->d[i] & (1 << (j))) == 0) + continue; + printf("%c%d", sep, (i*32 + j)); + sep = ','; + } +} + +void +print_flow6id( ipfw_insn_u32 *cmd) +{ + uint16_t i, limit = cmd->o.arg1; + char sep = ','; + + printf(" flow-id "); + for( i=0; i < limit; ++i) { + if (i == limit - 1) + sep = ' '; + printf("%d%c", cmd->d[i], sep); + } +} + +/* structure and define for the extension header in ipv6 */ +static struct _s_x ext6hdrcodes[] = { + { "frag", EXT_FRAGMENT }, + { "hopopt", EXT_HOPOPTS }, + { "route", EXT_ROUTING }, + { "dstopt", EXT_DSTOPTS }, + { "ah", EXT_AH }, + { "esp", EXT_ESP }, + { "rthdr0", EXT_RTHDR0 }, + { "rthdr2", EXT_RTHDR2 }, + { NULL, 0 } +}; + +/* fills command for the extension header filtering */ +int +fill_ext6hdr( ipfw_insn *cmd, char *av) +{ + int tok; + char *s = av; + + cmd->arg1 = 0; + + while(s) { + av = strsep( &s, ",") ; + tok = match_token(ext6hdrcodes, av); + switch (tok) { + case EXT_FRAGMENT: + cmd->arg1 |= EXT_FRAGMENT; + break; + + case EXT_HOPOPTS: + cmd->arg1 |= EXT_HOPOPTS; + break; + + case EXT_ROUTING: + cmd->arg1 |= EXT_ROUTING; + break; + + case EXT_DSTOPTS: + cmd->arg1 |= EXT_DSTOPTS; + break; + + case EXT_AH: + cmd->arg1 |= EXT_AH; + break; + + case EXT_ESP: + cmd->arg1 |= EXT_ESP; + break; + + case EXT_RTHDR0: + cmd->arg1 |= EXT_RTHDR0; + break; + + case EXT_RTHDR2: + cmd->arg1 |= EXT_RTHDR2; + break; + + default: + errx( EX_DATAERR, "invalid option for ipv6 exten header" ); + break; + } + } + if (cmd->arg1 == 0 ) + return 0; + cmd->opcode = O_EXT_HDR; + cmd->len |= F_INSN_SIZE( ipfw_insn ); + return 1; +} + +void +print_ext6hdr( ipfw_insn *cmd ) +{ + char sep = ' '; + + printf(" extension header:"); + if (cmd->arg1 & EXT_FRAGMENT ) { + printf("%cfragmentation", sep); + sep = ','; + } + if (cmd->arg1 & EXT_HOPOPTS ) { + printf("%chop options", sep); + sep = ','; + } + if (cmd->arg1 & EXT_ROUTING ) { + printf("%crouting options", sep); + sep = ','; + } + if (cmd->arg1 & EXT_RTHDR0 ) { + printf("%crthdr0", sep); + sep = ','; + } + if (cmd->arg1 & EXT_RTHDR2 ) { + printf("%crthdr2", sep); + sep = ','; + } + if (cmd->arg1 & EXT_DSTOPTS ) { + printf("%cdestination options", sep); + sep = ','; + } + if (cmd->arg1 & EXT_AH ) { + printf("%cauthentication header", sep); + sep = ','; + } + if (cmd->arg1 & EXT_ESP ) { + printf("%cencapsulated security payload", sep); + } +} + +/* Try to find ipv6 address by hostname */ +static int +lookup_host6 (char *host, struct in6_addr *ip6addr) +{ + struct hostent *he; + + if (!inet_pton(AF_INET6, host, ip6addr)) { + if ((he = gethostbyname2(host, AF_INET6)) == NULL) + return(-1); + memcpy(ip6addr, he->h_addr_list[0], sizeof( struct in6_addr)); + } + return(0); +} + + +/* + * fill the addr and mask fields in the instruction as appropriate from av. + * Update length as appropriate. + * The following formats are allowed: + * any matches any IP6. Actually returns an empty instruction. + * me returns O_IP6_*_ME + * + * 03f1::234:123:0342 single IP6 addres + * 03f1::234:123:0342/24 address/mask + * 03f1::234:123:0342/24,03f1::234:123:0343/ List of address + * + * Set of address (as in ipv6) not supported because ipv6 address + * are typically random past the initial prefix. + * Return 1 on success, 0 on failure. + */ +static int +fill_ip6(ipfw_insn_ip6 *cmd, char *av) +{ + int len = 0; + struct in6_addr *d = &(cmd->addr6); + /* + * Needed for multiple address. + * Note d[1] points to struct in6_add r mask6 of cmd + */ + + cmd->o.len &= ~F_LEN_MASK; /* zero len */ + + if (strcmp(av, "any") == 0) + return (1); + + + if (strcmp(av, "me") == 0) { /* Set the data for "me" opt*/ + cmd->o.len |= F_INSN_SIZE(ipfw_insn); + return (1); + } + + if (strcmp(av, "me6") == 0) { /* Set the data for "me" opt*/ + cmd->o.len |= F_INSN_SIZE(ipfw_insn); + return (1); + } + + av = strdup(av); + while (av) { + /* + * After the address we can have '/' indicating a mask, + * or ',' indicating another address follows. + */ + + char *p; + int masklen; + char md = '\0'; + + if ((p = strpbrk(av, "/,")) ) { + md = *p; /* save the separator */ + *p = '\0'; /* terminate address string */ + p++; /* and skip past it */ + } + /* now p points to NULL, mask or next entry */ + + /* lookup stores address in *d as a side effect */ + if (lookup_host6(av, d) != 0) { + /* XXX: failed. Free memory and go */ + errx(EX_DATAERR, "bad address \"%s\"", av); + } + /* next, look at the mask, if any */ + masklen = (md == '/') ? atoi(p) : 128; + if (masklen > 128 || masklen < 0) + errx(EX_DATAERR, "bad width \"%s\''", p); + else + n2mask(&d[1], masklen); + + APPLY_MASK(d, &d[1]) /* mask base address with mask */ + + /* find next separator */ + + if (md == '/') { /* find separator past the mask */ + p = strpbrk(p, ","); + if (p != NULL) + p++; + } + av = p; + + /* Check this entry */ + if (masklen == 0) { + /* + * 'any' turns the entire list into a NOP. + * 'not any' never matches, so it is removed from the + * list unless it is the only item, in which case we + * report an error. + */ + if (cmd->o.len & F_NOT && av == NULL && len == 0) + errx(EX_DATAERR, "not any never matches"); + continue; + } + + /* + * A single IP can be stored alone + */ + if (masklen == 128 && av == NULL && len == 0) { + len = F_INSN_SIZE(struct in6_addr); + break; + } + + /* Update length and pointer to arguments */ + len += F_INSN_SIZE(struct in6_addr)*2; + d += 2; + } /* end while */ + + /* + * Total length of the command, remember that 1 is the size of + * the base command. + */ + if (len + 1 > F_LEN_MASK) + errx(EX_DATAERR, "address list too long"); + cmd->o.len |= len+1; + free(av); + return (1); +} + +/* + * fills command for ipv6 flow-id filtering + * note that the 20 bit flow number is stored in a array of u_int32_t + * it's supported lists of flow-id, so in the o.arg1 we store how many + * additional flow-id we want to filter, the basic is 1 + */ +void +fill_flow6( ipfw_insn_u32 *cmd, char *av ) +{ + u_int32_t type; /* Current flow number */ + u_int16_t nflow = 0; /* Current flow index */ + char *s = av; + cmd->d[0] = 0; /* Initializing the base number*/ + + while (s) { + av = strsep( &s, ",") ; + type = strtoul(av, &av, 0); + if (*av != ',' && *av != '\0') + errx(EX_DATAERR, "invalid ipv6 flow number %s", av); + if (type > 0xfffff) + errx(EX_DATAERR, "flow number out of range %s", av); + cmd->d[nflow] |= type; + nflow++; + } + if( nflow > 0 ) { + cmd->o.opcode = O_FLOW6ID; + cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32) + nflow; + cmd->o.arg1 = nflow; + } + else { + errx(EX_DATAERR, "invalid ipv6 flow number %s", av); + } +} + +ipfw_insn * +add_srcip6(ipfw_insn *cmd, char *av) +{ + + fill_ip6((ipfw_insn_ip6 *)cmd, av); + if (F_LEN(cmd) == 0) { /* any */ + } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) { /* "me" */ + cmd->opcode = O_IP6_SRC_ME; + } else if (F_LEN(cmd) == + (F_INSN_SIZE(struct in6_addr) + F_INSN_SIZE(ipfw_insn))) { + /* single IP, no mask*/ + cmd->opcode = O_IP6_SRC; + } else { /* addr/mask opt */ + cmd->opcode = O_IP6_SRC_MASK; + } + return cmd; +} + +ipfw_insn * +add_dstip6(ipfw_insn *cmd, char *av) +{ + + fill_ip6((ipfw_insn_ip6 *)cmd, av); + if (F_LEN(cmd) == 0) { /* any */ + } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) { /* "me" */ + cmd->opcode = O_IP6_DST_ME; + } else if (F_LEN(cmd) == + (F_INSN_SIZE(struct in6_addr) + F_INSN_SIZE(ipfw_insn))) { + /* single IP, no mask*/ + cmd->opcode = O_IP6_DST; + } else { /* addr/mask opt */ + cmd->opcode = O_IP6_DST_MASK; + } + return cmd; +} diff --git a/ipfw/main.c b/ipfw/main.c new file mode 100644 index 0000000..7bd9105 --- /dev/null +++ b/ipfw/main.c @@ -0,0 +1,624 @@ +/* + * Copyright (c) 2002-2003,2010 Luigi Rizzo + * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Idea and grammar partially left from: + * Copyright (c) 1993 Daniel Boulet + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + * Command line interface for IP firewall facility + * + * $FreeBSD: head/sbin/ipfw/main.c 206494 2010-04-12 08:27:53Z luigi $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ipfw2.h" + +static void +help(void) +{ + fprintf(stderr, +"ipfw syntax summary (but please do read the ipfw(8) manpage):\n\n" +"\tipfw [-abcdefhnNqStTv] \n\n" +"where is one of the following:\n\n" +"add [num] [set N] [prob x] RULE-BODY\n" +"{pipe|queue} N config PIPE-BODY\n" +"[pipe|queue] {zero|delete|show} [N{,N}]\n" +"nat N config {ip IPADDR|if IFNAME|log|deny_in|same_ports|unreg_only|reset|\n" +" reverse|proxy_only|redirect_addr linkspec|\n" +" redirect_port linkspec|redirect_proto linkspec}\n" +"set [disable N... enable N...] | move [rule] X to Y | swap X Y | show\n" +"set N {show|list|zero|resetlog|delete} [N{,N}] | flush\n" +"table N {add ip[/bits] [value] | delete ip[/bits] | flush | list}\n" +"table all {flush | list}\n" +"\n" +"RULE-BODY: check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST]\n" +"ACTION: check-state | allow | count | deny | unreach{,6} CODE |\n" +" skipto N | {divert|tee} PORT | forward ADDR |\n" +" pipe N | queue N | nat N | setfib FIB | reass\n" +"PARAMS: [log [logamount LOGLIMIT]] [altq QUEUE_NAME]\n" +"ADDR: [ MAC dst src ether_type ] \n" +" [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ]\n" +" [ ipv6|ip6 from IP6ADDR [ PORT ] to IP6ADDR [ PORTLIST ] ]\n" +"IPADDR: [not] { any | me | ip/bits{x,y,z} | table(t[,v]) | IPLIST }\n" +"IP6ADDR: [not] { any | me | me6 | ip6/bits | IP6LIST }\n" +"IP6LIST: { ip6 | ip6/bits }[,IP6LIST]\n" +"IPLIST: { ip | ip/bits | ip:mask }[,IPLIST]\n" +"OPTION_LIST: OPTION [OPTION_LIST]\n" +"OPTION: bridged | diverted | diverted-loopback | diverted-output |\n" +" {dst-ip|src-ip} IPADDR | {dst-ip6|src-ip6|dst-ipv6|src-ipv6} IP6ADDR |\n" +" {dst-port|src-port} LIST |\n" +" estab | frag | {gid|uid} N | icmptypes LIST | in | out | ipid LIST |\n" +" iplen LIST | ipoptions SPEC | ipprecedence | ipsec | iptos SPEC |\n" +" ipttl LIST | ipversion VER | keep-state | layer2 | limit ... |\n" +" icmp6types LIST | ext6hdr LIST | flow-id N[,N] | fib FIB |\n" +" mac ... | mac-type LIST | proto LIST | {recv|xmit|via} {IF|IPADDR} |\n" +" setup | {tcpack|tcpseq|tcpwin} NN | tcpflags SPEC | tcpoptions SPEC |\n" +" tcpdatalen LIST | verrevpath | versrcreach | antispoof\n" +); + + exit(0); +} + +/* + * Called with the arguments, including program name because getopt + * wants it to be present. + * Returns 0 if successful, 1 if empty command, errx() in case of errors. + * First thing we do is process parameters creating an argv[] array + * which includes the program name and a NULL entry at the end. + * If we are called with a single string, we split it on whitespace. + * Also, arguments with a trailing ',' are joined to the next one. + * The pointers (av[]) and data are in a single chunk of memory. + * av[0] points to the original program name, all other entries + * point into the allocated chunk. + */ +static int +ipfw_main(int oldac, char **oldav) +{ + int ch, ac; + const char *errstr; + char **av, **save_av; + int do_acct = 0; /* Show packet/byte count */ + int try_next = 0; /* set if pipe cmd not found */ + int av_size; /* compute the av size */ + char *av_p; /* used to build the av list */ + +#define WHITESP " \t\f\v\n\r" + if (oldac < 2) + return 1; /* need at least one argument */ + + if (oldac == 2) { + /* + * If we are called with one argument, try to split it into + * words for subsequent parsing. Spaces after a ',' are + * removed by copying the string in-place. + */ + char *arg = oldav[1]; /* The string is the first arg. */ + int l = strlen(arg); + int copy = 0; /* 1 if we need to copy, 0 otherwise */ + int i, j; + + for (i = j = 0; i < l; i++) { + if (arg[i] == '#') /* comment marker */ + break; + if (copy) { + arg[j++] = arg[i]; + copy = !strchr("," WHITESP, arg[i]); + } else { + copy = !strchr(WHITESP, arg[i]); + if (copy) + arg[j++] = arg[i]; + } + } + if (!copy && j > 0) /* last char was a 'blank', remove it */ + j--; + l = j; /* the new argument length */ + arg[j++] = '\0'; + if (l == 0) /* empty string! */ + return 1; + + /* + * First, count number of arguments. Because of the previous + * processing, this is just the number of blanks plus 1. + */ + for (i = 0, ac = 1; i < l; i++) + if (strchr(WHITESP, arg[i]) != NULL) + ac++; + + /* + * Allocate the argument list structure as a single block + * of memory, containing pointers and the argument + * strings. We include one entry for the program name + * because getopt expects it, and a NULL at the end + * to simplify further parsing. + */ + ac++; /* add 1 for the program name */ + av_size = (ac+1) * sizeof(char *) + l + 1; + av = safe_calloc(av_size, 1); + + /* + * Init the argument pointer to the end of the array + * and copy arguments from arg[] to av[]. For each one, + * j is the initial character, i is the one past the end. + */ + av_p = (char *)&av[ac+1]; + for (ac = 1, i = j = 0; i < l; i++) { + if (strchr(WHITESP, arg[i]) != NULL || i == l-1) { + if (i == l-1) + i++; + bcopy(arg+j, av_p, i-j); + av[ac] = av_p; + av_p += i-j; /* the length of the string */ + *av_p++ = '\0'; + ac++; + j = i + 1; + } + } + } else { + /* + * If an argument ends with ',' join with the next one. + */ + int first, i, l=0; + + /* + * Allocate the argument list structure as a single block + * of memory, containing both pointers and the argument + * strings. We include some space for the program name + * because getopt expects it. + * We add an extra pointer to the end of the array, + * to make simpler further parsing. + */ + for (i=0; i= 2 && !strcmp(av[1], "sysctl")) { + char *s; + int i; + + if (ac != 3) { + printf( "sysctl emulation usage:\n" + " ipfw sysctl name[=value]\n" + " ipfw sysctl -a\n"); + return 0; + } + s = strchr(av[2], '='); + if (s == NULL) { + s = !strcmp(av[2], "-a") ? NULL : av[2]; + sysctlbyname(s, NULL, NULL, NULL, 0); + } else { /* ipfw sysctl x.y.z=value */ + /* assume an INT value, will extend later */ + if (s[1] == '\0') { + printf("ipfw sysctl: missing value\n\n"); + return 0; + } + *s = '\0'; + i = strtol(s+1, NULL, 0); + sysctlbyname(av[2], NULL, NULL, &i, sizeof(int)); + } + return 0; + } +#endif + + /* Save arguments for final freeing of memory. */ + save_av = av; + + optind = optreset = 1; /* restart getopt() */ + while ((ch = getopt(ac, av, "abcdefhinNp:qs:STtv")) != -1) + switch (ch) { + case 'a': + do_acct = 1; + break; + + case 'b': + co.comment_only = 1; + co.do_compact = 1; + break; + + case 'c': + co.do_compact = 1; + break; + + case 'd': + co.do_dynamic = 1; + break; + + case 'e': + co.do_expired = 1; + break; + + case 'f': + co.do_force = 1; + break; + + case 'h': /* help */ + free(save_av); + help(); + break; /* NOTREACHED */ + + case 'i': + co.do_value_as_ip = 1; + break; + + case 'n': + co.test_only = 1; + break; + + case 'N': + co.do_resolv = 1; + break; + + case 'q': + co.do_quiet = 1; + break; + + case 'p': + errx(EX_USAGE, "An absolute pathname must be used " + "with -p option."); + /* NOTREACHED */ + + case 's': /* sort */ + co.do_sort = atoi(optarg); + break; + + case 'S': + co.show_sets = 1; + break; + + case 't': + co.do_time = 1; + break; + + case 'T': + co.do_time = 2; /* numeric timestamp */ + break; + + case 'v': /* verbose */ + co.verbose = 1; + break; + + default: + free(save_av); + return 1; + } + + ac -= optind; + av += optind; + NEED1("bad arguments, for usage summary ``ipfw''"); + + /* + * An undocumented behaviour of ipfw1 was to allow rule numbers first, + * e.g. "100 add allow ..." instead of "add 100 allow ...". + * In case, swap first and second argument to get the normal form. + */ + if (ac > 1 && isdigit(*av[0])) { + char *p = av[0]; + + av[0] = av[1]; + av[1] = p; + } + + /* + * Optional: pipe, queue or nat. + */ + co.do_nat = 0; + co.do_pipe = 0; + co.use_set = 0; + if (!strncmp(*av, "nat", strlen(*av))) + co.do_nat = 1; + else if (!strncmp(*av, "pipe", strlen(*av))) + co.do_pipe = 1; + else if (_substrcmp(*av, "queue") == 0) + co.do_pipe = 2; + else if (_substrcmp(*av, "flowset") == 0) + co.do_pipe = 2; + else if (_substrcmp(*av, "sched") == 0) + co.do_pipe = 3; + else if (!strncmp(*av, "set", strlen(*av))) { + if (ac > 1 && isdigit(av[1][0])) { + co.use_set = strtonum(av[1], 0, resvd_set_number, + &errstr); + if (errstr) + errx(EX_DATAERR, + "invalid set number %s\n", av[1]); + ac -= 2; av += 2; co.use_set++; + } + } + + if (co.do_pipe || co.do_nat) { + ac--; + av++; + } + NEED1("missing command"); + + /* + * For pipes, queues and nats we normally say 'nat|pipe NN config' + * but the code is easier to parse as 'nat|pipe config NN' + * so we swap the two arguments. + */ + if ((co.do_pipe || co.do_nat) && ac > 1 && isdigit(*av[0])) { + char *p = av[0]; + + av[0] = av[1]; + av[1] = p; + } + + if (co.use_set == 0) { + if (_substrcmp(*av, "add") == 0) + ipfw_add(av); + else if (co.do_nat && _substrcmp(*av, "show") == 0) + ipfw_show_nat(ac, av); + else if (co.do_pipe && _substrcmp(*av, "config") == 0) + ipfw_config_pipe(ac, av); + else if (co.do_nat && _substrcmp(*av, "config") == 0) + ipfw_config_nat(ac, av); + else if (_substrcmp(*av, "set") == 0) + ipfw_sets_handler(av); + else if (_substrcmp(*av, "table") == 0) + ipfw_table_handler(ac, av); + else if (_substrcmp(*av, "enable") == 0) + ipfw_sysctl_handler(av, 1); + else if (_substrcmp(*av, "disable") == 0) + ipfw_sysctl_handler(av, 0); + else + try_next = 1; + } + + if (co.use_set || try_next) { + if (_substrcmp(*av, "delete") == 0) + ipfw_delete(av); + else if (_substrcmp(*av, "flush") == 0) + ipfw_flush(co.do_force); + else if (_substrcmp(*av, "zero") == 0) + ipfw_zero(ac, av, 0 /* IP_FW_ZERO */); + else if (_substrcmp(*av, "resetlog") == 0) + ipfw_zero(ac, av, 1 /* IP_FW_RESETLOG */); + else if (_substrcmp(*av, "print") == 0 || + _substrcmp(*av, "list") == 0) + ipfw_list(ac, av, do_acct); + else if (_substrcmp(*av, "show") == 0) + ipfw_list(ac, av, 1 /* show counters */); + else + errx(EX_USAGE, "bad command `%s'", *av); + } + + /* Free memory allocated in the argument parsing. */ + free(save_av); + return 0; +} + + +static void +ipfw_readfile(int ac, char *av[]) +{ +#define MAX_ARGS 32 + char buf[4096]; + char *progname = av[0]; /* original program name */ + const char *cmd = NULL; /* preprocessor name, if any */ + const char *filename = av[ac-1]; /* file to read */ + int c, lineno=0; + FILE *f = NULL; + pid_t preproc = 0; + + while ((c = getopt(ac, av, "cfNnp:qS")) != -1) { + switch(c) { + case 'c': + co.do_compact = 1; + break; + + case 'f': + co.do_force = 1; + break; + + case 'N': + co.do_resolv = 1; + break; + + case 'n': + co.test_only = 1; + break; + + case 'p': + /* + * ipfw -p cmd [args] filename + * + * We are done with getopt(). All arguments + * except the filename go to the preprocessor, + * so we need to do the following: + * - check that a filename is actually present; + * - advance av by optind-1 to skip arguments + * already processed; + * - decrease ac by optind, to remove the args + * already processed and the final filename; + * - set the last entry in av[] to NULL so + * popen() can detect the end of the array; + * - set optind=ac to let getopt() terminate. + */ + if (optind == ac) + errx(EX_USAGE, "no filename argument"); + cmd = optarg; + av[ac-1] = NULL; + av += optind - 1; + ac -= optind; + optind = ac; + break; + + case 'q': + co.do_quiet = 1; + break; + + case 'S': + co.show_sets = 1; + break; + + default: + errx(EX_USAGE, "bad arguments, for usage" + " summary ``ipfw''"); + } + + } + + if (cmd == NULL && ac != optind + 1) + errx(EX_USAGE, "extraneous filename arguments %s", av[ac-1]); + + if ((f = fopen(filename, "r")) == NULL) + err(EX_UNAVAILABLE, "fopen: %s", filename); + + if (cmd != NULL) { /* pipe through preprocessor */ + int pipedes[2]; + + if (pipe(pipedes) == -1) + err(EX_OSERR, "cannot create pipe"); + + preproc = fork(); + if (preproc == -1) + err(EX_OSERR, "cannot fork"); + + if (preproc == 0) { + /* + * Child, will run the preprocessor with the + * file on stdin and the pipe on stdout. + */ + if (dup2(fileno(f), 0) == -1 + || dup2(pipedes[1], 1) == -1) + err(EX_OSERR, "dup2()"); + fclose(f); + close(pipedes[1]); + close(pipedes[0]); + execvp(cmd, av); + err(EX_OSERR, "execvp(%s) failed", cmd); + } else { /* parent, will reopen f as the pipe */ + fclose(f); + close(pipedes[1]); + if ((f = fdopen(pipedes[0], "r")) == NULL) { + int savederrno = errno; + + (void)kill(preproc, SIGTERM); + errno = savederrno; + err(EX_OSERR, "fdopen()"); + } + } + } + + while (fgets(buf, sizeof(buf), f)) { /* read commands */ + char linename[20]; + char *args[2]; + + lineno++; + snprintf(linename, sizeof(linename), "Line %d", lineno); + setprogname(linename); /* XXX */ + args[0] = progname; + args[1] = buf; + ipfw_main(2, args); + } + fclose(f); + if (cmd != NULL) { + int status; + + if (waitpid(preproc, &status, 0) == -1) + errx(EX_OSERR, "waitpid()"); + if (WIFEXITED(status) && WEXITSTATUS(status) != EX_OK) + errx(EX_UNAVAILABLE, + "preprocessor exited with status %d", + WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + errx(EX_UNAVAILABLE, + "preprocessor exited with signal %d", + WTERMSIG(status)); + } +} + +int +main(int ac, char *av[]) +{ +#if defined(_WIN32) && defined(TCC) + { + WSADATA wsaData; + int ret=0; + unsigned short wVersionRequested = MAKEWORD(2, 2); + ret = WSAStartup(wVersionRequested, &wsaData); + if (ret != 0) { + /* Tell the user that we could not find a usable */ + /* Winsock DLL. */ + printf("WSAStartup failed with error: %d\n", ret); + return 1; + } + } +#endif + /* + * If the last argument is an absolute pathname, interpret it + * as a file to be preprocessed. + */ + + if (ac > 1 && av[ac - 1][0] == '/') { + if (access(av[ac - 1], R_OK) == 0) + ipfw_readfile(ac, av); + else + err(EX_USAGE, "pathname: %s", av[ac - 1]); + } else { + if (ipfw_main(ac, av)) { + errx(EX_USAGE, + "usage: ipfw [options]\n" + "do \"ipfw -h\" or \"man ipfw\" for details"); + } + } + return EX_OK; +} diff --git a/ipfw/qsort.c b/ipfw/qsort.c new file mode 100644 index 0000000..4258b8c --- /dev/null +++ b/ipfw/qsort.c @@ -0,0 +1,195 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD: src/lib/libc/stdlib/qsort.c,v 1.15 2008/01/14 09:21:34 das Exp $"); + +#include + +#ifdef I_AM_QSORT_R +typedef int cmp_t(void *, const void *, const void *); +#else +typedef int cmp_t(const void *, const void *); +#endif +static inline char *med3(char *, char *, char *, cmp_t *, void *); +static inline void swapfunc(char *, char *, int, int); + +#define min(a, b) (a) < (b) ? a : b + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + TYPE *pi = (TYPE *) (parmi); \ + TYPE *pj = (TYPE *) (parmj); \ + do { \ + TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + +static inline void +swapfunc(a, b, n, swaptype) + char *a, *b; + int n, swaptype; +{ + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +#ifdef I_AM_QSORT_R +#define CMP(t, x, y) (cmp((t), (x), (y))) +#else +#define CMP(t, x, y) (cmp((x), (y))) +#endif + +static inline char * +med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk +#ifndef I_AM_QSORT_R +__unused // XXX what ? +#endif +) +{ + return CMP(thunk, a, b) < 0 ? + (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) + :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); +} + +#ifdef I_AM_QSORT_R +void +qsort_r(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) +#else +#define thunk NULL +void +qsort(void *a, size_t n, size_t es, cmp_t *cmp) +#endif +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + size_t d, r; + int cmp_result; + int swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); + pm = med3(pm - d, pm, pm + d, cmp, thunk); + pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); + } + pm = med3(pl, pm, pn, cmp, thunk); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;;) { + while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) { + if (cmp_result == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) { + if (cmp_result == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + + pn = (char *)a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > es) +#ifdef I_AM_QSORT_R + qsort_r(a, r / es, es, thunk, cmp); +#else + qsort(a, r / es, es, cmp); +#endif + if ((r = pd - pc) > es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ +} diff --git a/ipfw/qsort_r.c b/ipfw/qsort_r.c new file mode 100644 index 0000000..f7c0e54 --- /dev/null +++ b/ipfw/qsort_r.c @@ -0,0 +1,8 @@ +/* + * This file is in the public domain. Originally written by Garrett + * A. Wollman. + * + * $FreeBSD: src/lib/libc/stdlib/qsort_r.c,v 1.1 2002/09/10 02:04:49 wollman Exp $ + */ +#define I_AM_QSORT_R +#include "qsort.c" diff --git a/ipfw/rule_test.sh b/ipfw/rule_test.sh new file mode 100755 index 0000000..d5ad6be --- /dev/null +++ b/ipfw/rule_test.sh @@ -0,0 +1,83 @@ +#/bin/bash + +COMMAND=ipfw + + +echo .########## Set $COMMAND mode .########## +$COMMAND add allow ip from any to any +$COMMAND -q flush + +echo .########## empty rules .########## +$COMMAND list +$COMMAND add allow ip from any to any +$COMMAND add allow ip from any to { 1.2.3.4 or 2.3.4.5 } +$COMMAND add allow { dst-ip 1.2.3.4 or dst-ip 2.3.4.5 } + +echo .########## listing 3 rules .########## +$COMMAND list + +$COMMAND delete 200 +echo .########## listing 2 rules .########## +$COMMAND list + +$COMMAND table 10 add 1.2.3.4 +$COMMAND table 10 add 1.2.3.5 +$COMMAND table 10 add 1.2.3.6 +$COMMAND table 10 add 1.2.3.7/13 +$COMMAND table 10 add 1.2.3.7/20 +$COMMAND table 10 add 1.2.3.7/28 + +echo .########## listing table 10 with 6 elements .########## +$COMMAND table 10 list +$COMMAND table 10 delete 1.2.3.6 + +echo .########## listing table 10 with 5 elements .########## +$COMMAND table 10 list +$COMMAND table 10 flush + +echo .########## table 10 empty .########## +$COMMAND table 10 list + +echo .########## move rule 100 to set 1 300 to 3 .########## +$COMMAND set move rule 100 to 1 +$COMMAND set move rule 300 to 3 +$COMMAND -S show + +echo .########## move rule 200 to 2 but 200 do not exist .###### +$COMMAND set move rule 200 to 2 + +echo .########## add some rules .########## +$COMMAND add 200 queue 2 proto ip +$COMMAND add 300 queue 5 proto ip +$COMMAND add 400 queue 40 proto ip +$COMMAND add 400 queue 50 proto ip + +echo .########## move rule 200 to 2 .###### +$COMMAND set move rule 200 to 2 + +echo .########## move rule 400 to 5 .###### +$COMMAND set move rule 400 to 5 + +echo .########## set 5 show 2 rules .###### +$COMMAND set 5 show + +echo .########## flush set 5 .###### +$COMMAND -q set 5 flush + +echo .########## set 5 show 0 rule .###### +$COMMAND set 5 show + +echo .########## disable set 1 .###### +$COMMAND set disable 1 + +echo .########## show all rules except set 1 .###### +$COMMAND -S show + +echo .########## enable set 1 .###### +$COMMAND set enable 1 + +echo .########## show all rules .###### +$COMMAND -S show + + + diff --git a/ipfw/ws2_32.def b/ipfw/ws2_32.def new file mode 100644 index 0000000..3813911 --- /dev/null +++ b/ipfw/ws2_32.def @@ -0,0 +1,120 @@ +LIBRARY ws2_32.dll + +EXPORTS +FreeAddrInfoW +GetAddrInfoW +GetNameInfoW +WEP +WPUCompleteOverlappedRequest +WSAAccept +WSAAddressToStringA +WSAAddressToStringW +WSAAsyncGetHostByAddr +WSAAsyncGetHostByName +WSAAsyncGetProtoByName +WSAAsyncGetProtoByNumber +WSAAsyncGetServByName +WSAAsyncGetServByPort +WSAAsyncSelect +WSACancelAsyncRequest +WSACancelBlockingCall +WSACleanup +WSACloseEvent +WSAConnect +WSACreateEvent +WSADuplicateSocketA +WSADuplicateSocketW +WSAEnumNameSpaceProvidersA +WSAEnumNameSpaceProvidersW +WSAEnumNetworkEvents +WSAEnumProtocolsA +WSAEnumProtocolsW +WSAEventSelect +WSAGetLastError +WSAGetOverlappedResult +WSAGetQOSByName +WSAGetServiceClassInfoA +WSAGetServiceClassInfoW +WSAGetServiceClassNameByClassIdA +WSAGetServiceClassNameByClassIdW +WSAHtonl +WSAHtons +WSAInstallServiceClassA +WSAInstallServiceClassW +WSAIoctl +WSAIsBlocking +WSAJoinLeaf +WSALookupServiceBeginA +WSALookupServiceBeginW +WSALookupServiceEnd +WSALookupServiceNextA +WSALookupServiceNextW +WSANSPIoctl +WSANtohl +WSANtohs +WSAProviderConfigChange +WSARecv +WSARecvDisconnect +WSARecvFrom +WSARemoveServiceClass +WSAResetEvent +WSASend +WSASendDisconnect +WSASendTo +WSASetBlockingHook +WSASetEvent +WSASetLastError +WSASetServiceA +WSASetServiceW +WSASocketA +WSASocketW +WSAStartup +WSAStringToAddressA +WSAStringToAddressW +WSAUnhookBlockingHook +WSAWaitForMultipleEvents +WSApSetPostRoutine +WSCDeinstallProvider +WSCEnableNSProvider +WSCEnumProtocols +WSCGetProviderPath +WSCInstallNameSpace +WSCInstallProvider +WSCUnInstallNameSpace +WSCUpdateProvider +WSCWriteNameSpaceOrder +WSCWriteProviderOrder +__WSAFDIsSet +accept +bind +closesocket +connect +freeaddrinfo +getaddrinfo +gethostbyaddr +gethostbyname +gethostname +getnameinfo +getpeername +getprotobyname +getprotobynumber +getservbyname +getservbyport +getsockname +getsockopt +htonl +htons +inet_addr +inet_ntoa +ioctlsocket +listen +ntohl +ntohs +recv +recvfrom +select +send +sendto +setsockopt +shutdown +socket diff --git a/kipfw/Makefile b/kipfw/Makefile new file mode 100644 index 0000000..6ca0562 --- /dev/null +++ b/kipfw/Makefile @@ -0,0 +1,367 @@ +# $Id: Makefile 12257 2013-04-26 21:13:24Z luigi $ +# gnu Makefile to build linux/Windows module for ipfw+dummynet. +# +# The defaults are set to build without modifications on PlanetLab +# and possibly 2.6 versions. +# On Windows, we use gnu-make and MSC + +# Some variables need to have specific names, because they are used +# by the build infrastructure on Linux and OpenWrt. They are: +# +# ccflags-y additional $(CC) flags +# M used by Kbuild, we must set it to `pwd` +# obj-m list of .o modules to build +# $(MOD)-y for each $MOD in obj-m, the list of objects +# obj-y same as above, for openwrt +# O_TARGET the link target, for openwrt +# EXTRA_CFLAGS as the name says... in openwrt +# EXTRA_CFLAGS is used in 2.6.22 module kernel compilation too +# KERNELPATH the path to the kernel sources or headers +# (on planetlab it is set already by the build system, +# for other systems we take KSRC which is either guessed +# or taken from the command line. +# +# Not sure about this (the name might be reserved) +# ipfw-cflags our flags for building the module +# +# Other variables are only private and can be renamed. They include: +# +# VER linux version we are building for (2.4 2.6 or openwrt) +# +#--- +# +# The windows files (passthru etc.) are modified version of the +# examples found in the $(DDK)/src/network/ndis/passthru/driver/ +# They can be re-created using the 'ndis-glue' target in the + +include $(PWD)/../Makefile.inc + +TARGET = kipfw + +# lets default for 2.6 for planetlab builds +VER ?= 2.6 + +#--- General values for all types of build --- +# obj-m is the target module +obj-m := ipfw_mod.o + +#-- the list of source files. IPFW_SRCS is our own name. +# Original ipfw and dummynet sources + FreeBSD stuff, +IPFW_SRCS := ip_fw2.c ip_fw_pfil.c ip_fw_sockopt.c +IPFW_SRCS += ip_fw_dynamic.c ip_fw_table.c ip_fw_log.c +IPFW_SRCS += radix.c in_cksum.c +IPFW_SRCS += ip_dummynet.c ip_dn_io.c ip_dn_glue.c +IPFW_SRCS += dn_heap.c +IPFW_SRCS += dn_sched_fifo.c dn_sched_wf2q.c +IPFW_SRCS += dn_sched_rr.c dn_sched_qfq.c +IPFW_SRCS += dn_sched_prio.c +# Module glue and functions missing in linux +IPFW_SRCS += ipfw2_mod.c bsd_compat.c + +# generic cflags used on all systems +#ipfw-cflags += -DIPFW_HASHTABLES +ipfw-cflags += -DIPFIREWALL_DEFAULT_TO_ACCEPT +# _BSD_SOURCE enables __FAVOR_BSD (udp/tcp bsd structs instead of posix) +ipfw-cflags += -D_BSD_SOURCE +ipfw-cflags += -DKERNEL_MODULE # build linux kernel module +# the two header trees for empty and override files +ipfw-cflags += -I $(M)/include_e +ipfw-cflags += -I $(M)/../sys +ipfw-cflags += -include $(M)/../glue.h # headers +ipfw-cflags += -include $(M)/missing.h # headers + +ifeq ($(OSARCH),Windows) #--- { Windows block +ifeq ($(VER),win64) + $(warning ---- building for 64-bit windows ---) + win_arch= -DAMD64=1 +else + win_arch= -Di386=1 +endif + M ?= $(shell pwd) + WIN_SRCS += md_win.c + WIN_SRCS += miniport.c protocol.c passthru.c debug.c + #compiler, linker, target, sources and objects + #DDK is exported from the root makefile + #DDK = C:/WinDDK/7600.16385.1 + + CSOURCES = $(IPFW_SRCS) $(WIN_SRCS) + + COBJS := $(CSOURCES:.c=.obj) + COBJS := $(addprefix $(OBJDIR)/,$(COBJS)) + + #include paths + INCLUDE_PATHS = -Ii386 -I../sys -Iinclude_e -I. + # INCLUDE_PATHS += -I$(OBJDIR) + INCLUDE_PATHS += -I$(DDK)/inc/api + INCLUDE_PATHS += -I$(DDK)/inc/ddk + INCLUDE_PATHS += -I$(DDK)/inc/crt + + # #preprocessor MS defines + PREPROC = -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 + PREPROC += -DNT_UP=0 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 + PREPROC += -D_WIN32_WINNT=0x0501 -DWINVER=0x0501 -D_WIN32_IE=0x0603 + PREPROC += -DWIN32_LEAN_AND_MEAN=1 + PREPROC += -D__BUILDMACHINE__=WinDDK -DFPO=0 -D_DLL=1 + PREPROC += -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 + PREPROC += -DNDIS51_MINIPORT=1 -DNDIS51=1 + PREPROC += -DMSC_NOOPT -DNTDDI_VERSION=0x05010200 + PREPROC += -DKMDF_MAJOR_VERSION_STRING=01 -DKMDF_MINOR_VERSION_STRING=009 + #PREPROC += -DDBG=1 #debug + PREPROC += -DNDEBUG #always up, seems no effect, possibly no debug? + PREPROC += -DDEVL=1 #always up, seems no effect + #macroing module name, WARNING: must match the one in .inf files + PREPROC += -DMODULENAME=Ipfw + + #our defines + OUR_PREPROC = -D_KERNEL -DKERNEL_MODULE -DKLD_MODULE + OUR_PREPROC += -D__BSD_VISIBLE -DIPFIREWALL_DEFAULT_TO_ACCEPT + OUR_PREPROC += -D__LITTLE_ENDIAN -DSYSCTL_NODE -DEMULATE_SYSCTL + +ifeq ($(TCC),) # Microsoft C compiler + CC = $(DDK)/bin/x86/x86/cl.exe + LD = $(DDK)/bin/x86/x86/link.exe + # #complier options + CFLAGS = -Fo$(OBJDIR)/ -c -FC -Zc:wchar_t- + CFLAGS += -Zl -Zp8 -Gy -Gm- -GF -cbstring -Gz -hotpatch -EHs-c- + CFLAGS += -W2 # -W3 gives too many conversion errors + CFLAGS += -GR- -GF -GS -Zi # XXX do we need this ? + CFLAGS += -Fd$(OBJDIR)/ + CFLAGS += -wd4603 -wd4627 -typedil- + CFLAGS += -FI $(DDK)/inc/api/warning.h + CFLAGS += -FI winmissing.h + CFLAGS += -FI missing.h # headers + CFLAGS += -FI ../glue.h # headers + + #optimization options + OPTIMIZE = -Od -Oi -Oy- + + #linker options + LDFLAGS = /MERGE:_PAGE=PAGE /MERGE:_TEXT=.text + LDFLAGS += /SECTION:INIT,d /OPT:REF /OPT:ICF + LDFLAGS += /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221 + LDFLAGS += /INCREMENTAL:NO /release /NODEFAULTLIB /WX + LDFLAGS += /debug /debugtype:cv,fixup,pdata + LDFLAGS += /version:6.1 /osversion:6.1 /functionpadmin:5 + LDFLAGS += /safeseh /pdbcompress + LDFLAGS += /STACK:0x40000,0x1000 /driver /base:0x10000 /align:0x80 + LDFLAGS += /stub:$(DDK)\\lib\\wxp\\stub512.com + LDFLAGS += /subsystem:native,5.01 /entry:GsDriverEntry@8 + LDFLAGS += /out:$(OBJDIR)/ipfw.sys + + #libraries to build against + LIBS = $(DDK)/lib/wxp/i386/BufferOverflowK.lib + LIBS += $(DDK)/lib/wxp/i386/ntoskrnl.lib + LIBS += $(DDK)/lib/wxp/i386/hal.lib + LIBS += $(DDK)/lib/wxp/i386/wmilib.lib + LIBS += $(DDK)/lib/wxp/i386/ndis.lib + LIBS += $(DDK)/lib/wxp/i386/sehupd.lib +else # use tcc. not working yet for the kernel module. + # TCC points to the root of tcc tree + CC=$(TCC)/bin/wintcc + EXTRA_CFLAGS += -DTCC -I.. + EXTRA_CFLAGS += -I$(TCC)/include/winapi -I$(TCC)/include + EXTRA_CFLAGS += -nostdinc + + CFLAGS += -include winmissing.h -include missing.h -include ../glue.h + CFLAGS += -I../../inc/api -I../../inc/ddk -I../../inc/crt + CFLAGS += -DRC_INVOKED +endif # use tcc + + #empty include directory to be built + M ?= $(shell pwd) + EFILES_asm += div64.h + EFILES_linux += if.h random.h errno.h + EFILES_net += if_types.h inet_hashtables.h route.h + + #targets +all: $(TARGET) + +$(TARGET): include_e + # XXX dangerous rm -rf $(OBJDIR) + mkdir -p $(OBJDIR) + $(MSG) " CC [$(CC)] $(CSOURCES)" + $(HIDE) $(CC) $(INCLUDE_PATHS) $(PREPROC) $(OUR_PREPROC) $(CFLAGS) $(OPTIMIZE) $(CSOURCES) + $(MSG) " LD [$(LD)] $(COBJS)" + $(HIDE) $(LD) $(LDFLAGS) $(COBJS) $(LIBS) + +else # } { linux variables and targets + +# We have three sections: OpenWrt, Linux 2.4 and Linux 2.6 + +ifeq ($(VER),openwrt) #--- { The Makefile section for openwrt --- + # We do not include a dependency on include_e as it is called + # by Makefile.openwrt in Build/Prepare + M=. + obj-y := $(IPFW_SRCS:%.c=%.o) + O_TARGET := $(obj-m) + + # xcflags-y is a temporary variable where we store build options + xcflags-y += -O1 -DLINUX_24 + xcflags-y += -g + + EXTRA_CFLAGS := $(xcflags-y) $(ipfw-cflags) -DSYSCTL_NODE -DEMULATE_SYSCTL + + # we should not export anything + #export-objs := ipfw2_mod.o +-include $(TOPDIR)/Rules.make +endif # ---- } end openwrt version + + +ifneq ($(shell echo $(VER)|grep '2.4'),) #--- { + # Makefile section for the linux 2.4 version + # tested on linux-2.4.35.4, does not work with 2.4.37 + # + # guess the kernel path -- or is it under /lib/modules ? + KERNELPATH ?= $(KSRC) + + # We need to figure out the gcc include directory, if not + # set by the user through MYGCC_INCLUDE + # Find compiler version (3rd field in last line returned by gcc -v) + # e.g. gcc version 4.3.2 (Debian 4.3.2-1.1) + MYGCC_VER ?= $(shell $(CC) -v 2>&1 |tail -n 1 | cut -d " " -f 3) + # We don't know the exact directory under /usr/lib/gcc so we guess + MYGCC_INCLUDE ?= $(shell echo /usr/lib/gcc/*/$(MYGCC_VER) | cut -d " " -f 1)/include + $(warning "---- gcc includes guessed to $(MYGCC_INCLUDE)") + + # additional warning + WARN += -Wall -Wundef + WARN += -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing + WARN += -fno-common -Werror-implicit-function-declaration + # WARN += -O2 -fno-stack-protector -m32 -msoft-float -mregparm=3 + # -mregparm=3 gives a printk error + WARN += -m32 -msoft-float # -mregparm=3 + #WARN += -freg-struct-return -mpreferred-stack-boundary=2 + WARN += -Wno-sign-compare + WARN += -Wdeclaration-after-statement + ifneq ($(MYGCC_VER),3.4.6) + WARN += -Wno-pointer-sign + endif + + ccflags-y += -O1 -DLINUX_24 + CFLAGS = -DMODULE -D__KERNEL__ -nostdinc \ + -isystem ${KERNELPATH}/include -isystem $(MYGCC_INCLUDE) \ + ${ccflags-y} + # The Main target +all: mod24 + +else # --- } { linux 2.6 and newer + + # This is the Makefile section for Linux 2.6.x including planetlab + +ifeq ($(IPFW_PLANETLAB),1) + $(warning "---- Building for PlanetLab") + ipfw-cflags += -DIPFW_PLANETLAB # PlanetLab compilation +endif + # if not set, use the version from the installed system + KERNELPATH ?= $(KSRC) +# $(warning "---- Building Version 2.6 $(VER) in $(KERNELPATH)") + WARN := -O1 -Wall -Werror -DDEBUG_SPINLOCK -DDEBUG_MUTEXES + # The main target + + # Required by GCC 4.6 + ccflags-y += -Wno-unused-but-set-variable + + # extract version number (decimal). Newer linuxes have a different dir + LINUX_VERSION_CODE := $(shell V=linux/version.h; G=. ; \ + [ -f $(KERNELPATH)/include/$${V} ] || G=generated/uapi ;\ + grep LINUX_VERSION_CODE $(KERNELPATH)/include/$${G}/linux/version.h | \ + awk '{printf "%d", $$3} ') + + # awk '{printf "%d %03x%02d", $$3, $$3/256, $$3%256} ') + # $(warning version $(LINUX_VERSION_CODE)) + + ifeq ($(shell if [ -z $(LINUX_VERSION_CODE) ] ; then echo "true"; fi),true) + $(warning "---- Perhaps you miss a (cd $(KERNELPATH); make oldconfig; make prepare; make scripts)"); + endif + + # Required by kernel <= 2.6.22, ccflags-y is used on newer version + ifeq ($(shell if [ "$(LINUX_VERSION_CODE)" -le 132630 ] ; then echo "true"; fi),true) + EXTRA_CFLAGS += $(ccflags-y) + endif + + $(warning $(shell [ "$(LINUX_VERSION_CODE)" -le 132635 ] && \ + [ `$(MAKE) -version | head -1 | cut -d " " -f 3` != '3.81' ] && \ + echo "**** need make 3.81 *****") ) + # $(warning make is $(MAKE) version is $(shell $(MAKE) -version | head -1) ) + +all: $(TARGET) +$(TARGET): include_e + $(MAKE) -C $(KERNELPATH) V=$(V) M=`pwd` modules + +endif # } --- linux 2.6 and newer + +#-- back to the common section for linux + +# the list of objects used to build the module +ipfw_mod-y = $(IPFW_SRCS:%.c=%.o) + +# additional $(CC) flags +ccflags-y += $(WARN) +ccflags-y += $(ipfw-cflags) +# if we really want debug symbols... +ccflags-y += -g + +mod24: include_e $(obj-m) + +$(obj-m): $(ipfw_mod-y) + $(LD) $(LDFLAGS) -m elf_i386 -r -o $@ $^ + +# M is the current directory, used in recursive builds +# so we allow it to be overridden +M ?= $(shell pwd) + +endif # } ----- end of the non-Windows block + +ifneq ($(OBJDIR),mia) + $(error objdir set to $(OBJDIR)) +endif + +#--- various common targets +clean: + -@rm -f *.o *.ko Module.symvers *.mod.c + -@# rm -rf $(OBJDIR) + -@rm -rf include_e + +distclean: clean + -@rm -f .*cmd modules.order opt_* + -@rm -rf .tmp_versions .*.o.d _CL_* + +# support to create empty dirs and files in include_e/ +# EFILES_foo/bar is the list of files to be created in foo/bar +# (/ and . are allowed in gmake variable names) + +EFILES_. += opt_inet.h opt_inet6.h opt_ipfw.h opt_ipsec.h opt_mpath.h +EFILES_. += opt_mbuf_stress_test.h opt_param.h opt_ipdivert.h + +EFILES_altq += if_altq.h +EFILES_arpa += inet.h +EFILES_machine += in_cksum.h +EFILES_net += ethernet.h netisr.h pf_mtag.h bpf.h if_types.h vnet.h + +EFILES_netinet += ether.h icmp6.h if_ether.h in.h in_pcb.h in_var.h +EFILES_netinet += in_systm.h ip_carp.h ip_var.h pim.h +EFILES_netinet += sctp.h tcp_timer.h tcpip.h udp_var.h +EFILES_netinet6 += ip6_var.h + +EFILES_sys += _lock.h _rwlock.h rmlock.h _mutex.h jail.h +EFILES_sys += condvar.h eventhandler.h domain.h +EFILES_sys += limits.h lock.h mutex.h priv.h +EFILES_sys += proc.h rwlock.h socket.h socketvar.h +EFILES_sys += sysctl.h time.h ucred.h + +# first make a list of directories from variable names +EDIRS= $(subst EFILES_,,$(filter EFILES_%,$(.VARIABLES))) +# then prepend the directory name to individual files. +# $(empty) serves to interpret the following space literally, +# and the ": = " substitution packs spaces into one. +EFILES = $(foreach i,$(EDIRS),$(subst $(empty) , $(i)/, $(EFILES_$(i): = ))) + +include_e: + -@rm -rf $(M)/include_e opt_* + -@mkdir -p $(M)/include_e + -@(cd $(M)/include_e; mkdir -p $(EDIRS); touch $(EFILES) ) + +#--- some other targets for testing purposes +test_radix: test_radix.o radix.o +test_lookup: ip_fw_lookup.o +test_radix test_lookup: CFLAGS=-Wall -Werror -O1 diff --git a/kipfw/bsd_compat.c b/kipfw/bsd_compat.c new file mode 100644 index 0000000..ed2ce5d --- /dev/null +++ b/kipfw/bsd_compat.c @@ -0,0 +1,568 @@ +/* + * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: bsd_compat.c 11530 2012-08-01 10:29:32Z luigi $ + * + * kernel variables and functions that are not available in linux. + */ + +#include +#include /* do_div on 2.4 */ +#include /* get_random_bytes on 2.4 */ +#include +#include +#include + +/* + * gettimeofday would be in sys/time.h but it is not + * visible if _KERNEL is defined + */ +int gettimeofday(struct timeval *, struct timezone *); + +int ticks; /* kernel ticks counter */ +int hz = 1000; /* default clock time */ +long tick = 1000; /* XXX is this 100000/hz ? */ +int bootverbose = 0; +struct timeval boottime; + +int ip_defttl = 64; /* XXX set default value */ +int max_linkhdr = 16; +int fw_one_pass = 1; +u_long in_ifaddrhmask; /* mask for hash table */ +struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */ + +u_int rt_numfibs = RT_NUMFIBS; + +/* + * pfil hook support. + * We make pfil_head_get return a non-null pointer, which is then ignored + * in our 'add-hook' routines. + */ +struct pfil_head; +typedef int (pfil_hook_t) + (void *, struct mbuf **, struct ifnet *, int, struct inpcb *); + +struct pfil_head * +pfil_head_get(int proto, u_long flags) +{ + static int dummy; + return (struct pfil_head *)&dummy; +} + +int +pfil_add_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h) +{ + return 0; +} + +int +pfil_remove_hook(pfil_hook_t *func, void *arg, int dir, struct pfil_head *h) +{ + return 0; +} + +/* define empty body for kernel function */ +int +priv_check(struct thread *td, int priv) +{ + return 0; +} + +int +securelevel_ge(struct ucred *cr, int level) +{ + return 0; +} + +int +sysctl_handle_int(SYSCTL_HANDLER_ARGS) +{ + return 0; +} + +int +sysctl_handle_long(SYSCTL_HANDLER_ARGS) +{ + return 0; +} + +void +ether_demux(struct ifnet *ifp, struct mbuf *m) +{ + return; +} + +int +ether_output_frame(struct ifnet *ifp, struct mbuf *m) +{ + return 0; +} + +void +in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum) +{ + return; +} + +void +icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu) +{ + return; +} + +u_short +in_cksum_skip(struct mbuf *m, int len, int skip) +{ + return 0; +} + +u_short +in_cksum_hdr(struct ip *ip) +{ + return 0; +} + +/* + * we don't really reassemble, just return whatever we had. + */ +struct mbuf * +ip_reass(struct mbuf *clone) +{ + return clone; +} +#ifdef INP_LOCK_ASSERT +#undef INP_LOCK_ASSERT +#define INP_LOCK_ASSERT(a) +#endif + +/* credentials check */ +#include +#ifdef __linux__ +int +cred_check(void *_insn, int proto, struct ifnet *oif, + struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, + u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, + struct sk_buff *skb) +{ + int match = 0; + ipfw_insn_u32 *insn = (ipfw_insn_u32 *)_insn; + + if (*ugid_lookupp == 0) { /* actively lookup and copy in cache */ + /* returns null if any element of the chain up to file is null. + * if sk != NULL then we also have a reference + */ + *ugid_lookupp = linux_lookup(proto, + src_ip.s_addr, htons(src_port), + dst_ip.s_addr, htons(dst_port), + skb, oif ? 1 : 0, u); + } + if (*ugid_lookupp < 0) + return 0; + + if (insn->o.opcode == O_UID) + match = (u->uid == (uid_t)insn->d[0]); + else if (insn->o.opcode == O_JAIL) + match = (u->xid == (uid_t)insn->d[0]); + else if (insn->o.opcode == O_GID) + match = (u->gid == (uid_t)insn->d[0]); + return match; +} +#endif /* __linux__ */ + +int +jailed(struct ucred *cred) +{ + return 0; +} + +/* +* Return 1 if an internet address is for a ``local'' host +* (one to which we have a connection). If subnetsarelocal +* is true, this includes other subnets of the local net. +* Otherwise, it includes only the directly-connected (sub)nets. +*/ +int +in_localaddr(struct in_addr in) +{ + return 1; +} + +int +sooptcopyout(struct sockopt *sopt, const void *buf, size_t len) +{ + size_t valsize = sopt->sopt_valsize; + + if (len < valsize) + sopt->sopt_valsize = valsize = len; + //printf("copyout buf = %p, sopt = %p, soptval = %p, len = %d \n", buf, sopt, sopt->sopt_val, len); + bcopy(buf, sopt->sopt_val, valsize); + return 0; +} + +/* + * copy data from userland to kernel + */ +int +sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen) +{ + size_t valsize = sopt->sopt_valsize; + + if (valsize < minlen) + return EINVAL; + if (valsize > len) + sopt->sopt_valsize = valsize = len; + //printf("copyin buf = %p, sopt = %p, soptval = %p, len = %d \n", buf, sopt, sopt->sopt_val, len); + bcopy(sopt->sopt_val, buf, valsize); + return 0; +} + +void +getmicrouptime(struct timeval *tv) +{ + do_gettimeofday(tv); +} + + +#include + +char * +inet_ntoa_r(struct in_addr ina, char *buf) +{ +#ifdef _WIN32 +#else + unsigned char *ucp = (unsigned char *)&ina; + + sprintf(buf, "%d.%d.%d.%d", + ucp[0] & 0xff, + ucp[1] & 0xff, + ucp[2] & 0xff, + ucp[3] & 0xff); +#endif + return buf; +} + +char * +inet_ntoa(struct in_addr ina) +{ + static char buf[16]; + return inet_ntoa_r(ina, buf); +} + +int +random(void) +{ +#ifdef _WIN32 + static unsigned long seed; + if (seed == 0) { + LARGE_INTEGER tm; + KeQuerySystemTime(&tm); + seed = tm.LowPart; + } + return RtlRandomEx(&seed) & 0x7fffffff; +#else + int r; + get_random_bytes(&r, sizeof(r)); + return r & 0x7fffffff; +#endif +} + + +/* + * do_div really does a u64 / u32 bit division. + * we save the sign and convert to uint befor calling. + * We are safe just because we always call it with small operands. + */ +int64_t +div64(int64_t a, int64_t b) +{ +#ifdef _WIN32 + int a1 = a, b1 = b; + return a1/b1; +#else + uint64_t ua, ub; + int sign = ((a>0)?1:-1) * ((b>0)?1:-1); + + ua = ((a>0)?a:-a); + ub = ((b>0)?b:-b); + do_div(ua, ub); + return sign*ua; +#endif +} + +#ifdef __MIPSEL__ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} +#endif // __MIPSEL__ + +/* + * compact version of fnmatch. + */ +int +fnmatch(const char *pattern, const char *string, int flags) +{ + char s; + + if (!string || !pattern) + return 1; /* no match */ + while ( (s = *string++) ) { + char p = *pattern++; + if (p == '\0') /* pattern is over, no match */ + return 1; + if (p == '*') /* wildcard, match */ + return 0; + if (p == '.' || p == s) /* char match, continue */ + continue; + return 1; /* no match */ + } + /* end of string, make sure the pattern is over too */ + if (*pattern == '\0' || *pattern == '*') + return 0; + return 1; /* no match */ +} + + +/* + * linux 2.6.33 defines these functions to access to + * skbuff internal structures. Define the missing + * function for the previous versions too. + */ +#ifdef linux +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) +inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) +{ + skb->dst = dst; +} + +inline struct dst_entry *skb_dst(const struct sk_buff *skb) +{ + return (struct dst_entry *)skb->dst; +} +#endif /* < 2.6.31 */ +#endif /* linux */ + + +/* support for sysctl emulation. + * XXX this is actually MI code that should be enabled also on openwrt + */ +#ifdef EMULATE_SYSCTL +static struct sysctltable GST; + +int +kesysctl_emu_get(struct sockopt* sopt) +{ + struct dn_id* oid = sopt->sopt_val; + struct sysctlhead* entry; + int sizeneeded = sizeof(struct dn_id) + GST.totalsize + + sizeof(struct sysctlhead); + unsigned char* pstring; + unsigned char* pdata; + int i; + + if (sopt->sopt_valsize < sizeneeded) { + // this is a probe to retrieve the space needed for + // a dump of the sysctl table + oid->id = sizeneeded; + sopt->sopt_valsize = sizeof(struct dn_id); + return 0; + } + + entry = (struct sysctlhead*)(oid+1); + for( i=0; iblocklen = GST.entry[i].head.blocklen; + entry->namelen = GST.entry[i].head.namelen; + entry->flags = GST.entry[i].head.flags; + entry->datalen = GST.entry[i].head.datalen; + pdata = (unsigned char*)(entry+1); + pstring = pdata+GST.entry[i].head.datalen; + bcopy(GST.entry[i].data, pdata, GST.entry[i].head.datalen); + bcopy(GST.entry[i].name, pstring, GST.entry[i].head.namelen); + entry = (struct sysctlhead*) + ((unsigned char*)(entry) + GST.entry[i].head.blocklen); + } + sopt->sopt_valsize = sizeneeded; + return 0; +} + +int +kesysctl_emu_set(void* p, int l) +{ + struct sysctlhead* entry; + unsigned char* pdata; + unsigned char* pstring; + int i = 0; + + entry = (struct sysctlhead*)(((struct dn_id*)p)+1); + pdata = (unsigned char*)(entry+1); + pstring = pdata + entry->datalen; + + for (i=0; idatalen != GST.entry[i].head.datalen) { + printf("%s: len mismatch, user %d vs kernel %d\n", + __FUNCTION__, entry->datalen, + GST.entry[i].head.datalen); + return -1; + } + // check access (at the moment flags handles only the R/W rights + //later on will be type + access + if( (GST.entry[i].head.flags & 3) == CTLFLAG_RD) { + printf("%s: the entry %s is read only\n", + __FUNCTION__,GST.entry[i].name); + return -1; + } + bcopy(pdata, GST.entry[i].data, GST.entry[i].head.datalen); + return 0; + } + printf("%s: match not found\n",__FUNCTION__); + return 0; +} + +/* convert all _ to . until the first . */ +static void +underscoretopoint(char* s) +{ + for (; *s && *s != '.'; s++) + if (*s == '_') + *s = '.'; +} + +static int +formatnames() +{ + int i; + int size=0; + char* name; + + for (i=0; i> 2, + GST.entry[i].head.flags & 0x00000003); + printf("data %i\n", *(int*)(GST.entry[i].data)); + printf("datalen %i\n", GST.entry[i].head.datalen); + printf("blocklen %i\n", GST.entry[i].head.blocklen); + } +} + +void sysctl_addgroup_f1(); +void sysctl_addgroup_f2(); +void sysctl_addgroup_f3(); +void sysctl_addgroup_f4(); + +void +keinit_GST() +{ + int ret; + + sysctl_addgroup_f1(); + sysctl_addgroup_f2(); + sysctl_addgroup_f3(); + sysctl_addgroup_f4(); + ret = formatnames(); + if (ret != 0) + printf("conversion of names failed for some reason\n"); + //dumpGST(); + printf("*** Global Sysctl Table entries = %i, total size = %i ***\n", + GST.count, GST.totalsize); +} + +void +keexit_GST() +{ + if (GST.namebuffer != NULL) + free(GST.namebuffer,0); + bzero(&GST, sizeof(GST)); +} + +void +sysctl_pushback(char* name, int flags, int datalen, void* data) +{ + if (GST.count >= GST_HARD_LIMIT) { + printf("WARNING: global sysctl table full, this entry will not be added," + "please recompile the module increasing the table size\n"); + return; + } + GST.entry[GST.count].head.namelen = strlen(name)+1; //add space for '\0' + GST.entry[GST.count].name = name; + GST.entry[GST.count].head.flags = flags; + GST.entry[GST.count].data = data; + GST.entry[GST.count].head.datalen = datalen; + GST.entry[GST.count].head.blocklen = + ((sizeof(struct sysctlhead) + GST.entry[GST.count].head.namelen + + GST.entry[GST.count].head.datalen)+3) & ~3; + GST.totalsize += GST.entry[GST.count].head.blocklen; + GST.count++; +} +#endif /* EMULATE_SYSCTL */ diff --git a/kipfw/debug.c b/kipfw/debug.c new file mode 100644 index 0000000..67a4f23 --- /dev/null +++ b/kipfw/debug.c @@ -0,0 +1,67 @@ +#include + +const char* texify_cmd(int i) +{ + if (i==110) + return("IP_FW_ADD"); + if (i==111) + return("IP_FW_DEL"); + if (i==112) + return("IP_FW_FLUSH"); + if (i==113) + return("IP_FW_ZERO"); + if (i==114) + return("IP_FW_GET"); + if (i==115) + return("IP_FW_RESETLOG"); + if (i==116) + return("IP_FW_NAT_CFG"); + if (i==117) + return("IP_FW_NAT_DEL"); + if (i==118) + return("IP_FW_NAT_GET_CONFIG"); + if (i==119) + return("IP_FW_NAT_GET_LOG"); + if (i==120) + return("IP_DUMMYNET_CONFIGURE"); + if (i==121) + return("IP_DUMMYNET_DEL"); + if (i==122) + return("IP_DUMMYNET_FLUSH"); + if (i==124) + return("IP_DUMMYNET_GET"); + if (i==108) + return("IP_FW3"); + if (i==109) + return("IP_DUMMYNET3"); + return ("BOH"); +} + +const char* texify_proto(unsigned int p) +{ + if (p==1) + return("ICMP"); + if (p==6) + return("TCP"); + if (p==17) + return("UDP"); + return("OTHER"); +} + +void hexdump(unsigned char* addr, int len, const char *msg) +{ + int i; + const int cicli = len/8; + const int resto = len%8; + unsigned char d[8]; + + DbgPrint("%s at %p len %d\n", msg, addr, len); + for (i=0; i<=cicli; i++) { + bzero(d, 8); + bcopy(addr+i*8, d, i < cicli ? 8 : resto); + DbgPrint("%04X %02X %02X %02X %02X %02X %02X %02X %02X\n", + i*8, d[0], d[1], d[2], d[3], d[4], + d[5], d[6], d[7]); + } + DbgPrint("\n"); +} diff --git a/kipfw/ipfw2_mod.c b/kipfw/ipfw2_mod.c new file mode 100644 index 0000000..d0824ce --- /dev/null +++ b/kipfw/ipfw2_mod.c @@ -0,0 +1,955 @@ +/* + * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: ipfw2_mod.c 12501 2014-01-10 01:09:14Z luigi $ + * + * The main interface to build ipfw+dummynet as a linux module. + * (and possibly as a windows module as well, though that part + * is not complete yet). + * + * The control interface uses the sockopt mechanism + * on a socket(AF_INET, SOCK_RAW, IPPROTO_RAW). + * + * The data interface uses the netfilter interface, at the moment + * hooked to the PRE_ROUTING and POST_ROUTING hooks. + * Unfortunately the netfilter interface is a moving target, + * so we need a set of macros to adapt to the various cases. + * + * In the netfilter hook we just mark packet as 'QUEUE' and then + * let the queue handler to do the whole work (filtering and + * possibly emulation). + * As we receive packets, we wrap them with an mbuf descriptor + * so the existing ipfw+dummynet code runs unmodified. + */ + +#include +#include /* sizeof struct mbuf */ +#include /* NGROUPS */ + +#ifndef D +#define ND(fmt, ...) do {} while (0) +#define D1(fmt, ...) do {} while (0) +#define D(fmt, ...) printf("%-10s " fmt "\n", \ + __FUNCTION__, ## __VA_ARGS__) +#endif + +#ifdef __linux__ +#include +#include + +#ifndef CONFIG_NETFILTER +#error should configure netfilter (broken on 2.6.26 and below ?) +#endif + +#include +#include /* NF_IP_PRI_FILTER */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) +#include /* nf_queue */ +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) +#define __read_mostly +#endif + +#endif /* !__linux__ */ + +#include /* in_addr */ +#include /* ip_fw_ctl_t, ip_fw_chk_t */ +#include /* ip_fw_ctl_t, ip_fw_chk_t */ +#include /* ip_dn_ctl_t, ip_dn_io_t */ +#include /* PFIL_IN, PFIL_OUT */ + +#ifdef __linux__ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) +/* XXX was < 2.6.0: inet_hashtables.h is introduced in 2.6.14 */ +// #warning --- inet_hashtables not present on 2.4 +#include +#include +#include +static inline int inet_iif(const struct sk_buff *skb) +{ + return ((struct rtable *)skb->dst)->rt_iif; +} + +#else +#include /* inet_lookup */ +#endif +#endif /* __linux__ */ + +#include /* inet_iif */ + +/* + * Here we allocate some global variables used in the firewall. + */ +//ip_dn_ctl_t *ip_dn_ctl_ptr; +int (*ip_dn_ctl_ptr)(struct sockopt *); + +ip_fw_ctl_t *ip_fw_ctl_ptr; + +int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); +ip_fw_chk_t *ip_fw_chk_ptr; + +void (*bridge_dn_p)(struct mbuf *, struct ifnet *); + +/* Divert hooks. */ +void (*ip_divert_ptr)(struct mbuf *m, int incoming); + +/* ng_ipfw hooks. */ +ng_ipfw_input_t *ng_ipfw_input_p = NULL; + +/*--- + * Glue code to implement the registration of children with the parent. + * Each child should call my_mod_register() when linking, so that + * module_init() and module_exit() can call init_children() and + * fini_children() to provide the necessary initialization. + * We use the same mechanism for MODULE_ and SYSINIT_. + * The former only get a pointer to the moduledata, + * the latter have two function pointers (init/uninit) + */ +#include +struct mod_args { + const char *name; + int order; + struct moduledata *mod; + void (*init)(void), (*uninit)(void); +}; + +static unsigned int mod_idx; +static struct mod_args mods[10]; /* hard limit to 10 modules */ + +int +my_mod_register(const char *name, int order, + struct moduledata *mod, void *init, void *uninit); +/* + * my_mod_register should be called automatically as the init + * functions in the submodules. Unfortunately this compiler/linker + * trick is not supported yet so we call it manually. + */ +int +my_mod_register(const char *name, int order, + struct moduledata *mod, void *init, void *uninit) +{ + struct mod_args m; + + m.name = name; + m.order = order; + m.mod = mod; + m.init = init; + m.uninit = uninit; + + printf("%s %s called\n", __FUNCTION__, name); + if (mod_idx < sizeof(mods) / sizeof(mods[0])) + mods[mod_idx++] = m; + return 0; +} + +static void +init_children(void) +{ + unsigned int i; + + /* Call the functions registered at init time. */ + printf("%s mod_idx value %d\n", __FUNCTION__, mod_idx); + for (i = 0; i < mod_idx; i++) { + struct mod_args *m = &mods[i]; + printf("+++ start module %d %s %s at %p order 0x%x\n", + i, m->name, m->mod ? m->mod->name : "SYSINIT", + m->mod, m->order); + if (m->mod && m->mod->evhand) + m->mod->evhand(NULL, MOD_LOAD, m->mod->priv); + else if (m->init) + m->init(); + } +} + +static void +fini_children(void) +{ + int i; + + /* Call the functions registered at init time. */ + for (i = mod_idx - 1; i >= 0; i--) { + struct mod_args *m = &mods[i]; + printf("+++ end module %d %s %s at %p order 0x%x\n", + i, m->name, m->mod ? m->mod->name : "SYSINIT", + m->mod, m->order); + if (m->mod && m->mod->evhand) + m->mod->evhand(NULL, MOD_UNLOAD, m->mod->priv); + else if (m->uninit) + m->uninit(); + } +} +/*--- end of module binding helper functions ---*/ + +/*--- + * Control hooks: + * ipfw_ctl_h() is a wrapper for linux to FreeBSD sockopt call convention. + * then call the ipfw handler in order to manage requests. + * In turn this is called by the linux set/get handlers. + */ +static int +ipfw_ctl_h(struct sockopt *s, int cmd, int dir, int len, void __user *user) +{ + struct thread t; + int ret = EINVAL; + + memset(s, 0, sizeof(*s)); + s->sopt_name = cmd; + s->sopt_dir = dir; + s->sopt_valsize = len; + s->sopt_val = user; + + /* sopt_td is not used but it is referenced */ + memset(&t, 0, sizeof(t)); + s->sopt_td = &t; + + //printf("%s called with cmd %d len %d sopt %p user %p\n", __FUNCTION__, cmd, len, s, user); + + if (ip_fw_ctl_ptr && cmd != IP_DUMMYNET3 && (cmd == IP_FW3 || + cmd < IP_DUMMYNET_CONFIGURE)) + ret = ip_fw_ctl_ptr(s); + else if (ip_dn_ctl_ptr && (cmd == IP_DUMMYNET3 || + cmd >= IP_DUMMYNET_CONFIGURE)) + ret = ip_dn_ctl_ptr(s); + + return -ret; /* errors are < 0 on linux */ +} + +#ifdef linux +/* + * Convert an mbuf into an skbuff + * At the moment this only works for ip packets fully contained + * in a single mbuf. We assume that on entry ip_len and ip_off are + * in host format, and the ip checksum is not computed. + */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) /* check boundary */ +int dst_output(struct skbuff *s) +{ + return 0; +} + +struct sk_buff * +mbuf2skbuff(struct mbuf* m) +{ + return NULL; +} +#else +struct sk_buff * +mbuf2skbuff(struct mbuf* m) +{ + struct sk_buff *skb; + size_t len = m->m_pkthdr.len; + + /* used to lookup the routing table */ + struct rtable *r; + struct flowi fl; + int ret = 0; /* success for ip_route_output_key() */ + + struct ip *ip = mtod(m, struct ip *); + + /* XXX ip_output has ip_len and ip_off in network format, + * linux expects host format */ + ip->ip_len = ntohs(ip->ip_len); + ip->ip_off = ntohs(ip->ip_off); + + ip->ip_sum = 0; + ip->ip_sum = in_cksum(m, ip->ip_hl<<2); + + /* fill flowi struct, we need just the dst addr, see XXX */ + bzero(&fl, sizeof(fl)); + flow_daddr.daddr = ip->ip_dst.s_addr; + + /* + * ip_route_output_key() should increment + * r->u.dst.__use and call a dst_hold(dst) + * XXX verify how we release the resources. + */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38) /* check boundary */ + r = ip_route_output_key(&init_net, &fl.u.ip4); +#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26) /* check boundary */ + ret = ip_route_output_key(&init_net, &r, &fl); +#else + ret = ip_route_output_key(&r, &fl); +#endif + if (ret != 0 || r == NULL ) { + printf("NO ROUTE FOUND\n"); + return NULL; + } + + /* allocate the skbuff and the data */ + skb = alloc_skb(len + sizeof(struct ethhdr), GFP_ATOMIC); + if (skb == NULL) { + printf("%s: can not allocate SKB buffers.\n", __FUNCTION__); + return NULL; + } + + skb->protocol = htons(ETH_P_IP); // XXX 8 or 16 bit ? + /* sk_dst_set XXX take the lock (?) */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) + skb_dst_set(skb, &r->u.dst); +#else + skb_dst_set(skb, &r->dst); +#endif + skb->dev = skb_dst(skb)->dev; + + /* reserve space for ethernet header */ + skb_reserve(skb, sizeof(struct ethhdr)); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) + skb_reset_network_header(skb); // skb->network_header = skb->data - skb->head +#else + skb->nh.raw = skb->data; +#endif + /* set skbuff tail pointers and copy content */ + skb_put(skb, len); + memcpy(skb->data, m->m_data, len); + + return skb; +} +#endif /* linux 2.6+ */ +#endif /* linux */ + + +/* + * This function is called to reinject packets to the + * kernel stack within the linux netfilter system + * or to send a new created mbuf. + * In the first case we have a valid sk_buff pointer + * encapsulated within the fake mbuf, so we can call + * the reinject function trough netisr_dispatch. + * In the last case we need to build a sk_buff from scratch, + * before sending out the packet. + */ +int +ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, + struct ip_moptions *imo, struct inpcb *inp) +{ + (void)opt; (void)ro; (void)flags; (void)imo; (void)inp; /* UNUSED */ + if ( m->m_skb != NULL ) { /* reinjected packet, just call dispatch */ + ND("sending... "); + netisr_dispatch(0, m); + } else { + /* self-generated packet, wrap as appropriate and send */ +#ifdef __linux__ + struct sk_buff *skb = mbuf2skbuff(m); + + if (skb != NULL) + dst_output(skb); +#else /* Windows */ + D("unimplemented."); +#endif + FREE_PKT(m); + } + return 0; +} + +/* + * setsockopt hook has no return value other than the error code. + */ +int +do_ipfw_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) +{ + struct sockopt s; /* pass arguments */ + (void)sk; /* UNUSED */ + return ipfw_ctl_h(&s, cmd, SOPT_SET, len, user); +} + +/* + * getsockopt can can return a block of data in response. + */ +int +do_ipfw_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) +{ + struct sockopt s; /* pass arguments */ + int ret = ipfw_ctl_h(&s, cmd, SOPT_GET, *len, user); + + (void)sk; /* UNUSED */ + *len = s.sopt_valsize; /* return length back to the caller */ + return ret; +} + +#ifdef __linux__ + +/* + * declare our [get|set]sockopt hooks + */ +static struct nf_sockopt_ops ipfw_sockopts = { + .pf = PF_INET, + .set_optmin = _IPFW_SOCKOPT_BASE, + .set_optmax = _IPFW_SOCKOPT_END, + .set = do_ipfw_set_ctl, + .get_optmin = _IPFW_SOCKOPT_BASE, + .get_optmax = _IPFW_SOCKOPT_END, + .get = do_ipfw_get_ctl, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + .owner = THIS_MODULE, +#endif +}; + +/*---- + * We need a number of macros to adapt to the various APIs in + * different linux versions. Among them: + * + * - the hook names change between macros (NF_IP*) and enum NF_INET_* + * + * - the second argument to the netfilter hook is + * struct sk_buff ** in kernels <= 2.6.22 + * struct sk_buff * in kernels > 2.6.22 + * + * - NF_STOP is not defined before 2.6 so we remap it to NF_ACCEPT + * + * - the packet descriptor passed to the queue handler is + * struct nf_info in kernels <= 2.6.24 + * struct nf_queue_entry in kernels <= 2.6.24 + * + * - the arguments to the queue handler also change; + */ + +/* + * declare hook to grab packets from the netfilter interface. + * The NF_* names change in different versions of linux, in some + * cases they are #defines, in others they are enum, so we + * need to adapt. + */ +#ifndef NF_IP_PRE_ROUTING +#define NF_IP_PRE_ROUTING NF_INET_PRE_ROUTING +#endif +#ifndef NF_IP_POST_ROUTING +#define NF_IP_POST_ROUTING NF_INET_POST_ROUTING +#endif + +/* + * ipfw hooks into the POST_ROUTING and the PRE_ROUTING chains. + * PlanetLab sets skb_tag to the slice id in the LOCAL_INPUT and + * POST_ROUTING chains, so if we want to use that information we + * need to hook the LOCAL_INPUT chain instead of the PRE_ROUTING. + * However at the moment the skb_tag info is not reliable so + * we stay with the standard hooks. + */ +#if 0 // defined(IPFW_PLANETLAB) +#define IPFW_HOOK_IN NF_IP_LOCAL_IN +#else +#define IPFW_HOOK_IN NF_IP_PRE_ROUTING +#endif + +/* + * The main netfilter hook. + * To make life simple, we queue everything and then do all the + * decision in the queue handler. + * + * XXX note that in 2.4 and up to 2.6.22 the skbuf is passed as sk_buff** + * so we have an #ifdef to set the proper argument type. + */ +static unsigned int +call_ipfw( +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) + unsigned int hooknum, +#else + const struct nf_hook_ops *hooknum, +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) // in 2.6.22 we have ** + struct sk_buff **skb, +#else + struct sk_buff *skb, +#endif + const struct net_device *in, const struct net_device *out, + int (*okfn)(struct sk_buff *)) +{ + (void)hooknum; (void)skb; (void)in; (void)out; (void)okfn; /* UNUSED */ + return NF_QUEUE; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) /* XXX was 2.6.0 */ +#define NF_STOP NF_ACCEPT +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) + +/* + * nf_queue_entry is a recent addition, in previous versions + * of the code the struct is called nf_info. + */ +#define nf_queue_entry nf_info /* for simplicity */ + +/* also, 2.4 and perhaps something else have different arguments */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) /* XXX unsure */ +/* on 2.4 we use nf_info */ +#define QH_ARGS struct sk_buff *skb, struct nf_info *info, void *data +#else /* 2.6.14. 2.6.24 */ +#define QH_ARGS struct sk_buff *skb, struct nf_info *info, unsigned int qnum, void *data +#endif + +#define DEFINE_SKB /* nothing, already an argument */ +#define REINJECT(_inf, _verd) nf_reinject(skb, _inf, _verd) + +#else /* 2.6.25 and above */ + +#define QH_ARGS struct nf_queue_entry *info, unsigned int queuenum +#define DEFINE_SKB struct sk_buff *skb = info->skb; +#define REINJECT(_inf, _verd) nf_reinject(_inf, _verd) +#endif + +/* + * used by dummynet when dropping packets + * XXX use dummynet_send() + */ +void +reinject_drop(struct mbuf* m) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) /* unsure on the exact boundary */ + struct sk_buff *skb = (struct sk_buff *)m; +#endif + REINJECT(m->queue_entry, NF_DROP); +} + +/* + * The real call to the firewall. nf_queue_entry points to the skbuf, + * and eventually we need to return both through nf_reinject(). + */ +static int +ipfw2_queue_handler(QH_ARGS) +{ + DEFINE_SKB /* no semicolon here, goes in the macro */ + int ret = 0; /* return value */ + struct mbuf *m; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) + if (skb->nh.iph == NULL) { + printf("null dp, len %d reinject now\n", skb->len); + REINJECT(info, NF_ACCEPT); + return 0; + } +#endif + m = malloc(sizeof(*m), 0, 0); + if (m == NULL) { + printf("malloc fail, len %d reinject now\n", skb->len); + REINJECT(info, NF_ACCEPT); + return 0; + } + + m->m_skb = skb; + m->m_len = skb->len; /* len from ip header to end */ + m->m_pkthdr.len = skb->len; /* total packet len */ + m->m_pkthdr.rcvif = info->indev; + m->queue_entry = info; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) /* XXX was 2.6.0 */ + m->m_data = (char *)skb->nh.iph; +#else + m->m_data = (char *)skb_network_header(skb); // XXX unsigned ? */ +#endif + + /* XXX add the interface */ + if (info->hook == IPFW_HOOK_IN) { + ret = ipfw_check_hook(NULL, &m, info->indev, PFIL_IN, NULL); + } else { + ret = ipfw_check_hook(NULL, &m, info->outdev, PFIL_OUT, NULL); + } + + if (m != NULL) { /* Accept. reinject and free the mbuf */ + REINJECT(info, NF_ACCEPT); + m_freem(m); + } else if (ret == 0) { + /* dummynet has kept the packet, will reinject later. */ + } else { + /* + * Packet dropped by ipfw or dummynet. Nothing to do as + * FREE_PKT already did a reinject as NF_DROP + */ + } + return 0; +} + +struct route; +struct ip_moptions; +struct inpcb; + +/* XXX should include prototypes for netisr_dispatch and ip_output */ +/* + * The reinjection routine after a packet comes out from dummynet. + * We must update the skb timestamp so ping reports the right time. + * This routine is also used (with num == -1) as FREE_PKT. XXX + */ +void +netisr_dispatch(int num, struct mbuf *m) +{ + struct nf_queue_entry *info = m->queue_entry; + struct sk_buff *skb = m->m_skb; /* always used */ + + /* + * This function can be called by the FREE_PKT() + * used when ipfw generate their own mbuf packets + * or by the mbuf2skbuff() function. + */ + m_freem(m); + + /* XXX check + * info is null in the case of a real mbuf + * (one created by the ipfw code without a + * valid sk_buff pointer + */ + if (info == NULL) + return; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) // XXX above 2.6.x ? + __net_timestamp(skb); /* update timestamp */ +#endif + + /* XXX to obey one-pass, possibly call the queue handler here */ + REINJECT(info, ((num == -1)?NF_DROP:NF_STOP)); /* accept but no more firewall */ +} + +/* + * socket lookup function for linux. + * This code is used to associate uid, gid, jail/xid to packets, + * and store the info in a cache *ugp where they can be accessed quickly. + * The function returns 1 if the info is found, -1 otherwise. + * + * We do this only on selected protocols: TCP, ... + * + * The chain is the following + * sk_buff* sock* socket* file* + * skb -> sk ->sk_socket->file ->f_owner ->pid + * skb -> sk ->sk_socket->file ->f_uid (direct) + * skb -> sk ->sk_socket->file ->f_cred->fsuid (2.6.29+) + * + * Related headers: + * linux/skbuff.h struct skbuff + * net/sock.h struct sock + * linux/net.h struct socket + * linux/fs.h struct file + * + * With vserver we may have sk->sk_xid and sk->sk_nid that + * which we store in fw_groups[1] (matches O_JAIL) and fw_groups[2] + * (no matches yet) + * + * Note- for locally generated, outgoing packets we should not need + * need a lookup because the sk_buff already points to the socket where + * the info is. + */ +extern struct inet_hashinfo tcp_hashinfo; +int +linux_lookup(const int proto, const __be32 saddr, const __be16 sport, + const __be32 daddr, const __be16 dport, + struct sk_buff *skb, int dir, struct bsd_ucred *u) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) /* XXX was 2.6.0 */ + return -1; +#else + struct sock *sk; + int ret = -1; /* default return value */ + int st = -1; /* state */ + + + if (proto != IPPROTO_TCP) /* XXX extend for UDP */ + return -1; + + if ((dir ? (void *)skb_dst(skb) : (void *)skb->dev) == NULL) { + panic(" -- this should not happen\n"); + return -1; + } + + if (skb->sk) { + sk = skb->sk; + } else { + /* + * Try a lookup. On a match, sk has a refcount that we must + * release on exit (we know it because skb->sk = NULL). + * + * inet_lookup above 2.6.24 has an additional 'net' parameter + * so we use a macro to conditionally supply it. + * swap dst and src depending on the direction. + */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24) +#define _OPT_NET_ARG +#else +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) +/* there is no dev_net() on 2.6.25 */ +#define _OPT_NET_ARG (skb->dev->nd_net), +#else /* 2.6.26 and above */ +#define _OPT_NET_ARG dev_net(skb->dev), +#endif +#endif + sk = (dir) ? /* dir != 0 on output */ + inet_lookup(_OPT_NET_ARG &tcp_hashinfo, + daddr, dport, saddr, sport, // match outgoing + inet_iif(skb)) : + inet_lookup(_OPT_NET_ARG &tcp_hashinfo, + saddr, sport, daddr, dport, // match incoming + skb->dev->ifindex); +#undef _OPT_NET_ARG + + if (sk == NULL) /* no match, nothing to be done */ + return -1; + } + ret = 1; /* retrying won't make things better */ + st = sk->sk_state; +#ifdef CONFIG_VSERVER + u->xid = sk->sk_xid; + u->nid = sk->sk_nid; +#else + u->xid = u->nid = 0; +#endif + /* + * Exclude tcp states where sk points to a inet_timewait_sock which + * has no sk_socket field (surely TCP_TIME_WAIT, perhaps more). + * To be safe, use a whitelist and not a blacklist. + * Before dereferencing sk_socket grab a lock on sk_callback_lock. + * + * Once again we need conditional code because the UID and GID + * location changes between kernels. + */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,28) +/* use the current's real uid/gid */ +#define _CURR_UID f_uid +#define _CURR_GID f_gid +#else /* 2.6.29 and above */ +/* use the current's file access real uid/gid */ +#define _CURR_UID f_cred->fsuid +#define _CURR_GID f_cred->fsgid +#endif + +#define GOOD_STATES ( \ + (1<sk_callback_lock); + if (sk->sk_socket && sk->sk_socket->file) { + u->uid = sk->sk_socket->file->_CURR_UID; + u->gid = sk->sk_socket->file->_CURR_GID; + } + read_unlock_bh(&sk->sk_callback_lock); + } else { + u->uid = u->gid = 0; + } + if (!skb->sk) /* return the reference that came from the lookup */ + sock_put(sk); +#undef GOOD_STATES +#undef _CURR_UID +#undef _CURR_GID + return ret; + +#endif /* LINUX > 2.4 */ +} + +/* + * Now prepare to hook the various functions. + * Linux 2.4 has a different API so we need some adaptation + * for register and unregister hooks + * + * the unregister function changed arguments between 2.6.22 and 2.6.24 + */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) +struct nf_queue_handler ipfw2_queue_handler_desc = { + .outfn = ipfw2_queue_handler, +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,2) + .name = "ipfw2 dummynet queue", +#endif +}; +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,2) +#define REG_QH_ARG(pf, fn) pf, &(fn ## _desc) +#else +#define REG_QH_ARG(pf, fn) &(fn ## _desc) +#endif +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) /* XXX was 2.6.0 */ +static int +nf_register_hooks(struct nf_hook_ops *ops, int n) +{ + int i, ret = 0; + for (i = 0; i < n; i++) { + ret = nf_register_hook(ops + i); + if (ret < 0) + break; + } + return ret; +} + +static void +nf_unregister_hooks(struct nf_hook_ops *ops, int n) +{ + int i; + for (i = 0; i < n; i++) { + nf_unregister_hook(ops + i); + } +} +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) /* XXX was 2.6.0 */ +#define REG_QH_ARG(pf, fn) pf, fn, NULL +#endif +#define UNREG_QH_ARG(pf, fn) //fn /* argument for nf_[un]register_queue_handler */ +#define SET_MOD_OWNER + +#else /* linux > 2.6.17 */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) +#define UNREG_QH_ARG(pf, fn) //fn +#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,8,2) +#define UNREG_QH_ARG(pf, fn) pf, &(fn ## _desc) +#else +#define UNREG_QH_ARG(pf, fn) +#endif /* 2.6.0 < LINUX > 2.6.24 */ + +#define SET_MOD_OWNER .owner = THIS_MODULE, + +#endif /* !LINUX < 2.6.0 */ + +static struct nf_hook_ops ipfw_ops[] __read_mostly = { + { + .hook = call_ipfw, + .pf = PF_INET, + .hooknum = IPFW_HOOK_IN, + .priority = NF_IP_PRI_FILTER, + SET_MOD_OWNER + }, + { + .hook = call_ipfw, + .pf = PF_INET, + .hooknum = NF_IP_POST_ROUTING, + .priority = NF_IP_PRI_FILTER, + SET_MOD_OWNER + }, +}; +#endif /* __linux__ */ + +/* descriptors for the children, until i find a way for the + * linker to produce them + */ +extern moduledata_t *moddesc_ipfw; +extern moduledata_t *moddesc_dummynet; +extern moduledata_t *moddesc_dn_fifo; +extern moduledata_t *moddesc_dn_wf2qp; +extern moduledata_t *moddesc_dn_rr; +extern moduledata_t *moddesc_dn_qfq; +extern moduledata_t *moddesc_dn_prio; +extern void *sysinit_ipfw_init; +extern void *sysuninit_ipfw_destroy; +extern void *sysinit_vnet_ipfw_init; +extern void *sysuninit_vnet_ipfw_uninit; + +/* + * Module glue - init and exit function. + */ +int __init +ipfw_module_init(void) +{ + int ret = 0; +#ifdef _WIN32 + unsigned long resolution; +#endif + + rn_init(64); + my_mod_register("ipfw", 1, moddesc_ipfw, NULL, NULL); + my_mod_register("sy_ipfw", 2, NULL, + sysinit_ipfw_init, sysuninit_ipfw_destroy); + my_mod_register("sy_Vnet_ipfw", 3, NULL, + sysinit_vnet_ipfw_init, sysuninit_vnet_ipfw_uninit); + my_mod_register("dummynet", 4, moddesc_dummynet, NULL, NULL); + my_mod_register("dn_fifo", 5, moddesc_dn_fifo, NULL, NULL); + my_mod_register("dn_wf2qp", 6, moddesc_dn_wf2qp, NULL, NULL); + my_mod_register("dn_rr", 7, moddesc_dn_rr, NULL, NULL); + my_mod_register("dn_qfq", 8, moddesc_dn_qfq, NULL, NULL); + my_mod_register("dn_prio", 9, moddesc_dn_prio, NULL, NULL); + init_children(); + +#ifdef _WIN32 + resolution = ExSetTimerResolution(1, TRUE); + printf("*** ExSetTimerResolution: resolution set to %d n-sec ***\n",resolution); +#endif +#ifdef EMULATE_SYSCTL + keinit_GST(); +#endif + +#ifdef __linux__ + /* sockopt register, in order to talk with user space */ + ret = nf_register_sockopt(&ipfw_sockopts); + if (ret < 0) { + printf("error %d in nf_register_sockopt\n", ret); + goto clean_modules; + } + + /* queue handler registration, in order to get network + * packet under a private queue */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,2) + ret = +#endif + nf_register_queue_handler(REG_QH_ARG(PF_INET, ipfw2_queue_handler) ); + if (ret < 0) /* queue busy */ + goto unregister_sockopt; + + ret = nf_register_hooks(ipfw_ops, ARRAY_SIZE(ipfw_ops)); + if (ret < 0) + goto unregister_sockopt; + + printf("%s loaded\n", __FUNCTION__); + return 0; + + +/* handle errors on load */ +unregister_sockopt: + nf_unregister_queue_handler(UNREG_QH_ARG(PF_INET, ipfw2_queue_handler) ); + nf_unregister_sockopt(&ipfw_sockopts); + +clean_modules: + fini_children(); + printf("%s error\n", __FUNCTION__); + +#endif /* __linux__ */ + return ret; +} + +/* module shutdown */ +void __exit +ipfw_module_exit(void) +{ +#ifdef EMULATE_SYSCTL + keexit_GST(); +#endif +#ifdef _WIN32 + ExSetTimerResolution(0,FALSE); + +#else /* linux hook */ + nf_unregister_hooks(ipfw_ops, ARRAY_SIZE(ipfw_ops)); + /* maybe drain the queue before unregistering ? */ + nf_unregister_queue_handler(UNREG_QH_ARG(PF_INET, ipfw2_queue_handler) ); + nf_unregister_sockopt(&ipfw_sockopts); +#endif /* __linux__ */ + + fini_children(); + + printf("%s unloaded\n", __FUNCTION__); +} + +#ifdef __linux__ +module_init(ipfw_module_init) +module_exit(ipfw_module_exit) +MODULE_LICENSE("Dual BSD/GPL"); /* the code here is all BSD. */ +#endif diff --git a/kipfw/md_win.c b/kipfw/md_win.c new file mode 100644 index 0000000..9e66889 --- /dev/null +++ b/kipfw/md_win.c @@ -0,0 +1,636 @@ +/* + * Copyright (C) 2010 Luigi Rizzo, Francesco Magno, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * kernel variables and functions that are not available in Windows. + */ + +#include /* provides PFIL_IN and PFIL_OUT */ +#include +#include /* in_addr */ +#include +#include +#include + +/* credentials check */ +int +cred_check(void *_insn, int proto, struct ifnet *oif, + struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, + u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, + struct sk_buff *skb) +{ + return 0; +} + +/* + * as good as anywhere, place here the missing calls + */ + +void * +my_alloc(int size) +{ + void *_ret = ExAllocatePoolWithTag(NonPagedPool, size, 'wfpi'); + if (_ret) + memset(_ret, 0, size); + return _ret; +} + +void +panic(const char *fmt, ...) +{ + printf("%s", fmt); + for (;;); +} + +int securelevel = 0; + +int ffs(int bits) +{ + int i; + if (bits == 0) + return (0); + for (i = 1; ; i++, bits >>= 1) { + if (bits & 1) + break; + } + return (i); +} + +void +do_gettimeofday(struct timeval *tv) +{ + static LARGE_INTEGER prevtime; //system time in 100-nsec resolution + static LARGE_INTEGER prevcount; //RTC counter value + static LARGE_INTEGER freq; //frequency + + LARGE_INTEGER currtime; + LARGE_INTEGER currcount; + if (prevtime.QuadPart == 0) { //first time we ask for system time + KeQuerySystemTime(&prevtime); + prevcount = KeQueryPerformanceCounter(&freq); + currtime.QuadPart = prevtime.QuadPart; + } else { + KeQuerySystemTime(&currtime); + currcount = KeQueryPerformanceCounter(&freq); + if (currtime.QuadPart == prevtime.QuadPart) { + //time has NOT changed, calculate time using ticks and DO NOT update + LONGLONG difftime = 0; //difference in 100-nsec + LONGLONG diffcount = 0; //clock count difference + //printf("time has NOT changed\n"); + diffcount = currcount.QuadPart - prevcount.QuadPart; + diffcount *= 10000000; + difftime = diffcount / freq.QuadPart; + currtime.QuadPart += difftime; + } else { + //time has changed, update and return SystemTime + //printf("time has changed\n"); + prevtime.QuadPart = currtime.QuadPart; + prevcount.QuadPart = currcount.QuadPart; + } + } + currtime.QuadPart /= 10; //convert in usec + tv->tv_sec = currtime.QuadPart / (LONGLONG)1000000; + tv->tv_usec = currtime.QuadPart % (LONGLONG)1000000; + //printf("sec %d usec %d\n",tv->tv_sec, tv->tv_usec); +} + +int time_uptime_w32() +{ + int ret; + LARGE_INTEGER tm; + KeQuerySystemTime(&tm); + ret = (int)(tm.QuadPart / (LONGLONG)1000000); + return ret; +} + + +/* + * Windows version of firewall hook. We receive a partial copy of + * the packet which points to the original buffers. In output, + * the refcount has been already incremented. + * The function reconstructs + * the whole packet in a contiguous memory area, builds a fake mbuf, + * calls the firewall, does the eventual cleaning and returns + * to MiniportSend or ProtocolReceive, which will silently return + * (dropping packet) or continue its execution (allowing packet). + * The memory area contains: + * - the fake mbuf, filled with data needed by ipfw, and information + * for reinjection + * - the packet data + */ +void hexdump(PUCHAR,int, const char *); +static char _if_in[] = "incoming"; +static char _if_out[] = "outgoing"; + +int +ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction, + NDIS_HANDLE Context) +{ + unsigned int BufferCount = 0; + unsigned TotalPacketLength = 0; + PNDIS_BUFFER pCurrentBuffer = NULL; + PNDIS_BUFFER pNextBuffer = NULL; + struct mbuf* m; + unsigned char* payload = NULL; + unsigned int ofs, l; + unsigned short EtherType = 0; + unsigned int i = 0; + int ret = 0; + PNDIS_BUFFER pNdisBuffer, old_head, old_tail; + NDIS_HANDLE PacketPool; + PADAPT pAdapt; + NDIS_STATUS Status; + + /* In NDIS, packets are a chain of NDIS_BUFFER. We query + * the packet to get a pointer of chain's head, the length + * of the chain, and the length of the packet itself. + * Then allocate a buffer for the mbuf and the payload. + */ + NdisQueryPacket(pNdisPacket, NULL, &BufferCount, + &pCurrentBuffer, &TotalPacketLength); + m = malloc(sizeof(struct mbuf) + TotalPacketLength, 0, 0 ); + if (m == NULL) //resource shortage, drop the packet + goto drop_pkt; + + /* set mbuf fields to point past the MAC header. + * Also set additional W32 info + */ + payload = (unsigned char*)(m + 1); + m->m_len = m->m_pkthdr.len = TotalPacketLength-14; + m->m_pkthdr.rcvif = (void *)((direction==INCOMING) ? _if_in : NULL); + m->m_data = payload + 14; /* past the MAC header */ + m->direction = direction; + m->context = Context; + m->pkt = pNdisPacket; + + /* m_skb != NULL is used in the ip_output routine to check + * for packets that come from the stack and differentiate + * from those internally generated by ipfw. + * The pointer is not used, just needs to be non-null. + */ + m->m_skb = (void *)pNdisPacket; + /* + * Now copy the data from the Windows buffers to the mbuf. + */ + for (i=0, ofs = 0; i < BufferCount; i++) { + unsigned char* src; + NdisQueryBufferSafe(pCurrentBuffer, &src, &l, + NormalPagePriority); + bcopy(src, payload + ofs, l); + ofs += l; + NdisGetNextBuffer(pCurrentBuffer, &pNextBuffer); + pCurrentBuffer = pNextBuffer; + } + /* + * Identify EtherType. If the packet is not IP, simply allow + * and don't bother the firewall. XXX should be done before. + */ + EtherType = *(unsigned short*)(payload + 12); + EtherType = RtlUshortByteSwap(EtherType); + if (EtherType != 0x0800) { + //DbgPrint("ethertype = %X, skipping ipfw\n",EtherType); + free(m, 0); + return PASS; + } + + /* + * Now build a buffer descriptor to replace the original chain. + */ + pAdapt = Context; + PacketPool = direction == OUTGOING ? + pAdapt->SendPacketPoolHandle : pAdapt->RecvPacketPoolHandle; + NdisAllocateBuffer(&Status, &pNdisBuffer, + PacketPool, payload, m->m_pkthdr.len+14); + if (Status != NDIS_STATUS_SUCCESS) + goto drop_pkt; + /* + * Save the old buffer pointers, and put the new one + * into the chain. + */ + pNdisBuffer->Next = NULL; + old_head = NDIS_PACKET_FIRST_NDIS_BUFFER(pNdisPacket); + old_tail = NDIS_PACKET_LAST_NDIS_BUFFER(pNdisPacket); + NdisReinitializePacket(pNdisPacket); + NdisChainBufferAtFront(pNdisPacket, pNdisBuffer); +#if 0 + if (direction == INCOMING) { + DBGPRINT(("incoming: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), TotalPacketLength)); + } else { + DBGPRINT(("outgoing: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), TotalPacketLength)); + } +#endif + if (direction == INCOMING) + ret = ipfw_check_hook(NULL, &m, NULL, PFIL_IN, NULL); + else + ret = ipfw_check_hook(NULL, &m, (struct ifnet*)_if_out, PFIL_OUT, NULL); + + if (m != NULL) { + /* Accept. Restore the old buffer chain, free + * the mbuf and return PASS. + */ + //DBGPRINT(("accepted\n")); + NdisReinitializePacket(pNdisPacket); + NDIS_PACKET_FIRST_NDIS_BUFFER(pNdisPacket) = old_head; + NDIS_PACKET_LAST_NDIS_BUFFER(pNdisPacket) = old_tail; + NdisFreeBuffer(pNdisBuffer); + m_freem(m); + return PASS; + } else if (ret == 0) { + /* dummynet has kept the packet, will reinject later. */ + //DBGPRINT(("kept by dummynet\n")); + return DUMMYNET; + } else { + /* + * Packet dropped by ipfw or dummynet. Nothing to do as + * FREE_PKT already freed the fake mbuf + */ + //DBGPRINT(("dropped by dummynet, ret = %i\n", ret)); + return DROP; + } +drop_pkt: + /* for some reason we cannot proceed. Free any resources + * including those received from above, and return + * faking success. XXX this must be fixed later. + */ + NdisFreePacket(pNdisPacket); + return DROP; +} + +/* + * Windows reinjection function. + * The packet is already available as m->pkt, so we only + * need to send it to the right place. + * Normally a ndis intermediate driver allocates + * a fresh descriptor, while the actual data's ownership is + * retained by the protocol, or the miniport below. + * Since an intermediate driver behaves as a miniport driver + * at the upper edge (towards the protocol), and as a protocol + * driver at the lower edge (towards the NIC), when we handle a + * packet we have a reserved area in both directions (we can use + * only one for each direction at our own discretion). + * Normally this area is used to save a pointer to the original + * packet, so when the driver is done with it, the original descriptor + * can be retrieved, and the resources freed (packet descriptor, + * buffer descriptor(s) and the actual data). In our driver this + * area is used to mark the reinjected packets as 'orphan', because + * the original descriptor is gone long ago. This way we can handle + * correctly the resource freeing when the callback function + * is called by NDIS. + */ + +void +netisr_dispatch(int num, struct mbuf *m) +{ + unsigned char* payload = (unsigned char*)(m+1); + PADAPT pAdapt = m->context; + NDIS_STATUS Status; + PNDIS_PACKET pPacket = m->pkt; + PNDIS_BUFFER pNdisBuffer; + NDIS_HANDLE PacketPool; + + if (num < 0) + goto drop_pkt; + + //debug print +#if 0 + DbgPrint("reinject %s\n", m->direction == OUTGOING ? + "outgoing" : "incoming"); +#endif + NdisAcquireSpinLock(&pAdapt->Lock); + if (m->direction == OUTGOING) { + //we must first check if the adapter is going down, + // in this case abort the reinjection + if (pAdapt->PTDeviceState > NdisDeviceStateD0) { + pAdapt->OutstandingSends--; + // XXX should we notify up ? + NdisReleaseSpinLock(&pAdapt->Lock); + goto drop_pkt; + } + } else { + /* if the upper miniport edge is not initialized or + * the miniport edge is in low power state, abort + * XXX we should notify the error. + */ + if (!pAdapt->MiniportHandle || + pAdapt->MPDeviceState > NdisDeviceStateD0) { + NdisReleaseSpinLock(&pAdapt->Lock); + goto drop_pkt; + } + } + NdisReleaseSpinLock(&pAdapt->Lock); + + if (m->direction == OUTGOING) { + PSEND_RSVD SendRsvd; + /* use the 8-bytes protocol reserved area, the first + * field is used to mark/the packet as 'orphan', the + * second stores the pointer to the mbuf, so in the + * the SendComplete handler we know that this is a + * reinjected packet and can free correctly. + */ + SendRsvd = (PSEND_RSVD)(pPacket->ProtocolReserved); + SendRsvd->OriginalPkt = NULL; + SendRsvd->pMbuf = m; + //do the actual send + NdisSend(&Status, pAdapt->BindingHandle, pPacket); + if (Status != NDIS_STATUS_PENDING) { + /* done, call the callback now */ + PtSendComplete(m->context, m->pkt, Status); + } + return; /* unconditional return here. */ + } else { + /* There's no need to check the 8-bytes miniport + * reserved area since the path going up will be always + * syncronous, and all the cleanup will be done inline. + * If the reinjected packed comes from a PtReceivePacket, + * there will be no callback. + * Otherwise PtReceiveComplete will be called but will just + * return since all the cleaning is alreqady done */ + // do the actual receive. + ULONG Proc = KeGetCurrentProcessorNumber(); + pAdapt->ReceivedIndicationFlags[Proc] = TRUE; + NdisMEthIndicateReceive(pAdapt->MiniportHandle, NULL, payload, 14, payload+14, m->m_len, m->m_len); + NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); + pAdapt->ReceivedIndicationFlags[Proc] = FALSE; + } +drop_pkt: + /* NDIS_PACKET exists and must be freed only if + * the packet come from a PtReceivePacket, oherwise + * m->pkt will ne null. + */ + if (m->pkt != NULL) + { + NdisUnchainBufferAtFront(m->pkt, &pNdisBuffer); + NdisFreeBuffer(pNdisBuffer); + NdisFreePacket(m->pkt); + } + m_freem(m); +} + +void win_freem(void *); /* wrapper for m_freem() for protocol.c */ +void +win_freem(void *_m) +{ + struct mbuf *m = _m; + m_freem(m); +} + +/* + * not implemented in linux. + * taken from /usr/src/lib/libc/string/strlcpy.c + */ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt) +{ + PNDIS_BUFFER pNdisBuffer; + + NdisQueryPacket(Packet, NULL, NULL, &pNdisBuffer, NULL); + NdisUnchainBufferAtFront(Packet, &pNdisBuffer); + NdisFreeBuffer(pNdisBuffer); + win_freem(m); + NdisFreePacket(Packet); + ADAPT_DECR_PENDING_SENDS(pAdapt); +} + +int +ipfw2_qhandler_w32_oldstyle(int direction, + NDIS_HANDLE ProtocolBindingContext, + unsigned char* HeaderBuffer, + unsigned int HeaderBufferSize, + unsigned char* LookAheadBuffer, + unsigned int LookAheadBufferSize, + unsigned int PacketSize) +{ + struct mbuf* m; + unsigned char* payload = NULL; + unsigned short EtherType = 0; + int ret = 0; + + /* We are in a special case when NIC signals an incoming + * packet using old style calls. This is done passing + * a pointer to the MAC header and a pointer to the + * rest of the packet. + * We simply allocate space for the mbuf and the + * subsequent payload section. + */ + m = malloc(sizeof(struct mbuf) + HeaderBufferSize + LookAheadBufferSize, 0, 0 ); + if (m == NULL) //resource shortage, drop the packet + return DROP; + + /* set mbuf fields to point past the MAC header. + * Also set additional W32 info. + * m->pkt here is set to null because the notification + * from the NIC has come with a header+loolahead buffer, + * no NDIS_PACKET has been provided. + */ + payload = (unsigned char*)(m + 1); + m->m_len = m->m_pkthdr.len = HeaderBufferSize+LookAheadBufferSize-14; + m->m_data = payload + 14; /* past the MAC header */ + m->direction = direction; + m->context = ProtocolBindingContext; + m->pkt = NULL; + + /* + * Now copy the data from the Windows buffers to the mbuf. + */ + bcopy(HeaderBuffer, payload, HeaderBufferSize); + bcopy(LookAheadBuffer, payload+HeaderBufferSize, LookAheadBufferSize); + //hexdump(payload,HeaderBufferSize+LookAheadBufferSize,"qhandler"); + /* + * Identify EtherType. If the packet is not IP, simply allow + * and don't bother the firewall. XXX should be done before. + */ + EtherType = *(unsigned short*)(payload + 12); + EtherType = RtlUshortByteSwap(EtherType); + if (EtherType != 0x0800) { + //DbgPrint("ethertype = %X, skipping ipfw\n",EtherType); + free(m, 0); + return PASS; + } + + //DbgPrint("incoming_raw: proto %u (%s), src %08X, dst %08X, sport %u, dport %u, len %u\n", *(payload+14+9), texify_proto(*(payload+14+9)), *(unsigned int*)(payload+14+12), *(unsigned int*)(payload+14+16), ntohs((*((unsigned short int*)(payload+14+20)))), ntohs((*((unsigned short int*)(payload+14+22)))), HeaderBufferSize+LookAheadBufferSize); + + /* Query the firewall */ + ret = ipfw_check_hook(NULL, &m, NULL, PFIL_IN, NULL); + + if (m != NULL) { + /* Accept. Free the mbuf and return PASS. */ + //DbgPrint("accepted\n"); + m_freem(m); + return PASS; + } else if (ret == 0) { + /* dummynet has kept the packet, will reinject later. */ + //DbgPrint("kept by dummynet\n"); + return DUMMYNET; + } else { + /* + * Packet dropped by ipfw or dummynet. Nothing to do as + * FREE_PKT already freed the fake mbuf + */ + //DbgPrint("dropped by dummynet, ret = %i\n", ret); + return DROP; + } +} + +/* forward declaration because those functions are used only here, + * no point to make them visible in passthru/protocol/miniport */ +int do_ipfw_set_ctl(struct sock *sk, int cmd, + void __user *user, unsigned int len); +int do_ipfw_get_ctl(struct sock *sk, int cmd, + void __user *user, int *len); + +NTSTATUS +DevIoControl( + IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIrp + ) +/*++ + +Routine Description: + + This is the dispatch routine for handling device ioctl requests. + +Arguments: + + pDeviceObject - Pointer to the device object. + + pIrp - Pointer to the request packet. + +Return Value: + + Status is returned. + +--*/ +{ + PIO_STACK_LOCATION pIrpSp; + NTSTATUS NtStatus = STATUS_SUCCESS; + unsigned long BytesReturned = 0; + unsigned long FunctionCode; + unsigned long len; + struct sockopt *sopt; + int ret = 0; + + UNREFERENCED_PARAMETER(pDeviceObject); + + pIrpSp = IoGetCurrentIrpStackLocation(pIrp); + + /* + * Using METHOD_BUFFERED as communication method, the userland + * side calls DeviceIoControl passing an input buffer and an output + * and their respective length (ipfw uses the same length for both). + * The system creates a single I/O buffer, with len=max(inlen,outlen). + * In the kernel we can read information from this buffer (which is + * directly accessible), overwrite it with our results, and set + * IoStatus.Information with the number of bytes that the system must + * copy back to userland. + * In our sockopt emulation, the initial part of the buffer contains + * a struct sockopt, followed by the data area. + */ + + len = pIrpSp->Parameters.DeviceIoControl.InputBufferLength; + if (len < sizeof(struct sockopt)) + { + return STATUS_NOT_SUPPORTED; // XXX find better value + } + sopt = pIrp->AssociatedIrp.SystemBuffer; + + FunctionCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode; + + len = sopt->sopt_valsize; + + switch (FunctionCode) + { + case IP_FW_SETSOCKOPT: + ret = do_ipfw_set_ctl(NULL, sopt->sopt_name, sopt+1, len); + break; + + case IP_FW_GETSOCKOPT: + ret = do_ipfw_get_ctl(NULL, sopt->sopt_name, sopt+1, &len); + sopt->sopt_valsize = len; + //sanity check on len + if (len + sizeof(struct sockopt) <= pIrpSp->Parameters.DeviceIoControl.InputBufferLength) + BytesReturned = len + sizeof(struct sockopt); + else + BytesReturned = pIrpSp->Parameters.DeviceIoControl.InputBufferLength; + break; + + default: + NtStatus = STATUS_NOT_SUPPORTED; + break; + } + + pIrp->IoStatus.Information = BytesReturned; + pIrp->IoStatus.Status = NtStatus; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return NtStatus; +} + +void dummynet(void * unused); +void ipfw_tick(void * vnetx); + +VOID dummynet_dpc( + __in struct _KDPC *Dpc, + __in_opt PVOID DeferredContext, + __in_opt PVOID SystemArgument1, + __in_opt PVOID SystemArgument2 + ) +{ + dummynet(NULL); +} + +VOID ipfw_dpc( + __in struct _KDPC *Dpc, + __in_opt PVOID DeferredContext, + __in_opt PVOID SystemArgument1, + __in_opt PVOID SystemArgument2 + ) +{ + ipfw_tick(DeferredContext); +} diff --git a/kipfw/missing.h b/kipfw/missing.h new file mode 100644 index 0000000..237c1dc --- /dev/null +++ b/kipfw/missing.h @@ -0,0 +1,645 @@ +/* + * Copyright (C) 2009 Luigi Rizzo, Marta Carbone, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: missing.h 12256 2013-04-26 21:12:44Z luigi $ + * + * Header for kernel variables and functions that are not available in + * userland. + */ + +#ifndef _MISSING_H_ +#define _MISSING_H_ + +#include +#ifdef linux +#include +#include +#include +#endif /* linux */ + +/* portability features, to be set before the rest: */ +#define HAVE_NET_IPLEN /* iplen/ipoff in net format */ +#define WITHOUT_BPF /* do not use bpf logging */ + +#ifdef _WIN32 + +#ifndef DEFINE_SPINLOCK +#define DEFINE_SPINLOCK(x) FAST_MUTEX x +#endif +/* spinlock --> Guarded Mutex KGUARDED_MUTEX */ +/* http://www.reactos.org/wiki/index.php/Guarded_Mutex */ +#define spin_lock_init(_l) +#define spin_lock_bh(_l) +#define spin_unlock_bh(_l) + +#include /* bsd-compat.c */ +#include /* bsd-compat.c */ +#include /* local version */ +#define INADDR_TO_IFP(a, b) b = NULL + +#else /* __linux__ */ + +#define MALLOC_DECLARE(x) /* nothing */ +#include /* do_gettimeofday */ +#include /* local version */ +struct inpcb; + +/* + * Kernel locking support. + * FreeBSD uses mtx in dummynet.c and struct rwlock ip_fw2.c + * + * In linux we use spinlock_bh to implement both. + * For 'struct rwlock' we need an #ifdef to change it to spinlock_t + */ + +#ifndef DEFINE_SPINLOCK /* this is for linux 2.4 */ +#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED +#endif + + +#define rw_assert(a, b) +#define rw_destroy(_l) +#define rw_init(_l, msg) spin_lock_init(_l) +#define rw_rlock(_l) spin_lock_bh(_l) +#define rw_runlock(_l) spin_unlock_bh(_l) +#define rw_wlock(_l) spin_lock_bh(_l) +#define rw_wunlock(_l) spin_unlock_bh(_l) +#define rw_init_flags(_l, s, v) + +#define mtx_assert(a, b) +#define mtx_destroy(m) +#define mtx_init(m, a,b,c) spin_lock_init(m) +#define mtx_lock(_l) spin_lock_bh(_l) +#define mtx_unlock(_l) spin_unlock_bh(_l) + +#endif /* __linux__ */ +/* end of locking support */ + +/* + * Reference to an ipfw rule that can be carried outside critical sections. + * A rule is identified by rulenum:rule_id which is ordered. + * In version chain_id the rule can be found in slot 'slot', so + * we don't need a lookup if chain_id == chain->id. + * + * On exit from the firewall this structure refers to the rule after + * the matching one (slot points to the new rule; rulenum:rule_id-1 + * is the matching rule), and additional info (e.g. info often contains + * the insn argument or tablearg in the low 16 bits, in host format). + * On entry, the structure is valid if slot>0, and refers to the starting + * rules. 'info' contains the reason for reinject, e.g. divert port, + * divert direction, and so on. + */ +struct ipfw_rule_ref { + uint32_t slot; /* slot for matching rule */ + uint32_t rulenum; /* matching rule number */ + uint32_t rule_id; /* matching rule id */ + uint32_t chain_id; /* ruleset id */ + uint32_t info; /* see below */ +}; + +enum { + IPFW_INFO_MASK = 0x0000ffff, + IPFW_INFO_OUT = 0x00000000, /* outgoing, just for convenience */ + IPFW_INFO_IN = 0x80000000, /* incoming, overloads dir */ + IPFW_ONEPASS = 0x40000000, /* One-pass, do not reinject */ + IPFW_IS_MASK = 0x30000000, /* which source ? */ + IPFW_IS_DIVERT = 0x20000000, + IPFW_IS_DUMMYNET =0x10000000, + IPFW_IS_PIPE = 0x08000000, /* pipe=1, queue = 0 */ +}; + +/* in netinet/in.h */ +#define in_nullhost(x) ((x).s_addr == INADDR_ANY) + +/* bzero not present on linux, but this should go in glue.h */ +#define bzero(s, n) memset(s, 0, n) +#define bcmp(p1, p2, n) memcmp(p1, p2, n) + +/* ethernet stuff */ +#define ETHERTYPE_IP 0x0800 /* IP protocol */ +//#define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ +struct ether_header { + u_char ether_dhost[ETHER_ADDR_LEN]; + u_char ether_shost[ETHER_ADDR_LEN]; + u_short ether_type; +}; + +#define ETHER_TYPE_LEN 2 /* length of the Ethernet type field */ +#define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN) + +/* + * Historically, BSD keeps ip_len and ip_off in host format + * when doing layer 3 processing, and this often requires + * to translate the format back and forth. + * To make the process explicit, we define a couple of macros + * that also take into account the fact that at some point + * we may want to keep those fields always in net format. + */ + +#if (BYTE_ORDER == BIG_ENDIAN) || defined(HAVE_NET_IPLEN) +#define SET_NET_IPLEN(p) do {} while (0) +#define SET_HOST_IPLEN(p) do {} while (0) +#else /* never on linux */ +#define SET_NET_IPLEN(p) do { \ + struct ip *h_ip = (p); \ + h_ip->ip_len = htons(h_ip->ip_len); \ + h_ip->ip_off = htons(h_ip->ip_off); \ + } while (0) + +#define SET_HOST_IPLEN(p) do { \ + struct ip *h_ip = (p); \ + h_ip->ip_len = ntohs(h_ip->ip_len); \ + h_ip->ip_off = ntohs(h_ip->ip_off); \ + } while (0) +#endif /* !HAVE_NET_IPLEN */ + +/* ip_dummynet.c */ +#define __FreeBSD_version 500035 + +#ifdef __linux__ +struct moduledata; +int my_mod_register(const char *name, + int order, struct moduledata *mod, void *init, void *uninit); + +/* define some macro for ip_dummynet */ + +struct malloc_type { +}; + +#define MALLOC_DEFINE(type, shortdesc, longdesc) \ + struct malloc_type type[1]; void *md_dummy_ ## type = type + +#define CTASSERT(x) + +/* log... does not use the first argument */ +#define LOG_ERR 0x100 +#define LOG_INFO 0x200 +#define log(_level, fmt, arg...) do { \ + int _qwerty=_level;(void)_qwerty; printk(KERN_ERR fmt, ##arg); } while (0) + +/* + * gettimeofday would be in sys/time.h but it is not + * visible if _KERNEL is defined + */ +int gettimeofday(struct timeval *, struct timezone *); + +#else /* _WIN32 */ +#define MALLOC_DEFINE(a,b,c) +#endif /* _WIN32 */ + +extern int hz; +extern long tick; /* exists in 2.4 but not in 2.6 */ +extern int bootverbose; +extern struct timeval boottime; + +/* The time_uptime a FreeBSD variable increased each second */ +#ifdef __linux__ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,37) /* revise boundaries */ +#define time_uptime get_seconds() +#else /* OpenWRT */ +#define time_uptime CURRENT_TIME +#endif +#else /* WIN32 */ +#define time_uptime time_uptime_w32() +#endif + +extern int max_linkhdr; +extern int ip_defttl; +extern u_long in_ifaddrhmask; /* mask for hash table */ +extern struct in_ifaddrhashhead *in_ifaddrhashtbl; /* inet addr hash table */ + +/*-------------------------------------------------*/ + +/* define, includes and functions missing in linux */ +/* include and define */ +#include /* inet_ntoa */ + +struct mbuf; + +/* used by ip_dummynet.c */ +void reinject_drop(struct mbuf* m); + +#include /* error define */ +#include /* IFNAMESIZ */ + +void rn_init(int); +/* + * some network structure can be defined in the bsd way + * by using the _FAVOR_BSD definition. This is not true + * for icmp structure. + * XXX struct icmp contains bsd names in + * /usr/include/netinet/ip_icmp.h + */ +#ifdef __linux__ +#define icmp_code code +#define icmp_type type + +/* linux in6_addr has no member __u6_addr + * replace the whole structure ? + */ +#define __u6_addr in6_u +#define __u6_addr32 u6_addr32 +#endif /* __linux__ */ + +/* defined in linux/sctp.h with no bsd definition */ +struct sctphdr { + uint16_t src_port; /* source port */ + uint16_t dest_port; /* destination port */ + uint32_t v_tag; /* verification tag of packet */ + uint32_t checksum; /* Adler32 C-Sum */ + /* chunks follow... */ +}; + +/* missing definition */ +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_ACK 0x10 + +#define RTF_CLONING 0x100 /* generate new routes on use */ + +#define IPPROTO_OSPFIGP 89 /* OSPFIGP */ +#define IPPROTO_CARP 112 /* CARP */ +#ifndef _WIN32 +#define IPPROTO_IPV4 IPPROTO_IPIP /* for compatibility */ +#endif + +#define CARP_VERSION 2 +#define CARP_ADVERTISEMENT 0x01 + +#define PRIV_NETINET_IPFW 491 /* Administer IPFW firewall. */ + +#define IP_FORWARDING 0x1 /* most of ip header exists */ + +#define NETISR_IP 2 /* same as AF_INET */ + +#define PRIV_NETINET_DUMMYNET 494 /* Administer DUMMYNET. */ + +extern int securelevel; + +struct carp_header { +#if BYTE_ORDER == LITTLE_ENDIAN + u_int8_t carp_type:4, + carp_version:4; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_int8_t carp_version:4, + carp_type:4; +#endif +}; + +struct pim { + int dummy; /* windows compiler does not like empty definition */ +}; + +#ifndef _WIN32 +struct route { + struct rtentry *ro_rt; + struct sockaddr ro_dst; +}; +#endif + +struct ifaltq { + void *ifq_head; +}; + +/* + * ifnet->if_snd is used in ip_dummynet.c to take the transmission + * clock. + */ +#if defined( __linux__) +#define if_xname name +#define if_snd XXX +/* search local the ip addresses, used for the "me" keyword */ +#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) +#define INADDR_TO_IFP(ip, b) \ + b = ip_dev_find(ip.s_addr) +#else +#define INADDR_TO_IFP(ip, b) \ + b = ip_dev_find((struct net *)&init_net, ip.s_addr) +#endif + +#elif defined( _WIN32 ) +/* used in ip_dummynet.c */ +struct ifnet { + char if_xname[IFNAMSIZ]; /* external name (name + unit) */ +// struct ifaltq if_snd; /* output queue (includes altq) */ +}; + +struct net_device { + char if_xname[IFNAMSIZ]; /* external name (name + unit) */ +}; +#endif + +/* involves mbufs */ +int in_cksum(struct mbuf *m, int len); +#define divert_cookie(mtag) 0 +#define divert_info(mtag) 0 +#define pf_find_mtag(a) NULL +#define pf_get_mtag(a) NULL +#ifndef _WIN32 +#define AF_LINK AF_ASH /* ? our sys/socket.h */ +#endif + +/* we don't pullup, either success or free and fail */ +#define m_pullup(m, x) \ + ((m)->m_len >= x ? (m) : (FREE_PKT(m), NULL)) + +struct pf_mtag { + void *hdr; /* saved hdr pos in mbuf, for ECN */ + sa_family_t af; /* for ECN */ + u_int32_t qid; /* queue id */ +}; + +#if 0 // ndef radix +/* radix stuff in radix.h and radix.c */ +struct radix_node { + caddr_t rn_key; /* object of search */ + caddr_t rn_mask; /* netmask, if present */ +}; +#endif /* !radix */ + +/* missing kernel functions */ +char *inet_ntoa(struct in_addr ina); +int random(void); + +/* + * Return the risult of a/b + * + * this is used in linux kernel space, + * since the 64bit division needs to + * be done using a macro + */ +int64_t +div64(int64_t a, int64_t b); + +char * +inet_ntoa_r(struct in_addr ina, char *buf); + +/* from bsd sys/queue.h */ +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +/* depending of linux version */ +#ifndef ETHERTYPE_IPV6 +#define ETHERTYPE_IPV6 0x86dd /* IP protocol version 6 */ +#endif + +/*-------------------------------------------------*/ +#define RT_NUMFIBS 1 +extern u_int rt_numfibs; + +/* involves kernel locking function */ +#ifdef RTFREE +#undef RTFREE +#define RTFREE(a) fprintf(stderr, "RTFREE: commented out locks\n"); +#endif + +void getmicrouptime(struct timeval *tv); + +/* from sys/netinet/ip_output.c */ +struct ip_moptions; +struct route; +struct ip; + +struct mbuf *ip_reass(struct mbuf *); +u_short in_cksum_hdr(struct ip *); +int ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, + struct ip_moptions *imo, struct inpcb *inp); + +/* from net/netisr.c */ +void netisr_dispatch(int num, struct mbuf *m); + +/* definition moved in missing.c */ +int sooptcopyout(struct sockopt *sopt, const void *buf, size_t len); + +int sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen); + +/* defined in session.c */ +int priv_check(struct thread *td, int priv); + +/* struct ucred is in linux/socket.h and has pid, uid, gid. + * We need a 'bsd_ucred' to store also the extra info + */ + +struct bsd_ucred { + uid_t uid; + gid_t gid; + uint32_t xid; + uint32_t nid; +}; + +int +cred_check(void *insn, int proto, struct ifnet *oif, + struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, + u_int16_t src_port, struct bsd_ucred *u, int *ugid_lookupp, + struct sk_buff *skb); + +int securelevel_ge(struct ucred *cr, int level); + +struct sysctl_oid; +struct sysctl_req; + +#ifdef _WIN32 +#define module_param_named(_name, _var, _ty, _perm) +#else /* !_WIN32 */ + +/* Linux 2.4 is mostly for openwrt */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#include /* generic_ffs() used in ip_fw2.c */ +typedef uint32_t __be32; +typedef uint16_t __be16; +struct sock; +struct net; +struct inet_hashinfo; +struct sock *inet_lookup( + struct inet_hashinfo *hashinfo, + const __be32 saddr, const __be16 sport, + const __be32 daddr, const __be16 dport, + const int dif); +struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif); +#endif /* Linux < 2.6 */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) && \ + LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16) /* XXX NOT sure, in 2.6.9 give an error */ +#define module_param_named(_name, _var, _ty, _perm) \ + //module_param(_name, _ty, 0644) +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) +typedef unsigned long uintptr_t; + +#ifdef __i386__ +static inline unsigned long __fls(unsigned long word) +{ + asm("bsr %1,%0" + : "=r" (word) + : "rm" (word)); + return word; +} +#endif + +#endif /* LINUX < 2.6.25 */ + +#endif /* !_WIN32 so maybe __linux__ */ + +#if defined (__linux__) && !defined (EMULATE_SYSCTL) +#define SYSCTL_DECL(_1) +#define SYSCTL_OID(_1, _2, _3, _4, _5, _6, _7, _8) +#define SYSCTL_NODE(_1, _2, _3, _4, _5, _6) +#define _SYSCTL_BASE(_name, _var, _ty, _perm) \ + module_param_named(_name, *(_var), _ty, \ + ( (_perm) == CTLFLAG_RD) ? 0444: 0644 ) +#define SYSCTL_PROC(_base, _oid, _name, _mode, _var, _val, _desc, _a, _b) + +#define SYSCTL_INT(_base, _oid, _name, _mode, _var, _val, _desc) \ + _SYSCTL_BASE(_name, _var, int, _mode) + +#define SYSCTL_LONG(_base, _oid, _name, _mode, _var, _val, _desc) \ + _SYSCTL_BASE(_name, _var, long, _mode) + +#define SYSCTL_ULONG(_base, _oid, _name, _mode, _var, _val, _desc) \ + _SYSCTL_BASE(_name, _var, ulong, _mode) + +#define SYSCTL_UINT(_base, _oid, _name, _mode, _var, _val, _desc) \ + _SYSCTL_BASE(_name, _var, uint, _mode) + +#define TUNABLE_INT(_name, _ptr) + +#define SYSCTL_VNET_PROC SYSCTL_PROC +#define SYSCTL_VNET_INT SYSCTL_INT +#define SYSCTL_VNET_UINT SYSCTL_UINT + +#endif + +#define SYSCTL_HANDLER_ARGS \ + struct sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req +int sysctl_handle_int(SYSCTL_HANDLER_ARGS); +int sysctl_handle_long(SYSCTL_HANDLER_ARGS); + + +void ether_demux(struct ifnet *ifp, struct mbuf *m); + +int ether_output_frame(struct ifnet *ifp, struct mbuf *m); + +void in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum); + +void icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu); + +void rtfree(struct rtentry *rt); + +u_short in_cksum_skip(struct mbuf *m, int len, int skip); + +#ifdef INP_LOCK_ASSERT +#undef INP_LOCK_ASSERT +#define INP_LOCK_ASSERT(a) +#endif + +int jailed(struct ucred *cred); + +/* +* Return 1 if an internet address is for a ``local'' host +* (one to which we have a connection). If subnetsarelocal +* is true, this includes other subnets of the local net. +* Otherwise, it includes only the directly-connected (sub)nets. +*/ +int in_localaddr(struct in_addr in); + +/* the prototype is already in the headers */ +//int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); + +int fnmatch(const char *pattern, const char *string, int flags); + +int +linux_lookup(const int proto, const __be32 saddr, const __be16 sport, + const __be32 daddr, const __be16 dport, + struct sk_buff *skb, int dir, struct bsd_ucred *u); + +/* vnet wrappers, in vnet.h and ip_var.h */ +//int ipfw_init(void); +//void ipfw_destroy(void); + +#define MTAG_IPFW 1148380143 /* IPFW-tagged cookie */ +#define MTAG_IPFW_RULE 1262273568 /* rule reference */ + +struct ip_fw_args; +extern int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); + +#define curvnet NULL +#define CURVNET_SET(_v) +#define CURVNET_RESTORE() +#define VNET_ASSERT(condition) + +#define VNET_NAME(n) n +#define VNET_DECLARE(t, n) extern t n +#define VNET_DEFINE(t, n) t n +#define _VNET_PTR(b, n) &VNET_NAME(n) +/* + * Virtualized global variable accessor macros. + */ +#define VNET_VNET_PTR(vnet, n) (&(n)) +#define VNET_VNET(vnet, n) (n) + +#define VNET_PTR(n) (&(n)) +#define VNET(n) (n) + +VNET_DECLARE(int, ip_defttl); +#define V_ip_defttl VNET(ip_defttl); + +int ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, + int dir, struct inpcb *inp); + +/* hooks for divert */ +extern void (*ip_divert_ptr)(struct mbuf *m, int incoming); + +extern int (*ip_dn_ctl_ptr)(struct sockopt *); +typedef int ip_fw_ctl_t(struct sockopt *); +extern ip_fw_ctl_t *ip_fw_ctl_ptr; + +/* netgraph prototypes */ +typedef int ng_ipfw_input_t(struct mbuf **, int, struct ip_fw_args *, int); +extern ng_ipfw_input_t *ng_ipfw_input_p; + +/* For kernel ipfw_ether and ipfw_bridge. */ +struct ip_fw_args; +typedef int ip_fw_chk_t(struct ip_fw_args *args); +extern ip_fw_chk_t *ip_fw_chk_ptr; + +#define V_ip_fw_chk_ptr VNET(ip_fw_chk_ptr) +#define V_ip_fw_ctl_ptr VNET(ip_fw_ctl_ptr) +#define V_tcbinfo VNET(tcbinfo) +#define V_udbinfo VNET(udbinfo) + +#endif /* !_MISSING_H_ */ diff --git a/kipfw/mysetenv.sh b/kipfw/mysetenv.sh new file mode 100644 index 0000000..baea772 --- /dev/null +++ b/kipfw/mysetenv.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +# bash script to set a suitable environment to call MSVC's build +# to build a 64-bit version of the kernel. +# +# inspired by C:/winddk/7600.16385.1/bin/setenv.bat +# see http://www.osronline.com/ddkx/ddtools/build_ref_0kqb.htm + +############################################################# +# edit theese variables to meet your configuration # +# - DRIVE is the hard drive letter where DDK is installed # +# - DDK is the path to the DDK's root directory # +# - CYGDDK is the complete cygwin path to DDK # +############################################################# +if [ $# -ne 3 ]; then +echo "invalid params" && exit 1 +fi +DRIVE=$1 +DDK=$2 +CYGDDK=/cygdrive/c/${DDK} +TARGETOS=$3 +MYDIR=`pwd` # XXX luigi + +if [ "$TARGETOS" = "wnet" ]; then +export DDK_TARGET_OS=WinNET +export _NT_TARGET_VERSION=0x502 +fi + +if [ "$TARGETOS" = "wlh" ]; then +export DDK_TARGET_OS=WinLH +export _NT_TARGET_VERSION=0x600 +fi + +if [ "$TARGETOS" = "win7" ]; then +export DDK_TARGET_OS=Win7 +export _NT_TARGET_VERSION=0x601 +fi + + +############################################################# +# don't edit anything else below this point # +############################################################# + +D=${DRIVE}${DDK} +DB=${D}/bin +DI=${D}/inc +DL=${D}/lib + + +export AMD64=1 +export ATL_INC_PATH=$DI # defaults to DDKROOT/inc +export ATL_INC_ROOT=$DI # XXX redundant ? +export ATL_LIB_PATH=${DL}/atl/* +export BASEDIR=$D # default +export BUFFER_OVERFLOW_CHECKS=1 +export BUILD_ALLOW_COMPILER_WARNINGS=1 +export BUILD_ALT_DIR=chk_${TARGETOS}_AMD64 +export BUILD_DEFAULT="-ei -nmake -i -nosqm" # can go on the command line +export BUILD_DEFAULT_TARGETS="-amd64" # can also go on the command line +export BUILD_MAKE_PROGRAM=nmake.exe # default to nmake +export BUILD_MULTIPROCESSOR=1 # parallel make, same as -M +export BUILD_OPTIONS=" ~imca ~toastpkg" +export COFFBASE_TXT_FILE=${DB}/coffbase.txt +export CPU=AMD64 +export CRT_INC_PATH=${DI}/crt # default +export CRT_LIB_PATH=${DL}/crt/* # not default, it seems uses lib/{wnet,win7}/* +export DDKBUILDENV=chk # checked or free +export DDK_INC_PATH=${DI}/ddk +export DDK_LIB_DEST=${DL}/${TARGETOS} +export DDK_LIB_PATH=${DL}/${TARGETOS}/* +export DEPRECATE_DDK_FUNCTIONS=1 +export DRIVER_INC_PATH=${DI}/ddk +export HALKIT_INC_PATH=${DI}/ddk +export HALKIT_LIB_PATH=${DL}/${TARGETOS}/* +export IFSKIT_INC_PATH=${DI}/ddk +export IFSKIT_LIB_DEST=${DL}/${TARGETOS} +export IFSKIT_LIB_PATH=${DL}/${TARGETOS}/* +export Include=${DI}/api +export KMDF_INC_PATH=${DI}/wdf/kmdf +export KMDF_LIB_PATH=${DL}/wdf/kmdf/* +export LANGUAGE_NEUTRAL=0 +export Lib=${DL} +export LINK_LIB_IGNORE=4198 +export MFC_INC_PATH=${DI}/mfc42 +export MFC_LIB_PATH=${DL}/mfc/* +export MSC_OPTIMIZATION="/Od /Oi" +export NEW_CRTS=1 +export NO_BINPLACE=TRUE +export NO_BROWSER_FILE=TRUE +export NTDBGFILES=1 +export NTDEBUG=ntsd +export NTDEBUGTYPE=both +# need NTMAKEENV to point to the binary dir +export NTMAKEENV=${DB} +export OAK_INC_PATH=${DI}/api + +export PATH="${CYGDDK}/bin/amd64:${CYGDDK}/tools/sdv/bin:${CYGDDK}/tools/pfd/bin/bin/x86_AMD64\ +:${CYGDDK}/bin/SelfSign:${CYGDDK}/bin/x86/amd64:${CYGDDK}/bin/x86\ +:${CYGDDK}/tools/pfd/bin/bin/AMD64:${CYGDDK}/tools/tracing/amd64:$PATH" + +export PATHEXT=".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC" +export PROJECT_ROOT=${D}/src +export PUBLIC_ROOT=${D} +export RAZZLETOOLPATH=${DB} +export RCNOFONTMAP=1 +export SDK_INC_PATH=${DI}/api +export SDK_LIB_DEST=${DL}/${TARGETOS} +export SDK_LIB_PATH=${DL}/${TARGETOS}/* +export SDV=${D}/tools/sdv +export separate_object_root=FALSE +export TEMP=tmpbuild +export TMP=tmpbuild +export UMDF_INC_PATH=${DI}/wdf/umdf +export USE_OBJECT_ROOT=1 +export WDM_INC_PATH=${DI}/ddk +export WPP_CONFIG_PATH=${DB}/wppconfig +export _AMD64bit=true +export _BUILDARCH=AMD64 +export _BuildType=chk +export _NTDRIVE=${DRIVE} +export _NTROOT=${DDK} +# +# --- XXX note, it spams C:/winddk/7600.16385.1/build.dat +# -c: delete objs, -e: generare build.* logfiles, -f rescan sources, -g color errors +unset MAKEFLAGS +echo "emv ${MAKE} flags ${MAKEFLAGS}" +cd kipfw-mod && build -cefg +echo "done" +#cp objchk_${TARGETOS}_amd64/amd64/ipfw.sys ../binary/ipfw.sys diff --git a/kipfw/netipfw.inf b/kipfw/netipfw.inf new file mode 100644 index 0000000..5dee2c8 --- /dev/null +++ b/kipfw/netipfw.inf @@ -0,0 +1,81 @@ +; version section +[Version] +Signature = "$Windows NT$" +Class = NetService +ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} +Provider = %Unipi% +DriverVer = 08/12/2012,3.0.1.1 + +; manufacturer section +[Manufacturer] +%Unipi% = UNIPI,NTx86,NTamd64 + +; control flags section +; optional, unused in netipfw.inf inf, used in netipfw_m.inf +[ControlFlags] + +; models section +[UNIPI] ; Win2k +%Desc% = Ipfw.ndi, unipi_ipfw +[UNIPI.NTx86] ;For WinXP and later +%Desc% = Ipfw.ndi, unipi_ipfw +[UNIPI.NTamd64] ;For x64 +%Desc% = Ipfw.ndi, unipi_ipfw + +; ddinstall section +[Ipfw.ndi] +AddReg = Ipfw.ndi.AddReg, Ipfw.AddReg +Characteristics = 0x4410 ; NCF_FILTER | NCF_NDIS_PROTOCOL !--Filter Specific--!! +CopyFiles = Ipfw.Files.Sys +CopyInf = netipfw_m.inf + +; remove section +[Ipfw.ndi.Remove] +DelFiles = Ipfw.Files.Sys + +;ddinstall.services section +[Ipfw.ndi.Services] +AddService = Ipfw,,Ipfw.AddService + +[Ipfw.AddService] +DisplayName = %ServiceDesc% +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ipfw.sys +AddReg = Ipfw.AddService.AddReg + +[Ipfw.AddService.AddReg] + +;file copy related sections +[SourceDisksNames] +1=%DiskDescription%,"",, + +[SourceDisksFiles] +ipfw.sys=1 + +[DestinationDirs] +DefaultDestDir = 12 +Ipfw.Files.Sys = 12 ; %windir%\System32\drivers + +; ddinstall->copyfiles points here +[Ipfw.Files.Sys] +ipfw.sys,,,2 + +; ddinstall->addreg points here +[Ipfw.ndi.AddReg] +HKR, Ndi, HelpText, , %HELP% ; this is displayed at the bottom of the General page of the Connection Properties dialog box +HKR, Ndi, FilterClass, , failover +HKR, Ndi, FilterDeviceInfId, , unipi_ipfwmp +HKR, Ndi, Service, , Ipfw +HKR, Ndi\Interfaces, UpperRange, , noupper +HKR, Ndi\Interfaces, LowerRange, , nolower +HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan" + +;strings section +[Strings] +Unipi = "Unipi" +DiskDescription = "Ipfw Driver Disk" +Desc = "ipfw+dummynet" +HELP = "This is ipfw and dummynet network emulator, developed by unipi.it" +ServiceDesc = "ipfw service" diff --git a/kipfw/netipfw_m.inf b/kipfw/netipfw_m.inf new file mode 100644 index 0000000..a299b12 --- /dev/null +++ b/kipfw/netipfw_m.inf @@ -0,0 +1,56 @@ +; version section +[Version] +Signature = "$Windows NT$" +Class = Net +ClassGUID = {4D36E972-E325-11CE-BFC1-08002BE10318} +Provider = %Unipi% +DriverVer = 08/12/2012,3.0.1.1 + +; control flags section +; optional, unused in netipfw.inf inf, used in netipfw_m.inf +[ControlFlags] +ExcludeFromSelect = unipi_ipfwmp + +; destinationdirs section, optional +[DestinationDirs] +DefaultDestDir=12 +; No files to copy + +; manufacturer section +[Manufacturer] +%Unipi% = UNIPI,NTx86,NTamd64 + +; models section +[UNIPI] ; Win2k +%Desc% = IpfwMP.ndi, unipi_ipfwmp +[UNIPI.NTx86] ;For WinXP and later +%Desc% = IpfwMP.ndi, unipi_ipfwmp +[UNIPI.NTamd64] ;For x64 +%Desc% = IpfwMP.ndi, unipi_ipfwmp + +; ddinstall section +[IpfwMP.ndi] +AddReg = IpfwMP.ndi.AddReg +Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN + +; ddinstall->addreg points here +[IpfwMP.ndi.AddReg] +HKR, Ndi, Service, 0, IpfwMP + +;ddinstall.services section +[IpfwMP.ndi.Services] +AddService = IpfwMP,0x2, IpfwMP.AddService + +[IpfwMP.AddService] +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ipfw.sys +AddReg = IpfwMP.AddService.AddReg + +[IpfwMP.AddService.AddReg] +; None + +[Strings] +Unipi = "Unipi" +Desc = "Ipfw Miniport" diff --git a/kipfw/sources b/kipfw/sources new file mode 100644 index 0000000..9481e75 --- /dev/null +++ b/kipfw/sources @@ -0,0 +1,20 @@ +TARGETNAME=ipfw +TARGETTYPE=DRIVER + +C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 + +MSC_WARNING_LEVEL=/W2 + +# The driver is built in the XP or .NET build environment +# So let us build NDIS 5.1 version. +C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1 +C_DEFINES=$(C_DEFINES) -DNDIS51=1 + +# Enable dummynet preprocessing macros +C_DEFINES=$(C_DEFINES) /D_WIN32 /DMODULENAME=Ipfw /D_BSD_SOURCE /DKERNEL_MODULE /D_KERNEL /DKLD_MODULE /D__BSD_VISIBLE /DIPFIREWALL_DEFAULT_TO_ACCEPT /D__LITTLE_ENDIAN /DSYSCTL_NODE /DEMULATE_SYSCTL -FIwinmissing.h -FImissing.h -FI../glue.h /DWIN32_LEAN_AND_MEAN=1 + +TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib + +INCLUDES= include_e ; ../sys + +SOURCES= ip_fw2.c ip_fw_pfil.c ip_fw_sockopt.c ip_fw_dynamic.c ip_fw_table.c ip_fw_log.c radix.c in_cksum.c ip_dummynet.c ip_dn_io.c ip_dn_glue.c dn_heap.c dn_sched_fifo.c dn_sched_wf2q.c dn_sched_rr.c dn_sched_qfq.c dn_sched_prio.c ipfw2_mod.c bsd_compat.c md_win.c miniport.c protocol.c passthru.c debug.c diff --git a/kipfw/win-passthru.diff b/kipfw/win-passthru.diff new file mode 100644 index 0000000..eeb211b --- /dev/null +++ b/kipfw/win-passthru.diff @@ -0,0 +1,251 @@ +diff -ubwrp original_passthru/miniport.c kipfw/miniport.c +--- original_passthru/miniport.c 2012-08-01 14:34:15.096679600 +0200 ++++ kipfw/miniport.c 2012-08-01 14:34:11.377929600 +0200 +@@ -223,6 +223,7 @@ Return Value: + // + // Use NDIS 5.1 packet stacking: + // ++ if (0) // XXX IPFW - make sure we don't go in here + { + PNDIS_PACKET_STACK pStack; + BOOLEAN Remaining; +@@ -347,6 +348,25 @@ Return Value: + MediaSpecificInfo, + MediaSpecificInfoSize); + } ++#if 1 /* IPFW: query the firewall */ ++ /* if dummynet keeps the packet, we mimic success. ++ * otherwise continue as usual. ++ */ ++ { ++ int ret = ipfw2_qhandler_w32(MyPacket, OUTGOING, ++ MiniportAdapterContext); ++ if (ret != PASS) { ++ if (ret == DROP) ++ return NDIS_STATUS_FAILURE; ++ else { //dummynet kept the packet ++#ifndef WIN9X ++ NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); ++#endif ++ return NDIS_STATUS_SUCCESS; //otherwise simply continue ++ } ++ } ++ } ++#endif /* end of IPFW code */ + + NdisSend(&Status, + pAdapt->BindingHandle, +diff -ubwrp original_passthru/passthru.c kipfw/passthru.c +--- original_passthru/passthru.c 2012-08-01 14:34:15.268554600 +0200 ++++ kipfw/passthru.c 2012-08-01 14:34:11.534179600 +0200 +@@ -47,8 +47,15 @@ NDIS_HANDLE NdisWrapperHandle; + // To support ioctls from user-mode: + // + +-#define LINKNAME_STRING L"\\DosDevices\\Passthru" +-#define NTDEVICE_STRING L"\\Device\\Passthru" ++#define STR2(x) #x ++#define STR(x) STR2(x) ++#define DOSPREFIX "\\DosDevices\\" ++#define NTPREFIX "\\Device\\" ++#define WIDEN2(x) L ## x ++#define WIDEN(x) WIDEN2(x) ++#define LINKNAME_STRING WIDEN(DOSPREFIX) WIDEN(STR(MODULENAME)) ++#define NTDEVICE_STRING WIDEN(NTPREFIX) WIDEN(STR(MODULENAME)) ++#define PROTOCOLNAME_STRING WIDEN(STR(MODULENAME)) + + NDIS_HANDLE NdisDeviceHandle = NULL; + PDEVICE_OBJECT ControlDeviceObject = NULL; +@@ -136,8 +143,8 @@ Return Value: + // Either the Send or the SendPackets handler should be specified. + // If SendPackets handler is specified, SendHandler is ignored + // +- MChars.SendHandler = NULL; // MPSend; +- MChars.SendPacketsHandler = MPSendPackets; ++ MChars.SendHandler = MPSend; // IPFW: use MPSend, not SendPackets ++ MChars.SendPacketsHandler = NULL; + + Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, + &MChars, +@@ -165,7 +172,7 @@ Return Value: + // This is needed to ensure that NDIS can correctly determine + // the binding and call us to bind to miniports below. + // +- NdisInitUnicodeString(&Name, L"Passthru"); // Protocol name ++ NdisInitUnicodeString(&Name, PROTOCOLNAME_STRING); // Protocol name + PChars.Name = Name; + PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete; + PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete; +@@ -205,6 +212,8 @@ Return Value: + NdisTerminateWrapper(NdisWrapperHandle, NULL); + } + ++ ipfw_module_init(); // IPFW - start the system ++ + return(Status); + } + +@@ -276,7 +285,8 @@ Return Value: + DispatchTable[IRP_MJ_CREATE] = PtDispatch; + DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; + DispatchTable[IRP_MJ_CLOSE] = PtDispatch; +- DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch; ++ // IPFW we use DevIoControl ? ++ DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl; + + + NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); +@@ -453,6 +463,7 @@ PtUnload( + + NdisFreeSpinLock(&GlobalLock); + ++ ipfw_module_exit(); // IPFW unloading dummynet ++ + DBGPRINT(("PtUnload: done!\n")); + } +- +diff -ubwrp original_passthru/passthru.h kipfw/passthru.h +--- original_passthru/passthru.h 2012-08-01 14:34:15.049804600 +0200 ++++ kipfw/passthru.h 2012-08-01 14:34:11.362304600 +0200 +@@ -61,6 +61,13 @@ PtDispatch( + IN PIRP Irp + ); + ++DRIVER_DISPATCH DevIoControl; ++NTSTATUS ++DevIoControl( ++ IN PDEVICE_OBJECT pDeviceObject, ++ IN PIRP pIrp ++ ); ++ + NDIS_STATUS + PtRegisterDevice( + VOID +@@ -366,6 +373,7 @@ PtDereferenceAdapt( + typedef struct _SEND_RSVD + { + PNDIS_PACKET OriginalPkt; ++ struct mbuf* pMbuf; // IPFW extension, reference to the mbuf + } SEND_RSVD, *PSEND_RSVD; + + // +@@ -376,6 +384,7 @@ typedef struct _SEND_RSVD + typedef struct _RECV_RSVD + { + PNDIS_PACKET OriginalPkt; ++ struct mbuf* pMbuf; // IPFW extension, reference to the mbuf + } RECV_RSVD, *PRECV_RSVD; + + C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved)); +@@ -475,3 +484,17 @@ IsIMDeviceStateOn( + */ + #define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) + ++#include "winmissing.h" ++ ++int ipfw_module_init(void); ++void ipfw_module_exit(void); ++int ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction, ++ NDIS_HANDLE Context); ++int ipfw2_qhandler_w32_oldstyle(int direction, NDIS_HANDLE ProtocolBindingContext, ++ unsigned char* HeaderBuffer, unsigned int HeaderBufferSize, ++ unsigned char* LookAheadBuffer, unsigned int LookAheadBufferSize, ++ unsigned int PacketSize); ++void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt); ++void hexdump(PUCHAR,int, const char *); ++void my_init(); ++void my_exit(); +\ Manca newline alla fine del file +Solo in original_passthru: passthru.htm +Solo in original_passthru: passthru.rc +diff -ubwrp original_passthru/protocol.c kipfw/protocol.c +--- original_passthru/protocol.c 2012-08-01 14:34:15.112304600 +0200 ++++ kipfw/protocol.c 2012-08-01 14:34:11.409179600 +0200 +@@ -841,6 +841,14 @@ Return Value: + SendRsvd = (PSEND_RSVD)(Packet->ProtocolReserved); + Pkt = SendRsvd->OriginalPkt; + ++#if 1 // IPFW - new code ++ //DbgPrint("SendComplete: packet %p pkt %p\n", Packet, Pkt); ++ if (Pkt == NULL) { //this is a reinjected packet, with no 'father' ++ CleanupReinjected(Packet, SendRsvd->pMbuf, pAdapt); ++ return; ++ } ++#endif /* IPFW */ ++ + #ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); + #endif +@@ -1021,6 +1029,13 @@ Return Value: + + if (pAdapt->MiniportHandle != NULL) + { ++#if 1 /* IPFW: query the firewall */ ++ int ret; ++ ret = ipfw2_qhandler_w32(MyPacket, INCOMING, ++ ProtocolBindingContext); ++ if (ret != PASS) ++ return 0; //otherwise simply continue ++#endif /* end of IPFW code */ + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + +@@ -1055,6 +1070,13 @@ Return Value: + { + case NdisMedium802_3: + case NdisMediumWan: ++ //DbgPrint("EthIndicateReceive context %p, header at %p len %u, lookahead at %p len %u, packetsize %u\n",ProtocolBindingContext,HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize); ++ //hexdump(HeaderBuffer,HeaderBufferSize+LookAheadBufferSize,"EthIndicateReceive"); ++ { ++ int ret = ipfw2_qhandler_w32_oldstyle(INCOMING, ProtocolBindingContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); ++ if (ret != PASS) ++ return NDIS_STATUS_SUCCESS; ++ } + NdisMEthIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, +@@ -1120,6 +1142,21 @@ Return Value: + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + ULONG Proc = KeGetCurrentProcessorNumber(); + ++ /* Warning: this is a poor implementation of the PtReceiveComplete ++ * made by MS, and it's a well known (but never fixed) issue. ++ * Since the ProcessorNumber here can be different from the one ++ * that processed the PtReceive, sometimes NdisMEthIndicateReceiveComplete ++ * will not be called, causing poor performance in the incoming traffic. ++ * In our driver, PtReceive is called for IP packets ONLY by particulary ++ * old NIC drivers, and the poor performance can be seen even ++ * in traffic not handled by ipfw or dummynet. ++ * Fortunately, this is quite rare, all the incoming IP packets ++ * will arrive through PtReceivePacket, and this callback will never ++ * be called. For reinjected traffic, a workaround is done ++ * commuting the ReceivedIndicationFlag and calling ++ * NdisMEthIndicateReceiveComplete manually for each packet. ++ */ ++ + if (((pAdapt->MiniportHandle != NULL) + && (pAdapt->MPDeviceState == NdisDeviceStateD0)) + && (pAdapt->ReceivedIndicationFlags[Proc])) +@@ -1199,7 +1236,7 @@ Return Value: + // See also: PtReceive(). + // + (VOID)NdisIMGetCurrentPacketStack(Packet, &Remaining); +- if (Remaining) ++ if (0 && Remaining) + { + // + // We can reuse "Packet". Indicate it up and be done with it. +@@ -1247,6 +1284,13 @@ Return Value: + + if (pAdapt->MiniportHandle != NULL) + { ++#if 1 /* IPFW: query the firewall */ ++ int ret; ++ ret = ipfw2_qhandler_w32(MyPacket, INCOMING, ++ ProtocolBindingContext); ++ if (ret != PASS) ++ return 0; //otherwise simply continue ++#endif /* end of IPFW code */ + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + diff --git a/kipfw/winmissing.h b/kipfw/winmissing.h new file mode 100644 index 0000000..5870264 --- /dev/null +++ b/kipfw/winmissing.h @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2010 Francesco Magno, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: winmissing.h 11647 2012-08-06 23:20:21Z luigi $ + * definitions and other things needed to build freebsd kernel + * modules in Windows (with the MSVC compiler) + */ + +#ifndef _WINMISSING_H_ +#define _WINMISSING_H_ + +#include +#include +#include +#include +#include +#include + +typedef UCHAR u_char; +typedef UCHAR u_int8_t; +typedef UCHAR uint8_t; +typedef USHORT u_short; +typedef USHORT u_int16_t; +typedef USHORT uint16_t; +typedef USHORT n_short; +typedef UINT u_int; +typedef INT32 int32_t; +typedef UINT32 u_int32_t; +typedef UINT32 uint32_t; +typedef ULONG u_long; +typedef ULONG n_long; +typedef UINT64 uint64_t; +typedef UINT64 u_int64_t; +typedef INT64 int64_t; + +typedef UINT32 in_addr_t; +typedef UCHAR sa_family_t; +typedef USHORT in_port_t; +typedef UINT32 __gid_t; +typedef UINT32 gid_t; +typedef UINT32 __uid_t; +typedef UINT32 uid_t; +typedef ULONG n_time; +typedef char* caddr_t; + +/* linux_lookup uses __be32 and __be16 in the prototype */ +typedef uint32_t __be32; /* XXX __u32 __bitwise __be32 */ +typedef uint16_t __be16; /* XXX */ + +//*** DEBUG STUFF *** +/* + * To see the debugging messages you need DbgView +http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx + */ +#define printf DbgPrint +#define log(lev, ...) DbgPrint(__VA_ARGS__) +const char* texify_cmd(int i); +const char* texify_proto(unsigned int p); +//*** end DEBUG STUFF *** + +#define snprintf _snprintf +#define timespec timeval +struct timeval { + long tv_sec; + long tv_usec; +}; + +struct in_addr { + in_addr_t s_addr; +}; + +struct sockaddr_in { + uint8_t sin_len; + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; + +/* XXX watch out, windows names are actually longer */ +#define IFNAMSIZ 16 +#define IF_NAMESIZE 16 + +#define ETHER_ADDR_LEN 6 + +/* we do not include the windows headers for in6_addr so + * we need to provide our own definition for the kernel. + */ +struct in6_addr { + union { + uint8_t __u6_addr8[16]; + uint16_t __u6_addr16[8]; + uint32_t __u6_addr32[4]; + } __u6_addr; /* 128-bit IP6 address */ +}; + +#define htons(x) RtlUshortByteSwap(x) +#define ntohs(x) RtlUshortByteSwap(x) +#define htonl(x) RtlUlongByteSwap(x) +#define ntohl(x) RtlUlongByteSwap(x) + +#define ENOSPC 28 /* No space left on device */ +#define EOPNOTSUPP 45 /* Operation not supported */ +#define EACCES 13 /* Permission denied */ +#define ENOENT 2 /* No such file or directory */ +#define EINVAL 22 /* Invalid argument */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ENOMEM 12 /* Cannot allocate memory */ +#define EEXIST 17 /* File exists */ +#define ESRCH 3 +#define ENOBUFS 55 /* No buffer space available */ +#define EBUSY 16 /* Module busy */ + + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#define __packed +#define __aligned(x); +#define __user +#define __init +#define __exit +#define __func__ __FUNCTION__ +#define inline __inline + +struct sockaddr_in6 { + int dummy; +}; + +//SPINLOCKS +#define DEFINE_SPINLOCK(x) NDIS_SPIN_LOCK x +#define mtx_init(m,a,b,c) NdisAllocateSpinLock(m) +#define mtx_lock(_l) NdisAcquireSpinLock(_l) +#define mtx_unlock(_l) NdisReleaseSpinLock(_l) +#define mtx_destroy(m) NdisFreeSpinLock(m) +#define mtx_assert(a, b) + +#define rw_rlock(_l) NdisAcquireSpinLock(_l) +#define rw_runlock(_l) NdisReleaseSpinLock(_l) +#define rw_assert(a, b) +#define rw_wlock(_l) NdisAcquireSpinLock(_l) +#define rw_wunlock(_l) NdisReleaseSpinLock(_l) +#define rw_destroy(_l) NdisFreeSpinLock(_l) +#define rw_init(_l, msg) NdisAllocateSpinLock(_l) +#define rw_init_flags(_l, s, v) NdisAllocateSpinLock(_l) + +#define rwlock_t NDIS_SPIN_LOCK +#define spinlock_t NDIS_SPIN_LOCK + +#define s6_addr __u6_addr.__u6_addr8 + + +struct icmphdr { + u_char icmp_type; /* type of message, see below */ + u_char icmp_code; /* type sub code */ + u_short icmp_cksum; /* ones complement cksum of struct */ +}; + +#define ICMP_ECHO 8 /* echo service */ + +#define IPOPT_OPTVAL 0 /* option ID */ +#define IPOPT_OLEN 1 /* option length */ +#define IPOPT_EOL 0 /* end of option list */ +#define IPOPT_NOP 1 /* no operation */ +#define IPOPT_LSRR 131 /* loose source route */ +#define IPOPT_SSRR 137 /* strict source route */ +#define IPOPT_RR 7 /* record packet route */ +#define IPOPT_TS 68 /* timestamp */ + +#define IPPROTO_ICMP 1 /* control message protocol */ +#define IPPROTO_TCP 6 /* tcp */ +#define IPPROTO_UDP 17 /* user datagram protocol */ +#define IPPROTO_ICMPV6 58 /* ICMP6 */ +#define IPPROTO_SCTP 132 /* SCTP */ +#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */ +#define IPPROTO_ROUTING 43 /* IP6 routing header */ +#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */ +#define IPPROTO_DSTOPTS 60 /* IP6 destination option */ +#define IPPROTO_AH 51 /* IP6 Auth Header */ +#define IPPROTO_ESP 50 /* IP6 Encap Sec. Payload */ +#define IPPROTO_NONE 59 /* IP6 no next header */ +#define IPPROTO_PIM 103 /* Protocol Independent Mcast */ + +#define IPPROTO_IPV6 41 +#define IPPROTO_IPV4 4 /* IPv4 encapsulation */ + + +#define INADDR_ANY (uint32_t)0x00000000 + +#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ +#define AF_LINK 18 /* Link layer interface */ + +#define IN_CLASSD(i) (((uint32_t)(i) & 0xf0000000) == 0xe0000000) +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define DROP 0 +#define PASS 1 +#define DUMMYNET 2 +#define INCOMING 0 +#define OUTGOING 1 + +size_t strlcpy(char *dst, const char *src, size_t siz); +void do_gettimeofday(struct timeval *tv); +int ffs(int bits); +int time_uptime_w32(); + +#endif /* _WINMISSING_H_ */ diff --git a/kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk b/kmod-ipfw3_2.4.35.4-brcm-2.4-1_mipsel.ipk new file mode 100644 index 0000000000000000000000000000000000000000..de31ced6a86489a4a57fae8bd5b06d6d6758cc24 GIT binary patch literal 100875 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 = FALSE; + + DBGPRINT(("==> Miniport Initialize: Adapt %p\n", pAdapt)); + + // + // Usually we export the medium type of the adapter below as our + // virtual miniport's medium type. However if the adapter below us + // is a WAN device, then we claim to be of medium type 802.3. + // + Medium = pAdapt->Medium; + + if (Medium == NdisMediumWan) + { + Medium = NdisMedium802_3; + } + + for (i = 0; i < MediumArraySize; i++) + { + if (MediumArray[i] == Medium) + { + *SelectedMediumIndex = i; + break; + } + } + + if (i == MediumArraySize) + { + Status = NDIS_STATUS_UNSUPPORTED_MEDIA; + break; + } + + + // + // Set the attributes now. NDIS_ATTRIBUTE_DESERIALIZE enables us + // to make up-calls to NDIS without having to call NdisIMSwitchToMiniport + // or NdisIMQueueCallBack. This also forces us to protect our data using + // spinlocks where appropriate. Also in this case NDIS does not queue + // packets on our behalf. Since this is a very simple pass-thru + // miniport, we do not have a need to protect anything. However in + // a general case there will be a need to use per-adapter spin-locks + // for the packet queues at the very least. + // + NdisMSetAttributesEx(MiniportAdapterHandle, + pAdapt, + 0, // CheckForHangTimeInSeconds + NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT | + NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT| + NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER | + NDIS_ATTRIBUTE_DESERIALIZE | + NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND, + 0); + + pAdapt->MiniportHandle = MiniportAdapterHandle; + // + // Initialize LastIndicatedStatus to be NDIS_STATUS_MEDIA_CONNECT + // + pAdapt->LastIndicatedStatus = NDIS_STATUS_MEDIA_CONNECT; + + // + // Initialize the power states for both the lower binding (PTDeviceState) + // and our miniport edge to Powered On. + // + pAdapt->MPDeviceState = NdisDeviceStateD0; + pAdapt->PTDeviceState = NdisDeviceStateD0; + + // + // Add this adapter to the global pAdapt List + // + NdisAcquireSpinLock(&GlobalLock); + + pAdapt->Next = pAdaptList; + pAdaptList = pAdapt; + + NdisReleaseSpinLock(&GlobalLock); + + // + // Create an ioctl interface + // + (VOID)PtRegisterDevice(); + + Status = NDIS_STATUS_SUCCESS; + } + while (FALSE); + + // + // If we had received an UnbindAdapter notification on the underlying + // adapter, we would have blocked that thread waiting for the IM Init + // process to complete. Wake up any such thread. + // + ASSERT(pAdapt->MiniportInitPending == TRUE); + pAdapt->MiniportInitPending = FALSE; + NdisSetEvent(&pAdapt->MiniportInitEvent); + + if (Status == NDIS_STATUS_SUCCESS) + { + PtReferenceAdapt(pAdapt); + } + + DBGPRINT(("<== Miniport Initialize: Adapt %p, Status %x\n", pAdapt, Status)); + + *OpenErrorStatus = Status; + + + return Status; +} + + +NDIS_STATUS +MPSend( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags + ) +/*++ + +Routine Description: + + Send Packet handler. Either this or our SendPackets (array) handler is called + based on which one is enabled in our Miniport Characteristics. + +Arguments: + + MiniportAdapterContext Pointer to the adapter + Packet Packet to send + Flags Unused, passed down below + +Return Value: + + Return code from NdisSend + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + PNDIS_PACKET MyPacket; + PVOID MediaSpecificInfo = NULL; + ULONG MediaSpecificInfoSize = 0; + + // + // The driver should fail the send if the virtual miniport is in low + // power state + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + return NDIS_STATUS_FAILURE; + } + +#ifdef NDIS51 + // + // Use NDIS 5.1 packet stacking: + // + if (0) // XXX IPFW - make sure we don't go in here + { + PNDIS_PACKET_STACK pStack; + BOOLEAN Remaining; + + // + // Packet stacks: Check if we can use the same packet for sending down. + // + + pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (Remaining) + { + // + // We can reuse "Packet". + // + // NOTE: if we needed to keep per-packet information in packets + // sent down, we can use pStack->IMReserved[]. + // + ASSERT(pStack); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + return NDIS_STATUS_FAILURE; + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + NdisSend(&Status, + pAdapt->BindingHandle, + Packet); + + if (Status != NDIS_STATUS_PENDING) + { + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + + return(Status); + } + } +#endif // NDIS51 + + // + // We are either not using packet stacks, or there isn't stack space + // in the original packet passed down to us. Allocate a new packet + // to wrap the data with. + // + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + return NDIS_STATUS_FAILURE; + + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisAllocatePacket(&Status, + &MyPacket, + pAdapt->SendPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PSEND_RSVD SendRsvd; + + // + // Save a pointer to the original packet in our reserved + // area in the new packet. This is needed so that we can + // get back to the original packet when the new packet's send + // is completed. + // + SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); + SendRsvd->OriginalPkt = Packet; + + NdisGetPacketFlags(MyPacket) = Flags; + + // + // Set up the new packet so that it describes the same + // data as the original packet. + // + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); +#ifdef WIN9X + // + // Work around the fact that NDIS does not initialize this + // to FALSE on Win9x. + // + NDIS_PACKET_VALID_COUNTS(MyPacket) = FALSE; +#endif + + // + // Copy the OOB Offset from the original packet to the new + // packet. + // + NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), + NDIS_OOB_DATA_FROM_PACKET(Packet), + sizeof(NDIS_PACKET_OOB_DATA)); + +#ifndef WIN9X + // + // Copy the right parts of per packet info into the new packet. + // This API is not available on Win9x since task offload is + // not supported on that platform. + // + NdisIMCopySendPerPacketInfo(MyPacket, Packet); +#endif + + // + // Copy the Media specific information + // + NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, + &MediaSpecificInfo, + &MediaSpecificInfoSize); + + if (MediaSpecificInfo || MediaSpecificInfoSize) + { + NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, + MediaSpecificInfo, + MediaSpecificInfoSize); + } +#if 1 /* IPFW: query the firewall */ + /* if dummynet keeps the packet, we mimic success. + * otherwise continue as usual. + */ + { + int ret = ipfw2_qhandler_w32(MyPacket, OUTGOING, + MiniportAdapterContext); + if (ret != PASS) { + if (ret == DROP) + return NDIS_STATUS_FAILURE; + else { //dummynet kept the packet +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + return NDIS_STATUS_SUCCESS; //otherwise simply continue + } + } + } +#endif /* end of IPFW code */ + + NdisSend(&Status, + pAdapt->BindingHandle, + MyPacket); + + + if (Status != NDIS_STATUS_PENDING) + { +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + NdisFreePacket(MyPacket); + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + else + { + ADAPT_DECR_PENDING_SENDS(pAdapt); + // + // We are out of packets. Silently drop it. Alternatively we can deal with it: + // - By keeping separate send and receive pools + // - Dynamically allocate more pools as needed and free them when not needed + // + } + + return(Status); +} + + +VOID +MPSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets + ) +/*++ + +Routine Description: + + Send Packet Array handler. Either this or our SendPacket handler is called + based on which one is enabled in our Miniport Characteristics. + +Arguments: + + MiniportAdapterContext Pointer to our adapter + PacketArray Set of packets to send + NumberOfPackets Self-explanatory + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + UINT i; + PVOID MediaSpecificInfo = NULL; + UINT MediaSpecificInfoSize = 0; + + + for (i = 0; i < NumberOfPackets; i++) + { + PNDIS_PACKET Packet, MyPacket; + + Packet = PacketArray[i]; + // + // The driver should fail the send if the virtual miniport is in low + // power state + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + NDIS_STATUS_FAILURE); + continue; + } + +#ifdef NDIS51 + + // + // Use NDIS 5.1 packet stacking: + // + { + PNDIS_PACKET_STACK pStack; + BOOLEAN Remaining; + + // + // Packet stacks: Check if we can use the same packet for sending down. + // + pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (Remaining) + { + // + // We can reuse "Packet". + // + // NOTE: if we needed to keep per-packet information in packets + // sent down, we can use pStack->IMReserved[]. + // + ASSERT(pStack); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + NDIS_STATUS_FAILURE); + } + else + { + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisSend(&Status, + pAdapt->BindingHandle, + Packet); + + if (Status != NDIS_STATUS_PENDING) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + Status); + + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + continue; + } + } +#endif + do + { + NdisAcquireSpinLock(&pAdapt->Lock); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisAllocatePacket(&Status, + &MyPacket, + pAdapt->SendPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PSEND_RSVD SendRsvd; + + SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); + SendRsvd->OriginalPkt = Packet; + + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); +#ifdef WIN9X + // + // Work around the fact that NDIS does not initialize this + // to FALSE on Win9x. + // + NDIS_PACKET_VALID_COUNTS(MyPacket) = FALSE; +#endif // WIN9X + + // + // Copy the OOB data from the original packet to the new + // packet. + // + NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), + NDIS_OOB_DATA_FROM_PACKET(Packet), + sizeof(NDIS_PACKET_OOB_DATA)); + // + // Copy relevant parts of the per packet info into the new packet + // +#ifndef WIN9X + NdisIMCopySendPerPacketInfo(MyPacket, Packet); +#endif + + // + // Copy the Media specific information + // + NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, + &MediaSpecificInfo, + &MediaSpecificInfoSize); + + if (MediaSpecificInfo || MediaSpecificInfoSize) + { + NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, + MediaSpecificInfo, + MediaSpecificInfoSize); + } + + NdisSend(&Status, + pAdapt->BindingHandle, + MyPacket); + + if (Status != NDIS_STATUS_PENDING) + { +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + NdisFreePacket(MyPacket); + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + else + { + // + // The driver cannot allocate a packet. + // + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + while (FALSE); + + if (Status != NDIS_STATUS_PENDING) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + Status); + } + } +} + + +NDIS_STATUS +MPQueryInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + + Entry point called by NDIS to query for the value of the specified OID. + Typical processing is to forward the query down to the underlying miniport. + + The following OIDs are filtered here: + + OID_PNP_QUERY_POWER - return success right here + + OID_GEN_SUPPORTED_GUIDS - do not forward, otherwise we will show up + multiple instances of private GUIDs supported by the underlying miniport. + + OID_PNP_CAPABILITIES - we do send this down to the lower miniport, but + the values returned are postprocessed before we complete this request; + see PtRequestComplete. + + NOTE on OID_TCP_TASK_OFFLOAD - if this IM driver modifies the contents + of data it passes through such that a lower miniport may not be able + to perform TCP task offload, then it should not forward this OID down, + but fail it here with the status NDIS_STATUS_NOT_SUPPORTED. This is to + avoid performing incorrect transformations on data. + + If our miniport edge (upper edge) is at a low-power state, fail the request. + + If our protocol edge (lower edge) has been notified of a low-power state, + we pend this request until the miniport below has been set to D0. Since + requests to miniports are serialized always, at most a single request will + be pended. + +Arguments: + + MiniportAdapterContext Pointer to the adapter structure + Oid Oid for this query + InformationBuffer Buffer for information + InformationBufferLength Size of this buffer + BytesWritten Specifies how much info is written + BytesNeeded In case the buffer is smaller than what we need, tell them how much is needed + + +Return Value: + + Return code from the NdisRequest below. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + + do + { + if (Oid == OID_PNP_QUERY_POWER) + { + // + // Do not forward this. + // + Status = NDIS_STATUS_SUCCESS; + break; + } + + if (Oid == OID_GEN_SUPPORTED_GUIDS) + { + // + // Do not forward this, otherwise we will end up with multiple + // instances of private GUIDs that the underlying miniport + // supports. + // + Status = NDIS_STATUS_NOT_SUPPORTED; + break; + } + + if (Oid == OID_TCP_TASK_OFFLOAD) + { + // + // Fail this -if- this driver performs data transformations + // that can interfere with a lower driver's ability to offload + // TCP tasks. + // + // Status = NDIS_STATUS_NOT_SUPPORTED; + // break; + // + } + // + // If the miniport below is unbinding, just fail any request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + NdisReleaseSpinLock(&pAdapt->Lock); + // + // All other queries are failed, if the miniport is not at D0, + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + Status = NDIS_STATUS_FAILURE; + break; + } + + pAdapt->Request.RequestType = NdisRequestQueryInformation; + pAdapt->Request.DATA.QUERY_INFORMATION.Oid = Oid; + pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer = InformationBuffer; + pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength = InformationBufferLength; + pAdapt->BytesNeeded = BytesNeeded; + pAdapt->BytesReadOrWritten = BytesWritten; + + // + // If the miniport below is binding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + // + // If the Protocol device state is OFF, mark this request as being + // pended. We queue this until the device state is back to D0. + // + if ((pAdapt->PTDeviceState > NdisDeviceStateD0) + && (pAdapt->StandingBy == FALSE)) + { + pAdapt->QueuedRequest = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_PENDING; + break; + } + // + // This is in the process of powering down the system, always fail the request + // + if (pAdapt->StandingBy == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingRequests = TRUE; + + NdisReleaseSpinLock(&pAdapt->Lock); + + // + // default case, most requests will be passed to the miniport below + // + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + + if (Status != NDIS_STATUS_PENDING) + { + PtRequestComplete(pAdapt, &pAdapt->Request, Status); + Status = NDIS_STATUS_PENDING; + } + + } while (FALSE); + + return(Status); + +} + + +VOID +MPQueryPNPCapabilities( + IN OUT PADAPT pAdapt, + OUT PNDIS_STATUS pStatus + ) +/*++ + +Routine Description: + + Postprocess a request for OID_PNP_CAPABILITIES that was forwarded + down to the underlying miniport, and has been completed by it. + +Arguments: + + pAdapt - Pointer to the adapter structure + pStatus - Place to return final status + +Return Value: + + None. + +--*/ + +{ + PNDIS_PNP_CAPABILITIES pPNPCapabilities; + PNDIS_PM_WAKE_UP_CAPABILITIES pPMstruct; + + if (pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength >= sizeof(NDIS_PNP_CAPABILITIES)) + { + pPNPCapabilities = (PNDIS_PNP_CAPABILITIES)(pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer); + + // + // The following fields must be overwritten by an IM driver. + // + pPMstruct= & pPNPCapabilities->WakeUpCapabilities; + pPMstruct->MinMagicPacketWakeUp = NdisDeviceStateUnspecified; + pPMstruct->MinPatternWakeUp = NdisDeviceStateUnspecified; + pPMstruct->MinLinkChangeWakeUp = NdisDeviceStateUnspecified; + *pAdapt->BytesReadOrWritten = sizeof(NDIS_PNP_CAPABILITIES); + *pAdapt->BytesNeeded = 0; + + + // + // Setting our internal flags + // Default, device is ON + // + pAdapt->MPDeviceState = NdisDeviceStateD0; + pAdapt->PTDeviceState = NdisDeviceStateD0; + + *pStatus = NDIS_STATUS_SUCCESS; + } + else + { + *pAdapt->BytesNeeded= sizeof(NDIS_PNP_CAPABILITIES); + *pStatus = NDIS_STATUS_RESOURCES; + } +} + + +NDIS_STATUS +MPSetInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + + Miniport SetInfo handler. + + In the case of OID_PNP_SET_POWER, record the power state and return the OID. + Do not pass below + If the device is suspended, do not block the SET_POWER_OID + as it is used to reactivate the Passthru miniport + + + PM- If the MP is not ON (DeviceState > D0) return immediately (except for 'query power' and 'set power') + If MP is ON, but the PT is not at D0, then queue the queue the request for later processing + + Requests to miniports are always serialized + + +Arguments: + + MiniportAdapterContext Pointer to the adapter structure + Oid Oid for this query + InformationBuffer Buffer for information + InformationBufferLength Size of this buffer + BytesRead Specifies how much info is read + BytesNeeded In case the buffer is smaller than what we need, tell them how much is needed + +Return Value: + + Return code from the NdisRequest below. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + + Status = NDIS_STATUS_FAILURE; + + do + { + // + // The Set Power should not be sent to the miniport below the Passthru, but is handled internally + // + if (Oid == OID_PNP_SET_POWER) + { + MPProcessSetPowerOid(&Status, + pAdapt, + InformationBuffer, + InformationBufferLength, + BytesRead, + BytesNeeded); + break; + + } + + // + // If the miniport below is unbinding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + NdisReleaseSpinLock(&pAdapt->Lock); + // + // All other Set Information requests are failed, if the miniport is + // not at D0 or is transitioning to a device state greater than D0. + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + Status = NDIS_STATUS_FAILURE; + break; + } + + // Set up the Request and return the result + pAdapt->Request.RequestType = NdisRequestSetInformation; + pAdapt->Request.DATA.SET_INFORMATION.Oid = Oid; + pAdapt->Request.DATA.SET_INFORMATION.InformationBuffer = InformationBuffer; + pAdapt->Request.DATA.SET_INFORMATION.InformationBufferLength = InformationBufferLength; + pAdapt->BytesNeeded = BytesNeeded; + pAdapt->BytesReadOrWritten = BytesRead; + + // + // If the miniport below is unbinding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + + // + // If the device below is at a low power state, we cannot send it the + // request now, and must pend it. + // + if ((pAdapt->PTDeviceState > NdisDeviceStateD0) + && (pAdapt->StandingBy == FALSE)) + { + pAdapt->QueuedRequest = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_PENDING; + break; + } + // + // This is in the process of powering down the system, always fail the request + // + if (pAdapt->StandingBy == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingRequests = TRUE; + + NdisReleaseSpinLock(&pAdapt->Lock); + // + // Forward the request to the device below. + // + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + if (Status != NDIS_STATUS_PENDING) + { + *BytesRead = pAdapt->Request.DATA.SET_INFORMATION.BytesRead; + *BytesNeeded = pAdapt->Request.DATA.SET_INFORMATION.BytesNeeded; + pAdapt->OutstandingRequests = FALSE; + } + + } while (FALSE); + + return(Status); +} + + +VOID +MPProcessSetPowerOid( + IN OUT PNDIS_STATUS pNdisStatus, + IN PADAPT pAdapt, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + This routine does all the procssing for a request with a SetPower Oid + The miniport shoud accept the Set Power and transition to the new state + + The Set Power should not be passed to the miniport below + + If the IM miniport is going into a low power state, then there is no guarantee if it will ever + be asked go back to D0, before getting halted. No requests should be pended or queued. + + +Arguments: + pNdisStatus - Status of the operation + pAdapt - The Adapter structure + InformationBuffer - The New DeviceState + InformationBufferLength + BytesRead - No of bytes read + BytesNeeded - No of bytes needed + + +Return Value: + Status - NDIS_STATUS_SUCCESS if all the wait events succeed. + +--*/ +{ + + + NDIS_DEVICE_POWER_STATE NewDeviceState; + + DBGPRINT(("==>MPProcessSetPowerOid: Adapt %p\n", pAdapt)); + + ASSERT (InformationBuffer != NULL); + + *pNdisStatus = NDIS_STATUS_FAILURE; + + do + { + // + // Check for invalid length + // + if (InformationBufferLength < sizeof(NDIS_DEVICE_POWER_STATE)) + { + *pNdisStatus = NDIS_STATUS_INVALID_LENGTH; + break; + } + + NewDeviceState = (*(PNDIS_DEVICE_POWER_STATE)InformationBuffer); + + // + // Check for invalid device state + // + if ((pAdapt->MPDeviceState > NdisDeviceStateD0) && (NewDeviceState != NdisDeviceStateD0)) + { + // + // If the miniport is in a non-D0 state, the miniport can only receive a Set Power to D0 + // + ASSERT (!(pAdapt->MPDeviceState > NdisDeviceStateD0) && (NewDeviceState != NdisDeviceStateD0)); + + *pNdisStatus = NDIS_STATUS_FAILURE; + break; + } + + // + // Is the miniport transitioning from an On (D0) state to an Low Power State (>D0) + // If so, then set the StandingBy Flag - (Block all incoming requests) + // + if (pAdapt->MPDeviceState == NdisDeviceStateD0 && NewDeviceState > NdisDeviceStateD0) + { + pAdapt->StandingBy = TRUE; + } + + // + // If the miniport is transitioning from a low power state to ON (D0), then clear the StandingBy flag + // All incoming requests will be pended until the physical miniport turns ON. + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0 && NewDeviceState == NdisDeviceStateD0) + { + pAdapt->StandingBy = FALSE; + } + + // + // Now update the state in the pAdapt structure; + // + pAdapt->MPDeviceState = NewDeviceState; + + *pNdisStatus = NDIS_STATUS_SUCCESS; + + + } while (FALSE); + + if (*pNdisStatus == NDIS_STATUS_SUCCESS) + { + // + // The miniport resume from low power state + // + if (pAdapt->StandingBy == FALSE) + { + // + // If we need to indicate the media connect state + // + if (pAdapt->LastIndicatedStatus != pAdapt->LatestUnIndicateStatus) + { + if (pAdapt->MiniportHandle != NULL) + { + NdisMIndicateStatus(pAdapt->MiniportHandle, + pAdapt->LatestUnIndicateStatus, + (PVOID)NULL, + 0); + NdisMIndicateStatusComplete(pAdapt->MiniportHandle); + pAdapt->LastIndicatedStatus = pAdapt->LatestUnIndicateStatus; + } + } + } + else + { + // + // Initialize LatestUnIndicatedStatus + // + pAdapt->LatestUnIndicateStatus = pAdapt->LastIndicatedStatus; + } + *BytesRead = sizeof(NDIS_DEVICE_POWER_STATE); + *BytesNeeded = 0; + } + else + { + *BytesRead = 0; + *BytesNeeded = sizeof (NDIS_DEVICE_POWER_STATE); + } + + DBGPRINT(("<==MPProcessSetPowerOid: Adapt %p\n", pAdapt)); +} + + +VOID +MPReturnPacket( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet + ) +/*++ + +Routine Description: + + NDIS Miniport entry point called whenever protocols are done with + a packet that we had indicated up and they had queued up for returning + later. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + Packet - packet being returned. + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + +#ifdef NDIS51 + // + // Packet stacking: Check if this packet belongs to us. + // + if (NdisGetPoolFromPacket(Packet) != pAdapt->RecvPacketPoolHandle) + { + // + // We reused the original packet in a receive indication. + // Simply return it to the miniport below us. + // + NdisReturnPackets(&Packet, 1); + } + else +#endif // NDIS51 + { + // + // This is a packet allocated from this IM's receive packet pool. + // Reclaim our packet, and return the original to the driver below. + // + + PNDIS_PACKET MyPacket; + PRECV_RSVD RecvRsvd; + + RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved); + MyPacket = RecvRsvd->OriginalPkt; + + NdisFreePacket(Packet); + NdisReturnPackets(&MyPacket, 1); + } +} + + +NDIS_STATUS +MPTransferData( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer + ) +/*++ + +Routine Description: + + Miniport's transfer data handler. + +Arguments: + + Packet Destination packet + BytesTransferred Place-holder for how much data was copied + MiniportAdapterContext Pointer to the adapter structure + MiniportReceiveContext Context + ByteOffset Offset into the packet for copying data + BytesToTransfer How much to copy. + +Return Value: + + Status of transfer + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + + // + // Return, if the device is OFF + // + + if (IsIMDeviceStateOn(pAdapt) == FALSE) + { + return NDIS_STATUS_FAILURE; + } + + NdisTransferData(&Status, + pAdapt->BindingHandle, + MiniportReceiveContext, + ByteOffset, + BytesToTransfer, + Packet, + BytesTransferred); + + return(Status); +} + +VOID +MPHalt( + IN NDIS_HANDLE MiniportAdapterContext + ) +/*++ + +Routine Description: + + Halt handler. All the hard-work for clean-up is done here. + +Arguments: + + MiniportAdapterContext Pointer to the Adapter + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + PADAPT *ppCursor; + + DBGPRINT(("==>MiniportHalt: Adapt %p\n", pAdapt)); + + pAdapt->MiniportHandle = NULL; + pAdapt->MiniportIsHalted = TRUE; + + // + // Remove this adapter from the global list + // + NdisAcquireSpinLock(&GlobalLock); + + for (ppCursor = &pAdaptList; *ppCursor != NULL; ppCursor = &(*ppCursor)->Next) + { + if (*ppCursor == pAdapt) + { + *ppCursor = pAdapt->Next; + break; + } + } + + NdisReleaseSpinLock(&GlobalLock); + + // + // Delete the ioctl interface that was created when the miniport + // was created. + // + (VOID)PtDeregisterDevice(); + + // + // If we have a valid bind, close the miniport below the protocol + // +#pragma prefast(suppress: __WARNING_DEREF_NULL_PTR, "pAdapt cannot be NULL") + if (pAdapt->BindingHandle != NULL) + { + // + // Close the binding below. and wait for it to complete + // + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(&Status, pAdapt->BindingHandle); + + if (Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + Status = pAdapt->Status; + } + + ASSERT (Status == NDIS_STATUS_SUCCESS); + + pAdapt->BindingHandle = NULL; + + PtDereferenceAdapt(pAdapt); + } + + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + + + DBGPRINT(("<== MiniportHalt: pAdapt %p\n", pAdapt)); +} + + +#ifdef NDIS51_MINIPORT + +VOID +MPCancelSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CancelId + ) +/*++ + +Routine Description: + + The miniport entry point to handle cancellation of all send packets + that match the given CancelId. If we have queued any packets that match + this, then we should dequeue them and call NdisMSendComplete for all + such packets, with a status of NDIS_STATUS_REQUEST_ABORTED. + + We should also call NdisCancelSendPackets in turn, on each lower binding + that this adapter corresponds to. This is to let miniports below cancel + any matching packets. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + CancelId - ID of packets to be cancelled. + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + + // + // If we queue packets on our adapter structure, this would be + // the place to acquire a spinlock to it, unlink any packets whose + // Id matches CancelId, release the spinlock and call NdisMSendComplete + // with NDIS_STATUS_REQUEST_ABORTED for all unlinked packets. + // + + // + // Next, pass this down so that we let the miniport(s) below cancel + // any packets that they might have queued. + // + NdisCancelSendPackets(pAdapt->BindingHandle, CancelId); + + return; +} + +VOID +MPDevicePnPEvent( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength + ) +/*++ + +Routine Description: + + This handler is called to notify us of PnP events directed to + our miniport device object. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + DevicePnPEvent - the event + InformationBuffer - Points to additional event-specific information + InformationBufferLength - length of above + +Return Value: + + None +--*/ +{ + // TBD - add code/comments about processing this. + + UNREFERENCED_PARAMETER(MiniportAdapterContext); + UNREFERENCED_PARAMETER(DevicePnPEvent); + UNREFERENCED_PARAMETER(InformationBuffer); + UNREFERENCED_PARAMETER(InformationBufferLength); + + return; +} + +VOID +MPAdapterShutdown( + IN NDIS_HANDLE MiniportAdapterContext + ) +/*++ + +Routine Description: + + This handler is called to notify us of an impending system shutdown. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + +Return Value: + + None +--*/ +{ + UNREFERENCED_PARAMETER(MiniportAdapterContext); + + return; +} + +#endif + + +VOID +MPFreeAllPacketPools( + IN PADAPT pAdapt + ) +/*++ + +Routine Description: + + Free all packet pools on the specified adapter. + +Arguments: + + pAdapt - pointer to ADAPT structure + +Return Value: + + None + +--*/ +{ + if (pAdapt->RecvPacketPoolHandle != NULL) + { + // + // Free the packet pool that is used to indicate receives + // + NdisFreePacketPool(pAdapt->RecvPacketPoolHandle); + + pAdapt->RecvPacketPoolHandle = NULL; + } + + if (pAdapt->SendPacketPoolHandle != NULL) + { + + // + // Free the packet pool that is used to send packets below + // + + NdisFreePacketPool(pAdapt->SendPacketPoolHandle); + + pAdapt->SendPacketPoolHandle = NULL; + + } +} + diff --git a/modified_passthru/passthru.c b/modified_passthru/passthru.c new file mode 100644 index 0000000..c366173 --- /dev/null +++ b/modified_passthru/passthru.c @@ -0,0 +1,469 @@ +/*++ + +Copyright (c) 1992-2000 Microsoft Corporation + +Module Name: + + passthru.c + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + + +#include "precomp.h" +#pragma hdrstop + +#pragma NDIS_INIT_FUNCTION(DriverEntry) + +NDIS_HANDLE ProtHandle = NULL; +NDIS_HANDLE DriverHandle = NULL; +NDIS_MEDIUM MediumArray[4] = + { + NdisMedium802_3, // Ethernet + NdisMedium802_5, // Token-ring + NdisMediumFddi, // Fddi + NdisMediumWan // NDISWAN + }; + +NDIS_SPIN_LOCK GlobalLock; + +PADAPT pAdaptList = NULL; +LONG MiniportCount = 0; + +NDIS_HANDLE NdisWrapperHandle; + +// +// To support ioctls from user-mode: +// + +#define STR2(x) #x +#define STR(x) STR2(x) +#define DOSPREFIX "\\DosDevices\\" +#define NTPREFIX "\\Device\\" +#define WIDEN2(x) L ## x +#define WIDEN(x) WIDEN2(x) +#define LINKNAME_STRING WIDEN(DOSPREFIX) WIDEN(STR(MODULENAME)) +#define NTDEVICE_STRING WIDEN(NTPREFIX) WIDEN(STR(MODULENAME)) +#define PROTOCOLNAME_STRING WIDEN(STR(MODULENAME)) + +NDIS_HANDLE NdisDeviceHandle = NULL; +PDEVICE_OBJECT ControlDeviceObject = NULL; + +enum _DEVICE_STATE +{ + PS_DEVICE_STATE_READY = 0, // ready for create/delete + PS_DEVICE_STATE_CREATING, // create operation in progress + PS_DEVICE_STATE_DELETING // delete operation in progress +} ControlDeviceState = PS_DEVICE_STATE_READY; + + + +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ) +/*++ + +Routine Description: + + First entry point to be called, when this driver is loaded. + Register with NDIS as an intermediate driver. + +Arguments: + + DriverObject - pointer to the system's driver object structure + for this driver + + RegistryPath - system's registry path for this driver + +Return Value: + + STATUS_SUCCESS if all initialization is successful, STATUS_XXX + error code if not. + +--*/ +{ + NDIS_STATUS Status; + NDIS_PROTOCOL_CHARACTERISTICS PChars; + NDIS_MINIPORT_CHARACTERISTICS MChars; + NDIS_STRING Name; + + Status = NDIS_STATUS_SUCCESS; + NdisAllocateSpinLock(&GlobalLock); + + NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL); + + do + { + // + // Register the miniport with NDIS. Note that it is the miniport + // which was started as a driver and not the protocol. Also the miniport + // must be registered prior to the protocol since the protocol's BindAdapter + // handler can be initiated anytime and when it is, it must be ready to + // start driver instances. + // + + NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS)); + + MChars.MajorNdisVersion = PASSTHRU_MAJOR_NDIS_VERSION; + MChars.MinorNdisVersion = PASSTHRU_MINOR_NDIS_VERSION; + + MChars.InitializeHandler = MPInitialize; + MChars.QueryInformationHandler = MPQueryInformation; + MChars.SetInformationHandler = MPSetInformation; + MChars.ResetHandler = NULL; + MChars.TransferDataHandler = MPTransferData; + MChars.HaltHandler = MPHalt; +#ifdef NDIS51_MINIPORT + MChars.CancelSendPacketsHandler = MPCancelSendPackets; + MChars.PnPEventNotifyHandler = MPDevicePnPEvent; + MChars.AdapterShutdownHandler = MPAdapterShutdown; +#endif // NDIS51_MINIPORT + + // + // We will disable the check for hang timeout so we do not + // need a check for hang handler! + // + MChars.CheckForHangHandler = NULL; + MChars.ReturnPacketHandler = MPReturnPacket; + + // + // Either the Send or the SendPackets handler should be specified. + // If SendPackets handler is specified, SendHandler is ignored + // + MChars.SendHandler = MPSend; // IPFW: use MPSend, not SendPackets + MChars.SendPacketsHandler = NULL; + + Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, + &MChars, + sizeof(MChars), + &DriverHandle); + if (Status != NDIS_STATUS_SUCCESS) + { + break; + } + +#ifndef WIN9X + NdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload); +#endif + + // + // Now register the protocol. + // + NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); + PChars.MajorNdisVersion = PASSTHRU_PROT_MAJOR_NDIS_VERSION; + PChars.MinorNdisVersion = PASSTHRU_PROT_MINOR_NDIS_VERSION; + + // + // Make sure the protocol-name matches the service-name + // (from the INF) under which this protocol is installed. + // This is needed to ensure that NDIS can correctly determine + // the binding and call us to bind to miniports below. + // + NdisInitUnicodeString(&Name, PROTOCOLNAME_STRING); // Protocol name + PChars.Name = Name; + PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete; + PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete; + PChars.SendCompleteHandler = PtSendComplete; + PChars.TransferDataCompleteHandler = PtTransferDataComplete; + + PChars.ResetCompleteHandler = PtResetComplete; + PChars.RequestCompleteHandler = PtRequestComplete; + PChars.ReceiveHandler = PtReceive; + PChars.ReceiveCompleteHandler = PtReceiveComplete; + PChars.StatusHandler = PtStatus; + PChars.StatusCompleteHandler = PtStatusComplete; + PChars.BindAdapterHandler = PtBindAdapter; + PChars.UnbindAdapterHandler = PtUnbindAdapter; + PChars.UnloadHandler = PtUnloadProtocol; + + PChars.ReceivePacketHandler = PtReceivePacket; + PChars.PnPEventHandler= PtPNPHandler; + + NdisRegisterProtocol(&Status, + &ProtHandle, + &PChars, + sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); + + if (Status != NDIS_STATUS_SUCCESS) + { + NdisIMDeregisterLayeredMiniport(DriverHandle); + break; + } + + NdisIMAssociateMiniport(DriverHandle, ProtHandle); + } + while (FALSE); + + if (Status != NDIS_STATUS_SUCCESS) + { + NdisTerminateWrapper(NdisWrapperHandle, NULL); + } + + ipfw_module_init(); // IPFW - start the system + + return(Status); +} + + +NDIS_STATUS +PtRegisterDevice( + VOID + ) +/*++ + +Routine Description: + + Register an ioctl interface - a device object to be used for this + purpose is created by NDIS when we call NdisMRegisterDevice. + + This routine is called whenever a new miniport instance is + initialized. However, we only create one global device object, + when the first miniport instance is initialized. This routine + handles potential race conditions with PtDeregisterDevice via + the ControlDeviceState and MiniportCount variables. + + NOTE: do not call this from DriverEntry; it will prevent the driver + from being unloaded (e.g. on uninstall). + +Arguments: + + None + +Return Value: + + NDIS_STATUS_SUCCESS if we successfully register a device object. + +--*/ +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + UNICODE_STRING DeviceName; + UNICODE_STRING DeviceLinkUnicodeString; + PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; + + DBGPRINT(("==>PtRegisterDevice\n")); + + NdisAcquireSpinLock(&GlobalLock); + + ++MiniportCount; + + if (1 == MiniportCount) + { + ASSERT(ControlDeviceState != PS_DEVICE_STATE_CREATING); + + // + // Another thread could be running PtDeregisterDevice on + // behalf of another miniport instance. If so, wait for + // it to exit. + // + while (ControlDeviceState != PS_DEVICE_STATE_READY) + { + NdisReleaseSpinLock(&GlobalLock); + NdisMSleep(1); + NdisAcquireSpinLock(&GlobalLock); + } + + ControlDeviceState = PS_DEVICE_STATE_CREATING; + + NdisReleaseSpinLock(&GlobalLock); + + + NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH)); + + DispatchTable[IRP_MJ_CREATE] = PtDispatch; + DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; + DispatchTable[IRP_MJ_CLOSE] = PtDispatch; + // IPFW we use DevIoControl ? + DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl; + + + NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); + NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); + + // + // Create a device object and register our dispatch handlers + // + + Status = NdisMRegisterDevice( + NdisWrapperHandle, + &DeviceName, + &DeviceLinkUnicodeString, + &DispatchTable[0], + &ControlDeviceObject, + &NdisDeviceHandle + ); + + NdisAcquireSpinLock(&GlobalLock); + + ControlDeviceState = PS_DEVICE_STATE_READY; + } + + NdisReleaseSpinLock(&GlobalLock); + + DBGPRINT(("<==PtRegisterDevice: %x\n", Status)); + + return (Status); +} + + +NTSTATUS +PtDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +/*++ +Routine Description: + + Process IRPs sent to this device. + +Arguments: + + DeviceObject - pointer to a device object + Irp - pointer to an I/O Request Packet + +Return Value: + + NTSTATUS - STATUS_SUCCESS always - change this when adding + real code to handle ioctls. + +--*/ +{ + PIO_STACK_LOCATION irpStack; + NTSTATUS status = STATUS_SUCCESS; + + UNREFERENCED_PARAMETER(DeviceObject); + + DBGPRINT(("==>Pt Dispatch\n")); + irpStack = IoGetCurrentIrpStackLocation(Irp); + + + switch (irpStack->MajorFunction) + { + case IRP_MJ_CREATE: + break; + + case IRP_MJ_CLEANUP: + break; + + case IRP_MJ_CLOSE: + break; + + case IRP_MJ_DEVICE_CONTROL: + // + // Add code here to handle ioctl commands sent to passthru. + // + break; + default: + break; + } + + Irp->IoStatus.Status = status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + DBGPRINT(("<== Pt Dispatch\n")); + + return status; + +} + + +NDIS_STATUS +PtDeregisterDevice( + VOID + ) +/*++ + +Routine Description: + + Deregister the ioctl interface. This is called whenever a miniport + instance is halted. When the last miniport instance is halted, we + request NDIS to delete the device object + +Arguments: + + NdisDeviceHandle - Handle returned by NdisMRegisterDevice + +Return Value: + + NDIS_STATUS_SUCCESS if everything worked ok + +--*/ +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + DBGPRINT(("==>PassthruDeregisterDevice\n")); + + NdisAcquireSpinLock(&GlobalLock); + + ASSERT(MiniportCount > 0); + + --MiniportCount; + + if (0 == MiniportCount) + { + // + // All miniport instances have been halted. Deregister + // the control device. + // + + ASSERT(ControlDeviceState == PS_DEVICE_STATE_READY); + + // + // Block PtRegisterDevice() while we release the control + // device lock and deregister the device. + // + ControlDeviceState = PS_DEVICE_STATE_DELETING; + + NdisReleaseSpinLock(&GlobalLock); + + if (NdisDeviceHandle != NULL) + { + Status = NdisMDeregisterDevice(NdisDeviceHandle); + NdisDeviceHandle = NULL; + } + + NdisAcquireSpinLock(&GlobalLock); + ControlDeviceState = PS_DEVICE_STATE_READY; + } + + NdisReleaseSpinLock(&GlobalLock); + + DBGPRINT(("<== PassthruDeregisterDevice: %x\n", Status)); + return Status; + +} + +VOID +PtUnload( + IN PDRIVER_OBJECT DriverObject + ) +// +// PassThru driver unload function +// +{ + UNREFERENCED_PARAMETER(DriverObject); + + DBGPRINT(("PtUnload: entered\n")); + + PtUnloadProtocol(); + + NdisIMDeregisterLayeredMiniport(DriverHandle); + + NdisFreeSpinLock(&GlobalLock); + + ipfw_module_exit(); // IPFW unloading dummynet + + DBGPRINT(("PtUnload: done!\n")); +} diff --git a/modified_passthru/passthru.h b/modified_passthru/passthru.h new file mode 100644 index 0000000..6e79db7 --- /dev/null +++ b/modified_passthru/passthru.h @@ -0,0 +1,500 @@ +/*++ + +Copyright (c) 1992-2000 Microsoft Corporation + +Module Name: + + passthru.h + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + +#ifdef NDIS51_MINIPORT +#define PASSTHRU_MAJOR_NDIS_VERSION 5 +#define PASSTHRU_MINOR_NDIS_VERSION 1 +#else +#define PASSTHRU_MAJOR_NDIS_VERSION 4 +#define PASSTHRU_MINOR_NDIS_VERSION 0 +#endif + +#ifdef NDIS51 +#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 5 +#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0 +#else +#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 4 +#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0 +#endif + +#define MAX_BUNDLEID_LENGTH 50 + +#define TAG 'ImPa' +#define WAIT_INFINITE 0 + + + +//advance declaration +typedef struct _ADAPT ADAPT, *PADAPT; + +DRIVER_INITIALIZE DriverEntry; +extern +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ); + +DRIVER_DISPATCH PtDispatch; +NTSTATUS +PtDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +DRIVER_DISPATCH DevIoControl; +NTSTATUS +DevIoControl( + IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIrp + ); + +NDIS_STATUS +PtRegisterDevice( + VOID + ); + +NDIS_STATUS +PtDeregisterDevice( + VOID + ); + +DRIVER_UNLOAD PtUnload; +VOID +PtUnloadProtocol( + VOID + ); + +// +// Protocol proto-types +// +extern +VOID +PtOpenAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus + ); + +extern +VOID +PtCloseAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ); + +extern +VOID +PtResetComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ); + +extern +VOID +PtRequestComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status + ); + +extern +VOID +PtStatus( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ); + +extern +VOID +PtStatusComplete( + IN NDIS_HANDLE ProtocolBindingContext + ); + +extern +VOID +PtSendComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ); + +extern +VOID +PtTransferDataComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ); + +extern +NDIS_STATUS +PtReceive( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ); + +extern +VOID +PtReceiveComplete( + IN NDIS_HANDLE ProtocolBindingContext + ); + +extern +INT +PtReceivePacket( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet + ); + +extern +VOID +PtBindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2 + ); + +extern +VOID +PtUnbindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext + ); + +VOID +PtUnload( + IN PDRIVER_OBJECT DriverObject + ); + + + +extern +NDIS_STATUS +PtPNPHandler( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT pNetPnPEvent + ); + + + + +NDIS_STATUS +PtPnPNetEventReconfigure( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ); + +NDIS_STATUS +PtPnPNetEventSetPower ( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ); + + +// +// Miniport proto-types +// +NDIS_STATUS +MPInitialize( + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE WrapperConfigurationContext + ); + +VOID +MPSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets + ); + +NDIS_STATUS +MPSend( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags + ); + +NDIS_STATUS +MPQueryInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded + ); + +NDIS_STATUS +MPSetInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +MPReturnPacket( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet + ); + +NDIS_STATUS +MPTransferData( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer + ); + +VOID +MPHalt( + IN NDIS_HANDLE MiniportAdapterContext + ); + + +VOID +MPQueryPNPCapabilities( + OUT PADAPT MiniportProtocolContext, + OUT PNDIS_STATUS Status + ); + + +#ifdef NDIS51_MINIPORT + +VOID +MPCancelSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CancelId + ); + +VOID +MPAdapterShutdown( + IN NDIS_HANDLE MiniportAdapterContext + ); + +VOID +MPDevicePnPEvent( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength + ); + +#endif // NDIS51_MINIPORT + +VOID +MPFreeAllPacketPools( + IN PADAPT pAdapt + ); + + +VOID +MPProcessSetPowerOid( + IN OUT PNDIS_STATUS pNdisStatus, + IN PADAPT pAdapt, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +PtReferenceAdapt( + IN PADAPT pAdapt + ); + +BOOLEAN +PtDereferenceAdapt( + IN PADAPT pAdapt + ); + +// +// There should be no DbgPrint's in the Free version of the driver +// +#if DBG + +#define DBGPRINT(Fmt) \ + { \ + DbgPrint("Passthru: "); \ + DbgPrint Fmt; \ + } + +#else // if DBG + +#define DBGPRINT(Fmt) + +#endif // if DBG + +#define NUM_PKTS_IN_POOL 256 + + +// +// Protocol reserved part of a sent packet that is allocated by us. +// +typedef struct _SEND_RSVD +{ + PNDIS_PACKET OriginalPkt; + struct mbuf* pMbuf; // IPFW extension, reference to the mbuf +} SEND_RSVD, *PSEND_RSVD; + +// +// Miniport reserved part of a received packet that is allocated by +// us. Note that this should fit into the MiniportReserved space +// in an NDIS_PACKET. +// +typedef struct _RECV_RSVD +{ + PNDIS_PACKET OriginalPkt; + struct mbuf* pMbuf; // IPFW extension, reference to the mbuf +} RECV_RSVD, *PRECV_RSVD; + +C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved)); + +// +// Event Codes related to the PassthruEvent Structure +// + +typedef enum +{ + Passthru_Invalid, + Passthru_SetPower, + Passthru_Unbind + +} PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE; + +// +// Passthru Event with a code to state why they have been state +// + +typedef struct _PASSTHRU_EVENT +{ + NDIS_EVENT Event; + PASSSTHRU_EVENT_CODE Code; + +} PASSTHRU_EVENT, *PPASSTHRU_EVENT; + + +// +// Structure used by both the miniport as well as the protocol part of the intermediate driver +// to represent an adapter and its corres. lower bindings +// +typedef struct _ADAPT +{ + struct _ADAPT * Next; + + NDIS_HANDLE BindingHandle; // To the lower miniport + NDIS_HANDLE MiniportHandle; // NDIS Handle to for miniport up-calls + NDIS_HANDLE SendPacketPoolHandle; + NDIS_HANDLE RecvPacketPoolHandle; + NDIS_STATUS Status; // Open Status + NDIS_EVENT Event; // Used by bind/halt for Open/Close Adapter synch. + NDIS_MEDIUM Medium; + NDIS_REQUEST Request; // This is used to wrap a request coming down + // to us. This exploits the fact that requests + // are serialized down to us. + PULONG BytesNeeded; + PULONG BytesReadOrWritten; + BOOLEAN ReceivedIndicationFlags[32]; + + BOOLEAN OutstandingRequests; // TRUE iff a request is pending + // at the miniport below + BOOLEAN QueuedRequest; // TRUE iff a request is queued at + // this IM miniport + + BOOLEAN StandingBy; // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State + BOOLEAN UnbindingInProcess; + NDIS_SPIN_LOCK Lock; + // False - At all other times, - Flag is cleared after a transition to D0 + + NDIS_DEVICE_POWER_STATE MPDeviceState; // Miniport's Device State + NDIS_DEVICE_POWER_STATE PTDeviceState; // Protocol's Device State + NDIS_STRING DeviceName; // For initializing the miniport edge + NDIS_EVENT MiniportInitEvent; // For blocking UnbindAdapter while + // an IM Init is in progress. + BOOLEAN MiniportInitPending; // TRUE iff IMInit in progress + NDIS_STATUS LastIndicatedStatus; // The last indicated media status + NDIS_STATUS LatestUnIndicateStatus; // The latest suppressed media status + ULONG OutstandingSends; + LONG RefCount; + BOOLEAN MiniportIsHalted; +} ADAPT, *PADAPT; + +extern NDIS_HANDLE ProtHandle, DriverHandle; +extern NDIS_MEDIUM MediumArray[4]; +extern PADAPT pAdaptList; +extern NDIS_SPIN_LOCK GlobalLock; + + +#define ADAPT_MINIPORT_HANDLE(_pAdapt) ((_pAdapt)->MiniportHandle) +#define ADAPT_DECR_PENDING_SENDS(_pAdapt) \ + { \ + NdisAcquireSpinLock(&(_pAdapt)->Lock); \ + (_pAdapt)->OutstandingSends--; \ + NdisReleaseSpinLock(&(_pAdapt)->Lock); \ + } + +// +// Custom Macros to be used by the passthru driver +// +/* +BOOLEAN +IsIMDeviceStateOn( + PADAPT + ) + +*/ +#define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) + +#include "winmissing.h" + +int ipfw_module_init(void); +void ipfw_module_exit(void); +int ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction, + NDIS_HANDLE Context); +int ipfw2_qhandler_w32_oldstyle(int direction, NDIS_HANDLE ProtocolBindingContext, + unsigned char* HeaderBuffer, unsigned int HeaderBufferSize, + unsigned char* LookAheadBuffer, unsigned int LookAheadBufferSize, + unsigned int PacketSize); +void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt); +void hexdump(PUCHAR,int, const char *); +void my_init(); +void my_exit(); \ No newline at end of file diff --git a/modified_passthru/precomp.h b/modified_passthru/precomp.h new file mode 100644 index 0000000..b2870d1 --- /dev/null +++ b/modified_passthru/precomp.h @@ -0,0 +1,11 @@ +#pragma warning(disable:4214) // bit field types other than int + +#pragma warning(disable:4201) // nameless struct/union +#pragma warning(disable:4115) // named type definition in parentheses +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4054) // cast of function pointer to PVOID +#pragma warning(disable:4244) // conversion from 'int' to 'BOOLEAN', possible loss of data + +#include +#include "passthru.h" + diff --git a/modified_passthru/protocol.c b/modified_passthru/protocol.c new file mode 100644 index 0000000..9db4c36 --- /dev/null +++ b/modified_passthru/protocol.c @@ -0,0 +1,1670 @@ +/*++ + +Copyright(c) 1992-2000 Microsoft Corporation + +Module Name: + + protocol.c + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + + +#include "precomp.h" +#pragma hdrstop + +#define MAX_PACKET_POOL_SIZE 0x0000FFFF +#define MIN_PACKET_POOL_SIZE 0x000000FF + +// +// NDIS version as 0xMMMMmmmm, where M=Major/m=minor (0x00050001 = 5.1); +// initially unknown (0) +// +ULONG NdisDotSysVersion = 0x0; + + +#define NDIS_SYS_VERSION_51 0x00050001 + + +VOID +PtBindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2 + ) +/*++ + +Routine Description: + + Called by NDIS to bind to a miniport below. + +Arguments: + + Status - Return status of bind here. + BindContext - Can be passed to NdisCompleteBindAdapter if this call is pended. + DeviceName - Device name to bind to. This is passed to NdisOpenAdapter. + SystemSpecific1 - Can be passed to NdisOpenProtocolConfiguration to read per-binding information + SystemSpecific2 - Unused + +Return Value: + + NDIS_STATUS_PENDING if this call is pended. In this case call NdisCompleteBindAdapter + to complete. + Anything else Completes this call synchronously + +--*/ +{ + NDIS_HANDLE ConfigHandle = NULL; + PNDIS_CONFIGURATION_PARAMETER Param; + NDIS_STRING DeviceStr = NDIS_STRING_CONST("UpperBindings"); + NDIS_STRING NdisVersionStr = NDIS_STRING_CONST("NdisVersion"); + PADAPT pAdapt = NULL; + NDIS_STATUS Sts; + UINT MediumIndex; + ULONG TotalSize; + BOOLEAN NoCleanUpNeeded = FALSE; + + + UNREFERENCED_PARAMETER(BindContext); + UNREFERENCED_PARAMETER(SystemSpecific2); + + DBGPRINT(("==> Protocol BindAdapter\n")); + + do + { + // + // Access the configuration section for our binding-specific + // parameters. + // + NdisOpenProtocolConfiguration(Status, + &ConfigHandle, + SystemSpecific1); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + if (NdisDotSysVersion == 0) + { + NdisReadConfiguration(Status, + &Param, + ConfigHandle, + &NdisVersionStr, // "NdisVersion" + NdisParameterInteger); + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + NdisDotSysVersion = Param->ParameterData.IntegerData; + } + + + // + // Read the "UpperBindings" reserved key that contains a list + // of device names representing our miniport instances corresponding + // to this lower binding. Since this is a 1:1 IM driver, this key + // contains exactly one name. + // + // If we want to implement a N:1 mux driver (N adapter instances + // over a single lower binding), then UpperBindings will be a + // MULTI_SZ containing a list of device names - we would loop through + // this list, calling NdisIMInitializeDeviceInstanceEx once for + // each name in it. + // + NdisReadConfiguration(Status, + &Param, + ConfigHandle, + &DeviceStr, + NdisParameterString); + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Allocate memory for the Adapter structure. This represents both the + // protocol context as well as the adapter structure when the miniport + // is initialized. + // + // In addition to the base structure, allocate space for the device + // instance string. + // + TotalSize = sizeof(ADAPT) + Param->ParameterData.StringData.MaximumLength; + + NdisAllocateMemoryWithTag(&pAdapt, TotalSize, TAG); + + if (pAdapt == NULL) + { + *Status = NDIS_STATUS_RESOURCES; + break; + } + + // + // Initialize the adapter structure. We copy in the IM device + // name as well, because we may need to use it in a call to + // NdisIMCancelInitializeDeviceInstance. The string returned + // by NdisReadConfiguration is active (i.e. available) only + // for the duration of this call to our BindAdapter handler. + // + NdisZeroMemory(pAdapt, TotalSize); + pAdapt->DeviceName.MaximumLength = Param->ParameterData.StringData.MaximumLength; + pAdapt->DeviceName.Length = Param->ParameterData.StringData.Length; + pAdapt->DeviceName.Buffer = (PWCHAR)((ULONG_PTR)pAdapt + sizeof(ADAPT)); + NdisMoveMemory(pAdapt->DeviceName.Buffer, + Param->ParameterData.StringData.Buffer, + Param->ParameterData.StringData.MaximumLength); + + + + NdisInitializeEvent(&pAdapt->Event); + NdisAllocateSpinLock(&pAdapt->Lock); + + // + // Allocate a packet pool for sends. We need this to pass sends down. + // We cannot use the same packet descriptor that came down to our send + // handler (see also NDIS 5.1 packet stacking). + // + NdisAllocatePacketPoolEx(Status, + &pAdapt->SendPacketPoolHandle, + MIN_PACKET_POOL_SIZE, + MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE, + sizeof(SEND_RSVD)); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Allocate a packet pool for receives. We need this to indicate receives. + // Same consideration as sends (see also NDIS 5.1 packet stacking). + // + NdisAllocatePacketPoolEx(Status, + &pAdapt->RecvPacketPoolHandle, + MIN_PACKET_POOL_SIZE, + MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE, + PROTOCOL_RESERVED_SIZE_IN_PACKET); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Now open the adapter below and complete the initialization + // + NdisOpenAdapter(Status, + &Sts, + &pAdapt->BindingHandle, + &MediumIndex, + MediumArray, + sizeof(MediumArray)/sizeof(NDIS_MEDIUM), + ProtHandle, + pAdapt, + DeviceName, + 0, + NULL); + + if (*Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + *Status = pAdapt->Status; + } + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + PtReferenceAdapt(pAdapt); + +#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "Ndis guarantees MediumIndex to be within bounds"); + pAdapt->Medium = MediumArray[MediumIndex]; + + // + // Now ask NDIS to initialize our miniport (upper) edge. + // Set the flag below to synchronize with a possible call + // to our protocol Unbind handler that may come in before + // our miniport initialization happens. + // + pAdapt->MiniportInitPending = TRUE; + NdisInitializeEvent(&pAdapt->MiniportInitEvent); + + PtReferenceAdapt(pAdapt); + + *Status = NdisIMInitializeDeviceInstanceEx(DriverHandle, + &pAdapt->DeviceName, + pAdapt); + + if (*Status != NDIS_STATUS_SUCCESS) + { + if (pAdapt->MiniportIsHalted == TRUE) + { + NoCleanUpNeeded = TRUE; + } + + DBGPRINT(("BindAdapter: Adapt %p, IMInitializeDeviceInstance error %x\n", + pAdapt, *Status)); + + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + + break; + } + + PtDereferenceAdapt(pAdapt); + + } while(FALSE); + + // + // Close the configuration handle now - see comments above with + // the call to NdisIMInitializeDeviceInstanceEx. + // + if (ConfigHandle != NULL) + { + NdisCloseConfiguration(ConfigHandle); + } + + if ((*Status != NDIS_STATUS_SUCCESS) && (NoCleanUpNeeded == FALSE)) + { + if (pAdapt != NULL) + { + if (pAdapt->BindingHandle != NULL) + { + NDIS_STATUS LocalStatus; + + // + // Close the binding we opened above. + // + + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(&LocalStatus, pAdapt->BindingHandle); + pAdapt->BindingHandle = NULL; + + if (LocalStatus == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + LocalStatus = pAdapt->Status; + + + } + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + } + } + } + + + DBGPRINT(("<== Protocol BindAdapter: pAdapt %p, Status %x\n", pAdapt, *Status)); +} + + +VOID +PtOpenAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus + ) +/*++ + +Routine Description: + + Completion routine for NdisOpenAdapter issued from within the PtBindAdapter. Simply + unblock the caller. + +Arguments: + + ProtocolBindingContext Pointer to the adapter + Status Status of the NdisOpenAdapter call + OpenErrorStatus Secondary status(ignored by us). + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + UNREFERENCED_PARAMETER(OpenErrorStatus); + + DBGPRINT(("==> PtOpenAdapterComplete: Adapt %p, Status %x\n", pAdapt, Status)); + pAdapt->Status = Status; + NdisSetEvent(&pAdapt->Event); +} + + +VOID +PtUnbindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext + ) +/*++ + +Routine Description: + + Called by NDIS when we are required to unbind to the adapter below. + This functions shares functionality with the miniport's HaltHandler. + The code should ensure that NdisCloseAdapter and NdisFreeMemory is called + only once between the two functions + +Arguments: + + Status Placeholder for return status + ProtocolBindingContext Pointer to the adapter structure + UnbindContext Context for NdisUnbindComplete() if this pends + +Return Value: + + Status for NdisIMDeinitializeDeviceContext + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS LocalStatus; + + UNREFERENCED_PARAMETER(UnbindContext); + + DBGPRINT(("==> PtUnbindAdapter: Adapt %p\n", pAdapt)); + + // + // Set the flag that the miniport below is unbinding, so the request handlers will + // fail any request comming later + // + NdisAcquireSpinLock(&pAdapt->Lock); + pAdapt->UnbindingInProcess = TRUE; + if (pAdapt->QueuedRequest == TRUE) + { + pAdapt->QueuedRequest = FALSE; + NdisReleaseSpinLock(&pAdapt->Lock); + + PtRequestComplete(pAdapt, + &pAdapt->Request, + NDIS_STATUS_FAILURE ); + + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } +#ifndef WIN9X + // + // Check if we had called NdisIMInitializeDeviceInstanceEx and + // we are awaiting a call to MiniportInitialize. + // + if (pAdapt->MiniportInitPending == TRUE) + { + // + // Try to cancel the pending IMInit process. + // + LocalStatus = NdisIMCancelInitializeDeviceInstance( + DriverHandle, + &pAdapt->DeviceName); + + if (LocalStatus == NDIS_STATUS_SUCCESS) + { + // + // Successfully cancelled IM Initialization; our + // Miniport Initialize routine will not be called + // for this device. + // + pAdapt->MiniportInitPending = FALSE; + ASSERT(pAdapt->MiniportHandle == NULL); + } + else + { + // + // Our Miniport Initialize routine will be called + // (may be running on another thread at this time). + // Wait for it to finish. + // + NdisWaitEvent(&pAdapt->MiniportInitEvent, 0); + ASSERT(pAdapt->MiniportInitPending == FALSE); + } + + } +#endif // !WIN9X + + // + // Call NDIS to remove our device-instance. We do most of the work + // inside the HaltHandler. + // + // The Handle will be NULL if our miniport Halt Handler has been called or + // if the IM device was never initialized + // + + if (pAdapt->MiniportHandle != NULL) + { + *Status = NdisIMDeInitializeDeviceInstance(pAdapt->MiniportHandle); + + if (*Status != NDIS_STATUS_SUCCESS) + { + *Status = NDIS_STATUS_FAILURE; + } + } + else + { + // + // We need to do some work here. + // Close the binding below us + // and release the memory allocated. + // + + if(pAdapt->BindingHandle != NULL) + { + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(Status, pAdapt->BindingHandle); + + // + // Wait for it to complete + // + if(*Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + *Status = pAdapt->Status; + } + pAdapt->BindingHandle = NULL; + } + else + { + // + // Both Our MiniportHandle and Binding Handle should not be NULL. + // + *Status = NDIS_STATUS_FAILURE; + ASSERT(0); + } + + // + // Free the memory here, if was not released earlier(by calling the HaltHandler) + // + MPFreeAllPacketPools(pAdapt); + NdisFreeSpinLock(&pAdapt->Lock); + NdisFreeMemory(pAdapt, 0, 0); + } + + DBGPRINT(("<== PtUnbindAdapter: Adapt %p\n", pAdapt)); +} + +VOID +PtUnloadProtocol( + VOID +) +{ + NDIS_STATUS Status; + + if (ProtHandle != NULL) + { + NdisDeregisterProtocol(&Status, ProtHandle); + ProtHandle = NULL; + } + + DBGPRINT(("PtUnloadProtocol: done!\n")); +} + + + +VOID +PtCloseAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion for the CloseAdapter call. + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + Status Completion status + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + DBGPRINT(("CloseAdapterComplete: Adapt %p, Status %x\n", pAdapt, Status)); + pAdapt->Status = Status; + NdisSetEvent(&pAdapt->Event); +} + + +VOID +PtResetComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion for the reset. + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + Status Completion status + +Return Value: + + None. + +--*/ +{ + + UNREFERENCED_PARAMETER(ProtocolBindingContext); + UNREFERENCED_PARAMETER(Status); + // + // We never issue a reset, so we should not be here. + // + ASSERT(0); +} + + +VOID +PtRequestComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion handler for the previously posted request. All OIDS + are completed by and sent to the same miniport that they were requested for. + If Oid == OID_PNP_QUERY_POWER then the data structure needs to returned with all entries = + NdisDeviceStateUnspecified + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + NdisRequest The posted request + Status Completion status + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + NDIS_OID Oid = pAdapt->Request.DATA.SET_INFORMATION.Oid ; + + // + // Since our request is not outstanding anymore + // + ASSERT(pAdapt->OutstandingRequests == TRUE); + + pAdapt->OutstandingRequests = FALSE; + + // + // Complete the Set or Query, and fill in the buffer for OID_PNP_CAPABILITIES, if need be. + // + switch (NdisRequest->RequestType) + { + case NdisRequestQueryInformation: + + // + // We never pass OID_PNP_QUERY_POWER down. + // + ASSERT(Oid != OID_PNP_QUERY_POWER); + + if ((Oid == OID_PNP_CAPABILITIES) && (Status == NDIS_STATUS_SUCCESS)) + { + MPQueryPNPCapabilities(pAdapt, &Status); + } + *pAdapt->BytesReadOrWritten = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten; + *pAdapt->BytesNeeded = NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded; + + if (((Oid == OID_GEN_MAC_OPTIONS) + && (Status == NDIS_STATUS_SUCCESS)) + && (NdisDotSysVersion >= NDIS_SYS_VERSION_51)) + { + // + // Only do this on Windows XP or greater (NDIS.SYS v 5.1); + // do not do in Windows 2000 (NDIS.SYS v 5.0)) + // + + // + // Remove the no-loopback bit from mac-options. In essence we are + // telling NDIS that we can handle loopback. We don't, but the + // interface below us does. If we do not do this, then loopback + // processing happens both below us and above us. This is wasteful + // at best and if Netmon is running, it will see multiple copies + // of loopback packets when sniffing above us. + // + // Only the lowest miniport is a stack of layered miniports should + // ever report this bit set to NDIS. + // + *(PULONG)NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer &= ~NDIS_MAC_OPTION_NO_LOOPBACK; + } + + NdisMQueryInformationComplete(pAdapt->MiniportHandle, + Status); + break; + + case NdisRequestSetInformation: + + ASSERT( Oid != OID_PNP_SET_POWER); + + *pAdapt->BytesReadOrWritten = NdisRequest->DATA.SET_INFORMATION.BytesRead; + *pAdapt->BytesNeeded = NdisRequest->DATA.SET_INFORMATION.BytesNeeded; + NdisMSetInformationComplete(pAdapt->MiniportHandle, + Status); + break; + + default: + ASSERT(0); + break; + } + +} + + +VOID +PtStatus( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ) +/*++ + +Routine Description: + + Status handler for the lower-edge(protocol). + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + GeneralStatus Status code + StatusBuffer Status buffer + StatusBufferSize Size of the status buffer + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + + // + // Pass up this indication only if the upper edge miniport is initialized + // and powered on. Also ignore indications that might be sent by the lower + // miniport when it isn't at D0. + // + if ((pAdapt->MiniportHandle != NULL) && + (pAdapt->MPDeviceState == NdisDeviceStateD0) && + (pAdapt->PTDeviceState == NdisDeviceStateD0)) + { + if ((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || + (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT)) + { + + pAdapt->LastIndicatedStatus = GeneralStatus; + } + NdisMIndicateStatus(pAdapt->MiniportHandle, + GeneralStatus, + StatusBuffer, + StatusBufferSize); + } + // + // Save the last indicated media status + // + else + { + if ((pAdapt->MiniportHandle != NULL) && + ((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || + (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT))) + { + pAdapt->LatestUnIndicateStatus = GeneralStatus; + } + } + +} + + +VOID +PtStatusComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +/*++ + +Routine Description: + + +Arguments: + + +Return Value: + + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + + // + // Pass up this indication only if the upper edge miniport is initialized + // and powered on. Also ignore indications that might be sent by the lower + // miniport when it isn't at D0. + // + if ((pAdapt->MiniportHandle != NULL) && + (pAdapt->MPDeviceState == NdisDeviceStateD0) && + (pAdapt->PTDeviceState == NdisDeviceStateD0)) + { + NdisMIndicateStatusComplete(pAdapt->MiniportHandle); + } +} + + +VOID +PtSendComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Called by NDIS when the miniport below had completed a send. We should + complete the corresponding upper-edge send this represents. + +Arguments: + + ProtocolBindingContext - Points to ADAPT structure + Packet - Low level packet being completed + Status - status of send + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + PNDIS_PACKET Pkt; + NDIS_HANDLE PoolHandle; + +#ifdef NDIS51 + // + // Packet stacking: + // + // Determine if the packet we are completing is the one we allocated. If so, then + // get the original packet from the reserved area and completed it and free the + // allocated packet. If this is the packet that was sent down to us, then just + // complete it + // + PoolHandle = NdisGetPoolFromPacket(Packet); + if (PoolHandle != pAdapt->SendPacketPoolHandle) + { + // + // We had passed down a packet belonging to the protocol above us. + // + // DBGPRINT(("PtSendComp: Adapt %p, Stacked Packet %p\n", pAdapt, Packet)); + + NdisMSendComplete(pAdapt->MiniportHandle, + Packet, + Status); + } + else +#endif // NDIS51 + { + PSEND_RSVD SendRsvd; + + SendRsvd = (PSEND_RSVD)(Packet->ProtocolReserved); + Pkt = SendRsvd->OriginalPkt; + +#if 1 // IPFW - new code + //DbgPrint("SendComplete: packet %p pkt %p\n", Packet, Pkt); + if (Pkt == NULL) { //this is a reinjected packet, with no 'father' + CleanupReinjected(Packet, SendRsvd->pMbuf, pAdapt); + return; + } +#endif /* IPFW */ + +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); +#endif + + NdisDprFreePacket(Packet); + + NdisMSendComplete(pAdapt->MiniportHandle, + Pkt, + Status); + } + // + // Decrease the outstanding send count + // + ADAPT_DECR_PENDING_SENDS(pAdapt); +} + + +VOID +PtTransferDataComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ) +/*++ + +Routine Description: + + Entry point called by NDIS to indicate completion of a call by us + to NdisTransferData. + + See notes under SendComplete. + +Arguments: + +Return Value: + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + if(pAdapt->MiniportHandle) + { + NdisMTransferDataComplete(pAdapt->MiniportHandle, + Packet, + Status, + BytesTransferred); + } +} + + +NDIS_STATUS +PtReceive( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookAheadBufferSize, + IN UINT PacketSize + ) +/*++ + +Routine Description: + + Handle receive data indicated up by the miniport below. We pass + it along to the protocol above us. + + If the miniport below indicates packets, NDIS would more + likely call us at our ReceivePacket handler. However we + might be called here in certain situations even though + the miniport below has indicated a receive packet, e.g. + if the miniport had set packet status to NDIS_STATUS_RESOURCES. + +Arguments: + + + +Return Value: + + NDIS_STATUS_SUCCESS if we processed the receive successfully, + NDIS_STATUS_XXX error code if we discarded it. + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + PNDIS_PACKET MyPacket, Packet = NULL; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + ULONG Proc = KeGetCurrentProcessorNumber(); + + if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0)) + { + Status = NDIS_STATUS_FAILURE; + } + else do + { + // + // Get at the packet, if any, indicated up by the miniport below. + // + Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); + if (Packet != NULL) + { + // + // The miniport below did indicate up a packet. Use information + // from that packet to construct a new packet to indicate up. + // + +#ifdef NDIS51 + // + // NDIS 5.1 NOTE: Do not reuse the original packet in indicating + // up a receive, even if there is sufficient packet stack space. + // If we had to do so, we would have had to overwrite the + // status field in the original packet to NDIS_STATUS_RESOURCES, + // and it is not allowed for protocols to overwrite this field + // in received packets. + // +#endif // NDIS51 + + // + // Get a packet off the pool and indicate that up + // + NdisDprAllocatePacket(&Status, + &MyPacket, + pAdapt->RecvPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + // + // Make our packet point to data from the original + // packet. NOTE: this works only because we are + // indicating a receive directly from the context of + // our receive indication. If we need to queue this + // packet and indicate it from another thread context, + // we will also have to allocate a new buffer and copy + // over the packet contents, OOB data and per-packet + // information. This is because the packet data + // is available only for the duration of this + // receive indication call. + // + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); + + // + // Get the original packet (it could be the same packet as the + // one received or a different one based on the number of layered + // miniports below) and set it on the indicated packet so the OOB + // data is visible correctly at protocols above. If the IM driver + // modifies the packet in any way it should not set the new packet's + // original packet equal to the original packet of the packet that + // was indicated to it from the underlying driver, in this case, the + // IM driver should also ensure that the related per packet info should + // be copied to the new packet. + // we can set the original packet to the original packet of the packet + // indicated from the underlying driver because the driver doesn't modify + // the data content in the packet. + // + NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); + NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); + + // + // Copy packet flags. + // + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + // + // Force protocols above to make a copy if they want to hang + // on to data in this packet. This is because we are in our + // Receive handler (not ReceivePacket) and we can't return a + // ref count from here. + // + NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); + + // + // By setting NDIS_STATUS_RESOURCES, we also know that we can reclaim + // this packet as soon as the call to NdisMIndicateReceivePacket + // returns. + // + + if (pAdapt->MiniportHandle != NULL) + { +#if 1 /* IPFW: query the firewall */ + int ret; + ret = ipfw2_qhandler_w32(MyPacket, INCOMING, + ProtocolBindingContext); + if (ret != PASS) + return 0; //otherwise simply continue +#endif /* end of IPFW code */ + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + + // + // Reclaim the indicated packet. Since we had set its status + // to NDIS_STATUS_RESOURCES, we are guaranteed that protocols + // above are done with it. + // + NdisDprFreePacket(MyPacket); + + break; + } + } + else + { + // + // The miniport below us uses the old-style (not packet) + // receive indication. Fall through. + // + } + + // + // Fall through if the miniport below us has either not + // indicated a packet or we could not allocate one + // + pAdapt->ReceivedIndicationFlags[Proc] = TRUE; + if (pAdapt->MiniportHandle == NULL) + { + break; + } + switch (pAdapt->Medium) + { + case NdisMedium802_3: + case NdisMediumWan: + //DbgPrint("EthIndicateReceive context %p, header at %p len %u, lookahead at %p len %u, packetsize %u\n",ProtocolBindingContext,HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize); + //hexdump(HeaderBuffer,HeaderBufferSize+LookAheadBufferSize,"EthIndicateReceive"); + { + int ret = ipfw2_qhandler_w32_oldstyle(INCOMING, ProtocolBindingContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); + if (ret != PASS) + return NDIS_STATUS_SUCCESS; + } + NdisMEthIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; + + case NdisMedium802_5: + NdisMTrIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; + +#if FDDI + case NdisMediumFddi: + NdisMFddiIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; +#endif + default: + ASSERT(FALSE); + break; + } + + } while(FALSE); + + return Status; +} + + +VOID +PtReceiveComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +/*++ + +Routine Description: + + Called by the adapter below us when it is done indicating a batch of + received packets. + +Arguments: + + ProtocolBindingContext Pointer to our adapter structure. + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + ULONG Proc = KeGetCurrentProcessorNumber(); + + /* Warning: this is a poor implementation of the PtReceiveComplete + * made by MS, and it's a well known (but never fixed) issue. + * Since the ProcessorNumber here can be different from the one + * that processed the PtReceive, sometimes NdisMEthIndicateReceiveComplete + * will not be called, causing poor performance in the incoming traffic. + * In our driver, PtReceive is called for IP packets ONLY by particulary + * old NIC drivers, and the poor performance can be seen even + * in traffic not handled by ipfw or dummynet. + * Fortunately, this is quite rare, all the incoming IP packets + * will arrive through PtReceivePacket, and this callback will never + * be called. For reinjected traffic, a workaround is done + * commuting the ReceivedIndicationFlag and calling + * NdisMEthIndicateReceiveComplete manually for each packet. + */ + + if (((pAdapt->MiniportHandle != NULL) + && (pAdapt->MPDeviceState == NdisDeviceStateD0)) + && (pAdapt->ReceivedIndicationFlags[Proc])) + { + switch (pAdapt->Medium) + { + case NdisMedium802_3: + case NdisMediumWan: + NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); + break; + + case NdisMedium802_5: + NdisMTrIndicateReceiveComplete(pAdapt->MiniportHandle); + break; +#if FDDI + case NdisMediumFddi: + NdisMFddiIndicateReceiveComplete(pAdapt->MiniportHandle); + break; +#endif + default: + ASSERT(FALSE); + break; + } + } + + pAdapt->ReceivedIndicationFlags[Proc] = FALSE; +} + + +INT +PtReceivePacket( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet + ) +/*++ + +Routine Description: + + ReceivePacket handler. Called by NDIS if the miniport below supports + NDIS 4.0 style receives. Re-package the buffer chain in a new packet + and indicate the new packet to protocols above us. Any context for + packets indicated up must be kept in the MiniportReserved field. + + NDIS 5.1 - packet stacking - if there is sufficient "stack space" in + the packet passed to us, we can use the same packet in a receive + indication. + +Arguments: + + ProtocolBindingContext - Pointer to our adapter structure. + Packet - Pointer to the packet + +Return Value: + + == 0 -> We are done with the packet + != 0 -> We will keep the packet and call NdisReturnPackets() this + many times when done. +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS Status; + PNDIS_PACKET MyPacket; + BOOLEAN Remaining; + + // + // Drop the packet silently if the upper miniport edge isn't initialized or + // the miniport edge is in low power state + // + if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0)) + { + return 0; + } + +#ifdef NDIS51 + // + // Check if we can reuse the same packet for indicating up. + // See also: PtReceive(). + // + (VOID)NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (0 && Remaining) + { + // + // We can reuse "Packet". Indicate it up and be done with it. + // + Status = NDIS_GET_PACKET_STATUS(Packet); + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &Packet, 1); + return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); + } +#endif // NDIS51 + + // + // Get a packet off the pool and indicate that up + // + NdisDprAllocatePacket(&Status, + &MyPacket, + pAdapt->RecvPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PRECV_RSVD RecvRsvd; + + RecvRsvd = (PRECV_RSVD)(MyPacket->MiniportReserved); + RecvRsvd->OriginalPkt = Packet; + + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); + + // + // Get the original packet (it could be the same packet as the one + // received or a different one based on the number of layered miniports + // below) and set it on the indicated packet so the OOB data is visible + // correctly to protocols above us. + // + NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); + + // + // Set Packet Flags + // + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + Status = NDIS_GET_PACKET_STATUS(Packet); + + NDIS_SET_PACKET_STATUS(MyPacket, Status); + NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet)); + + if (pAdapt->MiniportHandle != NULL) + { +#if 1 /* IPFW: query the firewall */ + int ret; + ret = ipfw2_qhandler_w32(MyPacket, INCOMING, + ProtocolBindingContext); + if (ret != PASS) + return 0; //otherwise simply continue +#endif /* end of IPFW code */ + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + + // + // Check if we had indicated up the packet with NDIS_STATUS_RESOURCES + // NOTE -- do not use NDIS_GET_PACKET_STATUS(MyPacket) for this since + // it might have changed! Use the value saved in the local variable. + // + if (Status == NDIS_STATUS_RESOURCES) + { + // + // Our ReturnPackets handler will not be called for this packet. + // We should reclaim it right here. + // + NdisDprFreePacket(MyPacket); + } + + return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); + } + else + { + // + // We are out of packets. Silently drop it. + // + return(0); + } +} + + +NDIS_STATUS +PtPNPHandler( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT pNetPnPEvent + ) + +/*++ +Routine Description: + + This is called by NDIS to notify us of a PNP event related to a lower + binding. Based on the event, this dispatches to other helper routines. + + NDIS 5.1: forward this event to the upper protocol(s) by calling + NdisIMNotifyPnPEvent. + +Arguments: + + ProtocolBindingContext - Pointer to our adapter structure. Can be NULL + for "global" notifications + + pNetPnPEvent - Pointer to the PNP event to be processed. + +Return Value: + + NDIS_STATUS code indicating status of event processing. + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + DBGPRINT(("PtPnPHandler: Adapt %p, Event %d\n", pAdapt, pNetPnPEvent->NetEvent)); + + switch (pNetPnPEvent->NetEvent) + { + case NetEventSetPower: + Status = PtPnPNetEventSetPower(pAdapt, pNetPnPEvent); + break; + + case NetEventReconfigure: + Status = PtPnPNetEventReconfigure(pAdapt, pNetPnPEvent); + break; + + default: +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above, before + // doing anything else with it. + // + if (pAdapt && pAdapt->MiniportHandle) + { + Status = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#else + Status = NDIS_STATUS_SUCCESS; + +#endif // NDIS51 + + break; + } + + return Status; +} + + +NDIS_STATUS +PtPnPNetEventReconfigure( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ) +/*++ +Routine Description: + + This routine is called from NDIS to notify our protocol edge of a + reconfiguration of parameters for either a specific binding (pAdapt + is not NULL), or global parameters if any (pAdapt is NULL). + +Arguments: + + pAdapt - Pointer to our adapter structure. + pNetPnPEvent - the reconfigure event + +Return Value: + + NDIS_STATUS_SUCCESS + +--*/ +{ + NDIS_STATUS ReconfigStatus = NDIS_STATUS_SUCCESS; + NDIS_STATUS ReturnStatus = NDIS_STATUS_SUCCESS; + + do + { + // + // Is this is a global reconfiguration notification ? + // + if (pAdapt == NULL) + { + // + // An important event that causes this notification to us is if + // one of our upper-edge miniport instances was enabled after being + // disabled earlier, e.g. from Device Manager in Win2000. Note that + // NDIS calls this because we had set up an association between our + // miniport and protocol entities by calling NdisIMAssociateMiniport. + // + // Since we would have torn down the lower binding for that miniport, + // we need NDIS' assistance to re-bind to the lower miniport. The + // call to NdisReEnumerateProtocolBindings does exactly that. + // + NdisReEnumerateProtocolBindings (ProtHandle); + + break; + } + +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above before doing anything + // with it. + // + if (pAdapt->MiniportHandle) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + ReconfigStatus = NDIS_STATUS_SUCCESS; + + } while(FALSE); + + DBGPRINT(("<==PtPNPNetEventReconfigure: pAdapt %p\n", pAdapt)); + +#ifdef NDIS51 + // + // Overwrite status with what upper-layer protocol(s) returned. + // + ReconfigStatus = ReturnStatus; +#endif + + return ReconfigStatus; +} + + +NDIS_STATUS +PtPnPNetEventSetPower( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ) +/*++ +Routine Description: + + This is a notification to our protocol edge of the power state + of the lower miniport. If it is going to a low-power state, we must + wait here for all outstanding sends and requests to complete. + + NDIS 5.1: Since we use packet stacking, it is not sufficient to + check usage of our local send packet pool to detect whether or not + all outstanding sends have completed. For this, use the new API + NdisQueryPendingIOCount. + + NDIS 5.1: Use the 5.1 API NdisIMNotifyPnPEvent to pass on PnP + notifications to upper protocol(s). + +Arguments: + + pAdapt - Pointer to the adpater structure + pNetPnPEvent - The Net Pnp Event. this contains the new device state + +Return Value: + + NDIS_STATUS_SUCCESS or the status returned by upper-layer protocols. + +--*/ +{ + PNDIS_DEVICE_POWER_STATE pDeviceState =(PNDIS_DEVICE_POWER_STATE)(pNetPnPEvent->Buffer); + NDIS_DEVICE_POWER_STATE PrevDeviceState = pAdapt->PTDeviceState; + NDIS_STATUS Status; + NDIS_STATUS ReturnStatus; + + ReturnStatus = NDIS_STATUS_SUCCESS; + + // + // Set the Internal Device State, this blocks all new sends or receives + // + NdisAcquireSpinLock(&pAdapt->Lock); + pAdapt->PTDeviceState = *pDeviceState; + + // + // Check if the miniport below is going to a low power state. + // + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + // + // If the miniport below is going to standby, fail all incoming requests + // + if (PrevDeviceState == NdisDeviceStateD0) + { + pAdapt->StandingBy = TRUE; + } + + NdisReleaseSpinLock(&pAdapt->Lock); + +#ifdef NDIS51 + // + // Notify upper layer protocol(s) first. + // + if (pAdapt->MiniportHandle != NULL) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + // + // Wait for outstanding sends and requests to complete. + // + while (pAdapt->OutstandingSends != 0) + { + NdisMSleep(2); + } + + while (pAdapt->OutstandingRequests == TRUE) + { + // + // sleep till outstanding requests complete + // + NdisMSleep(2); + } + + // + // If the below miniport is going to low power state, complete the queued request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->QueuedRequest) + { + pAdapt->QueuedRequest = FALSE; + NdisReleaseSpinLock(&pAdapt->Lock); + PtRequestComplete(pAdapt, &pAdapt->Request, NDIS_STATUS_FAILURE); + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } + + + ASSERT(NdisPacketPoolUsage(pAdapt->SendPacketPoolHandle) == 0); + ASSERT(pAdapt->OutstandingRequests == FALSE); + } + else + { + // + // If the physical miniport is powering up (from Low power state to D0), + // clear the flag + // + if (PrevDeviceState > NdisDeviceStateD0) + { + pAdapt->StandingBy = FALSE; + } + // + // The device below is being turned on. If we had a request + // pending, send it down now. + // + if (pAdapt->QueuedRequest == TRUE) + { + pAdapt->QueuedRequest = FALSE; + + pAdapt->OutstandingRequests = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + if (Status != NDIS_STATUS_PENDING) + { + PtRequestComplete(pAdapt, + &pAdapt->Request, + Status); + + } + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } + + +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above + // + if (pAdapt->MiniportHandle) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + } + + return ReturnStatus; +} + +VOID +PtReferenceAdapt( + IN PADAPT pAdapt + ) +{ + NdisAcquireSpinLock(&pAdapt->Lock); + + ASSERT(pAdapt->RefCount >= 0); + + pAdapt->RefCount ++; + NdisReleaseSpinLock(&pAdapt->Lock); +} + + +BOOLEAN +PtDereferenceAdapt( + IN PADAPT pAdapt + ) +{ + NdisAcquireSpinLock(&pAdapt->Lock); + + ASSERT(pAdapt->RefCount > 0); + + pAdapt->RefCount--; + + if (pAdapt->RefCount == 0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + + // + // Free all resources on this adapter structure. + // + MPFreeAllPacketPools (pAdapt);; + NdisFreeSpinLock(&pAdapt->Lock); + NdisFreeMemory(pAdapt, 0 , 0); + + return TRUE; + + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + + return FALSE; + } +} + + diff --git a/original_passthru/makefile b/original_passthru/makefile new file mode 100644 index 0000000..c6c9e94 --- /dev/null +++ b/original_passthru/makefile @@ -0,0 +1,22 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the components of NT +# + +#!INCLUDE $(NTMAKEENV)\makefile.def + + +!IF DEFINED(_NT_TARGET_VERSION) +! IF $(_NT_TARGET_VERSION)>=0x501 +! INCLUDE $(NTMAKEENV)\makefile.def +! ELSE +# Only warn once per directory +! INCLUDE $(NTMAKEENV)\makefile.plt +! IF "$(BUILD_PASS)"=="PASS1" +! message BUILDMSG: Warning : The sample "$(MAKEDIR)" is not valid for the current OS target. +! ENDIF +! ENDIF +!ELSE +! INCLUDE $(NTMAKEENV)\makefile.def +!ENDIF diff --git a/original_passthru/miniport.c b/original_passthru/miniport.c new file mode 100644 index 0000000..a7f3bbc --- /dev/null +++ b/original_passthru/miniport.c @@ -0,0 +1,1461 @@ +/*++ + +Copyright (c) 1992-2000 Microsoft Corporation + +Module Name: + + miniport.c + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + +#include "precomp.h" +#pragma hdrstop + + + +NDIS_STATUS +MPInitialize( + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE WrapperConfigurationContext + ) +/*++ + +Routine Description: + + This is the initialize handler which gets called as a result of + the BindAdapter handler calling NdisIMInitializeDeviceInstanceEx. + The context parameter which we pass there is the adapter structure + which we retrieve here. + + Arguments: + + OpenErrorStatus Not used by us. + SelectedMediumIndex Place-holder for what media we are using + MediumArray Array of ndis media passed down to us to pick from + MediumArraySize Size of the array + MiniportAdapterHandle The handle NDIS uses to refer to us + WrapperConfigurationContext For use by NdisOpenConfiguration + +Return Value: + + NDIS_STATUS_SUCCESS unless something goes wrong + +--*/ +{ + UINT i; + PADAPT pAdapt; + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + NDIS_MEDIUM Medium; + + UNREFERENCED_PARAMETER(WrapperConfigurationContext); + + do + { + // + // Start off by retrieving our adapter context and storing + // the Miniport handle in it. + // + pAdapt = NdisIMGetDeviceContext(MiniportAdapterHandle); + pAdapt->MiniportIsHalted = FALSE; + + DBGPRINT(("==> Miniport Initialize: Adapt %p\n", pAdapt)); + + // + // Usually we export the medium type of the adapter below as our + // virtual miniport's medium type. However if the adapter below us + // is a WAN device, then we claim to be of medium type 802.3. + // + Medium = pAdapt->Medium; + + if (Medium == NdisMediumWan) + { + Medium = NdisMedium802_3; + } + + for (i = 0; i < MediumArraySize; i++) + { + if (MediumArray[i] == Medium) + { + *SelectedMediumIndex = i; + break; + } + } + + if (i == MediumArraySize) + { + Status = NDIS_STATUS_UNSUPPORTED_MEDIA; + break; + } + + + // + // Set the attributes now. NDIS_ATTRIBUTE_DESERIALIZE enables us + // to make up-calls to NDIS without having to call NdisIMSwitchToMiniport + // or NdisIMQueueCallBack. This also forces us to protect our data using + // spinlocks where appropriate. Also in this case NDIS does not queue + // packets on our behalf. Since this is a very simple pass-thru + // miniport, we do not have a need to protect anything. However in + // a general case there will be a need to use per-adapter spin-locks + // for the packet queues at the very least. + // + NdisMSetAttributesEx(MiniportAdapterHandle, + pAdapt, + 0, // CheckForHangTimeInSeconds + NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT | + NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT| + NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER | + NDIS_ATTRIBUTE_DESERIALIZE | + NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND, + 0); + + pAdapt->MiniportHandle = MiniportAdapterHandle; + // + // Initialize LastIndicatedStatus to be NDIS_STATUS_MEDIA_CONNECT + // + pAdapt->LastIndicatedStatus = NDIS_STATUS_MEDIA_CONNECT; + + // + // Initialize the power states for both the lower binding (PTDeviceState) + // and our miniport edge to Powered On. + // + pAdapt->MPDeviceState = NdisDeviceStateD0; + pAdapt->PTDeviceState = NdisDeviceStateD0; + + // + // Add this adapter to the global pAdapt List + // + NdisAcquireSpinLock(&GlobalLock); + + pAdapt->Next = pAdaptList; + pAdaptList = pAdapt; + + NdisReleaseSpinLock(&GlobalLock); + + // + // Create an ioctl interface + // + (VOID)PtRegisterDevice(); + + Status = NDIS_STATUS_SUCCESS; + } + while (FALSE); + + // + // If we had received an UnbindAdapter notification on the underlying + // adapter, we would have blocked that thread waiting for the IM Init + // process to complete. Wake up any such thread. + // + ASSERT(pAdapt->MiniportInitPending == TRUE); + pAdapt->MiniportInitPending = FALSE; + NdisSetEvent(&pAdapt->MiniportInitEvent); + + if (Status == NDIS_STATUS_SUCCESS) + { + PtReferenceAdapt(pAdapt); + } + + DBGPRINT(("<== Miniport Initialize: Adapt %p, Status %x\n", pAdapt, Status)); + + *OpenErrorStatus = Status; + + + return Status; +} + + +NDIS_STATUS +MPSend( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags + ) +/*++ + +Routine Description: + + Send Packet handler. Either this or our SendPackets (array) handler is called + based on which one is enabled in our Miniport Characteristics. + +Arguments: + + MiniportAdapterContext Pointer to the adapter + Packet Packet to send + Flags Unused, passed down below + +Return Value: + + Return code from NdisSend + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + PNDIS_PACKET MyPacket; + PVOID MediaSpecificInfo = NULL; + ULONG MediaSpecificInfoSize = 0; + + // + // The driver should fail the send if the virtual miniport is in low + // power state + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + return NDIS_STATUS_FAILURE; + } + +#ifdef NDIS51 + // + // Use NDIS 5.1 packet stacking: + // + { + PNDIS_PACKET_STACK pStack; + BOOLEAN Remaining; + + // + // Packet stacks: Check if we can use the same packet for sending down. + // + + pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (Remaining) + { + // + // We can reuse "Packet". + // + // NOTE: if we needed to keep per-packet information in packets + // sent down, we can use pStack->IMReserved[]. + // + ASSERT(pStack); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + return NDIS_STATUS_FAILURE; + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + NdisSend(&Status, + pAdapt->BindingHandle, + Packet); + + if (Status != NDIS_STATUS_PENDING) + { + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + + return(Status); + } + } +#endif // NDIS51 + + // + // We are either not using packet stacks, or there isn't stack space + // in the original packet passed down to us. Allocate a new packet + // to wrap the data with. + // + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + return NDIS_STATUS_FAILURE; + + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisAllocatePacket(&Status, + &MyPacket, + pAdapt->SendPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PSEND_RSVD SendRsvd; + + // + // Save a pointer to the original packet in our reserved + // area in the new packet. This is needed so that we can + // get back to the original packet when the new packet's send + // is completed. + // + SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); + SendRsvd->OriginalPkt = Packet; + + NdisGetPacketFlags(MyPacket) = Flags; + + // + // Set up the new packet so that it describes the same + // data as the original packet. + // + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); +#ifdef WIN9X + // + // Work around the fact that NDIS does not initialize this + // to FALSE on Win9x. + // + NDIS_PACKET_VALID_COUNTS(MyPacket) = FALSE; +#endif + + // + // Copy the OOB Offset from the original packet to the new + // packet. + // + NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), + NDIS_OOB_DATA_FROM_PACKET(Packet), + sizeof(NDIS_PACKET_OOB_DATA)); + +#ifndef WIN9X + // + // Copy the right parts of per packet info into the new packet. + // This API is not available on Win9x since task offload is + // not supported on that platform. + // + NdisIMCopySendPerPacketInfo(MyPacket, Packet); +#endif + + // + // Copy the Media specific information + // + NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, + &MediaSpecificInfo, + &MediaSpecificInfoSize); + + if (MediaSpecificInfo || MediaSpecificInfoSize) + { + NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, + MediaSpecificInfo, + MediaSpecificInfoSize); + } + + NdisSend(&Status, + pAdapt->BindingHandle, + MyPacket); + + + if (Status != NDIS_STATUS_PENDING) + { +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + NdisFreePacket(MyPacket); + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + else + { + ADAPT_DECR_PENDING_SENDS(pAdapt); + // + // We are out of packets. Silently drop it. Alternatively we can deal with it: + // - By keeping separate send and receive pools + // - Dynamically allocate more pools as needed and free them when not needed + // + } + + return(Status); +} + + +VOID +MPSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets + ) +/*++ + +Routine Description: + + Send Packet Array handler. Either this or our SendPacket handler is called + based on which one is enabled in our Miniport Characteristics. + +Arguments: + + MiniportAdapterContext Pointer to our adapter + PacketArray Set of packets to send + NumberOfPackets Self-explanatory + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + UINT i; + PVOID MediaSpecificInfo = NULL; + UINT MediaSpecificInfoSize = 0; + + + for (i = 0; i < NumberOfPackets; i++) + { + PNDIS_PACKET Packet, MyPacket; + + Packet = PacketArray[i]; + // + // The driver should fail the send if the virtual miniport is in low + // power state + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + NDIS_STATUS_FAILURE); + continue; + } + +#ifdef NDIS51 + + // + // Use NDIS 5.1 packet stacking: + // + { + PNDIS_PACKET_STACK pStack; + BOOLEAN Remaining; + + // + // Packet stacks: Check if we can use the same packet for sending down. + // + pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (Remaining) + { + // + // We can reuse "Packet". + // + // NOTE: if we needed to keep per-packet information in packets + // sent down, we can use pStack->IMReserved[]. + // + ASSERT(pStack); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + NDIS_STATUS_FAILURE); + } + else + { + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisSend(&Status, + pAdapt->BindingHandle, + Packet); + + if (Status != NDIS_STATUS_PENDING) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + Status); + + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + continue; + } + } +#endif + do + { + NdisAcquireSpinLock(&pAdapt->Lock); + // + // If the below miniport is going to low power state, stop sending down any packet. + // + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingSends++; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisAllocatePacket(&Status, + &MyPacket, + pAdapt->SendPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PSEND_RSVD SendRsvd; + + SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); + SendRsvd->OriginalPkt = Packet; + + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); +#ifdef WIN9X + // + // Work around the fact that NDIS does not initialize this + // to FALSE on Win9x. + // + NDIS_PACKET_VALID_COUNTS(MyPacket) = FALSE; +#endif // WIN9X + + // + // Copy the OOB data from the original packet to the new + // packet. + // + NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), + NDIS_OOB_DATA_FROM_PACKET(Packet), + sizeof(NDIS_PACKET_OOB_DATA)); + // + // Copy relevant parts of the per packet info into the new packet + // +#ifndef WIN9X + NdisIMCopySendPerPacketInfo(MyPacket, Packet); +#endif + + // + // Copy the Media specific information + // + NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, + &MediaSpecificInfo, + &MediaSpecificInfoSize); + + if (MediaSpecificInfo || MediaSpecificInfoSize) + { + NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, + MediaSpecificInfo, + MediaSpecificInfoSize); + } + + NdisSend(&Status, + pAdapt->BindingHandle, + MyPacket); + + if (Status != NDIS_STATUS_PENDING) + { +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); +#endif + NdisFreePacket(MyPacket); + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + else + { + // + // The driver cannot allocate a packet. + // + ADAPT_DECR_PENDING_SENDS(pAdapt); + } + } + while (FALSE); + + if (Status != NDIS_STATUS_PENDING) + { + NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), + Packet, + Status); + } + } +} + + +NDIS_STATUS +MPQueryInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + + Entry point called by NDIS to query for the value of the specified OID. + Typical processing is to forward the query down to the underlying miniport. + + The following OIDs are filtered here: + + OID_PNP_QUERY_POWER - return success right here + + OID_GEN_SUPPORTED_GUIDS - do not forward, otherwise we will show up + multiple instances of private GUIDs supported by the underlying miniport. + + OID_PNP_CAPABILITIES - we do send this down to the lower miniport, but + the values returned are postprocessed before we complete this request; + see PtRequestComplete. + + NOTE on OID_TCP_TASK_OFFLOAD - if this IM driver modifies the contents + of data it passes through such that a lower miniport may not be able + to perform TCP task offload, then it should not forward this OID down, + but fail it here with the status NDIS_STATUS_NOT_SUPPORTED. This is to + avoid performing incorrect transformations on data. + + If our miniport edge (upper edge) is at a low-power state, fail the request. + + If our protocol edge (lower edge) has been notified of a low-power state, + we pend this request until the miniport below has been set to D0. Since + requests to miniports are serialized always, at most a single request will + be pended. + +Arguments: + + MiniportAdapterContext Pointer to the adapter structure + Oid Oid for this query + InformationBuffer Buffer for information + InformationBufferLength Size of this buffer + BytesWritten Specifies how much info is written + BytesNeeded In case the buffer is smaller than what we need, tell them how much is needed + + +Return Value: + + Return code from the NdisRequest below. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + + do + { + if (Oid == OID_PNP_QUERY_POWER) + { + // + // Do not forward this. + // + Status = NDIS_STATUS_SUCCESS; + break; + } + + if (Oid == OID_GEN_SUPPORTED_GUIDS) + { + // + // Do not forward this, otherwise we will end up with multiple + // instances of private GUIDs that the underlying miniport + // supports. + // + Status = NDIS_STATUS_NOT_SUPPORTED; + break; + } + + if (Oid == OID_TCP_TASK_OFFLOAD) + { + // + // Fail this -if- this driver performs data transformations + // that can interfere with a lower driver's ability to offload + // TCP tasks. + // + // Status = NDIS_STATUS_NOT_SUPPORTED; + // break; + // + } + // + // If the miniport below is unbinding, just fail any request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + NdisReleaseSpinLock(&pAdapt->Lock); + // + // All other queries are failed, if the miniport is not at D0, + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + Status = NDIS_STATUS_FAILURE; + break; + } + + pAdapt->Request.RequestType = NdisRequestQueryInformation; + pAdapt->Request.DATA.QUERY_INFORMATION.Oid = Oid; + pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer = InformationBuffer; + pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength = InformationBufferLength; + pAdapt->BytesNeeded = BytesNeeded; + pAdapt->BytesReadOrWritten = BytesWritten; + + // + // If the miniport below is binding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + // + // If the Protocol device state is OFF, mark this request as being + // pended. We queue this until the device state is back to D0. + // + if ((pAdapt->PTDeviceState > NdisDeviceStateD0) + && (pAdapt->StandingBy == FALSE)) + { + pAdapt->QueuedRequest = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_PENDING; + break; + } + // + // This is in the process of powering down the system, always fail the request + // + if (pAdapt->StandingBy == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingRequests = TRUE; + + NdisReleaseSpinLock(&pAdapt->Lock); + + // + // default case, most requests will be passed to the miniport below + // + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + + if (Status != NDIS_STATUS_PENDING) + { + PtRequestComplete(pAdapt, &pAdapt->Request, Status); + Status = NDIS_STATUS_PENDING; + } + + } while (FALSE); + + return(Status); + +} + + +VOID +MPQueryPNPCapabilities( + IN OUT PADAPT pAdapt, + OUT PNDIS_STATUS pStatus + ) +/*++ + +Routine Description: + + Postprocess a request for OID_PNP_CAPABILITIES that was forwarded + down to the underlying miniport, and has been completed by it. + +Arguments: + + pAdapt - Pointer to the adapter structure + pStatus - Place to return final status + +Return Value: + + None. + +--*/ + +{ + PNDIS_PNP_CAPABILITIES pPNPCapabilities; + PNDIS_PM_WAKE_UP_CAPABILITIES pPMstruct; + + if (pAdapt->Request.DATA.QUERY_INFORMATION.InformationBufferLength >= sizeof(NDIS_PNP_CAPABILITIES)) + { + pPNPCapabilities = (PNDIS_PNP_CAPABILITIES)(pAdapt->Request.DATA.QUERY_INFORMATION.InformationBuffer); + + // + // The following fields must be overwritten by an IM driver. + // + pPMstruct= & pPNPCapabilities->WakeUpCapabilities; + pPMstruct->MinMagicPacketWakeUp = NdisDeviceStateUnspecified; + pPMstruct->MinPatternWakeUp = NdisDeviceStateUnspecified; + pPMstruct->MinLinkChangeWakeUp = NdisDeviceStateUnspecified; + *pAdapt->BytesReadOrWritten = sizeof(NDIS_PNP_CAPABILITIES); + *pAdapt->BytesNeeded = 0; + + + // + // Setting our internal flags + // Default, device is ON + // + pAdapt->MPDeviceState = NdisDeviceStateD0; + pAdapt->PTDeviceState = NdisDeviceStateD0; + + *pStatus = NDIS_STATUS_SUCCESS; + } + else + { + *pAdapt->BytesNeeded= sizeof(NDIS_PNP_CAPABILITIES); + *pStatus = NDIS_STATUS_RESOURCES; + } +} + + +NDIS_STATUS +MPSetInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + + Miniport SetInfo handler. + + In the case of OID_PNP_SET_POWER, record the power state and return the OID. + Do not pass below + If the device is suspended, do not block the SET_POWER_OID + as it is used to reactivate the Passthru miniport + + + PM- If the MP is not ON (DeviceState > D0) return immediately (except for 'query power' and 'set power') + If MP is ON, but the PT is not at D0, then queue the queue the request for later processing + + Requests to miniports are always serialized + + +Arguments: + + MiniportAdapterContext Pointer to the adapter structure + Oid Oid for this query + InformationBuffer Buffer for information + InformationBufferLength Size of this buffer + BytesRead Specifies how much info is read + BytesNeeded In case the buffer is smaller than what we need, tell them how much is needed + +Return Value: + + Return code from the NdisRequest below. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + + Status = NDIS_STATUS_FAILURE; + + do + { + // + // The Set Power should not be sent to the miniport below the Passthru, but is handled internally + // + if (Oid == OID_PNP_SET_POWER) + { + MPProcessSetPowerOid(&Status, + pAdapt, + InformationBuffer, + InformationBufferLength, + BytesRead, + BytesNeeded); + break; + + } + + // + // If the miniport below is unbinding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + NdisReleaseSpinLock(&pAdapt->Lock); + // + // All other Set Information requests are failed, if the miniport is + // not at D0 or is transitioning to a device state greater than D0. + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0) + { + Status = NDIS_STATUS_FAILURE; + break; + } + + // Set up the Request and return the result + pAdapt->Request.RequestType = NdisRequestSetInformation; + pAdapt->Request.DATA.SET_INFORMATION.Oid = Oid; + pAdapt->Request.DATA.SET_INFORMATION.InformationBuffer = InformationBuffer; + pAdapt->Request.DATA.SET_INFORMATION.InformationBufferLength = InformationBufferLength; + pAdapt->BytesNeeded = BytesNeeded; + pAdapt->BytesReadOrWritten = BytesRead; + + // + // If the miniport below is unbinding, fail the request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->UnbindingInProcess == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + + // + // If the device below is at a low power state, we cannot send it the + // request now, and must pend it. + // + if ((pAdapt->PTDeviceState > NdisDeviceStateD0) + && (pAdapt->StandingBy == FALSE)) + { + pAdapt->QueuedRequest = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_PENDING; + break; + } + // + // This is in the process of powering down the system, always fail the request + // + if (pAdapt->StandingBy == TRUE) + { + NdisReleaseSpinLock(&pAdapt->Lock); + Status = NDIS_STATUS_FAILURE; + break; + } + pAdapt->OutstandingRequests = TRUE; + + NdisReleaseSpinLock(&pAdapt->Lock); + // + // Forward the request to the device below. + // + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + if (Status != NDIS_STATUS_PENDING) + { + *BytesRead = pAdapt->Request.DATA.SET_INFORMATION.BytesRead; + *BytesNeeded = pAdapt->Request.DATA.SET_INFORMATION.BytesNeeded; + pAdapt->OutstandingRequests = FALSE; + } + + } while (FALSE); + + return(Status); +} + + +VOID +MPProcessSetPowerOid( + IN OUT PNDIS_STATUS pNdisStatus, + IN PADAPT pAdapt, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ) +/*++ + +Routine Description: + This routine does all the procssing for a request with a SetPower Oid + The miniport shoud accept the Set Power and transition to the new state + + The Set Power should not be passed to the miniport below + + If the IM miniport is going into a low power state, then there is no guarantee if it will ever + be asked go back to D0, before getting halted. No requests should be pended or queued. + + +Arguments: + pNdisStatus - Status of the operation + pAdapt - The Adapter structure + InformationBuffer - The New DeviceState + InformationBufferLength + BytesRead - No of bytes read + BytesNeeded - No of bytes needed + + +Return Value: + Status - NDIS_STATUS_SUCCESS if all the wait events succeed. + +--*/ +{ + + + NDIS_DEVICE_POWER_STATE NewDeviceState; + + DBGPRINT(("==>MPProcessSetPowerOid: Adapt %p\n", pAdapt)); + + ASSERT (InformationBuffer != NULL); + + *pNdisStatus = NDIS_STATUS_FAILURE; + + do + { + // + // Check for invalid length + // + if (InformationBufferLength < sizeof(NDIS_DEVICE_POWER_STATE)) + { + *pNdisStatus = NDIS_STATUS_INVALID_LENGTH; + break; + } + + NewDeviceState = (*(PNDIS_DEVICE_POWER_STATE)InformationBuffer); + + // + // Check for invalid device state + // + if ((pAdapt->MPDeviceState > NdisDeviceStateD0) && (NewDeviceState != NdisDeviceStateD0)) + { + // + // If the miniport is in a non-D0 state, the miniport can only receive a Set Power to D0 + // + ASSERT (!(pAdapt->MPDeviceState > NdisDeviceStateD0) && (NewDeviceState != NdisDeviceStateD0)); + + *pNdisStatus = NDIS_STATUS_FAILURE; + break; + } + + // + // Is the miniport transitioning from an On (D0) state to an Low Power State (>D0) + // If so, then set the StandingBy Flag - (Block all incoming requests) + // + if (pAdapt->MPDeviceState == NdisDeviceStateD0 && NewDeviceState > NdisDeviceStateD0) + { + pAdapt->StandingBy = TRUE; + } + + // + // If the miniport is transitioning from a low power state to ON (D0), then clear the StandingBy flag + // All incoming requests will be pended until the physical miniport turns ON. + // + if (pAdapt->MPDeviceState > NdisDeviceStateD0 && NewDeviceState == NdisDeviceStateD0) + { + pAdapt->StandingBy = FALSE; + } + + // + // Now update the state in the pAdapt structure; + // + pAdapt->MPDeviceState = NewDeviceState; + + *pNdisStatus = NDIS_STATUS_SUCCESS; + + + } while (FALSE); + + if (*pNdisStatus == NDIS_STATUS_SUCCESS) + { + // + // The miniport resume from low power state + // + if (pAdapt->StandingBy == FALSE) + { + // + // If we need to indicate the media connect state + // + if (pAdapt->LastIndicatedStatus != pAdapt->LatestUnIndicateStatus) + { + if (pAdapt->MiniportHandle != NULL) + { + NdisMIndicateStatus(pAdapt->MiniportHandle, + pAdapt->LatestUnIndicateStatus, + (PVOID)NULL, + 0); + NdisMIndicateStatusComplete(pAdapt->MiniportHandle); + pAdapt->LastIndicatedStatus = pAdapt->LatestUnIndicateStatus; + } + } + } + else + { + // + // Initialize LatestUnIndicatedStatus + // + pAdapt->LatestUnIndicateStatus = pAdapt->LastIndicatedStatus; + } + *BytesRead = sizeof(NDIS_DEVICE_POWER_STATE); + *BytesNeeded = 0; + } + else + { + *BytesRead = 0; + *BytesNeeded = sizeof (NDIS_DEVICE_POWER_STATE); + } + + DBGPRINT(("<==MPProcessSetPowerOid: Adapt %p\n", pAdapt)); +} + + +VOID +MPReturnPacket( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet + ) +/*++ + +Routine Description: + + NDIS Miniport entry point called whenever protocols are done with + a packet that we had indicated up and they had queued up for returning + later. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + Packet - packet being returned. + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + +#ifdef NDIS51 + // + // Packet stacking: Check if this packet belongs to us. + // + if (NdisGetPoolFromPacket(Packet) != pAdapt->RecvPacketPoolHandle) + { + // + // We reused the original packet in a receive indication. + // Simply return it to the miniport below us. + // + NdisReturnPackets(&Packet, 1); + } + else +#endif // NDIS51 + { + // + // This is a packet allocated from this IM's receive packet pool. + // Reclaim our packet, and return the original to the driver below. + // + + PNDIS_PACKET MyPacket; + PRECV_RSVD RecvRsvd; + + RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved); + MyPacket = RecvRsvd->OriginalPkt; + + NdisFreePacket(Packet); + NdisReturnPackets(&MyPacket, 1); + } +} + + +NDIS_STATUS +MPTransferData( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer + ) +/*++ + +Routine Description: + + Miniport's transfer data handler. + +Arguments: + + Packet Destination packet + BytesTransferred Place-holder for how much data was copied + MiniportAdapterContext Pointer to the adapter structure + MiniportReceiveContext Context + ByteOffset Offset into the packet for copying data + BytesToTransfer How much to copy. + +Return Value: + + Status of transfer + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + + // + // Return, if the device is OFF + // + + if (IsIMDeviceStateOn(pAdapt) == FALSE) + { + return NDIS_STATUS_FAILURE; + } + + NdisTransferData(&Status, + pAdapt->BindingHandle, + MiniportReceiveContext, + ByteOffset, + BytesToTransfer, + Packet, + BytesTransferred); + + return(Status); +} + +VOID +MPHalt( + IN NDIS_HANDLE MiniportAdapterContext + ) +/*++ + +Routine Description: + + Halt handler. All the hard-work for clean-up is done here. + +Arguments: + + MiniportAdapterContext Pointer to the Adapter + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + NDIS_STATUS Status; + PADAPT *ppCursor; + + DBGPRINT(("==>MiniportHalt: Adapt %p\n", pAdapt)); + + pAdapt->MiniportHandle = NULL; + pAdapt->MiniportIsHalted = TRUE; + + // + // Remove this adapter from the global list + // + NdisAcquireSpinLock(&GlobalLock); + + for (ppCursor = &pAdaptList; *ppCursor != NULL; ppCursor = &(*ppCursor)->Next) + { + if (*ppCursor == pAdapt) + { + *ppCursor = pAdapt->Next; + break; + } + } + + NdisReleaseSpinLock(&GlobalLock); + + // + // Delete the ioctl interface that was created when the miniport + // was created. + // + (VOID)PtDeregisterDevice(); + + // + // If we have a valid bind, close the miniport below the protocol + // +#pragma prefast(suppress: __WARNING_DEREF_NULL_PTR, "pAdapt cannot be NULL") + if (pAdapt->BindingHandle != NULL) + { + // + // Close the binding below. and wait for it to complete + // + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(&Status, pAdapt->BindingHandle); + + if (Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + Status = pAdapt->Status; + } + + ASSERT (Status == NDIS_STATUS_SUCCESS); + + pAdapt->BindingHandle = NULL; + + PtDereferenceAdapt(pAdapt); + } + + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + + + DBGPRINT(("<== MiniportHalt: pAdapt %p\n", pAdapt)); +} + + +#ifdef NDIS51_MINIPORT + +VOID +MPCancelSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CancelId + ) +/*++ + +Routine Description: + + The miniport entry point to handle cancellation of all send packets + that match the given CancelId. If we have queued any packets that match + this, then we should dequeue them and call NdisMSendComplete for all + such packets, with a status of NDIS_STATUS_REQUEST_ABORTED. + + We should also call NdisCancelSendPackets in turn, on each lower binding + that this adapter corresponds to. This is to let miniports below cancel + any matching packets. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + CancelId - ID of packets to be cancelled. + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)MiniportAdapterContext; + + // + // If we queue packets on our adapter structure, this would be + // the place to acquire a spinlock to it, unlink any packets whose + // Id matches CancelId, release the spinlock and call NdisMSendComplete + // with NDIS_STATUS_REQUEST_ABORTED for all unlinked packets. + // + + // + // Next, pass this down so that we let the miniport(s) below cancel + // any packets that they might have queued. + // + NdisCancelSendPackets(pAdapt->BindingHandle, CancelId); + + return; +} + +VOID +MPDevicePnPEvent( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength + ) +/*++ + +Routine Description: + + This handler is called to notify us of PnP events directed to + our miniport device object. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + DevicePnPEvent - the event + InformationBuffer - Points to additional event-specific information + InformationBufferLength - length of above + +Return Value: + + None +--*/ +{ + // TBD - add code/comments about processing this. + + UNREFERENCED_PARAMETER(MiniportAdapterContext); + UNREFERENCED_PARAMETER(DevicePnPEvent); + UNREFERENCED_PARAMETER(InformationBuffer); + UNREFERENCED_PARAMETER(InformationBufferLength); + + return; +} + +VOID +MPAdapterShutdown( + IN NDIS_HANDLE MiniportAdapterContext + ) +/*++ + +Routine Description: + + This handler is called to notify us of an impending system shutdown. + +Arguments: + + MiniportAdapterContext - pointer to ADAPT structure + +Return Value: + + None +--*/ +{ + UNREFERENCED_PARAMETER(MiniportAdapterContext); + + return; +} + +#endif + + +VOID +MPFreeAllPacketPools( + IN PADAPT pAdapt + ) +/*++ + +Routine Description: + + Free all packet pools on the specified adapter. + +Arguments: + + pAdapt - pointer to ADAPT structure + +Return Value: + + None + +--*/ +{ + if (pAdapt->RecvPacketPoolHandle != NULL) + { + // + // Free the packet pool that is used to indicate receives + // + NdisFreePacketPool(pAdapt->RecvPacketPoolHandle); + + pAdapt->RecvPacketPoolHandle = NULL; + } + + if (pAdapt->SendPacketPoolHandle != NULL) + { + + // + // Free the packet pool that is used to send packets below + // + + NdisFreePacketPool(pAdapt->SendPacketPoolHandle); + + pAdapt->SendPacketPoolHandle = NULL; + + } +} + diff --git a/original_passthru/netsf.inf b/original_passthru/netsf.inf new file mode 100644 index 0000000..5e03a01 --- /dev/null +++ b/original_passthru/netsf.inf @@ -0,0 +1,165 @@ +; -- NETSF.INF -- +; +; Passthru driver INF file - this is the INF for the service (protocol) +; part. +; +; Copyright (c) 1993-2001, Microsoft Corporation +; +; ---------------------------------------------------------------------- +; Notes: +; 0. The term "filter" is used in this INF to refer to an NDIS IM driver that +; implements a 1:1 relationship between upper and lower bindings. +; +; 1. Items specifically required for a filter have been marked with +; "!!--Filter Specific--!!" keyword +; 2. In general a filter DOES NOT require a notify object for proper installation. +; A notify object is only required if one wants to have better control +; over binding operations or if one wants to receive notifications +; when other components get installed/removed/bound/unbound. +; Since Windows 2000 systems do not have support for CopyINF directive, +; a notify object is required to programmatically copy the miniport INF +; file to the system INF directory. Previous versions of this INF file +; erroneously used to copy the INF files directly by using the CopyFiles +; directive. +; On Windows XP, you can install a filter IM without a notify object. +; by following the instructions in (4). +; +; 3. If you want to use this INF file with your own IM driver, please +; make the following modifications: +; File netsf.inf +; -------------- +; a. In section [SourceDiskFiles] and [Passthru.Files.Sys] +; change passthru.sys to the name of your own driver binary. +; b. In section [Passthru.ndi.AddReg], change values of +; BindForm and MiniportId to appropriate values. +; File netsf_m.inf +; ---------------- +; a. Replace MS_PassthruMP with InfId of your miniport. +; b. In section [PassthruMP.AddService], +; change ServiceBinary appropriately. +; c. In section [PassthruMP.ndi.AddReg], +; change "Passthru" in the line having "Service" +; to reflect the appropriate name +; +; +; ---------------------------------------------------------------------- + +[Version] +Signature = "$Windows NT$" +Class = NetService +ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} +Provider = %Msft% +DriverVer =10/01/2002,6.0.5019.0 + +[Manufacturer] +%Msft% = MSFT,NTx86,NTia64,NTamd64 + +[ControlFlags] + +;========================================================================= +; +;========================================================================= +;For Win2K + +[MSFT] +%Passthru_Desc% = Passthru.ndi, ms_passthru + +;For WinXP and later + +[MSFT.NTx86] +%Passthru_Desc% = Passthru.ndi, ms_passthru + +[MSFT.NTia64] +%Passthru_Desc% = Passthru.ndi, ms_passthru + +[MSFT.NTamd64] +%Passthru_Desc% = Passthru.ndi, ms_passthru + + +[Passthru.ndi] +AddReg = Passthru.ndi.AddReg, Passthru.AddReg +Characteristics = 0x4410 ; NCF_FILTER | NCF_NDIS_PROTOCOL !--Filter Specific--!! +CopyFiles = Passthru.Files.Sys +CopyInf = netsf_m.inf + +[Passthru.ndi.Remove] +DelFiles = Passthru.Files.Sys + +[Passthru.ndi.Services] +AddService = Passthru,, Passthru.AddService + +[Passthru.AddService] +DisplayName = %PassthruService_Desc% +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\passthru.sys +AddReg = Passthru.AddService.AddReg + + +[Passthru.AddService.AddReg] +; ---------------------------------------------------------------------- +; Add any miniport-specific parameters here. These are params that your +; filter device is going to use. +; +;HKR, Parameters, ParameterName, 0x10000, "MultiSz", "Parameter", "Value" +;HKR, Parameters, ParameterName2, 0x10001, 4 + + +; ---------------------------------------------------------------------- +; File copy +; +[SourceDisksNames] +1=%DiskDescription%,"",, + +[SourceDisksFiles] +passthru.sys=1 + +[DestinationDirs] +DefaultDestDir = 12 +Passthru.Files.Sys = 12 ; %windir%\System32\drivers + +[Passthru.Files.Sys] +passthru.sys,,,2 + +; ---------------------------------------------------------------------- +; Filter Install +; + +[Passthru.ndi.AddReg] +HKR, Ndi, HelpText, , %Passthru_HELP% + +; ---------------------------------------------------------------------- +; !!--Filter Specific--!! +; +; Note: +; 1. Other components may also have UpperRange/LowerRange but for filters +; the value of both of them must be noupper/nolower +; 2. The value FilterClass is required. +; 3. The value Service is required +; 4. FilterDeviceInfId is the InfId of the filter device (miniport) that will +; be installed for each filtered adapter. +; In this case this is ms_passthrump (refer to netsf_m.inf) +; +HKR, Ndi, FilterClass, , failover +HKR, Ndi, FilterDeviceInfId, , ms_passthrump +HKR, Ndi, Service, , Passthru +HKR, Ndi\Interfaces, UpperRange, , noupper +HKR, Ndi\Interfaces, LowerRange, , nolower +HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan" + +[Passthru.AddReg] +; The following key is Required +; The following key is Passthru specific +HKR, Parameters, Param1, 0, 4 + +; ---------------------------------------------------------------------- +[Strings] +Msft = "Microsoft" +DiskDescription = "Microsoft Passthru Driver Disk" + +Passthru_Desc = "Passthru Driver" +Passthru_HELP = "Passthru Driver" +PassthruService_Desc = "Passthru Service" + + diff --git a/original_passthru/netsf_m.inf b/original_passthru/netsf_m.inf new file mode 100644 index 0000000..6605a02 --- /dev/null +++ b/original_passthru/netsf_m.inf @@ -0,0 +1,93 @@ +; -- NETSF_M.INF -- +; +; Passsthru Miniport INF file +; +; Copyright (c) 1993-1999, Microsoft Corporation + +; ---------------------------------------------------------------------- +; Notes: +; 0. The term "filter" is used here to refer to an NDIS IM driver that +; implements a 1:1 relationship between upper and lower bindings. +; 1. Items specifically required for a filter have been marked with +; "!!--Filter Specific--!!" keyword +; 2. A filter DOES NOT require a notify object for proper installation. +; A notify object is only required if one wants to have better control +; over binding operations or if one wants to receive notifications +; when other components get installed/removed/bound/unbound. +; This sample uses a notify object as an example only. If you do not +; want to use a notify object, please comment out the lines that add +; ClsId and ComponentDll registry keys. +; ---------------------------------------------------------------------- + +[Version] +signature = "$Windows NT$" +Class = Net +ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} +Provider = %Msft% +DriverVer =10/01/2002,6.0.5019.0 + +[ControlFlags] +ExcludeFromSelect = ms_passthrump + +[DestinationDirs] +DefaultDestDir=12 +; No files to copy + +[Manufacturer] +%Msft% = MSFT,NTx86,NTia64,NTamd64 + +;For Win2K + +[MSFT] +%PassthruMP_Desc% = PassthruMP.ndi, ms_passthrump + +;For WinXP and later + +[MSFT.NTx86] +%PassthruMP_Desc% = PassthruMP.ndi, ms_passthrump + +[MSFT.NTia64] +%PassthruMP_Desc% = PassthruMP.ndi, ms_passthrump + +[MSFT.NTamd64] +%PassthruMP_Desc% = PassthruMP.ndi, ms_passthrump + + +[PassthruMP.ndi] +AddReg = PassthruMP.ndi.AddReg +Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN + +[PassthruMP.ndi.AddReg] +HKR, Ndi, Service, 0, PassthruMP + +[PassthruMP.ndi.Services] +AddService = PassthruMP,0x2, PassthruMP.AddService + + +[PassthruMP.AddService] +ServiceType = 1 ;SERVICE_KERNEL_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +ServiceBinary = %12%\passthru.sys +AddReg = PassthruMP.AddService.AddReg + + +[PassthruMP.AddService.AddReg] +; ---------------------------------------------------------------------- +; Add any miniport-specific parameters here. These are params that your +; filter device is going to use. +; +;HKR, Parameters, ParameterName, 0x10000, "MultiSz", "Parameter", "Value" +;HKR, Parameters, ParameterName2, 0x10001, 4 + +[Strings] +Msft = "Microsoft" +PassthruMP_Desc = "Passthru Miniport" + +[SourceDisksNames] +;None + +[SourceDisksFiles] +;None + + diff --git a/original_passthru/passthru.c b/original_passthru/passthru.c new file mode 100644 index 0000000..f614f2a --- /dev/null +++ b/original_passthru/passthru.c @@ -0,0 +1,458 @@ +/*++ + +Copyright (c) 1992-2000 Microsoft Corporation + +Module Name: + + passthru.c + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + + +#include "precomp.h" +#pragma hdrstop + +#pragma NDIS_INIT_FUNCTION(DriverEntry) + +NDIS_HANDLE ProtHandle = NULL; +NDIS_HANDLE DriverHandle = NULL; +NDIS_MEDIUM MediumArray[4] = + { + NdisMedium802_3, // Ethernet + NdisMedium802_5, // Token-ring + NdisMediumFddi, // Fddi + NdisMediumWan // NDISWAN + }; + +NDIS_SPIN_LOCK GlobalLock; + +PADAPT pAdaptList = NULL; +LONG MiniportCount = 0; + +NDIS_HANDLE NdisWrapperHandle; + +// +// To support ioctls from user-mode: +// + +#define LINKNAME_STRING L"\\DosDevices\\Passthru" +#define NTDEVICE_STRING L"\\Device\\Passthru" + +NDIS_HANDLE NdisDeviceHandle = NULL; +PDEVICE_OBJECT ControlDeviceObject = NULL; + +enum _DEVICE_STATE +{ + PS_DEVICE_STATE_READY = 0, // ready for create/delete + PS_DEVICE_STATE_CREATING, // create operation in progress + PS_DEVICE_STATE_DELETING // delete operation in progress +} ControlDeviceState = PS_DEVICE_STATE_READY; + + + +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ) +/*++ + +Routine Description: + + First entry point to be called, when this driver is loaded. + Register with NDIS as an intermediate driver. + +Arguments: + + DriverObject - pointer to the system's driver object structure + for this driver + + RegistryPath - system's registry path for this driver + +Return Value: + + STATUS_SUCCESS if all initialization is successful, STATUS_XXX + error code if not. + +--*/ +{ + NDIS_STATUS Status; + NDIS_PROTOCOL_CHARACTERISTICS PChars; + NDIS_MINIPORT_CHARACTERISTICS MChars; + NDIS_STRING Name; + + Status = NDIS_STATUS_SUCCESS; + NdisAllocateSpinLock(&GlobalLock); + + NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL); + + do + { + // + // Register the miniport with NDIS. Note that it is the miniport + // which was started as a driver and not the protocol. Also the miniport + // must be registered prior to the protocol since the protocol's BindAdapter + // handler can be initiated anytime and when it is, it must be ready to + // start driver instances. + // + + NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS)); + + MChars.MajorNdisVersion = PASSTHRU_MAJOR_NDIS_VERSION; + MChars.MinorNdisVersion = PASSTHRU_MINOR_NDIS_VERSION; + + MChars.InitializeHandler = MPInitialize; + MChars.QueryInformationHandler = MPQueryInformation; + MChars.SetInformationHandler = MPSetInformation; + MChars.ResetHandler = NULL; + MChars.TransferDataHandler = MPTransferData; + MChars.HaltHandler = MPHalt; +#ifdef NDIS51_MINIPORT + MChars.CancelSendPacketsHandler = MPCancelSendPackets; + MChars.PnPEventNotifyHandler = MPDevicePnPEvent; + MChars.AdapterShutdownHandler = MPAdapterShutdown; +#endif // NDIS51_MINIPORT + + // + // We will disable the check for hang timeout so we do not + // need a check for hang handler! + // + MChars.CheckForHangHandler = NULL; + MChars.ReturnPacketHandler = MPReturnPacket; + + // + // Either the Send or the SendPackets handler should be specified. + // If SendPackets handler is specified, SendHandler is ignored + // + MChars.SendHandler = NULL; // MPSend; + MChars.SendPacketsHandler = MPSendPackets; + + Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, + &MChars, + sizeof(MChars), + &DriverHandle); + if (Status != NDIS_STATUS_SUCCESS) + { + break; + } + +#ifndef WIN9X + NdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload); +#endif + + // + // Now register the protocol. + // + NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); + PChars.MajorNdisVersion = PASSTHRU_PROT_MAJOR_NDIS_VERSION; + PChars.MinorNdisVersion = PASSTHRU_PROT_MINOR_NDIS_VERSION; + + // + // Make sure the protocol-name matches the service-name + // (from the INF) under which this protocol is installed. + // This is needed to ensure that NDIS can correctly determine + // the binding and call us to bind to miniports below. + // + NdisInitUnicodeString(&Name, L"Passthru"); // Protocol name + PChars.Name = Name; + PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete; + PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete; + PChars.SendCompleteHandler = PtSendComplete; + PChars.TransferDataCompleteHandler = PtTransferDataComplete; + + PChars.ResetCompleteHandler = PtResetComplete; + PChars.RequestCompleteHandler = PtRequestComplete; + PChars.ReceiveHandler = PtReceive; + PChars.ReceiveCompleteHandler = PtReceiveComplete; + PChars.StatusHandler = PtStatus; + PChars.StatusCompleteHandler = PtStatusComplete; + PChars.BindAdapterHandler = PtBindAdapter; + PChars.UnbindAdapterHandler = PtUnbindAdapter; + PChars.UnloadHandler = PtUnloadProtocol; + + PChars.ReceivePacketHandler = PtReceivePacket; + PChars.PnPEventHandler= PtPNPHandler; + + NdisRegisterProtocol(&Status, + &ProtHandle, + &PChars, + sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); + + if (Status != NDIS_STATUS_SUCCESS) + { + NdisIMDeregisterLayeredMiniport(DriverHandle); + break; + } + + NdisIMAssociateMiniport(DriverHandle, ProtHandle); + } + while (FALSE); + + if (Status != NDIS_STATUS_SUCCESS) + { + NdisTerminateWrapper(NdisWrapperHandle, NULL); + } + + return(Status); +} + + +NDIS_STATUS +PtRegisterDevice( + VOID + ) +/*++ + +Routine Description: + + Register an ioctl interface - a device object to be used for this + purpose is created by NDIS when we call NdisMRegisterDevice. + + This routine is called whenever a new miniport instance is + initialized. However, we only create one global device object, + when the first miniport instance is initialized. This routine + handles potential race conditions with PtDeregisterDevice via + the ControlDeviceState and MiniportCount variables. + + NOTE: do not call this from DriverEntry; it will prevent the driver + from being unloaded (e.g. on uninstall). + +Arguments: + + None + +Return Value: + + NDIS_STATUS_SUCCESS if we successfully register a device object. + +--*/ +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + UNICODE_STRING DeviceName; + UNICODE_STRING DeviceLinkUnicodeString; + PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; + + DBGPRINT(("==>PtRegisterDevice\n")); + + NdisAcquireSpinLock(&GlobalLock); + + ++MiniportCount; + + if (1 == MiniportCount) + { + ASSERT(ControlDeviceState != PS_DEVICE_STATE_CREATING); + + // + // Another thread could be running PtDeregisterDevice on + // behalf of another miniport instance. If so, wait for + // it to exit. + // + while (ControlDeviceState != PS_DEVICE_STATE_READY) + { + NdisReleaseSpinLock(&GlobalLock); + NdisMSleep(1); + NdisAcquireSpinLock(&GlobalLock); + } + + ControlDeviceState = PS_DEVICE_STATE_CREATING; + + NdisReleaseSpinLock(&GlobalLock); + + + NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH)); + + DispatchTable[IRP_MJ_CREATE] = PtDispatch; + DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; + DispatchTable[IRP_MJ_CLOSE] = PtDispatch; + DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch; + + + NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); + NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); + + // + // Create a device object and register our dispatch handlers + // + + Status = NdisMRegisterDevice( + NdisWrapperHandle, + &DeviceName, + &DeviceLinkUnicodeString, + &DispatchTable[0], + &ControlDeviceObject, + &NdisDeviceHandle + ); + + NdisAcquireSpinLock(&GlobalLock); + + ControlDeviceState = PS_DEVICE_STATE_READY; + } + + NdisReleaseSpinLock(&GlobalLock); + + DBGPRINT(("<==PtRegisterDevice: %x\n", Status)); + + return (Status); +} + + +NTSTATUS +PtDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +/*++ +Routine Description: + + Process IRPs sent to this device. + +Arguments: + + DeviceObject - pointer to a device object + Irp - pointer to an I/O Request Packet + +Return Value: + + NTSTATUS - STATUS_SUCCESS always - change this when adding + real code to handle ioctls. + +--*/ +{ + PIO_STACK_LOCATION irpStack; + NTSTATUS status = STATUS_SUCCESS; + + UNREFERENCED_PARAMETER(DeviceObject); + + DBGPRINT(("==>Pt Dispatch\n")); + irpStack = IoGetCurrentIrpStackLocation(Irp); + + + switch (irpStack->MajorFunction) + { + case IRP_MJ_CREATE: + break; + + case IRP_MJ_CLEANUP: + break; + + case IRP_MJ_CLOSE: + break; + + case IRP_MJ_DEVICE_CONTROL: + // + // Add code here to handle ioctl commands sent to passthru. + // + break; + default: + break; + } + + Irp->IoStatus.Status = status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + DBGPRINT(("<== Pt Dispatch\n")); + + return status; + +} + + +NDIS_STATUS +PtDeregisterDevice( + VOID + ) +/*++ + +Routine Description: + + Deregister the ioctl interface. This is called whenever a miniport + instance is halted. When the last miniport instance is halted, we + request NDIS to delete the device object + +Arguments: + + NdisDeviceHandle - Handle returned by NdisMRegisterDevice + +Return Value: + + NDIS_STATUS_SUCCESS if everything worked ok + +--*/ +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + DBGPRINT(("==>PassthruDeregisterDevice\n")); + + NdisAcquireSpinLock(&GlobalLock); + + ASSERT(MiniportCount > 0); + + --MiniportCount; + + if (0 == MiniportCount) + { + // + // All miniport instances have been halted. Deregister + // the control device. + // + + ASSERT(ControlDeviceState == PS_DEVICE_STATE_READY); + + // + // Block PtRegisterDevice() while we release the control + // device lock and deregister the device. + // + ControlDeviceState = PS_DEVICE_STATE_DELETING; + + NdisReleaseSpinLock(&GlobalLock); + + if (NdisDeviceHandle != NULL) + { + Status = NdisMDeregisterDevice(NdisDeviceHandle); + NdisDeviceHandle = NULL; + } + + NdisAcquireSpinLock(&GlobalLock); + ControlDeviceState = PS_DEVICE_STATE_READY; + } + + NdisReleaseSpinLock(&GlobalLock); + + DBGPRINT(("<== PassthruDeregisterDevice: %x\n", Status)); + return Status; + +} + +VOID +PtUnload( + IN PDRIVER_OBJECT DriverObject + ) +// +// PassThru driver unload function +// +{ + UNREFERENCED_PARAMETER(DriverObject); + + DBGPRINT(("PtUnload: entered\n")); + + PtUnloadProtocol(); + + NdisIMDeregisterLayeredMiniport(DriverHandle); + + NdisFreeSpinLock(&GlobalLock); + + DBGPRINT(("PtUnload: done!\n")); +} + diff --git a/original_passthru/passthru.h b/original_passthru/passthru.h new file mode 100644 index 0000000..badde8a --- /dev/null +++ b/original_passthru/passthru.h @@ -0,0 +1,477 @@ +/*++ + +Copyright (c) 1992-2000 Microsoft Corporation + +Module Name: + + passthru.h + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + +#ifdef NDIS51_MINIPORT +#define PASSTHRU_MAJOR_NDIS_VERSION 5 +#define PASSTHRU_MINOR_NDIS_VERSION 1 +#else +#define PASSTHRU_MAJOR_NDIS_VERSION 4 +#define PASSTHRU_MINOR_NDIS_VERSION 0 +#endif + +#ifdef NDIS51 +#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 5 +#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0 +#else +#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 4 +#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0 +#endif + +#define MAX_BUNDLEID_LENGTH 50 + +#define TAG 'ImPa' +#define WAIT_INFINITE 0 + + + +//advance declaration +typedef struct _ADAPT ADAPT, *PADAPT; + +DRIVER_INITIALIZE DriverEntry; +extern +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ); + +DRIVER_DISPATCH PtDispatch; +NTSTATUS +PtDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NDIS_STATUS +PtRegisterDevice( + VOID + ); + +NDIS_STATUS +PtDeregisterDevice( + VOID + ); + +DRIVER_UNLOAD PtUnload; +VOID +PtUnloadProtocol( + VOID + ); + +// +// Protocol proto-types +// +extern +VOID +PtOpenAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus + ); + +extern +VOID +PtCloseAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ); + +extern +VOID +PtResetComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ); + +extern +VOID +PtRequestComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status + ); + +extern +VOID +PtStatus( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ); + +extern +VOID +PtStatusComplete( + IN NDIS_HANDLE ProtocolBindingContext + ); + +extern +VOID +PtSendComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ); + +extern +VOID +PtTransferDataComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ); + +extern +NDIS_STATUS +PtReceive( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ); + +extern +VOID +PtReceiveComplete( + IN NDIS_HANDLE ProtocolBindingContext + ); + +extern +INT +PtReceivePacket( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet + ); + +extern +VOID +PtBindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2 + ); + +extern +VOID +PtUnbindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext + ); + +VOID +PtUnload( + IN PDRIVER_OBJECT DriverObject + ); + + + +extern +NDIS_STATUS +PtPNPHandler( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT pNetPnPEvent + ); + + + + +NDIS_STATUS +PtPnPNetEventReconfigure( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ); + +NDIS_STATUS +PtPnPNetEventSetPower ( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ); + + +// +// Miniport proto-types +// +NDIS_STATUS +MPInitialize( + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE WrapperConfigurationContext + ); + +VOID +MPSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets + ); + +NDIS_STATUS +MPSend( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags + ); + +NDIS_STATUS +MPQueryInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded + ); + +NDIS_STATUS +MPSetInformation( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +MPReturnPacket( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet + ); + +NDIS_STATUS +MPTransferData( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer + ); + +VOID +MPHalt( + IN NDIS_HANDLE MiniportAdapterContext + ); + + +VOID +MPQueryPNPCapabilities( + OUT PADAPT MiniportProtocolContext, + OUT PNDIS_STATUS Status + ); + + +#ifdef NDIS51_MINIPORT + +VOID +MPCancelSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CancelId + ); + +VOID +MPAdapterShutdown( + IN NDIS_HANDLE MiniportAdapterContext + ); + +VOID +MPDevicePnPEvent( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength + ); + +#endif // NDIS51_MINIPORT + +VOID +MPFreeAllPacketPools( + IN PADAPT pAdapt + ); + + +VOID +MPProcessSetPowerOid( + IN OUT PNDIS_STATUS pNdisStatus, + IN PADAPT pAdapt, + __in_bcount(InformationBufferLength) IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +PtReferenceAdapt( + IN PADAPT pAdapt + ); + +BOOLEAN +PtDereferenceAdapt( + IN PADAPT pAdapt + ); + +// +// There should be no DbgPrint's in the Free version of the driver +// +#if DBG + +#define DBGPRINT(Fmt) \ + { \ + DbgPrint("Passthru: "); \ + DbgPrint Fmt; \ + } + +#else // if DBG + +#define DBGPRINT(Fmt) + +#endif // if DBG + +#define NUM_PKTS_IN_POOL 256 + + +// +// Protocol reserved part of a sent packet that is allocated by us. +// +typedef struct _SEND_RSVD +{ + PNDIS_PACKET OriginalPkt; +} SEND_RSVD, *PSEND_RSVD; + +// +// Miniport reserved part of a received packet that is allocated by +// us. Note that this should fit into the MiniportReserved space +// in an NDIS_PACKET. +// +typedef struct _RECV_RSVD +{ + PNDIS_PACKET OriginalPkt; +} RECV_RSVD, *PRECV_RSVD; + +C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved)); + +// +// Event Codes related to the PassthruEvent Structure +// + +typedef enum +{ + Passthru_Invalid, + Passthru_SetPower, + Passthru_Unbind + +} PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE; + +// +// Passthru Event with a code to state why they have been state +// + +typedef struct _PASSTHRU_EVENT +{ + NDIS_EVENT Event; + PASSSTHRU_EVENT_CODE Code; + +} PASSTHRU_EVENT, *PPASSTHRU_EVENT; + + +// +// Structure used by both the miniport as well as the protocol part of the intermediate driver +// to represent an adapter and its corres. lower bindings +// +typedef struct _ADAPT +{ + struct _ADAPT * Next; + + NDIS_HANDLE BindingHandle; // To the lower miniport + NDIS_HANDLE MiniportHandle; // NDIS Handle to for miniport up-calls + NDIS_HANDLE SendPacketPoolHandle; + NDIS_HANDLE RecvPacketPoolHandle; + NDIS_STATUS Status; // Open Status + NDIS_EVENT Event; // Used by bind/halt for Open/Close Adapter synch. + NDIS_MEDIUM Medium; + NDIS_REQUEST Request; // This is used to wrap a request coming down + // to us. This exploits the fact that requests + // are serialized down to us. + PULONG BytesNeeded; + PULONG BytesReadOrWritten; + BOOLEAN ReceivedIndicationFlags[32]; + + BOOLEAN OutstandingRequests; // TRUE iff a request is pending + // at the miniport below + BOOLEAN QueuedRequest; // TRUE iff a request is queued at + // this IM miniport + + BOOLEAN StandingBy; // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State + BOOLEAN UnbindingInProcess; + NDIS_SPIN_LOCK Lock; + // False - At all other times, - Flag is cleared after a transition to D0 + + NDIS_DEVICE_POWER_STATE MPDeviceState; // Miniport's Device State + NDIS_DEVICE_POWER_STATE PTDeviceState; // Protocol's Device State + NDIS_STRING DeviceName; // For initializing the miniport edge + NDIS_EVENT MiniportInitEvent; // For blocking UnbindAdapter while + // an IM Init is in progress. + BOOLEAN MiniportInitPending; // TRUE iff IMInit in progress + NDIS_STATUS LastIndicatedStatus; // The last indicated media status + NDIS_STATUS LatestUnIndicateStatus; // The latest suppressed media status + ULONG OutstandingSends; + LONG RefCount; + BOOLEAN MiniportIsHalted; +} ADAPT, *PADAPT; + +extern NDIS_HANDLE ProtHandle, DriverHandle; +extern NDIS_MEDIUM MediumArray[4]; +extern PADAPT pAdaptList; +extern NDIS_SPIN_LOCK GlobalLock; + + +#define ADAPT_MINIPORT_HANDLE(_pAdapt) ((_pAdapt)->MiniportHandle) +#define ADAPT_DECR_PENDING_SENDS(_pAdapt) \ + { \ + NdisAcquireSpinLock(&(_pAdapt)->Lock); \ + (_pAdapt)->OutstandingSends--; \ + NdisReleaseSpinLock(&(_pAdapt)->Lock); \ + } + +// +// Custom Macros to be used by the passthru driver +// +/* +BOOLEAN +IsIMDeviceStateOn( + PADAPT + ) + +*/ +#define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 ) + diff --git a/original_passthru/passthru.htm b/original_passthru/passthru.htm new file mode 100644 index 0000000..ee23278 --- /dev/null +++ b/original_passthru/passthru.htm @@ -0,0 +1,486 @@ + + + + + + + + +passthru + + + + + + + + + + + + + + + + + + diff --git a/original_passthru/passthru.rc b/original_passthru/passthru.rc new file mode 100644 index 0000000..6ae427c --- /dev/null +++ b/original_passthru/passthru.rc @@ -0,0 +1,41 @@ +#include +#include + +/*-----------------------------------------------*/ +/* the following lines are specific to this file */ +/*-----------------------------------------------*/ + +/* VER_FILETYPE, VER_FILESUBTYPE, VER_FILEDESCRIPTION_STR + * and VER_INTERNALNAME_STR must be defined before including COMMON.VER + * The strings don't need a '\0', since common.ver has them. + */ +#define VER_FILETYPE VFT_DRV +/* possible values: VFT_UNKNOWN + VFT_APP + VFT_DLL + VFT_DRV + VFT_FONT + VFT_VXD + VFT_STATIC_LIB +*/ +#define VER_FILESUBTYPE VFT2_DRV_NETWORK +/* possible values VFT2_UNKNOWN + VFT2_DRV_PRINTER + VFT2_DRV_KEYBOARD + VFT2_DRV_LANGUAGE + VFT2_DRV_DISPLAY + VFT2_DRV_MOUSE + VFT2_DRV_NETWORK + VFT2_DRV_SYSTEM + VFT2_DRV_INSTALLABLE + VFT2_DRV_SOUND + VFT2_DRV_COMM +*/ +#define VER_FILEDESCRIPTION_STR "Sample NDIS 4.0 Intermediate Miniport Driver" +#define VER_INTERNALNAME_STR "PASSTHRU.SYS" +#define VER_ORIGINALFILENAME_STR "PASSTHRU.SYS" +#define VER_LANGNEUTRAL + +#include "common.ver" + + diff --git a/original_passthru/precomp.h b/original_passthru/precomp.h new file mode 100644 index 0000000..b2870d1 --- /dev/null +++ b/original_passthru/precomp.h @@ -0,0 +1,11 @@ +#pragma warning(disable:4214) // bit field types other than int + +#pragma warning(disable:4201) // nameless struct/union +#pragma warning(disable:4115) // named type definition in parentheses +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4054) // cast of function pointer to PVOID +#pragma warning(disable:4244) // conversion from 'int' to 'BOOLEAN', possible loss of data + +#include +#include "passthru.h" + diff --git a/original_passthru/protocol.c b/original_passthru/protocol.c new file mode 100644 index 0000000..213924c --- /dev/null +++ b/original_passthru/protocol.c @@ -0,0 +1,1626 @@ +/*++ + +Copyright(c) 1992-2000 Microsoft Corporation + +Module Name: + + protocol.c + +Abstract: + + Ndis Intermediate Miniport driver sample. This is a passthru driver. + +Author: + +Environment: + + +Revision History: + + +--*/ + + +#include "precomp.h" +#pragma hdrstop + +#define MAX_PACKET_POOL_SIZE 0x0000FFFF +#define MIN_PACKET_POOL_SIZE 0x000000FF + +// +// NDIS version as 0xMMMMmmmm, where M=Major/m=minor (0x00050001 = 5.1); +// initially unknown (0) +// +ULONG NdisDotSysVersion = 0x0; + + +#define NDIS_SYS_VERSION_51 0x00050001 + + +VOID +PtBindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2 + ) +/*++ + +Routine Description: + + Called by NDIS to bind to a miniport below. + +Arguments: + + Status - Return status of bind here. + BindContext - Can be passed to NdisCompleteBindAdapter if this call is pended. + DeviceName - Device name to bind to. This is passed to NdisOpenAdapter. + SystemSpecific1 - Can be passed to NdisOpenProtocolConfiguration to read per-binding information + SystemSpecific2 - Unused + +Return Value: + + NDIS_STATUS_PENDING if this call is pended. In this case call NdisCompleteBindAdapter + to complete. + Anything else Completes this call synchronously + +--*/ +{ + NDIS_HANDLE ConfigHandle = NULL; + PNDIS_CONFIGURATION_PARAMETER Param; + NDIS_STRING DeviceStr = NDIS_STRING_CONST("UpperBindings"); + NDIS_STRING NdisVersionStr = NDIS_STRING_CONST("NdisVersion"); + PADAPT pAdapt = NULL; + NDIS_STATUS Sts; + UINT MediumIndex; + ULONG TotalSize; + BOOLEAN NoCleanUpNeeded = FALSE; + + + UNREFERENCED_PARAMETER(BindContext); + UNREFERENCED_PARAMETER(SystemSpecific2); + + DBGPRINT(("==> Protocol BindAdapter\n")); + + do + { + // + // Access the configuration section for our binding-specific + // parameters. + // + NdisOpenProtocolConfiguration(Status, + &ConfigHandle, + SystemSpecific1); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + if (NdisDotSysVersion == 0) + { + NdisReadConfiguration(Status, + &Param, + ConfigHandle, + &NdisVersionStr, // "NdisVersion" + NdisParameterInteger); + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + NdisDotSysVersion = Param->ParameterData.IntegerData; + } + + + // + // Read the "UpperBindings" reserved key that contains a list + // of device names representing our miniport instances corresponding + // to this lower binding. Since this is a 1:1 IM driver, this key + // contains exactly one name. + // + // If we want to implement a N:1 mux driver (N adapter instances + // over a single lower binding), then UpperBindings will be a + // MULTI_SZ containing a list of device names - we would loop through + // this list, calling NdisIMInitializeDeviceInstanceEx once for + // each name in it. + // + NdisReadConfiguration(Status, + &Param, + ConfigHandle, + &DeviceStr, + NdisParameterString); + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Allocate memory for the Adapter structure. This represents both the + // protocol context as well as the adapter structure when the miniport + // is initialized. + // + // In addition to the base structure, allocate space for the device + // instance string. + // + TotalSize = sizeof(ADAPT) + Param->ParameterData.StringData.MaximumLength; + + NdisAllocateMemoryWithTag(&pAdapt, TotalSize, TAG); + + if (pAdapt == NULL) + { + *Status = NDIS_STATUS_RESOURCES; + break; + } + + // + // Initialize the adapter structure. We copy in the IM device + // name as well, because we may need to use it in a call to + // NdisIMCancelInitializeDeviceInstance. The string returned + // by NdisReadConfiguration is active (i.e. available) only + // for the duration of this call to our BindAdapter handler. + // + NdisZeroMemory(pAdapt, TotalSize); + pAdapt->DeviceName.MaximumLength = Param->ParameterData.StringData.MaximumLength; + pAdapt->DeviceName.Length = Param->ParameterData.StringData.Length; + pAdapt->DeviceName.Buffer = (PWCHAR)((ULONG_PTR)pAdapt + sizeof(ADAPT)); + NdisMoveMemory(pAdapt->DeviceName.Buffer, + Param->ParameterData.StringData.Buffer, + Param->ParameterData.StringData.MaximumLength); + + + + NdisInitializeEvent(&pAdapt->Event); + NdisAllocateSpinLock(&pAdapt->Lock); + + // + // Allocate a packet pool for sends. We need this to pass sends down. + // We cannot use the same packet descriptor that came down to our send + // handler (see also NDIS 5.1 packet stacking). + // + NdisAllocatePacketPoolEx(Status, + &pAdapt->SendPacketPoolHandle, + MIN_PACKET_POOL_SIZE, + MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE, + sizeof(SEND_RSVD)); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Allocate a packet pool for receives. We need this to indicate receives. + // Same consideration as sends (see also NDIS 5.1 packet stacking). + // + NdisAllocatePacketPoolEx(Status, + &pAdapt->RecvPacketPoolHandle, + MIN_PACKET_POOL_SIZE, + MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE, + PROTOCOL_RESERVED_SIZE_IN_PACKET); + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + + // + // Now open the adapter below and complete the initialization + // + NdisOpenAdapter(Status, + &Sts, + &pAdapt->BindingHandle, + &MediumIndex, + MediumArray, + sizeof(MediumArray)/sizeof(NDIS_MEDIUM), + ProtHandle, + pAdapt, + DeviceName, + 0, + NULL); + + if (*Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + *Status = pAdapt->Status; + } + + if (*Status != NDIS_STATUS_SUCCESS) + { + break; + } + PtReferenceAdapt(pAdapt); + +#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "Ndis guarantees MediumIndex to be within bounds"); + pAdapt->Medium = MediumArray[MediumIndex]; + + // + // Now ask NDIS to initialize our miniport (upper) edge. + // Set the flag below to synchronize with a possible call + // to our protocol Unbind handler that may come in before + // our miniport initialization happens. + // + pAdapt->MiniportInitPending = TRUE; + NdisInitializeEvent(&pAdapt->MiniportInitEvent); + + PtReferenceAdapt(pAdapt); + + *Status = NdisIMInitializeDeviceInstanceEx(DriverHandle, + &pAdapt->DeviceName, + pAdapt); + + if (*Status != NDIS_STATUS_SUCCESS) + { + if (pAdapt->MiniportIsHalted == TRUE) + { + NoCleanUpNeeded = TRUE; + } + + DBGPRINT(("BindAdapter: Adapt %p, IMInitializeDeviceInstance error %x\n", + pAdapt, *Status)); + + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + + break; + } + + PtDereferenceAdapt(pAdapt); + + } while(FALSE); + + // + // Close the configuration handle now - see comments above with + // the call to NdisIMInitializeDeviceInstanceEx. + // + if (ConfigHandle != NULL) + { + NdisCloseConfiguration(ConfigHandle); + } + + if ((*Status != NDIS_STATUS_SUCCESS) && (NoCleanUpNeeded == FALSE)) + { + if (pAdapt != NULL) + { + if (pAdapt->BindingHandle != NULL) + { + NDIS_STATUS LocalStatus; + + // + // Close the binding we opened above. + // + + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(&LocalStatus, pAdapt->BindingHandle); + pAdapt->BindingHandle = NULL; + + if (LocalStatus == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + LocalStatus = pAdapt->Status; + + + } + if (PtDereferenceAdapt(pAdapt)) + { + pAdapt = NULL; + } + } + } + } + + + DBGPRINT(("<== Protocol BindAdapter: pAdapt %p, Status %x\n", pAdapt, *Status)); +} + + +VOID +PtOpenAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus + ) +/*++ + +Routine Description: + + Completion routine for NdisOpenAdapter issued from within the PtBindAdapter. Simply + unblock the caller. + +Arguments: + + ProtocolBindingContext Pointer to the adapter + Status Status of the NdisOpenAdapter call + OpenErrorStatus Secondary status(ignored by us). + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + UNREFERENCED_PARAMETER(OpenErrorStatus); + + DBGPRINT(("==> PtOpenAdapterComplete: Adapt %p, Status %x\n", pAdapt, Status)); + pAdapt->Status = Status; + NdisSetEvent(&pAdapt->Event); +} + + +VOID +PtUnbindAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext + ) +/*++ + +Routine Description: + + Called by NDIS when we are required to unbind to the adapter below. + This functions shares functionality with the miniport's HaltHandler. + The code should ensure that NdisCloseAdapter and NdisFreeMemory is called + only once between the two functions + +Arguments: + + Status Placeholder for return status + ProtocolBindingContext Pointer to the adapter structure + UnbindContext Context for NdisUnbindComplete() if this pends + +Return Value: + + Status for NdisIMDeinitializeDeviceContext + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS LocalStatus; + + UNREFERENCED_PARAMETER(UnbindContext); + + DBGPRINT(("==> PtUnbindAdapter: Adapt %p\n", pAdapt)); + + // + // Set the flag that the miniport below is unbinding, so the request handlers will + // fail any request comming later + // + NdisAcquireSpinLock(&pAdapt->Lock); + pAdapt->UnbindingInProcess = TRUE; + if (pAdapt->QueuedRequest == TRUE) + { + pAdapt->QueuedRequest = FALSE; + NdisReleaseSpinLock(&pAdapt->Lock); + + PtRequestComplete(pAdapt, + &pAdapt->Request, + NDIS_STATUS_FAILURE ); + + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } +#ifndef WIN9X + // + // Check if we had called NdisIMInitializeDeviceInstanceEx and + // we are awaiting a call to MiniportInitialize. + // + if (pAdapt->MiniportInitPending == TRUE) + { + // + // Try to cancel the pending IMInit process. + // + LocalStatus = NdisIMCancelInitializeDeviceInstance( + DriverHandle, + &pAdapt->DeviceName); + + if (LocalStatus == NDIS_STATUS_SUCCESS) + { + // + // Successfully cancelled IM Initialization; our + // Miniport Initialize routine will not be called + // for this device. + // + pAdapt->MiniportInitPending = FALSE; + ASSERT(pAdapt->MiniportHandle == NULL); + } + else + { + // + // Our Miniport Initialize routine will be called + // (may be running on another thread at this time). + // Wait for it to finish. + // + NdisWaitEvent(&pAdapt->MiniportInitEvent, 0); + ASSERT(pAdapt->MiniportInitPending == FALSE); + } + + } +#endif // !WIN9X + + // + // Call NDIS to remove our device-instance. We do most of the work + // inside the HaltHandler. + // + // The Handle will be NULL if our miniport Halt Handler has been called or + // if the IM device was never initialized + // + + if (pAdapt->MiniportHandle != NULL) + { + *Status = NdisIMDeInitializeDeviceInstance(pAdapt->MiniportHandle); + + if (*Status != NDIS_STATUS_SUCCESS) + { + *Status = NDIS_STATUS_FAILURE; + } + } + else + { + // + // We need to do some work here. + // Close the binding below us + // and release the memory allocated. + // + + if(pAdapt->BindingHandle != NULL) + { + NdisResetEvent(&pAdapt->Event); + + NdisCloseAdapter(Status, pAdapt->BindingHandle); + + // + // Wait for it to complete + // + if(*Status == NDIS_STATUS_PENDING) + { + NdisWaitEvent(&pAdapt->Event, 0); + *Status = pAdapt->Status; + } + pAdapt->BindingHandle = NULL; + } + else + { + // + // Both Our MiniportHandle and Binding Handle should not be NULL. + // + *Status = NDIS_STATUS_FAILURE; + ASSERT(0); + } + + // + // Free the memory here, if was not released earlier(by calling the HaltHandler) + // + MPFreeAllPacketPools(pAdapt); + NdisFreeSpinLock(&pAdapt->Lock); + NdisFreeMemory(pAdapt, 0, 0); + } + + DBGPRINT(("<== PtUnbindAdapter: Adapt %p\n", pAdapt)); +} + +VOID +PtUnloadProtocol( + VOID +) +{ + NDIS_STATUS Status; + + if (ProtHandle != NULL) + { + NdisDeregisterProtocol(&Status, ProtHandle); + ProtHandle = NULL; + } + + DBGPRINT(("PtUnloadProtocol: done!\n")); +} + + + +VOID +PtCloseAdapterComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion for the CloseAdapter call. + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + Status Completion status + +Return Value: + + None. + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + DBGPRINT(("CloseAdapterComplete: Adapt %p, Status %x\n", pAdapt, Status)); + pAdapt->Status = Status; + NdisSetEvent(&pAdapt->Event); +} + + +VOID +PtResetComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion for the reset. + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + Status Completion status + +Return Value: + + None. + +--*/ +{ + + UNREFERENCED_PARAMETER(ProtocolBindingContext); + UNREFERENCED_PARAMETER(Status); + // + // We never issue a reset, so we should not be here. + // + ASSERT(0); +} + + +VOID +PtRequestComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Completion handler for the previously posted request. All OIDS + are completed by and sent to the same miniport that they were requested for. + If Oid == OID_PNP_QUERY_POWER then the data structure needs to returned with all entries = + NdisDeviceStateUnspecified + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + NdisRequest The posted request + Status Completion status + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + NDIS_OID Oid = pAdapt->Request.DATA.SET_INFORMATION.Oid ; + + // + // Since our request is not outstanding anymore + // + ASSERT(pAdapt->OutstandingRequests == TRUE); + + pAdapt->OutstandingRequests = FALSE; + + // + // Complete the Set or Query, and fill in the buffer for OID_PNP_CAPABILITIES, if need be. + // + switch (NdisRequest->RequestType) + { + case NdisRequestQueryInformation: + + // + // We never pass OID_PNP_QUERY_POWER down. + // + ASSERT(Oid != OID_PNP_QUERY_POWER); + + if ((Oid == OID_PNP_CAPABILITIES) && (Status == NDIS_STATUS_SUCCESS)) + { + MPQueryPNPCapabilities(pAdapt, &Status); + } + *pAdapt->BytesReadOrWritten = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten; + *pAdapt->BytesNeeded = NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded; + + if (((Oid == OID_GEN_MAC_OPTIONS) + && (Status == NDIS_STATUS_SUCCESS)) + && (NdisDotSysVersion >= NDIS_SYS_VERSION_51)) + { + // + // Only do this on Windows XP or greater (NDIS.SYS v 5.1); + // do not do in Windows 2000 (NDIS.SYS v 5.0)) + // + + // + // Remove the no-loopback bit from mac-options. In essence we are + // telling NDIS that we can handle loopback. We don't, but the + // interface below us does. If we do not do this, then loopback + // processing happens both below us and above us. This is wasteful + // at best and if Netmon is running, it will see multiple copies + // of loopback packets when sniffing above us. + // + // Only the lowest miniport is a stack of layered miniports should + // ever report this bit set to NDIS. + // + *(PULONG)NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer &= ~NDIS_MAC_OPTION_NO_LOOPBACK; + } + + NdisMQueryInformationComplete(pAdapt->MiniportHandle, + Status); + break; + + case NdisRequestSetInformation: + + ASSERT( Oid != OID_PNP_SET_POWER); + + *pAdapt->BytesReadOrWritten = NdisRequest->DATA.SET_INFORMATION.BytesRead; + *pAdapt->BytesNeeded = NdisRequest->DATA.SET_INFORMATION.BytesNeeded; + NdisMSetInformationComplete(pAdapt->MiniportHandle, + Status); + break; + + default: + ASSERT(0); + break; + } + +} + + +VOID +PtStatus( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ) +/*++ + +Routine Description: + + Status handler for the lower-edge(protocol). + +Arguments: + + ProtocolBindingContext Pointer to the adapter structure + GeneralStatus Status code + StatusBuffer Status buffer + StatusBufferSize Size of the status buffer + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + + // + // Pass up this indication only if the upper edge miniport is initialized + // and powered on. Also ignore indications that might be sent by the lower + // miniport when it isn't at D0. + // + if ((pAdapt->MiniportHandle != NULL) && + (pAdapt->MPDeviceState == NdisDeviceStateD0) && + (pAdapt->PTDeviceState == NdisDeviceStateD0)) + { + if ((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || + (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT)) + { + + pAdapt->LastIndicatedStatus = GeneralStatus; + } + NdisMIndicateStatus(pAdapt->MiniportHandle, + GeneralStatus, + StatusBuffer, + StatusBufferSize); + } + // + // Save the last indicated media status + // + else + { + if ((pAdapt->MiniportHandle != NULL) && + ((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || + (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT))) + { + pAdapt->LatestUnIndicateStatus = GeneralStatus; + } + } + +} + + +VOID +PtStatusComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +/*++ + +Routine Description: + + +Arguments: + + +Return Value: + + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + + // + // Pass up this indication only if the upper edge miniport is initialized + // and powered on. Also ignore indications that might be sent by the lower + // miniport when it isn't at D0. + // + if ((pAdapt->MiniportHandle != NULL) && + (pAdapt->MPDeviceState == NdisDeviceStateD0) && + (pAdapt->PTDeviceState == NdisDeviceStateD0)) + { + NdisMIndicateStatusComplete(pAdapt->MiniportHandle); + } +} + + +VOID +PtSendComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ) +/*++ + +Routine Description: + + Called by NDIS when the miniport below had completed a send. We should + complete the corresponding upper-edge send this represents. + +Arguments: + + ProtocolBindingContext - Points to ADAPT structure + Packet - Low level packet being completed + Status - status of send + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + PNDIS_PACKET Pkt; + NDIS_HANDLE PoolHandle; + +#ifdef NDIS51 + // + // Packet stacking: + // + // Determine if the packet we are completing is the one we allocated. If so, then + // get the original packet from the reserved area and completed it and free the + // allocated packet. If this is the packet that was sent down to us, then just + // complete it + // + PoolHandle = NdisGetPoolFromPacket(Packet); + if (PoolHandle != pAdapt->SendPacketPoolHandle) + { + // + // We had passed down a packet belonging to the protocol above us. + // + // DBGPRINT(("PtSendComp: Adapt %p, Stacked Packet %p\n", pAdapt, Packet)); + + NdisMSendComplete(pAdapt->MiniportHandle, + Packet, + Status); + } + else +#endif // NDIS51 + { + PSEND_RSVD SendRsvd; + + SendRsvd = (PSEND_RSVD)(Packet->ProtocolReserved); + Pkt = SendRsvd->OriginalPkt; + +#ifndef WIN9X + NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); +#endif + + NdisDprFreePacket(Packet); + + NdisMSendComplete(pAdapt->MiniportHandle, + Pkt, + Status); + } + // + // Decrease the outstanding send count + // + ADAPT_DECR_PENDING_SENDS(pAdapt); +} + + +VOID +PtTransferDataComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ) +/*++ + +Routine Description: + + Entry point called by NDIS to indicate completion of a call by us + to NdisTransferData. + + See notes under SendComplete. + +Arguments: + +Return Value: + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + + if(pAdapt->MiniportHandle) + { + NdisMTransferDataComplete(pAdapt->MiniportHandle, + Packet, + Status, + BytesTransferred); + } +} + + +NDIS_STATUS +PtReceive( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookAheadBufferSize, + IN UINT PacketSize + ) +/*++ + +Routine Description: + + Handle receive data indicated up by the miniport below. We pass + it along to the protocol above us. + + If the miniport below indicates packets, NDIS would more + likely call us at our ReceivePacket handler. However we + might be called here in certain situations even though + the miniport below has indicated a receive packet, e.g. + if the miniport had set packet status to NDIS_STATUS_RESOURCES. + +Arguments: + + + +Return Value: + + NDIS_STATUS_SUCCESS if we processed the receive successfully, + NDIS_STATUS_XXX error code if we discarded it. + +--*/ +{ + PADAPT pAdapt = (PADAPT)ProtocolBindingContext; + PNDIS_PACKET MyPacket, Packet = NULL; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + ULONG Proc = KeGetCurrentProcessorNumber(); + + if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0)) + { + Status = NDIS_STATUS_FAILURE; + } + else do + { + // + // Get at the packet, if any, indicated up by the miniport below. + // + Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); + if (Packet != NULL) + { + // + // The miniport below did indicate up a packet. Use information + // from that packet to construct a new packet to indicate up. + // + +#ifdef NDIS51 + // + // NDIS 5.1 NOTE: Do not reuse the original packet in indicating + // up a receive, even if there is sufficient packet stack space. + // If we had to do so, we would have had to overwrite the + // status field in the original packet to NDIS_STATUS_RESOURCES, + // and it is not allowed for protocols to overwrite this field + // in received packets. + // +#endif // NDIS51 + + // + // Get a packet off the pool and indicate that up + // + NdisDprAllocatePacket(&Status, + &MyPacket, + pAdapt->RecvPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + // + // Make our packet point to data from the original + // packet. NOTE: this works only because we are + // indicating a receive directly from the context of + // our receive indication. If we need to queue this + // packet and indicate it from another thread context, + // we will also have to allocate a new buffer and copy + // over the packet contents, OOB data and per-packet + // information. This is because the packet data + // is available only for the duration of this + // receive indication call. + // + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); + + // + // Get the original packet (it could be the same packet as the + // one received or a different one based on the number of layered + // miniports below) and set it on the indicated packet so the OOB + // data is visible correctly at protocols above. If the IM driver + // modifies the packet in any way it should not set the new packet's + // original packet equal to the original packet of the packet that + // was indicated to it from the underlying driver, in this case, the + // IM driver should also ensure that the related per packet info should + // be copied to the new packet. + // we can set the original packet to the original packet of the packet + // indicated from the underlying driver because the driver doesn't modify + // the data content in the packet. + // + NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); + NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); + + // + // Copy packet flags. + // + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + // + // Force protocols above to make a copy if they want to hang + // on to data in this packet. This is because we are in our + // Receive handler (not ReceivePacket) and we can't return a + // ref count from here. + // + NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); + + // + // By setting NDIS_STATUS_RESOURCES, we also know that we can reclaim + // this packet as soon as the call to NdisMIndicateReceivePacket + // returns. + // + + if (pAdapt->MiniportHandle != NULL) + { + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + + // + // Reclaim the indicated packet. Since we had set its status + // to NDIS_STATUS_RESOURCES, we are guaranteed that protocols + // above are done with it. + // + NdisDprFreePacket(MyPacket); + + break; + } + } + else + { + // + // The miniport below us uses the old-style (not packet) + // receive indication. Fall through. + // + } + + // + // Fall through if the miniport below us has either not + // indicated a packet or we could not allocate one + // + pAdapt->ReceivedIndicationFlags[Proc] = TRUE; + if (pAdapt->MiniportHandle == NULL) + { + break; + } + switch (pAdapt->Medium) + { + case NdisMedium802_3: + case NdisMediumWan: + NdisMEthIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; + + case NdisMedium802_5: + NdisMTrIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; + +#if FDDI + case NdisMediumFddi: + NdisMFddiIndicateReceive(pAdapt->MiniportHandle, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookAheadBuffer, + LookAheadBufferSize, + PacketSize); + break; +#endif + default: + ASSERT(FALSE); + break; + } + + } while(FALSE); + + return Status; +} + + +VOID +PtReceiveComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +/*++ + +Routine Description: + + Called by the adapter below us when it is done indicating a batch of + received packets. + +Arguments: + + ProtocolBindingContext Pointer to our adapter structure. + +Return Value: + + None + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + ULONG Proc = KeGetCurrentProcessorNumber(); + + if (((pAdapt->MiniportHandle != NULL) + && (pAdapt->MPDeviceState == NdisDeviceStateD0)) + && (pAdapt->ReceivedIndicationFlags[Proc])) + { + switch (pAdapt->Medium) + { + case NdisMedium802_3: + case NdisMediumWan: + NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); + break; + + case NdisMedium802_5: + NdisMTrIndicateReceiveComplete(pAdapt->MiniportHandle); + break; +#if FDDI + case NdisMediumFddi: + NdisMFddiIndicateReceiveComplete(pAdapt->MiniportHandle); + break; +#endif + default: + ASSERT(FALSE); + break; + } + } + + pAdapt->ReceivedIndicationFlags[Proc] = FALSE; +} + + +INT +PtReceivePacket( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet + ) +/*++ + +Routine Description: + + ReceivePacket handler. Called by NDIS if the miniport below supports + NDIS 4.0 style receives. Re-package the buffer chain in a new packet + and indicate the new packet to protocols above us. Any context for + packets indicated up must be kept in the MiniportReserved field. + + NDIS 5.1 - packet stacking - if there is sufficient "stack space" in + the packet passed to us, we can use the same packet in a receive + indication. + +Arguments: + + ProtocolBindingContext - Pointer to our adapter structure. + Packet - Pointer to the packet + +Return Value: + + == 0 -> We are done with the packet + != 0 -> We will keep the packet and call NdisReturnPackets() this + many times when done. +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS Status; + PNDIS_PACKET MyPacket; + BOOLEAN Remaining; + + // + // Drop the packet silently if the upper miniport edge isn't initialized or + // the miniport edge is in low power state + // + if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0)) + { + return 0; + } + +#ifdef NDIS51 + // + // Check if we can reuse the same packet for indicating up. + // See also: PtReceive(). + // + (VOID)NdisIMGetCurrentPacketStack(Packet, &Remaining); + if (Remaining) + { + // + // We can reuse "Packet". Indicate it up and be done with it. + // + Status = NDIS_GET_PACKET_STATUS(Packet); + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &Packet, 1); + return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); + } +#endif // NDIS51 + + // + // Get a packet off the pool and indicate that up + // + NdisDprAllocatePacket(&Status, + &MyPacket, + pAdapt->RecvPacketPoolHandle); + + if (Status == NDIS_STATUS_SUCCESS) + { + PRECV_RSVD RecvRsvd; + + RecvRsvd = (PRECV_RSVD)(MyPacket->MiniportReserved); + RecvRsvd->OriginalPkt = Packet; + + NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet); + NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet); + + // + // Get the original packet (it could be the same packet as the one + // received or a different one based on the number of layered miniports + // below) and set it on the indicated packet so the OOB data is visible + // correctly to protocols above us. + // + NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); + + // + // Set Packet Flags + // + NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); + + Status = NDIS_GET_PACKET_STATUS(Packet); + + NDIS_SET_PACKET_STATUS(MyPacket, Status); + NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet)); + + if (pAdapt->MiniportHandle != NULL) + { + NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); + } + + // + // Check if we had indicated up the packet with NDIS_STATUS_RESOURCES + // NOTE -- do not use NDIS_GET_PACKET_STATUS(MyPacket) for this since + // it might have changed! Use the value saved in the local variable. + // + if (Status == NDIS_STATUS_RESOURCES) + { + // + // Our ReturnPackets handler will not be called for this packet. + // We should reclaim it right here. + // + NdisDprFreePacket(MyPacket); + } + + return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); + } + else + { + // + // We are out of packets. Silently drop it. + // + return(0); + } +} + + +NDIS_STATUS +PtPNPHandler( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT pNetPnPEvent + ) + +/*++ +Routine Description: + + This is called by NDIS to notify us of a PNP event related to a lower + binding. Based on the event, this dispatches to other helper routines. + + NDIS 5.1: forward this event to the upper protocol(s) by calling + NdisIMNotifyPnPEvent. + +Arguments: + + ProtocolBindingContext - Pointer to our adapter structure. Can be NULL + for "global" notifications + + pNetPnPEvent - Pointer to the PNP event to be processed. + +Return Value: + + NDIS_STATUS code indicating status of event processing. + +--*/ +{ + PADAPT pAdapt =(PADAPT)ProtocolBindingContext; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + DBGPRINT(("PtPnPHandler: Adapt %p, Event %d\n", pAdapt, pNetPnPEvent->NetEvent)); + + switch (pNetPnPEvent->NetEvent) + { + case NetEventSetPower: + Status = PtPnPNetEventSetPower(pAdapt, pNetPnPEvent); + break; + + case NetEventReconfigure: + Status = PtPnPNetEventReconfigure(pAdapt, pNetPnPEvent); + break; + + default: +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above, before + // doing anything else with it. + // + if (pAdapt && pAdapt->MiniportHandle) + { + Status = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#else + Status = NDIS_STATUS_SUCCESS; + +#endif // NDIS51 + + break; + } + + return Status; +} + + +NDIS_STATUS +PtPnPNetEventReconfigure( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ) +/*++ +Routine Description: + + This routine is called from NDIS to notify our protocol edge of a + reconfiguration of parameters for either a specific binding (pAdapt + is not NULL), or global parameters if any (pAdapt is NULL). + +Arguments: + + pAdapt - Pointer to our adapter structure. + pNetPnPEvent - the reconfigure event + +Return Value: + + NDIS_STATUS_SUCCESS + +--*/ +{ + NDIS_STATUS ReconfigStatus = NDIS_STATUS_SUCCESS; + NDIS_STATUS ReturnStatus = NDIS_STATUS_SUCCESS; + + do + { + // + // Is this is a global reconfiguration notification ? + // + if (pAdapt == NULL) + { + // + // An important event that causes this notification to us is if + // one of our upper-edge miniport instances was enabled after being + // disabled earlier, e.g. from Device Manager in Win2000. Note that + // NDIS calls this because we had set up an association between our + // miniport and protocol entities by calling NdisIMAssociateMiniport. + // + // Since we would have torn down the lower binding for that miniport, + // we need NDIS' assistance to re-bind to the lower miniport. The + // call to NdisReEnumerateProtocolBindings does exactly that. + // + NdisReEnumerateProtocolBindings (ProtHandle); + + break; + } + +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above before doing anything + // with it. + // + if (pAdapt->MiniportHandle) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + ReconfigStatus = NDIS_STATUS_SUCCESS; + + } while(FALSE); + + DBGPRINT(("<==PtPNPNetEventReconfigure: pAdapt %p\n", pAdapt)); + +#ifdef NDIS51 + // + // Overwrite status with what upper-layer protocol(s) returned. + // + ReconfigStatus = ReturnStatus; +#endif + + return ReconfigStatus; +} + + +NDIS_STATUS +PtPnPNetEventSetPower( + IN PADAPT pAdapt, + IN PNET_PNP_EVENT pNetPnPEvent + ) +/*++ +Routine Description: + + This is a notification to our protocol edge of the power state + of the lower miniport. If it is going to a low-power state, we must + wait here for all outstanding sends and requests to complete. + + NDIS 5.1: Since we use packet stacking, it is not sufficient to + check usage of our local send packet pool to detect whether or not + all outstanding sends have completed. For this, use the new API + NdisQueryPendingIOCount. + + NDIS 5.1: Use the 5.1 API NdisIMNotifyPnPEvent to pass on PnP + notifications to upper protocol(s). + +Arguments: + + pAdapt - Pointer to the adpater structure + pNetPnPEvent - The Net Pnp Event. this contains the new device state + +Return Value: + + NDIS_STATUS_SUCCESS or the status returned by upper-layer protocols. + +--*/ +{ + PNDIS_DEVICE_POWER_STATE pDeviceState =(PNDIS_DEVICE_POWER_STATE)(pNetPnPEvent->Buffer); + NDIS_DEVICE_POWER_STATE PrevDeviceState = pAdapt->PTDeviceState; + NDIS_STATUS Status; + NDIS_STATUS ReturnStatus; + + ReturnStatus = NDIS_STATUS_SUCCESS; + + // + // Set the Internal Device State, this blocks all new sends or receives + // + NdisAcquireSpinLock(&pAdapt->Lock); + pAdapt->PTDeviceState = *pDeviceState; + + // + // Check if the miniport below is going to a low power state. + // + if (pAdapt->PTDeviceState > NdisDeviceStateD0) + { + // + // If the miniport below is going to standby, fail all incoming requests + // + if (PrevDeviceState == NdisDeviceStateD0) + { + pAdapt->StandingBy = TRUE; + } + + NdisReleaseSpinLock(&pAdapt->Lock); + +#ifdef NDIS51 + // + // Notify upper layer protocol(s) first. + // + if (pAdapt->MiniportHandle != NULL) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + // + // Wait for outstanding sends and requests to complete. + // + while (pAdapt->OutstandingSends != 0) + { + NdisMSleep(2); + } + + while (pAdapt->OutstandingRequests == TRUE) + { + // + // sleep till outstanding requests complete + // + NdisMSleep(2); + } + + // + // If the below miniport is going to low power state, complete the queued request + // + NdisAcquireSpinLock(&pAdapt->Lock); + if (pAdapt->QueuedRequest) + { + pAdapt->QueuedRequest = FALSE; + NdisReleaseSpinLock(&pAdapt->Lock); + PtRequestComplete(pAdapt, &pAdapt->Request, NDIS_STATUS_FAILURE); + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } + + + ASSERT(NdisPacketPoolUsage(pAdapt->SendPacketPoolHandle) == 0); + ASSERT(pAdapt->OutstandingRequests == FALSE); + } + else + { + // + // If the physical miniport is powering up (from Low power state to D0), + // clear the flag + // + if (PrevDeviceState > NdisDeviceStateD0) + { + pAdapt->StandingBy = FALSE; + } + // + // The device below is being turned on. If we had a request + // pending, send it down now. + // + if (pAdapt->QueuedRequest == TRUE) + { + pAdapt->QueuedRequest = FALSE; + + pAdapt->OutstandingRequests = TRUE; + NdisReleaseSpinLock(&pAdapt->Lock); + + NdisRequest(&Status, + pAdapt->BindingHandle, + &pAdapt->Request); + + if (Status != NDIS_STATUS_PENDING) + { + PtRequestComplete(pAdapt, + &pAdapt->Request, + Status); + + } + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + } + + +#ifdef NDIS51 + // + // Pass on this notification to protocol(s) above + // + if (pAdapt->MiniportHandle) + { + ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent); + } +#endif // NDIS51 + + } + + return ReturnStatus; +} + +VOID +PtReferenceAdapt( + IN PADAPT pAdapt + ) +{ + NdisAcquireSpinLock(&pAdapt->Lock); + + ASSERT(pAdapt->RefCount >= 0); + + pAdapt->RefCount ++; + NdisReleaseSpinLock(&pAdapt->Lock); +} + + +BOOLEAN +PtDereferenceAdapt( + IN PADAPT pAdapt + ) +{ + NdisAcquireSpinLock(&pAdapt->Lock); + + ASSERT(pAdapt->RefCount > 0); + + pAdapt->RefCount--; + + if (pAdapt->RefCount == 0) + { + NdisReleaseSpinLock(&pAdapt->Lock); + + // + // Free all resources on this adapter structure. + // + MPFreeAllPacketPools (pAdapt);; + NdisFreeSpinLock(&pAdapt->Lock); + NdisFreeMemory(pAdapt, 0 , 0); + + return TRUE; + + } + else + { + NdisReleaseSpinLock(&pAdapt->Lock); + + return FALSE; + } +} + + diff --git a/original_passthru/sources b/original_passthru/sources new file mode 100644 index 0000000..d52d78f --- /dev/null +++ b/original_passthru/sources @@ -0,0 +1,39 @@ +TARGETNAME=passthru +TARGETTYPE=DRIVER + +C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 + +MSC_WARNING_LEVEL=/WX /W4 + +!if "$(DDK_TARGET_OS)"=="Win2K" +# +# The driver is built in the Win2K build environment +# +C_DEFINES=$(C_DEFINES) -DNDIS40_MINIPORT=1 +C_DEFINES=$(C_DEFINES) -DNDIS40=1 +!else +# +# The driver is built in the XP or .NET build environment +# So let us build NDIS 5.1 version. +# +C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1 +C_DEFINES=$(C_DEFINES) -DNDIS51=1 +!endif + +# Uncomment the following to build for Win98/SE/WinMe +# This causes several APIs that are not present in Win9X to be +# ifdef'ed out. +# C_DEFINES=$(C_DEFINES) -DWIN9X=1 + +PRECOMPILED_INCLUDE=precomp.h + +TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib + +INCLUDES= + +SOURCES=\ + miniport.c \ + passthru.c \ + passthru.rc \ + protocol.c + diff --git a/planetlab/Makefile.planetlab b/planetlab/Makefile.planetlab new file mode 100644 index 0000000..f341262 --- /dev/null +++ b/planetlab/Makefile.planetlab @@ -0,0 +1,181 @@ +# $Id: Makefile 11687 2012-08-12 20:51:25Z luigi $ +# +# Top level makefile for building ipfw/dummynet (kernel and userspace). +# You can run it manually or also under the Planetlab build. +# Planetlab wants also the 'install' target. +# +# To build on system with non standard Kernel sources or userland files, +# you should run this with +# +# make KERNELPATH=/path/to/linux-2.x.y.z USRDIR=/path/to/usr +# +# We assume that $(USRDIR) contains include/ and lib/ used to build userland. +# + +include Makefile.inc + +DATE ?= $(shell date +%Y%m%d) +SNAPSHOT_NAME=$(DATE)-ipfw3.tgz +BINDIST=$(DATE)-dummynet-linux.tgz +WINDIST=$(DATE)-dummynet-windows.zip + +.PHONY: ipfw kipfw + +########################################### +# windows x86 and x64 specific variables # +########################################### +# DRIVE must be the hard drive letter where DDK is installed +# DDKDIR must be the path to the DDK root directory, without drive letter +# TARGETOS (x64 only) must be one of the following: +# wnet -> windows server 2003 +# wlh -> windows vista and windows server 2008 +# win7 -> windows 7 +# future version must be added here +export WIN64 +export DDK +export DRIVE +export DDKDIR +DRIVE ?= C: +DDKDIR ?= /WinDDK/7600.16385.1 +DDK = $(DRIVE)$(DDKDIR) + +TARGETOS=win7 + +_all: all + +clean distclean: + -@(cd ipfw && $(MAKE) $(@) ) + -@rm -rf kipfw-mod binary64/[A-hj-z]* + +all: kipfw ipfw + @# -- windows only +ifeq ($(OSARCH),Windows) # copy files +ifeq ($(WIN64),) + -@ cp ipfw/ipfw.exe kipfw-mod/$(OBJDIR)/ipfw.sys binary/ + -@ cp kipfw/*.inf binary/ +else + -@ cp binary/* binary64/ + -@ cp ipfw/ipfw.exe kipfw-mod/objchk_win7_amd64/amd64/ipfw.sys binary64/ +endif # WIN64 +endif # Windows + +win64: + $(MAKE) WIN64=1 + +# kipfw-src prepares the sources for the kernel part. +# The windows files (passthru etc.) are modified version of the +# examples found in the $(DDK)/src/network/ndis/passthru/driver/ +# They can be re-created using the 'ndis-glue' target +# # We need a sed trick to remove newlines from the patchfile. + +ndis-glue: + -@mkdir -p kipfw-mod + cp $(DDK)/src/network/ndis/passthru/driver/*.[ch] kipfw-mod + cat kipfw/win-passthru.diff | sed "s/$$(printf '\r')//g" | (cd kipfw-mod; patch ) + +kipfw-src: + -@rm -rf kipfw-mod + -@mkdir -p kipfw-mod + -@cp -Rp kipfw/* kipfw-mod + -@cp `find sys -name \*.c` kipfw-mod + -@(cd kipfw-mod && $(MAKE) include_e) +ifeq ($(OSARCH),Windows) + make ndis-glue +endif + +snapshot: + $(MAKE) distclean + (cd ..; tar cvzhf /tmp/$(SNAPSHOT_NAME) --exclude .svn \ + --exclude README.openwrt --exclude tags --exclude NOTES \ + --exclude tcc-0.9.25-bsd \ + --exclude original_passthru \ + --exclude ipfw3.diff --exclude add_rules \ + --exclude test --exclude test_ \ + ipfw3-2012 ) + +bindist: + $(MAKE) clean + $(MAKE) all + tar cvzf /tmp/$(BINDIST) ipfw/ipfw ipfw/ipfw.8 kipfw-mod/ipfw_mod.ko + +windist: + $(MAKE) clean + -$(MAKE) all + -rm /tmp/$(WINDIST) + zip -r /tmp/$(WINDIST) binary -x \*.svn\* + + +ipfw: + @(cd ipfw && $(MAKE) $(@) ) + +kipfw: kipfw-src +ifeq ($(WIN64),) # linux or windows 32 bit + @(cd kipfw-mod && $(MAKE) $(@) ) +else #--- windows 64 bit, we use build.exe and nmake + rm -f kipfw-mod/Makefile + mkdir kipfw-mod/tmpbuild # check mysetenv.sh + bash kipfw/mysetenv.sh $(DRIVE) $(DDKDIR) $(TARGETOS) +endif + +IPF3_REPO ?= svn+ssh://some.host/some/path/ipfw3-2012 + +planetlab_update: + # clean and create a local working directory + rm -rf /tmp/pl-tmp + mkdir -p /tmp/pl-tmp/pl + mkdir -p /tmp/pl-tmp/ol2 + # get the trunk version of the PlanetLab repository + # to specify the sshkey use the .ssh/config file + (cd /tmp/pl-tmp/pl; \ + svn co svn+ssh://svn.planet-lab.org/svn/ipfw/trunk) + # get an updated copy of the main ipfw repository + (cd /tmp/pl-tmp/ol2; svn export $(IPFW3_REPO) ) + # copy the new version over the old one + (cd /tmp/pl-tmp; cp -rP ol2/ipfw3/* pl/trunk) + # files cleanup in the old version + (cd /tmp/pl-tmp; diff -r ol2/ipfw3 pl/trunk | \ + grep -v "svn" | awk '{print $$3 $$4}' | \ + sed 's/:/\//' | xargs rm -rf) + # local adjustments here + rm -rf /tmp/pl-tmp/pl/trunk/planetlab/check_planetlab_sync + # commit to the remote repo + @echo "Please, revise the update with the commands:" + @echo "(cd /tmp/pl-tmp/pl/trunk; svn diff)" + @echo "(cd /tmp/pl-tmp/pl/trunk; svn status)" + @echo "and commit with:" + @echo "(cd /tmp/pl-tmp/pl/trunk; svn ci -m 'Update from the mail ipfw repo.')" + +openwrt_release: + # create a temporary directory + $(eval TMPDIR := $(shell mktemp -d -p /tmp/ ipfw3_openwrt_XXXXX)) + # create the source destination directory + $(eval IPFWDIR := ipfw3-$(DATE)) + $(eval DSTDIR := $(TMPDIR)/$(IPFWDIR)) + mkdir $(DSTDIR) + # copy the package, clean objects and svn info + cp -r ./ipfw ./kipfw-mod glue.h Makefile ./configuration README $(DSTDIR) + (cd $(DSTDIR); make -s distclean; find . -name .svn | xargs rm -rf) + (cd $(TMPDIR); tar czf $(IPFWDIR).tar.gz $(IPFWDIR)) + + # create the port files in /tmp/ipfw3-port + $(eval PORTDIR := $(TMPDIR)/ipfw3) + mkdir -p $(PORTDIR)/patches + # generate the Makefile, PKG_VERSION and PKG_MD5SUM + md5sum $(DSTDIR).tar.gz | cut -d ' ' -f 1 > $(TMPDIR)/md5sum + cat ./OPENWRT/Makefile | \ + sed s/PKG_VERSION:=/PKG_VERSION:=$(DATE)/ | \ + sed s/PKG_MD5SUM:=/PKG_MD5SUM:=`cat $(TMPDIR)/md5sum`/ \ + > $(PORTDIR)/Makefile + + @echo "" + @echo "The openwrt port is in $(TMPDIR)/ipfw3-port" + @echo "The source file should be copied to the public server:" + @echo "scp $(DSTDIR).tar.gz marta@info.iet.unipi.it:~marta/public_html/dummynet" + @echo "after this the temporary directory $(TMPDIR) can be removed." + +install: + +diff: + -@(diff -upr $(BSD_HEAD)/sbin/ipfw ipfw) + -@(diff -upr $(BSD_HEAD)/sys sys) + diff --git a/planetlab/check_planetlab_sync b/planetlab/check_planetlab_sync new file mode 100755 index 0000000..f59853f --- /dev/null +++ b/planetlab/check_planetlab_sync @@ -0,0 +1,22 @@ +#!/bin/sh + +# +# This script is used to check the sync of the local repo +# with the remote planetlab repository + +tmpfile=/tmp/chech_planetlab_sync.tmp + +# check for local copy sync +svn diff > /tmp/chech_planetlab_sync.tmp +if [ -s $tmpfile ] ; then + echo "Local repo unsynced, can not continue" + exit -1 + rm $tmpfile +fi + +# export remote copy +svn --force export http://svn.planet-lab.org/svn/ipfw/trunk ./ >> /dev/null + +# check diffs again, output to the user +svn diff +svn status | grep -v check_planetlab_sync diff --git a/planetlab/ipfw b/planetlab/ipfw new file mode 100755 index 0000000..114cafb --- /dev/null +++ b/planetlab/ipfw @@ -0,0 +1,84 @@ +#!/bin/sh +# +# ipfw init the emulation service +# +# chkconfig: 2345 09 91 +# description: ipfw init and shutdown +# + +# Source function library. +. /etc/init.d/functions + +IPFW=ipfw +IPFW_BACKEND=/vsys/ipfw-be +IPFW_MOD=ipfw_mod + +if [ ! -x /sbin/$IPFW ] || [ ! -x ${IPFW_BACKEND} ]; then + echo -n "/sbin/$IPFW does not exist."; warning; echo + exit 0 +fi + +# Load the ipfw module, and initialize netconfig +start() { + # load the module + modprobe $IPFW_MOD >& /dev/null + let ret=$?; + [ $ret -eq 0 ] && success || failure + + # init netconfig + echo "super dbcleanup" | ${IPFW_BACKEND} root >& /dev/null + echo "super init" | ${IPFW_BACKEND} root >& /dev/null + + return $ret +} + +stop() { + # clean netconfig stuff + echo "super dbcleanup" | ${IPFW_BACKEND} root >& /dev/null + echo "Unloading $IPFW_MOD module: " + + # unload the ipfw module + rmmod ${IPFW_MOD} + let ret=$?; + [ $ret -eq 0 ] && success || failure + + return $ret +} + +# echo the ipfw status +status() { + # check for module presence + grep '^ipfw_mod$' /proc/modules >& /dev/null || echo "ipfw not loaded" && return 0 + + # Show active users + USERS=$(grep BLOCK /tmp/ff | wc -l) + echo "ipfw is loaded and there are currently ${USERS} with active emulation." + return 0 +} + +# main +case "$1" in + start) + start + RETVAL=$? + ;; + stop) + stop + RETVAL=$? + ;; + restart) + stop + start + RETVAL=$? + ;; + status) + status + RETVAL=$? + ;; + *) + echo $"Usage: $0 {start|stop|restart|status}" + exit 1 + ;; +esac + +exit $RETVAL diff --git a/planetlab/ipfw.8.gz b/planetlab/ipfw.8.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2db9233519c3f1d9716c42d886c11b8d01ca60f GIT binary patch literal 26396 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 literal 0 HcmV?d00001 diff --git a/planetlab/ipfw.cron b/planetlab/ipfw.cron new file mode 100644 index 0000000..1b09340 --- /dev/null +++ b/planetlab/ipfw.cron @@ -0,0 +1,3 @@ +# Runs every 5 minutes and clean ipfw expired rules +# $Id: ipfw.cron 6069 2010-04-15 09:35:33Z marta $ +*/5 * * * * root echo "super killexpired" | /vsys/ipfw-be root > /dev/null 2>&1 diff --git a/planetlab/ipfwroot.spec b/planetlab/ipfwroot.spec new file mode 100644 index 0000000..1170ed7 --- /dev/null +++ b/planetlab/ipfwroot.spec @@ -0,0 +1,135 @@ +# +# $Id: ipfwroot.spec 16174 2009-12-15 13:38:15Z marta $ +# +# TODO: +# restart crond +# +%define url $URL: svn+ssh://onelab2/home/svn/ports-luigi/ipfw3-2012/planetlab/ipfwroot.spec $ + +# Marta Carbone +# 2009 - Universita` di Pisa +# License is BSD. + +# kernel_release, kernel_version and kernel_arch are expected to be set by the build to e.g. +# kernel_release : vs2.3.0.29.1.planetlab +# kernel_version : 2.6.22.14 + +%define name ipfwroot +%define version 0.9 +%define taglevel 11 + +%define release %{kernel_version}.%{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}} +%define kernel_id_arch %{kernel_version}-%{kernel_release}-%{kernel_arch} +%define kernel_id %{kernel_version}-%{kernel_release} + +Summary: ipfw and dummynet for Linux +Name: %{name} +Version: %{version} +Release: %{release} +License: BSD +Group: System Environment/Kernel +Source0: %{name}-%{version}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +Requires: vixie-cron +Requires: vsys-scripts + +Vendor: unipi +Packager: PlanetLab +# XXX ask +Distribution: PlanetLab %{plrelease} +URL: %(echo %{url} | cut -d ' ' -f 2) + +%description +ipfw is the Linux port of the FreeBSD ipfw and dummynet packages + +%prep +%setup + +%build +# clean the rpm build directory +rm -rf $RPM_BUILD_ROOT + +# with the new build, we use the kernel-devel rpm for building +%define kernelpath /usr/src/kernels/%{kernel_id_arch} + +%__make KERNELPATH=%kernelpath clean +%__make KERNELPATH=%kernelpath IPFW_PLANETLAB=1 + +%install +install -D -m 755 dummynet2/ipfw_mod.ko $RPM_BUILD_ROOT/lib/modules/%{kernel_id}/net/netfilter/ipfw_mod.ko +install -D -m 755 ipfw/ipfw $RPM_BUILD_ROOT/sbin/ipfw +install -D -m 644 planetlab/ipfw.cron $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d/ipfw.cron +install -D -m 755 planetlab/ipfw $RPM_BUILD_ROOT/etc/rc.d/init.d/ipfw + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +### this script is also triggered while the node image is being created at build-time +# some parts of the script do not make sense in this context +# this is why the build exports PL_BOOTCD=1 in such cases +depmod -a +/sbin/chkconfig --add ipfw +# start the service if not building +[ -z "$PL_BOOTCD" ] && service ipfw start + +%postun +# stop the service if not building +[ -z "$PL_BOOTCD" ] && service ipfw stop + +# here there is a list of the final installation directories +%files +%defattr(-,root,root) +%dir /lib/modules/%{kernel_id} +/lib/modules/%{kernel_id}/net/netfilter/ipfw_mod.ko +/sbin/ipfw +%{_sysconfdir}/cron.d/ipfw.cron +/etc/rc.d/init.d/ipfw + +%changelog +* Mon Apr 12 2010 Thierry Parmentelat - ipfw-0.9-11 +- add ipfw initialization script to chkconfig + +* Wed Mar 03 2010 Talip Baris Metin - ipfw-0.9-10 +- - Load module at installation - Marta + +* Mon Jan 11 2010 Thierry Parmentelat - ipfw-0.9-9 +- consistent with vsys-scripts-0.95-13 + +* Mon Jan 11 2010 Marta Carbone +- Integrated the ipfw rules cleanup into the backend + +* Sat Jan 09 2010 Thierry Parmentelat - ipfw-0.9-8 +- builds on 2.6.22 & 2.6.27 - for 32 and 64 bits + +* Wed Jan 06 2010 Marta Carbone +- move to dummynet2, added support for table lookup +- added the vsys-script dependencies and the ipfw initialization + +* Tue Dec 15 2009 Marta Carbone +- more work on the radix code, added sysctl read/write support + +* Sun Nov 29 2009 Thierry Parmentelat - ipfw-0.9-7 +- added missing qsort.c - tag 0.9-6 was broken + +* Thu Nov 26 2009 Thierry Parmentelat - ipfw-0.9-6 +- root: removed goto into the main ipfw switch, enabled slice_id matching +- slice: completely move netconfig checks into the backend + +* Mon Nov 09 2009 Thierry Parmentelat - ipfw-0.9-5 +- additional features on matching packets, including uid match + +* Mon Sep 07 2009 Thierry Parmentelat - ipfw-0.9-4 +- on behalf of Marta Carbone, more options and features + +* Thu Jul 23 2009 Thierry Parmentelat - ipfw-0.9-3 +- fixed memory usage issue + +* Wed Jul 15 2009 Thierry Parmentelat - ipfw-0.9-2 +- patch for building on x86_64 + +* Thu Jun 25 2009 Marta Carbone +- post installation removed for deployment, moved manpages to the slice package + +* Fri Apr 17 2009 Marta Carbone +- Initial release diff --git a/planetlab/ipfwslice.spec b/planetlab/ipfwslice.spec new file mode 100644 index 0000000..cd98b89 --- /dev/null +++ b/planetlab/ipfwslice.spec @@ -0,0 +1,94 @@ +# +# $Id: ipfwslice.spec 16174 2009-12-15 13:38:15Z marta $ +# +# TODO: +# restart crond +# modprobe ipfw_mod.ko (depmod ?) +# +%define url $URL: svn+ssh://onelab2/home/svn/ports-luigi/ipfw3-2012/planetlab/ipfwslice.spec $ + +# Marta Carbone +# 2009 - Universita` di Pisa +# License is BSD. + +%define name ipfwslice +%define version 0.9 +%define taglevel 11 + +%define release %{kernel_version}.%{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}} +%define kernel_id_arch %{kernel_version}-%{kernel_release}-%{kernel_arch} +%define kernel_id %{kernel_version}-%{kernel_release} + +Summary: ipfw and dummynet for Linux +Name: %{name} +Version: %{version} +Release: %{release} +License: BSD +Group: System Environment/Kernel +Source0: %{name}-%{version}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + +Vendor: unipi +Packager: PlanetLab +Distribution: PlanetLab %{plrelease} +URL: %(echo %{url} | cut -d ' ' -f 2) + +%description +the frontend part of the ipfw planetlab package + +%prep +%setup + +%build +rm -rf $RPM_BUILD_ROOT + +%install +install -D -m 755 planetlab/netconfig $RPM_BUILD_ROOT/sbin/netconfig +install -D -m 755 planetlab/ipfw.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/ipfw.8.gz + +%clean +rm -rf $RPM_BUILD_ROOT + +# here there is a list of the final installation directories +%files +%defattr(-,root,root) +/sbin/netconfig +%{_mandir}/man8/ipfw.8* + +%changelog +* Mon Apr 12 2010 Thierry Parmentelat - ipfw-0.9-11 +- add ipfw initialization script to chkconfig + +* Wed Mar 03 2010 Talip Baris Metin - ipfw-0.9-10 +- - Load module at installation - Marta + +* Mon Jan 11 2010 Thierry Parmentelat - ipfw-0.9-9 +- consistent with vsys-scripts-0.95-13 + +* Sat Jan 09 2010 Thierry Parmentelat - ipfw-0.9-8 +- builds on 2.6.22 & 2.6.27 - for 32 and 64 bits + +* Tue Dec 15 2009 Marta Carbone +- more work on the radix code, added sysctl read/write support + +* Sun Nov 29 2009 Thierry Parmentelat - ipfw-0.9-7 +- added missing qsort.c - tag 0.9-6 was broken + +* Thu Nov 26 2009 Thierry Parmentelat - ipfw-0.9-6 +- root: removed goto into the main ipfw switch, enabled slice_id matching +- slice: completely move netconfig checks into the backend + +* Mon Nov 09 2009 Thierry Parmentelat - ipfw-0.9-5 +- additional features on matching packets, including uid match + +* Mon Sep 07 2009 Thierry Parmentelat - ipfw-0.9-4 +- on behalf of Marta Carbone, more options and features + +* Thu Jul 23 2009 Thierry Parmentelat - ipfw-0.9-3 +- fixed memory usage issue + +* Wed Jul 15 2009 Thierry Parmentelat - ipfw-0.9-2 +- patch for building on x86_64 + +* Thu Jun 25 2009 Marta Carbone +- Initial release diff --git a/planetlab/netconfig b/planetlab/netconfig new file mode 100755 index 0000000..7108582 --- /dev/null +++ b/planetlab/netconfig @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Marta Carbone, Luigi Rizzo +# Copyright (C) 2009 Universita` di Pisa +# $Id: netconfig 4533 2009-12-16 14:39:23Z luigi $ +# +# This script is the frontend to be used with the vsys system. +# It simply passes information to the backend and gets back the reply + +PIPE_IN=/vsys/ipfw-be.in +PIPE_OUT=/vsys/ipfw-be.out + +sudo sh -c "echo $* >> ${PIPE_IN}" +sudo sh -c "cat ${PIPE_OUT}" diff --git a/planetlab/planetlab-tags.mk b/planetlab/planetlab-tags.mk new file mode 100644 index 0000000..25eff0e --- /dev/null +++ b/planetlab/planetlab-tags.mk @@ -0,0 +1,6 @@ +# $Id: planetlab-tags.mk 7450 2010-10-18 11:17:43Z marta $ +# These are good to build the ipfw modules from svn on kernels 2.6.22 +# and are used to fetch files from the onelab2 repository. +linux-2.6-SVNBRANCH := 22 +linux-2.6-SVNPATH := http://svn.planet-lab.org/svn/linux-2.6/tags/linux-2.6-22-39-1 +ipfwsrc-SVNPATH := svn+ssh://luigi%40onelab2.iet.unipi.it/home/svn/ports-luigi/dummynet-branches/ipfw3 diff --git a/planetlab/planetlab.mk b/planetlab/planetlab.mk new file mode 100644 index 0000000..6d3504b --- /dev/null +++ b/planetlab/planetlab.mk @@ -0,0 +1,26 @@ +# $Id: planetlab.mk 4533 2009-12-16 14:39:23Z luigi $ +# .mk file to build a module +kernel-MODULES := linux-2.6 +kernel-SPEC := kernel-2.6.spec +kernel-BUILD-FROM-SRPM := yes +ifeq "$(HOSTARCH)" "i386" +kernel-RPMFLAGS:= --target i686 +else +kernel-RPMFLAGS:= --target $(HOSTARCH) +endif +ALL += kernel + +ipfwroot-MODULES := ipfwsrc +ipfwroot-SPEC := planetlab/ipfwroot.spec +ipfwroot-DEPEND-DEVEL-RPMS := kernel-devel +ipfwroot-SPECVARS = kernel_version=$(kernel.rpm-version) \ + kernel_release=$(kernel.rpm-release) \ + kernel_arch=$(kernel.rpm-arch) +ALL += ipfwroot + +ipfwslice-MODULES := ipfwsrc +ipfwslice-SPEC := planetlab/ipfwslice.spec +ipfwslice-SPECVARS = kernel_version=$(kernel.rpm-version) \ + kernel_release=$(kernel.rpm-release) \ + kernel_arch=$(kernel.rpm-arch) +ALL += ipfwslice diff --git a/planetlab/sample_hook b/planetlab/sample_hook new file mode 100755 index 0000000..b47c8de --- /dev/null +++ b/planetlab/sample_hook @@ -0,0 +1,34 @@ +#!/bin/sh + +# +# Marta Carbone +# 2009 - Universita` di Pisa +# +# This is a sample hook file in charge to collect +# statistical information on netconfig usage. It dumps +# on a log file slicename, port and the configuration string +# used to configure a dummynet experiment. +# +# Each time a user configure a dummynet port, this file +# will be executed. +# The following variables will be passed as argument: +# +# ${SLICE} ${PORT} ${CONFIG_STRING} +# ${SLICE} The slicename executing the netconfig command +# ${PORT} The port to be configured +# ${CONFIG_STRING} The configuration string +# +# Note that this script can get additional information +# by executing the ipfw command, e.g. +# ipfw list # list of installed rules +# ipfw show # list of rules and statistical information +# ipfw pipe show # list of pipes +# +# a complete list of ipfw commands is available at: +# http://www.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8 + +# logfile +LOG_FILE=/tmp/ipfw_hook.log + +echo -e `date` >> ${LOG_FILE} +echo "$*" >> ${LOG_FILE} diff --git a/sys/net/if.h b/sys/net/if.h new file mode 100644 index 0000000..1aa8e7b --- /dev/null +++ b/sys/net/if.h @@ -0,0 +1 @@ +#include diff --git a/sys/net/pfil.h b/sys/net/pfil.h new file mode 100644 index 0000000..af26a79 --- /dev/null +++ b/sys/net/pfil.h @@ -0,0 +1,121 @@ +/* $FreeBSD: src/sys/net/pfil.h,v 1.16 2007/06/08 12:43:25 gallatin Exp $ */ +/* $NetBSD: pfil.h,v 1.22 2003/06/23 12:57:08 martin Exp $ */ + +/*- + * Copyright (c) 1996 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +#ifndef _NET_PFIL_H_ +#define _NET_PFIL_H_ + +#include +#include +#include +#include +#include +#include + +struct mbuf; +struct ifnet; +struct inpcb; + +/* + * The packet filter hooks are designed for anything to call them to + * possibly intercept the packet. + */ +struct packet_filter_hook { + TAILQ_ENTRY(packet_filter_hook) pfil_link; + int (*pfil_func)(void *, struct mbuf **, struct ifnet *, int, + struct inpcb *); + void *pfil_arg; +}; + +#define PFIL_IN 0x00000001 +#define PFIL_OUT 0x00000002 +#define PFIL_WAITOK 0x00000004 +#define PFIL_ALL (PFIL_IN|PFIL_OUT) + +typedef TAILQ_HEAD(pfil_list, packet_filter_hook) pfil_list_t; + +#define PFIL_TYPE_AF 1 /* key is AF_* type */ +#define PFIL_TYPE_IFNET 2 /* key is ifnet pointer */ + +struct pfil_head { + pfil_list_t ph_in; + pfil_list_t ph_out; + int ph_type; + int ph_nhooks; +#if defined( __linux__ ) || defined( _WIN32 ) + rwlock_t ph_mtx; +#else + struct rmlock ph_lock; +#endif + union { + u_long phu_val; + void *phu_ptr; + } ph_un; +#define ph_af ph_un.phu_val +#define ph_ifnet ph_un.phu_ptr + LIST_ENTRY(pfil_head) ph_list; +}; + +int pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *, + int, struct inpcb *), void *, int, struct pfil_head *); +int pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, + int, struct inpcb *), void *, int, struct pfil_head *); +int pfil_run_hooks(struct pfil_head *, struct mbuf **, struct ifnet *, + int, struct inpcb *inp); + +int pfil_head_register(struct pfil_head *); +int pfil_head_unregister(struct pfil_head *); + +struct pfil_head *pfil_head_get(int, u_long); + +#define PFIL_HOOKED(p) ((p)->ph_nhooks > 0) +#define PFIL_LOCK_INIT(p) \ + rm_init_flags(&(p)->ph_lock, "PFil hook read/write mutex", RM_RECURSE) +#define PFIL_LOCK_DESTROY(p) rm_destroy(&(p)->ph_lock) +#define PFIL_RLOCK(p, t) rm_rlock(&(p)->ph_lock, (t)) +#define PFIL_WLOCK(p) rm_wlock(&(p)->ph_lock) +#define PFIL_RUNLOCK(p, t) rm_runlock(&(p)->ph_lock, (t)) +#define PFIL_WUNLOCK(p) rm_wunlock(&(p)->ph_lock) +#define PFIL_LIST_LOCK() mtx_lock(&pfil_global_lock) +#define PFIL_LIST_UNLOCK() mtx_unlock(&pfil_global_lock) + +static __inline struct packet_filter_hook * +pfil_hook_get(int dir, struct pfil_head *ph) +{ + + if (dir == PFIL_IN) + return (TAILQ_FIRST(&ph->ph_in)); + else if (dir == PFIL_OUT) + return (TAILQ_FIRST(&ph->ph_out)); + else + return (NULL); +} + +#endif /* _NET_PFIL_H_ */ diff --git a/sys/net/radix.c b/sys/net/radix.c new file mode 100644 index 0000000..22bac2b --- /dev/null +++ b/sys/net/radix.c @@ -0,0 +1,1203 @@ +/*- + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)radix.c 8.5 (Berkeley) 5/19/95 + * $FreeBSD: head/sys/net/radix.c 200354 2009-12-10 10:34:30Z luigi $ + */ + +/* + * Routines to build and maintain radix trees for routing lookups. + */ +#include +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include +#include "opt_mpath.h" +#ifdef RADIX_MPATH +#include +#endif +#else /* !_KERNEL */ +#include +#include +#include +#define log(x, arg...) fprintf(stderr, ## arg) +#define panic(x) fprintf(stderr, "PANIC: %s", x), exit(1) +#define min(a, b) ((a) < (b) ? (a) : (b) ) +#include +#endif /* !_KERNEL */ + +static int rn_walktree_from(struct radix_node_head *h, void *a, void *m, + walktree_f_t *f, void *w); +static int rn_walktree(struct radix_node_head *, walktree_f_t *, void *); +static struct radix_node + *rn_insert(void *, struct radix_node_head *, int *, + struct radix_node [2]), + *rn_newpair(void *, int, struct radix_node[2]), + *rn_search(void *, struct radix_node *), + *rn_search_m(void *, struct radix_node *, void *); + +static int max_keylen; +static struct radix_mask *rn_mkfreelist; +static struct radix_node_head *mask_rnhead; +/* + * Work area -- the following point to 3 buffers of size max_keylen, + * allocated in this order in a block of memory malloc'ed by rn_init. + * rn_zeros, rn_ones are set in rn_init and used in readonly afterwards. + * addmask_key is used in rn_addmask in rw mode and not thread-safe. + */ +static char *rn_zeros, *rn_ones, *addmask_key; + +#define MKGet(m) { \ + if (rn_mkfreelist) { \ + m = rn_mkfreelist; \ + rn_mkfreelist = (m)->rm_mklist; \ + } else \ + R_Malloc(m, struct radix_mask *, sizeof (struct radix_mask)); } + +#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} + +#define rn_masktop (mask_rnhead->rnh_treetop) + +static int rn_lexobetter(void *m_arg, void *n_arg); +static struct radix_mask * + rn_new_radix_mask(struct radix_node *tt, + struct radix_mask *next); +static int rn_satisfies_leaf(char *trial, struct radix_node *leaf, + int skip); + +/* + * The data structure for the keys is a radix tree with one way + * branching removed. The index rn_bit at an internal node n represents a bit + * position to be tested. The tree is arranged so that all descendants + * of a node n have keys whose bits all agree up to position rn_bit - 1. + * (We say the index of n is rn_bit.) + * + * There is at least one descendant which has a one bit at position rn_bit, + * and at least one with a zero there. + * + * A route is determined by a pair of key and mask. We require that the + * bit-wise logical and of the key and mask to be the key. + * We define the index of a route to associated with the mask to be + * the first bit number in the mask where 0 occurs (with bit number 0 + * representing the highest order bit). + * + * We say a mask is normal if every bit is 0, past the index of the mask. + * If a node n has a descendant (k, m) with index(m) == index(n) == rn_bit, + * and m is a normal mask, then the route applies to every descendant of n. + * If the index(m) < rn_bit, this implies the trailing last few bits of k + * before bit b are all 0, (and hence consequently true of every descendant + * of n), so the route applies to all descendants of the node as well. + * + * Similar logic shows that a non-normal mask m such that + * index(m) <= index(n) could potentially apply to many children of n. + * Thus, for each non-host route, we attach its mask to a list at an internal + * node as high in the tree as we can go. + * + * The present version of the code makes use of normal routes in short- + * circuiting an explict mask and compare operation when testing whether + * a key satisfies a normal route, and also in remembering the unique leaf + * that governs a subtree. + */ + +/* + * Most of the functions in this code assume that the key/mask arguments + * are sockaddr-like structures, where the first byte is an u_char + * indicating the size of the entire structure. + * + * To make the assumption more explicit, we use the LEN() macro to access + * this field. It is safe to pass an expression with side effects + * to LEN() as the argument is evaluated only once. + * We cast the result to int as this is the dominant usage. + */ +#define LEN(x) ( (int) (*(const u_char *)(x)) ) + +/* + * XXX THIS NEEDS TO BE FIXED + * In the code, pointers to keys and masks are passed as either + * 'void *' (because callers use to pass pointers of various kinds), or + * 'caddr_t' (which is fine for pointer arithmetics, but not very + * clean when you dereference it to access data). Furthermore, caddr_t + * is really 'char *', while the natural type to operate on keys and + * masks would be 'u_char'. This mismatch require a lot of casts and + * intermediate variables to adapt types that clutter the code. + */ + +/* + * Search a node in the tree matching the key. + */ +static struct radix_node * +rn_search(v_arg, head) + void *v_arg; + struct radix_node *head; +{ + register struct radix_node *x; + register caddr_t v; + + for (x = head, v = v_arg; x->rn_bit >= 0;) { + if (x->rn_bmask & v[x->rn_offset]) + x = x->rn_right; + else + x = x->rn_left; + } + return (x); +} + +/* + * Same as above, but with an additional mask. + * XXX note this function is used only once. + */ +static struct radix_node * +rn_search_m(v_arg, head, m_arg) + struct radix_node *head; + void *v_arg, *m_arg; +{ + register struct radix_node *x; + register caddr_t v = v_arg, m = m_arg; + + for (x = head; x->rn_bit >= 0;) { + if ((x->rn_bmask & m[x->rn_offset]) && + (x->rn_bmask & v[x->rn_offset])) + x = x->rn_right; + else + x = x->rn_left; + } + return x; +} + +int +rn_refines(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register caddr_t m = m_arg, n = n_arg; + register caddr_t lim, lim2 = lim = n + LEN(n); + int longer = LEN(n++) - LEN(m++); + int masks_are_equal = 1; + + if (longer > 0) + lim -= longer; + while (n < lim) { + if (*n & ~(*m)) + return 0; + if (*n++ != *m++) + masks_are_equal = 0; + } + while (n < lim2) + if (*n++) + return 0; + if (masks_are_equal && (longer < 0)) + for (lim2 = m - longer; m < lim2; ) + if (*m++) + return 1; + return (!masks_are_equal); +} + +struct radix_node * +rn_lookup(v_arg, m_arg, head) + void *v_arg, *m_arg; + struct radix_node_head *head; +{ + register struct radix_node *x; + caddr_t netmask = 0; + + if (m_arg) { + x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_offset); + if (x == 0) + return (0); + netmask = x->rn_key; + } + x = rn_match(v_arg, head); + if (x && netmask) { + while (x && x->rn_mask != netmask) + x = x->rn_dupedkey; + } + return x; +} + +static int +rn_satisfies_leaf(trial, leaf, skip) + char *trial; + register struct radix_node *leaf; + int skip; +{ + register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask; + char *cplim; + int length = min(LEN(cp), LEN(cp2)); + + if (cp3 == NULL) + cp3 = rn_ones; + else + length = min(length, LEN(cp3)); + cplim = cp + length; cp3 += skip; cp2 += skip; + for (cp += skip; cp < cplim; cp++, cp2++, cp3++) + if ((*cp ^ *cp2) & *cp3) + return 0; + return 1; +} + +struct radix_node * +rn_match(v_arg, head) + void *v_arg; + struct radix_node_head *head; +{ + caddr_t v = v_arg; + register struct radix_node *t = head->rnh_treetop, *x; + register caddr_t cp = v, cp2; + caddr_t cplim; + struct radix_node *saved_t, *top = t; + int off = t->rn_offset, vlen = LEN(cp), matched_off; + register int test, b, rn_bit; + + /* + * Open code rn_search(v, top) to avoid overhead of extra + * subroutine call. + */ + for (; t->rn_bit >= 0; ) { + if (t->rn_bmask & cp[t->rn_offset]) + t = t->rn_right; + else + t = t->rn_left; + } + /* + * See if we match exactly as a host destination + * or at least learn how many bits match, for normal mask finesse. + * + * It doesn't hurt us to limit how many bytes to check + * to the length of the mask, since if it matches we had a genuine + * match and the leaf we have is the most specific one anyway; + * if it didn't match with a shorter length it would fail + * with a long one. This wins big for class B&C netmasks which + * are probably the most common case... + */ + if (t->rn_mask) + vlen = *(u_char *)t->rn_mask; + cp += off; cp2 = t->rn_key + off; cplim = v + vlen; + for (; cp < cplim; cp++, cp2++) + if (*cp != *cp2) + goto on1; + /* + * This extra grot is in case we are explicitly asked + * to look up the default. Ugh! + * + * Never return the root node itself, it seems to cause a + * lot of confusion. + */ + if (t->rn_flags & RNF_ROOT) + t = t->rn_dupedkey; + return t; +on1: + test = (*cp ^ *cp2) & 0xff; /* find first bit that differs */ + for (b = 7; (test >>= 1) > 0;) + b--; + matched_off = cp - v; + b += matched_off << 3; + rn_bit = -1 - b; + /* + * If there is a host route in a duped-key chain, it will be first. + */ + if ((saved_t = t)->rn_mask == 0) + t = t->rn_dupedkey; + for (; t; t = t->rn_dupedkey) + /* + * Even if we don't match exactly as a host, + * we may match if the leaf we wound up at is + * a route to a net. + */ + if (t->rn_flags & RNF_NORMAL) { + if (rn_bit <= t->rn_bit) + return t; + } else if (rn_satisfies_leaf(v, t, matched_off)) + return t; + t = saved_t; + /* start searching up the tree */ + do { + register struct radix_mask *m; + t = t->rn_parent; + m = t->rn_mklist; + /* + * If non-contiguous masks ever become important + * we can restore the masking and open coding of + * the search and satisfaction test and put the + * calculation of "off" back before the "do". + */ + while (m) { + if (m->rm_flags & RNF_NORMAL) { + if (rn_bit <= m->rm_bit) + return (m->rm_leaf); + } else { + off = min(t->rn_offset, matched_off); + x = rn_search_m(v, t, m->rm_mask); + while (x && x->rn_mask != m->rm_mask) + x = x->rn_dupedkey; + if (x && rn_satisfies_leaf(v, x, off)) + return x; + } + m = m->rm_mklist; + } + } while (t != top); + return 0; +} + +#ifdef RN_DEBUG +int rn_nodenum; +struct radix_node *rn_clist; +int rn_saveinfo; +int rn_debug = 1; +#endif + +/* + * Whenever we add a new leaf to the tree, we also add a parent node, + * so we allocate them as an array of two elements: the first one must be + * the leaf (see RNTORT() in route.c), the second one is the parent. + * This routine initializes the relevant fields of the nodes, so that + * the leaf is the left child of the parent node, and both nodes have + * (almost) all all fields filled as appropriate. + * (XXX some fields are left unset, see the '#if 0' section). + * The function returns a pointer to the parent node. + */ + +static struct radix_node * +rn_newpair(v, b, nodes) + void *v; + int b; + struct radix_node nodes[2]; +{ + register struct radix_node *tt = nodes, *t = tt + 1; + t->rn_bit = b; + t->rn_bmask = 0x80 >> (b & 7); + t->rn_left = tt; + t->rn_offset = b >> 3; + +#if 0 /* XXX perhaps we should fill these fields as well. */ + t->rn_parent = t->rn_right = NULL; + + tt->rn_mask = NULL; + tt->rn_dupedkey = NULL; + tt->rn_bmask = 0; +#endif + tt->rn_bit = -1; + tt->rn_key = (caddr_t)v; + tt->rn_parent = t; + tt->rn_flags = t->rn_flags = RNF_ACTIVE; + tt->rn_mklist = t->rn_mklist = 0; +#ifdef RN_DEBUG + tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; + tt->rn_ybro = rn_clist; + rn_clist = tt; +#endif + return t; +} + +static struct radix_node * +rn_insert(v_arg, head, dupentry, nodes) + void *v_arg; + struct radix_node_head *head; + int *dupentry; + struct radix_node nodes[2]; +{ + caddr_t v = v_arg; + struct radix_node *top = head->rnh_treetop; + int head_off = top->rn_offset, vlen = LEN(v); + register struct radix_node *t = rn_search(v_arg, top); + register caddr_t cp = v + head_off; + register int b; + struct radix_node *tt; + /* + * Find first bit at which v and t->rn_key differ + */ + { + register caddr_t cp2 = t->rn_key + head_off; + register int cmp_res; + caddr_t cplim = v + vlen; + + while (cp < cplim) + if (*cp2++ != *cp++) + goto on1; + *dupentry = 1; + return t; +on1: + *dupentry = 0; + cmp_res = (cp[-1] ^ cp2[-1]) & 0xff; + for (b = (cp - v) << 3; cmp_res; b--) + cmp_res >>= 1; + } + { + register struct radix_node *p, *x = top; + cp = v; + do { + p = x; + if (cp[x->rn_offset] & x->rn_bmask) + x = x->rn_right; + else + x = x->rn_left; + } while (b > (unsigned) x->rn_bit); + /* x->rn_bit < b && x->rn_bit >= 0 */ +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p); +#endif + t = rn_newpair(v_arg, b, nodes); + tt = t->rn_left; + if ((cp[p->rn_offset] & p->rn_bmask) == 0) + p->rn_left = t; + else + p->rn_right = t; + x->rn_parent = t; + t->rn_parent = p; /* frees x, p as temp vars below */ + if ((cp[t->rn_offset] & t->rn_bmask) == 0) { + t->rn_right = x; + } else { + t->rn_right = tt; + t->rn_left = x; + } +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Coming Out:\n"), traverse(p); +#endif + } + return (tt); +} + +struct radix_node * +rn_addmask(n_arg, search, skip) + int search, skip; + void *n_arg; +{ + caddr_t netmask = (caddr_t)n_arg; + register struct radix_node *x; + register caddr_t cp, cplim; + register int b = 0, mlen, j; + int maskduplicated, m0, isnormal; + struct radix_node *saved_x; + static int last_zeroed = 0; + + if ((mlen = LEN(netmask)) > max_keylen) + mlen = max_keylen; + if (skip == 0) + skip = 1; + if (mlen <= skip) + return (mask_rnhead->rnh_nodes); + if (skip > 1) + bcopy(rn_ones + 1, addmask_key + 1, skip - 1); + if ((m0 = mlen) > skip) + bcopy(netmask + skip, addmask_key + skip, mlen - skip); + /* + * Trim trailing zeroes. + */ + for (cp = addmask_key + mlen; (cp > addmask_key) && cp[-1] == 0;) + cp--; + mlen = cp - addmask_key; + if (mlen <= skip) { + if (m0 >= last_zeroed) + last_zeroed = mlen; + return (mask_rnhead->rnh_nodes); + } + if (m0 < last_zeroed) + bzero(addmask_key + m0, last_zeroed - m0); + *addmask_key = last_zeroed = mlen; + x = rn_search(addmask_key, rn_masktop); + if (bcmp(addmask_key, x->rn_key, mlen) != 0) + x = 0; + if (x || search) + return (x); + R_Zalloc(x, struct radix_node *, max_keylen + 2 * sizeof (*x)); + if ((saved_x = x) == 0) + return (0); + netmask = cp = (caddr_t)(x + 2); + bcopy(addmask_key, cp, mlen); + x = rn_insert(cp, mask_rnhead, &maskduplicated, x); + if (maskduplicated) { + log(LOG_ERR, "rn_addmask: mask impossibly already in tree"); + Free(saved_x); + return (x); + } + /* + * Calculate index of mask, and check for normalcy. + * First find the first byte with a 0 bit, then if there are + * more bits left (remember we already trimmed the trailing 0's), + * the pattern must be one of those in normal_chars[], or we have + * a non-contiguous mask. + */ + cplim = netmask + mlen; + isnormal = 1; + for (cp = netmask + skip; (cp < cplim) && *(u_char *)cp == 0xff;) + cp++; + if (cp != cplim) { + static char normal_chars[] = { + 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff}; + + for (j = 0x80; (j & *cp) != 0; j >>= 1) + b++; + if (*cp != normal_chars[b] || cp != (cplim - 1)) + isnormal = 0; + } + b += (cp - netmask) << 3; + x->rn_bit = -1 - b; + if (isnormal) + x->rn_flags |= RNF_NORMAL; + return (x); +} + +static int /* XXX: arbitrary ordering for non-contiguous masks */ +rn_lexobetter(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register u_char *mp = m_arg, *np = n_arg, *lim; + + if (LEN(mp) > LEN(np)) + return 1; /* not really, but need to check longer one first */ + if (LEN(mp) == LEN(np)) + for (lim = mp + LEN(mp); mp < lim;) + if (*mp++ > *np++) + return 1; + return 0; +} + +static struct radix_mask * +rn_new_radix_mask(tt, next) + register struct radix_node *tt; + register struct radix_mask *next; +{ + register struct radix_mask *m; + + MKGet(m); + if (m == 0) { + log(LOG_ERR, "Mask for route not entered\n"); + return (0); + } + bzero(m, sizeof *m); + m->rm_bit = tt->rn_bit; + m->rm_flags = tt->rn_flags; + if (tt->rn_flags & RNF_NORMAL) + m->rm_leaf = tt; + else + m->rm_mask = tt->rn_mask; + m->rm_mklist = next; + tt->rn_mklist = m; + return m; +} + +struct radix_node * +rn_addroute(v_arg, n_arg, head, treenodes) + void *v_arg, *n_arg; + struct radix_node_head *head; + struct radix_node treenodes[2]; +{ + caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg; + register struct radix_node *t, *x = 0, *tt; + struct radix_node *saved_tt, *top = head->rnh_treetop; + short b = 0, b_leaf = 0; + int keyduplicated; + caddr_t mmask; + struct radix_mask *m, **mp; + + /* + * In dealing with non-contiguous masks, there may be + * many different routes which have the same mask. + * We will find it useful to have a unique pointer to + * the mask to speed avoiding duplicate references at + * nodes and possibly save time in calculating indices. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 0, top->rn_offset)) == 0) + return (0); + b_leaf = x->rn_bit; + b = -1 - x->rn_bit; + netmask = x->rn_key; + } + /* + * Deal with duplicated keys: attach node to previous instance + */ + saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); + if (keyduplicated) { + for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { +#ifdef RADIX_MPATH + /* permit multipath, if enabled for the family */ + if (rn_mpath_capable(head) && netmask == tt->rn_mask) { + /* + * go down to the end of multipaths, so that + * new entry goes into the end of rn_dupedkey + * chain. + */ + do { + t = tt; + tt = tt->rn_dupedkey; + } while (tt && t->rn_mask == tt->rn_mask); + break; + } +#endif + if (tt->rn_mask == netmask) + return (0); + if (netmask == 0 || + (tt->rn_mask && + ((b_leaf < tt->rn_bit) /* index(netmask) > node */ + || rn_refines(netmask, tt->rn_mask) + || rn_lexobetter(netmask, tt->rn_mask)))) + break; + } + /* + * If the mask is not duplicated, we wouldn't + * find it among possible duplicate key entries + * anyway, so the above test doesn't hurt. + * + * We sort the masks for a duplicated key the same way as + * in a masklist -- most specific to least specific. + * This may require the unfortunate nuisance of relocating + * the head of the list. + * + * We also reverse, or doubly link the list through the + * parent pointer. + */ + if (tt == saved_tt) { + struct radix_node *xx = x; + /* link in at head of list */ + (tt = treenodes)->rn_dupedkey = t; + tt->rn_flags = t->rn_flags; + tt->rn_parent = x = t->rn_parent; + t->rn_parent = tt; /* parent */ + if (x->rn_left == t) + x->rn_left = tt; + else + x->rn_right = tt; + saved_tt = tt; x = xx; + } else { + (tt = treenodes)->rn_dupedkey = t->rn_dupedkey; + t->rn_dupedkey = tt; + tt->rn_parent = t; /* parent */ + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_parent = tt; /* parent */ + } +#ifdef RN_DEBUG + t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; +#endif + tt->rn_key = (caddr_t) v; + tt->rn_bit = -1; + tt->rn_flags = RNF_ACTIVE; + } + /* + * Put mask in tree. + */ + if (netmask) { + tt->rn_mask = netmask; + tt->rn_bit = x->rn_bit; + tt->rn_flags |= x->rn_flags & RNF_NORMAL; + } + t = saved_tt->rn_parent; + if (keyduplicated) + goto on2; + b_leaf = -1 - t->rn_bit; + if (t->rn_right == saved_tt) + x = t->rn_left; + else + x = t->rn_right; + /* Promote general routes from below */ + if (x->rn_bit < 0) { + for (mp = &t->rn_mklist; x; x = x->rn_dupedkey) + if (x->rn_mask && (x->rn_bit >= b_leaf) && x->rn_mklist == 0) { + *mp = m = rn_new_radix_mask(x, 0); + if (m) + mp = &m->rm_mklist; + } + } else if (x->rn_mklist) { + /* + * Skip over masks whose index is > that of new node + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m->rm_bit >= b_leaf) + break; + t->rn_mklist = m; *mp = 0; + } +on2: + /* Add new route to highest possible ancestor's list */ + if ((netmask == 0) || (b > t->rn_bit )) + return tt; /* can't lift at all */ + b_leaf = tt->rn_bit; + do { + x = t; + t = t->rn_parent; + } while (b <= t->rn_bit && x != top); + /* + * Search through routes associated with node to + * insert new route according to index. + * Need same criteria as when sorting dupedkeys to avoid + * double loop on deletion. + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { + if (m->rm_bit < b_leaf) + continue; + if (m->rm_bit > b_leaf) + break; + if (m->rm_flags & RNF_NORMAL) { + mmask = m->rm_leaf->rn_mask; + if (tt->rn_flags & RNF_NORMAL) { +#if !defined(RADIX_MPATH) + log(LOG_ERR, + "Non-unique normal route, mask not entered\n"); +#endif + return tt; + } + } else + mmask = m->rm_mask; + if (mmask == netmask) { + m->rm_refs++; + tt->rn_mklist = m; + return tt; + } + if (rn_refines(netmask, mmask) + || rn_lexobetter(netmask, mmask)) + break; + } + *mp = rn_new_radix_mask(tt, *mp); + return tt; +} + +struct radix_node * +rn_delete(v_arg, netmask_arg, head) + void *v_arg, *netmask_arg; + struct radix_node_head *head; +{ + register struct radix_node *t, *p, *x, *tt; + struct radix_mask *m, *saved_m, **mp; + struct radix_node *dupedkey, *saved_tt, *top; + caddr_t v, netmask; + int b, head_off, vlen; + + v = v_arg; + netmask = netmask_arg; + x = head->rnh_treetop; + tt = rn_search(v, x); + head_off = x->rn_offset; + vlen = LEN(v); + saved_tt = tt; + top = x; + if (tt == 0 || + bcmp(v + head_off, tt->rn_key + head_off, vlen - head_off)) + return (0); + /* + * Delete our route from mask lists. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 1, head_off)) == 0) + return (0); + netmask = x->rn_key; + while (tt->rn_mask != netmask) + if ((tt = tt->rn_dupedkey) == 0) + return (0); + } + if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0) + goto on1; + if (tt->rn_flags & RNF_NORMAL) { + if (m->rm_leaf != tt || m->rm_refs > 0) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + return 0; /* dangling ref could cause disaster */ + } + } else { + if (m->rm_mask != tt->rn_mask) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + goto on1; + } + if (--m->rm_refs >= 0) + goto on1; + } + b = -1 - tt->rn_bit; + t = saved_tt->rn_parent; + if (b > t->rn_bit) + goto on1; /* Wasn't lifted at all */ + do { + x = t; + t = t->rn_parent; + } while (b <= t->rn_bit && x != top); + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m == saved_m) { + *mp = m->rm_mklist; + MKFree(m); + break; + } + if (m == 0) { + log(LOG_ERR, "rn_delete: couldn't find our annotation\n"); + if (tt->rn_flags & RNF_NORMAL) + return (0); /* Dangling ref to us */ + } +on1: + /* + * Eliminate us from tree + */ + if (tt->rn_flags & RNF_ROOT) + return (0); +#ifdef RN_DEBUG + /* Get us out of the creation list */ + for (t = rn_clist; t && t->rn_ybro != tt; t = t->rn_ybro) {} + if (t) t->rn_ybro = tt->rn_ybro; +#endif + t = tt->rn_parent; + dupedkey = saved_tt->rn_dupedkey; + if (dupedkey) { + /* + * Here, tt is the deletion target and + * saved_tt is the head of the dupekey chain. + */ + if (tt == saved_tt) { + /* remove from head of chain */ + x = dupedkey; x->rn_parent = t; + if (t->rn_left == tt) + t->rn_left = x; + else + t->rn_right = x; + } else { + /* find node in front of tt on the chain */ + for (x = p = saved_tt; p && p->rn_dupedkey != tt;) + p = p->rn_dupedkey; + if (p) { + p->rn_dupedkey = tt->rn_dupedkey; + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_parent = p; + /* parent */ + } else log(LOG_ERR, "rn_delete: couldn't find us\n"); + } + t = tt + 1; + if (t->rn_flags & RNF_ACTIVE) { +#ifndef RN_DEBUG + *++x = *t; + p = t->rn_parent; +#else + b = t->rn_info; + *++x = *t; + t->rn_info = b; + p = t->rn_parent; +#endif + if (p->rn_left == t) + p->rn_left = x; + else + p->rn_right = x; + x->rn_left->rn_parent = x; + x->rn_right->rn_parent = x; + } + goto out; + } + if (t->rn_left == tt) + x = t->rn_right; + else + x = t->rn_left; + p = t->rn_parent; + if (p->rn_right == t) + p->rn_right = x; + else + p->rn_left = x; + x->rn_parent = p; + /* + * Demote routes attached to us. + */ + if (t->rn_mklist) { + if (x->rn_bit >= 0) { + for (mp = &x->rn_mklist; (m = *mp);) + mp = &m->rm_mklist; + *mp = t->rn_mklist; + } else { + /* If there are any key,mask pairs in a sibling + duped-key chain, some subset will appear sorted + in the same order attached to our mklist */ + for (m = t->rn_mklist; m && x; x = x->rn_dupedkey) + if (m == x->rn_mklist) { + struct radix_mask *mm = m->rm_mklist; + x->rn_mklist = 0; + if (--(m->rm_refs) < 0) + MKFree(m); + m = mm; + } + if (m) + log(LOG_ERR, + "rn_delete: Orphaned Mask %p at %p\n", + m, x); + } + } + /* + * We may be holding an active internal node in the tree. + */ + x = tt + 1; + if (t != x) { +#ifndef RN_DEBUG + *t = *x; +#else + b = t->rn_info; + *t = *x; + t->rn_info = b; +#endif + t->rn_left->rn_parent = t; + t->rn_right->rn_parent = t; + p = x->rn_parent; + if (p->rn_left == x) + p->rn_left = t; + else + p->rn_right = t; + } +out: + tt->rn_flags &= ~RNF_ACTIVE; + tt[1].rn_flags &= ~RNF_ACTIVE; + return (tt); +} + +/* + * This is the same as rn_walktree() except for the parameters and the + * exit. + */ +static int +rn_walktree_from(h, a, m, f, w) + struct radix_node_head *h; + void *a, *m; + walktree_f_t *f; + void *w; +{ + int error; + struct radix_node *base, *next; + u_char *xa = (u_char *)a; + u_char *xm = (u_char *)m; + register struct radix_node *rn, *last = 0 /* shut up gcc */; + int stopping = 0; + int lastb; + + /* + * rn_search_m is sort-of-open-coded here. We cannot use the + * function because we need to keep track of the last node seen. + */ + /* printf("about to search\n"); */ + for (rn = h->rnh_treetop; rn->rn_bit >= 0; ) { + last = rn; + /* printf("rn_bit %d, rn_bmask %x, xm[rn_offset] %x\n", + rn->rn_bit, rn->rn_bmask, xm[rn->rn_offset]); */ + if (!(rn->rn_bmask & xm[rn->rn_offset])) { + break; + } + if (rn->rn_bmask & xa[rn->rn_offset]) { + rn = rn->rn_right; + } else { + rn = rn->rn_left; + } + } + /* printf("done searching\n"); */ + + /* + * Two cases: either we stepped off the end of our mask, + * in which case last == rn, or we reached a leaf, in which + * case we want to start from the last node we looked at. + * Either way, last is the node we want to start from. + */ + rn = last; + lastb = rn->rn_bit; + + /* printf("rn %p, lastb %d\n", rn, lastb);*/ + + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + while (rn->rn_bit >= 0) + rn = rn->rn_left; + + while (!stopping) { + /* printf("node %p (%d)\n", rn, rn->rn_bit); */ + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_parent->rn_right == rn + && !(rn->rn_flags & RNF_ROOT)) { + rn = rn->rn_parent; + + /* if went up beyond last, stop */ + if (rn->rn_bit <= lastb) { + stopping = 1; + /* printf("up too far\n"); */ + /* + * XXX we should jump to the 'Process leaves' + * part, because the values of 'rn' and 'next' + * we compute will not be used. Not a big deal + * because this loop will terminate, but it is + * inefficient and hard to understand! + */ + } + } + + /* + * At the top of the tree, no need to traverse the right + * half, prevent the traversal of the entire tree in the + * case of default route. + */ + if (rn->rn_parent->rn_flags & RNF_ROOT) + stopping = 1; + + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) + rn = rn->rn_left; + next = rn; + /* Process leaves */ + while ((rn = base) != 0) { + base = rn->rn_dupedkey; + /* printf("leaf %p\n", rn); */ + if (!(rn->rn_flags & RNF_ROOT) + && (error = (*f)(rn, w))) + return (error); + } + rn = next; + + if (rn->rn_flags & RNF_ROOT) { + /* printf("root, stopping"); */ + stopping = 1; + } + + } + return 0; +} + +static int +rn_walktree(h, f, w) + struct radix_node_head *h; + walktree_f_t *f; + void *w; +{ + int error; + struct radix_node *base, *next; + register struct radix_node *rn = h->rnh_treetop; + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + + /* First time through node, go left */ + while (rn->rn_bit >= 0) + rn = rn->rn_left; + for (;;) { + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_parent->rn_right == rn + && (rn->rn_flags & RNF_ROOT) == 0) + rn = rn->rn_parent; + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) + rn = rn->rn_left; + next = rn; + /* Process leaves */ + while ((rn = base)) { + base = rn->rn_dupedkey; + if (!(rn->rn_flags & RNF_ROOT) + && (error = (*f)(rn, w))) + return (error); + } + rn = next; + if (rn->rn_flags & RNF_ROOT) + return (0); + } + /* NOTREACHED */ +} + +/* + * Allocate and initialize an empty tree. This has 3 nodes, which are + * part of the radix_node_head (in the order ) and are + * marked RNF_ROOT so they cannot be freed. + * The leaves have all-zero and all-one keys, with significant + * bits starting at 'off'. + * Return 1 on success, 0 on error. + */ +int +rn_inithead(head, off) + void **head; + int off; +{ + register struct radix_node_head *rnh; + register struct radix_node *t, *tt, *ttt; + if (*head) + return (1); + R_Zalloc(rnh, struct radix_node_head *, sizeof (*rnh)); + if (rnh == 0) + return (0); +#ifdef _KERNEL + RADIX_NODE_HEAD_LOCK_INIT(rnh); +#endif + *head = rnh; + t = rn_newpair(rn_zeros, off, rnh->rnh_nodes); + ttt = rnh->rnh_nodes + 2; + t->rn_right = ttt; + t->rn_parent = t; + tt = t->rn_left; /* ... which in turn is rnh->rnh_nodes */ + tt->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE; + tt->rn_bit = -1 - off; + *ttt = *tt; + ttt->rn_key = rn_ones; + rnh->rnh_addaddr = rn_addroute; + rnh->rnh_deladdr = rn_delete; + rnh->rnh_matchaddr = rn_match; + rnh->rnh_lookup = rn_lookup; + rnh->rnh_walktree = rn_walktree; + rnh->rnh_walktree_from = rn_walktree_from; + rnh->rnh_treetop = t; + return (1); +} + +int +rn_detachhead(void **head) +{ + struct radix_node_head *rnh; + + KASSERT((head != NULL && *head != NULL), + ("%s: head already freed", __func__)); + rnh = *head; + + /* Free nodes. */ + Free(rnh); + + *head = NULL; + return (1); +} + +void +rn_init(int maxk) +{ + char *cp, *cplim; + + max_keylen = maxk; + if (max_keylen == 0) { + log(LOG_ERR, + "rn_init: radix functions require max_keylen be set\n"); + return; + } + R_Malloc(rn_zeros, char *, 3 * max_keylen); + if (rn_zeros == NULL) + panic("rn_init"); + bzero(rn_zeros, 3 * max_keylen); + rn_ones = cp = rn_zeros + max_keylen; + addmask_key = cplim = rn_ones + max_keylen; + while (cp < cplim) + *cp++ = -1; + if (rn_inithead((void **)(void *)&mask_rnhead, 0) == 0) + panic("rn_init 2"); +} diff --git a/sys/net/radix.h b/sys/net/radix.h new file mode 100644 index 0000000..4102c99 --- /dev/null +++ b/sys/net/radix.h @@ -0,0 +1,181 @@ +/*- + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)radix.h 8.2 (Berkeley) 10/31/94 + * $FreeBSD: head/sys/net/radix.h 185747 2008-12-07 21:15:43Z kmacy $ + */ + +#ifndef _RADIX_H_ +#define _RADIX_H_ + +#ifdef _KERNEL +#include +#include +#include +#endif + +#ifdef MALLOC_DECLARE +MALLOC_DECLARE(M_RTABLE); +#endif + +/* + * Radix search tree node layout. + */ + +struct radix_node { + struct radix_mask *rn_mklist; /* list of masks contained in subtree */ + struct radix_node *rn_parent; /* parent */ + short rn_bit; /* bit offset; -1-index(netmask) */ + char rn_bmask; /* node: mask for bit test*/ + u_char rn_flags; /* enumerated next */ +#define RNF_NORMAL 1 /* leaf contains normal route */ +#define RNF_ROOT 2 /* leaf is root leaf for tree */ +#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ + union { + struct { /* leaf only data: */ + caddr_t rn_Key; /* object of search */ + caddr_t rn_Mask; /* netmask, if present */ + struct radix_node *rn_Dupedkey; + } rn_leaf; + struct { /* node only data: */ + int rn_Off; /* where to start compare */ + struct radix_node *rn_L;/* progeny */ + struct radix_node *rn_R;/* progeny */ + } rn_node; + } rn_u; +#ifdef RN_DEBUG + int rn_info; + struct radix_node *rn_twin; + struct radix_node *rn_ybro; +#endif +}; + +#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey +#define rn_key rn_u.rn_leaf.rn_Key +#define rn_mask rn_u.rn_leaf.rn_Mask +#define rn_offset rn_u.rn_node.rn_Off +#define rn_left rn_u.rn_node.rn_L +#define rn_right rn_u.rn_node.rn_R + +/* + * Annotations to tree concerning potential routes applying to subtrees. + */ + +struct radix_mask { + short rm_bit; /* bit offset; -1-index(netmask) */ + char rm_unused; /* cf. rn_bmask */ + u_char rm_flags; /* cf. rn_flags */ + struct radix_mask *rm_mklist; /* more masks to try */ + union { + caddr_t rmu_mask; /* the mask */ + struct radix_node *rmu_leaf; /* for normal routes */ + } rm_rmu; + int rm_refs; /* # of references to this struct */ +}; + +#define rm_mask rm_rmu.rmu_mask +#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ + +typedef int walktree_f_t(struct radix_node *, void *); + +struct radix_node_head { + struct radix_node *rnh_treetop; + u_int rnh_gen; /* generation counter */ + int rnh_multipath; /* multipath capable ? */ + int rnh_addrsize; /* permit, but not require fixed keys */ + int rnh_pktsize; /* permit, but not require fixed keys */ + struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ + (void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[]); + struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ + (void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[]); + struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ + (void *v, void *mask, struct radix_node_head *head); + struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ + (void *v, void *mask, struct radix_node_head *head); + struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ + (void *v, struct radix_node_head *head); + struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ + (void *v, void *mask, struct radix_node_head *head); + struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ + (void *v, struct radix_node_head *head); + int (*rnh_walktree) /* traverse tree */ + (struct radix_node_head *head, walktree_f_t *f, void *w); + int (*rnh_walktree_from) /* traverse tree below a */ + (struct radix_node_head *head, void *a, void *m, + walktree_f_t *f, void *w); + void (*rnh_close) /* do something when the last ref drops */ + (struct radix_node *rn, struct radix_node_head *head); + struct radix_node rnh_nodes[3]; /* empty tree for common case */ +#ifdef _KERNEL +#if defined( __linux__ ) || defined( _WIN32 ) + spinlock_t rnh_lock; +#else + struct rwlock rnh_lock; /* locks entire radix tree */ +#endif /* !__linux__ */ +#endif +}; + +#ifndef _KERNEL +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) +#define R_Zalloc(p, t, n) (p = (t) calloc(1,(unsigned int)(n))) +#define Free(p) free((char *)p); +#else +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT)) +#define R_Zalloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT | M_ZERO)) +#define Free(p) free((caddr_t)p, M_RTABLE); + +#define RADIX_NODE_HEAD_LOCK_INIT(rnh) \ + rw_init_flags(&(rnh)->rnh_lock, "radix node head", 0) +#define RADIX_NODE_HEAD_LOCK(rnh) rw_wlock(&(rnh)->rnh_lock) +#define RADIX_NODE_HEAD_UNLOCK(rnh) rw_wunlock(&(rnh)->rnh_lock) +#define RADIX_NODE_HEAD_RLOCK(rnh) rw_rlock(&(rnh)->rnh_lock) +#define RADIX_NODE_HEAD_RUNLOCK(rnh) rw_runlock(&(rnh)->rnh_lock) +#define RADIX_NODE_HEAD_LOCK_TRY_UPGRADE(rnh) rw_try_upgrade(&(rnh)->rnh_lock) + + +#define RADIX_NODE_HEAD_DESTROY(rnh) rw_destroy(&(rnh)->rnh_lock) +#define RADIX_NODE_HEAD_LOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_LOCKED) +#define RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_WLOCKED) +#endif /* _KERNEL */ + +void rn_init(int); +int rn_inithead(void **, int); +int rn_detachhead(void **); +int rn_refines(void *, void *); +struct radix_node + *rn_addmask(void *, int, int), + *rn_addroute (void *, void *, struct radix_node_head *, + struct radix_node [2]), + *rn_delete(void *, void *, struct radix_node_head *), + *rn_lookup (void *v_arg, void *m_arg, + struct radix_node_head *head), + *rn_match(void *, struct radix_node_head *); + +#endif /* _RADIX_H_ */ diff --git a/sys/netgraph/ng_ipfw.h b/sys/netgraph/ng_ipfw.h new file mode 100644 index 0000000..de74d4e --- /dev/null +++ b/sys/netgraph/ng_ipfw.h @@ -0,0 +1,33 @@ +/*- + * Copyright 2005, Gleb Smirnoff + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: src/sys/netgraph/ng_ipfw.h,v 1.2 2006/02/17 09:42:49 glebius Exp $ + */ + +#ifndef _NG_IPFW_H +#define _NG_IPFW_H +#define NG_IPFW_NODE_TYPE "ipfw" +#define NGM_IPFW_COOKIE 1105988990 +#endif /* _NG_IPFW_H */ diff --git a/sys/netinet/in_cksum.c b/sys/netinet/in_cksum.c new file mode 100644 index 0000000..d6acf87 --- /dev/null +++ b/sys/netinet/in_cksum.c @@ -0,0 +1,146 @@ +/*- + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + */ + +#include +__FBSDID("$FreeBSD: src/sys/netinet/in_cksum.c,v 1.10 2007/10/07 20:44:22 silby Exp $"); + +#include +#include + +/* + * Checksum routine for Internet Protocol family headers (Portable Version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + */ + +#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) +#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} + +int +in_cksum(struct mbuf *m, int len) +{ + register u_short *w; + register int sum = 0; + register int mlen = 0; + int byte_swapped = 0; + + union { + char c[2]; + u_short s; + } s_util; + union { + u_short s[2]; + long l; + } l_util; + + for (;m && len; m = m->m_next) { + if (m->m_len == 0) + continue; + w = mtod(m, u_short *); + if (mlen == -1) { + /* + * The first byte of this mbuf is the continuation + * of a word spanning between this mbuf and the + * last mbuf. + * + * s_util.c[0] is already saved when scanning previous + * mbuf. + */ + s_util.c[1] = *(char *)w; + sum += s_util.s; + w = (u_short *)((char *)w + 1); + mlen = m->m_len - 1; + len--; + } else + mlen = m->m_len; + if (len < mlen) + mlen = len; + len -= mlen; + /* + * Force to even boundary. + */ + if ((1 & (uintptr_t) w) && (mlen > 0)) { + REDUCE; + sum <<= 8; + s_util.c[0] = *(u_char *)w; + w = (u_short *)((char *)w + 1); + mlen--; + byte_swapped = 1; + } + /* + * Unroll the loop to make overhead from + * branches &c small. + */ + while ((mlen -= 32) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; + sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; + w += 16; + } + mlen += 32; + while ((mlen -= 8) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + w += 4; + } + mlen += 8; + if (mlen == 0 && byte_swapped == 0) + continue; + REDUCE; + while ((mlen -= 2) >= 0) { + sum += *w++; + } + if (byte_swapped) { + REDUCE; + sum <<= 8; + byte_swapped = 0; + if (mlen == -1) { + s_util.c[1] = *(char *)w; + sum += s_util.s; + mlen = 0; + } else + mlen = -1; + } else if (mlen == -1) + s_util.c[0] = *(char *)w; + } + if (len) + printf("cksum: out of data\n"); + if (mlen == -1) { + /* The last mbuf has odd # of bytes. Follow the + standard (the odd byte may be shifted left by 8 bits + or not as determined by endian-ness of the machine) */ + s_util.c[1] = 0; + sum += s_util.s; + } + REDUCE; + return (~sum & 0xffff); +} diff --git a/sys/netinet/ip.h b/sys/netinet/ip.h new file mode 100644 index 0000000..c9da4d8 --- /dev/null +++ b/sys/netinet/ip.h @@ -0,0 +1,49 @@ +#ifndef _NETINET_IP_H_ +#define _NETINET_IP_H_ + +#define LITTLE_ENDIAN 1234 +#define BIG_ENDIAN 4321 +#if defined(__BIG_ENDIAN) +#define BYTE_ORDER BIG_ENDIAN +//#warning we are in bigendian +#elif defined(__LITTLE_ENDIAN) +//#warning we are in littleendian +#define BYTE_ORDER LITTLE_ENDIAN +#else +#error no platform +#endif + +/* XXX endiannes doesn't belong here */ +// #define LITTLE_ENDIAN 1234 +// #define BIG_ENDIAN 4321 +// #define BYTE_ORDER LITTLE_ENDIAN + +/* + * Structure of an internet header, naked of options. + */ +struct ip { +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ip_hl:4, /* header length */ + ip_v:4; /* version */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ip_v:4, /* version */ + ip_hl:4; /* header length */ +#endif + u_char ip_tos; /* type of service */ + u_short ip_len; /* total length */ + u_short ip_id; /* identification */ + u_short ip_off; /* fragment offset field */ +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + u_char ip_ttl; /* time to live */ + u_char ip_p; /* protocol */ + u_short ip_sum; /* checksum */ + struct in_addr ip_src,ip_dst; /* source and dest address */ +} __packed __aligned(4); + +#define IPTOS_LOWDELAY 0x10 + +#endif /* _NETINET_IP_H_ */ diff --git a/sys/netinet/ip6.h b/sys/netinet/ip6.h new file mode 100644 index 0000000..88b42a4 --- /dev/null +++ b/sys/netinet/ip6.h @@ -0,0 +1,58 @@ +#ifndef _NETINET_IP6_H_ +#define _NETINET_IP6_H_ +#define IN6_ARE_ADDR_EQUAL(a, b) \ +(memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) + +struct ip6_hdr { + union { + struct ip6_hdrctl { + u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */ + u_int16_t ip6_un1_plen; /* payload length */ + u_int8_t ip6_un1_nxt; /* next header */ + u_int8_t ip6_un1_hlim; /* hop limit */ + } ip6_un1; + u_int8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ + } ip6_ctlun; + struct in6_addr ip6_src; /* source address */ + struct in6_addr ip6_dst; /* destination address */ +}; +#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt +#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow + + +struct icmp6_hdr { + u_int8_t icmp6_type; /* type field */ + u_int8_t icmp6_code; /* code field */ + u_int16_t icmp6_cksum; /* checksum field */ + union { + u_int32_t icmp6_un_data32[1]; /* type-specific field */ + u_int16_t icmp6_un_data16[2]; /* type-specific field */ + u_int8_t icmp6_un_data8[4]; /* type-specific field */ + } icmp6_dataun; +}; + +struct ip6_hbh { + u_int8_t ip6h_nxt; /* next header */ + u_int8_t ip6h_len; /* length in units of 8 octets */ + /* followed by options */ +}; +struct ip6_rthdr { + u_int8_t ip6r_nxt; /* next header */ + u_int8_t ip6r_len; /* length in units of 8 octets */ + u_int8_t ip6r_type; /* routing type */ + u_int8_t ip6r_segleft; /* segments left */ + /* followed by routing type specific data */ +}; +struct ip6_frag { + u_int8_t ip6f_nxt; /* next header */ + u_int8_t ip6f_reserved; /* reserved field */ + u_int16_t ip6f_offlg; /* offset, reserved, and flag */ + u_int32_t ip6f_ident; /* identification */ +}; +#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ +#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ +struct ip6_ext { + u_int8_t ip6e_nxt; + u_int8_t ip6e_len; +}; +#endif /* _NETINET_IP6_H_ */ diff --git a/sys/netinet/ip_dummynet.h b/sys/netinet/ip_dummynet.h new file mode 100644 index 0000000..eab28f6 --- /dev/null +++ b/sys/netinet/ip_dummynet.h @@ -0,0 +1,263 @@ +/*- + * Copyright (c) 1998-2010 Luigi Rizzo, Universita` di Pisa + * Portions Copyright (c) 2000 Akamba Corp. + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: user/luigi/ipfw3-head/sys/netinet/ip_dummynet.h 203321 2010-01-31 21:39:25Z luigi $ + */ + +#ifndef _IP_DUMMYNET_H +#define _IP_DUMMYNET_H + +/* + * Definition of the kernel-userland API for dummynet. + * + * Setsockopt() and getsockopt() pass a batch of objects, each + * of them starting with a "struct dn_id" which should fully identify + * the object and its relation with others in the sequence. + * The first object in each request should have + * type= DN_CMD_*, id = DN_API_VERSION. + * For other objects, type and subtype specify the object, len indicates + * the total length including the header, and 'id' identifies the specific + * object. + * + * Most objects are numbered with an identifier in the range 1..65535. + * DN_MAX_ID indicates the first value outside the range. + */ + +#define DN_API_VERSION 12500000 +#define DN_MAX_ID 0x10000 + +struct dn_id { + uint16_t len; /* total obj len including this header */ + uint8_t type; + uint8_t subtype; + uint32_t id; /* generic id */ +}; + +/* + * These values are in the type field of struct dn_id. + * To preserve the ABI, never rearrange the list or delete + * entries with the exception of DN_LAST + */ +enum { + DN_NONE = 0, + DN_LINK = 1, + DN_FS, + DN_SCH, + DN_SCH_I, + DN_QUEUE, + DN_DELAY_LINE, + DN_PROFILE, + DN_FLOW, /* struct dn_flow */ + DN_TEXT, /* opaque text is the object */ + + DN_CMD_CONFIG = 0x80, /* objects follow */ + DN_CMD_DELETE, /* subtype + list of entries */ + DN_CMD_GET, /* subtype + list of entries */ + DN_CMD_FLUSH, + /* for compatibility with FreeBSD 7.2/8 */ + DN_COMPAT_PIPE, + DN_COMPAT_QUEUE, + DN_GET_COMPAT, + + /* special commands for emulation of sysctl variables */ + DN_SYSCTL_GET, + DN_SYSCTL_SET, + + DN_LAST, +}; + +enum { /* subtype for schedulers, flowset and the like */ + DN_SCHED_UNKNOWN = 0, + DN_SCHED_FIFO = 1, + DN_SCHED_WF2QP = 2, + /* others are in individual modules */ +}; + +enum { /* user flags */ + DN_HAVE_MASK = 0x0001, /* fs or sched has a mask */ + DN_NOERROR = 0x0002, /* do not report errors */ + DN_QHT_HASH = 0x0004, /* qht is a hash table */ + DN_QSIZE_BYTES = 0x0008, /* queue size is in bytes */ + DN_HAS_PROFILE = 0x0010, /* a link has a profile */ + DN_IS_RED = 0x0020, + DN_IS_GENTLE_RED= 0x0040, + DN_PIPE_CMD = 0x1000, /* pipe config... */ +}; + +/* + * link template. + */ +struct dn_link { + struct dn_id oid; + + /* + * Userland sets bw and delay in bits/s and milliseconds. + * The kernel converts this back and forth to bits/tick and ticks. + * XXX what about burst ? + */ + int32_t link_nr; + int bandwidth; /* bit/s or bits/tick. */ + int delay; /* ms and ticks */ + uint64_t burst; /* scaled. bits*Hz XXX */ +}; + +/* + * A flowset, which is a template for flows. Contains parameters + * from the command line: id, target scheduler, queue sizes, plr, + * flow masks, buckets for the flow hash, and possibly scheduler- + * specific parameters (weight, quantum and so on). + */ +struct dn_fs { + struct dn_id oid; + uint32_t fs_nr; /* the flowset number */ + uint32_t flags; /* userland flags */ + int qsize; /* queue size in slots or bytes */ + int32_t plr; /* PLR, pkt loss rate (2^31-1 means 100%) */ + uint32_t buckets; /* buckets used for the queue hash table */ + + struct ipfw_flow_id flow_mask; + uint32_t sched_nr; /* the scheduler we attach to */ + /* generic scheduler parameters. Leave them at -1 if unset. + * Now we use 0: weight, 1: lmax, 2: priority + */ + int par[4]; + + /* RED/GRED parameters. + * weight and probabilities are in the range 0..1 represented + * in fixed point arithmetic with SCALE_RED decimal bits. + */ +#define SCALE_RED 16 +#define SCALE(x) ( (x) << SCALE_RED ) +#define SCALE_VAL(x) ( (x) >> SCALE_RED ) +#define SCALE_MUL(x,y) ( ( (x) * (y) ) >> SCALE_RED ) + int w_q ; /* queue weight (scaled) */ + int max_th ; /* maximum threshold for queue (scaled) */ + int min_th ; /* minimum threshold for queue (scaled) */ + int max_p ; /* maximum value for p_b (scaled) */ + +}; + +/* + * dn_flow collects flow_id and stats for queues and scheduler + * instances, and is used to pass these info to userland. + * oid.type/oid.subtype describe the object, oid.id is number + * of the parent object. + */ +struct dn_flow { + struct dn_id oid; + struct ipfw_flow_id fid; + uint64_t tot_pkts; /* statistics counters */ + uint64_t tot_bytes; + uint32_t length; /* Queue length, in packets */ + uint32_t len_bytes; /* Queue length, in bytes */ + uint32_t drops; +}; + + +/* + * Scheduler template, mostly indicating the name, number, + * sched_mask and buckets. + */ +struct dn_sch { + struct dn_id oid; + uint32_t sched_nr; /* N, scheduler number */ + uint32_t buckets; /* number of buckets for the instances */ + uint32_t flags; /* have_mask, ... */ + + char name[16]; /* null terminated */ + /* mask to select the appropriate scheduler instance */ + struct ipfw_flow_id sched_mask; /* M */ +}; + + +/* A delay profile is attached to a link. + * Note that a profile, as any other object, cannot be longer than 2^16 + */ +#define ED_MAX_SAMPLES_NO 1024 +struct dn_profile { + struct dn_id oid; + /* fields to simulate a delay profile */ +#define ED_MAX_NAME_LEN 32 + char name[ED_MAX_NAME_LEN]; + int link_nr; + int loss_level; + int bandwidth; // XXX use link bandwidth? + int samples_no; /* actual len of samples[] */ + int samples[0]; /* may be shorter */ +}; + + + +/* + * Overall structure of dummynet + +In dummynet, packets are selected with the firewall rules, and passed +to two different objects: PIPE or QUEUE (bad name). + +A QUEUE defines a classifier, which groups packets into flows +according to a 'mask', puts them into independent queues (one +per flow) with configurable size and queue management policy, +and passes flows to a scheduler: + + (flow_mask|sched_mask) sched_mask + +---------+ weight Wx +-------------+ + | |->-[flow]-->--| |-+ + -->--| QUEUE x | ... | | | + | |->-[flow]-->--| SCHEDuler N | | + +---------+ | | | + ... | +--[LINK N]-->-- + +---------+ weight Wy | | +--[LINK N]-->-- + | |->-[flow]-->--| | | + -->--| QUEUE y | ... | | | + | |->-[flow]-->--| | | + +---------+ +-------------+ | + +-------------+ + +Many QUEUE objects can connect to the same scheduler, each +QUEUE object can have its own set of parameters. + +In turn, the SCHEDuler 'forks' multiple instances according +to a 'sched_mask', each instance manages its own set of queues +and transmits on a private instance of a configurable LINK. + +A PIPE is a simplified version of the above, where there +is no flow_mask, and each scheduler instance handles a single queue. + +The following data structures (visible from userland) describe +the objects used by dummynet: + + + dn_link, contains the main configuration parameters related + to delay and bandwidth; + + dn_profile describes a delay profile; + + dn_flow describes the flow status (flow id, statistics) + + + dn_sch describes a scheduler + + dn_fs describes a flowset (msk, weight, queue parameters) + + * + */ + +#endif /* _IP_DUMMYNET_H */ diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h new file mode 100644 index 0000000..9bfe775 --- /dev/null +++ b/sys/netinet/ip_fw.h @@ -0,0 +1,646 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: user/luigi/ipfw3-head/sys/netinet/ip_fw.h 202072 2010-01-11 10:12:35Z luigi $ + */ + +#ifndef _IPFW2_H +#define _IPFW2_H + +/* + * The default rule number. By the design of ip_fw, the default rule + * is the last one, so its number can also serve as the highest number + * allowed for a rule. The ip_fw code relies on both meanings of this + * constant. + */ +#define IPFW_DEFAULT_RULE 65535 + +/* + * The number of ipfw tables. The maximum allowed table number is the + * (IPFW_TABLES_MAX - 1). + */ +#define IPFW_TABLES_MAX 128 + +/* + * Most commands (queue, pipe, tag, untag, limit...) can have a 16-bit + * argument between 1 and 65534. The value 0 is unused, the value + * 65535 (IP_FW_TABLEARG) is used to represent 'tablearg', i.e. the + * can be 1..65534, or 65535 to indicate the use of a 'tablearg' + * result of the most recent table() lookup. + * Note that 16bit is only a historical limit, resulting from + * the use of a 16-bit fields for that value. In reality, we can have + * 2^32 pipes, queues, tag values and so on, and use 0 as a tablearg. + */ +#define IPFW_ARG_MIN 1 +#define IPFW_ARG_MAX 65534 +#define IP_FW_TABLEARG 65535 /* XXX should use 0 */ + + /* + * Number of entries in the call stack of the call/return commands. + * Call stack currently is an uint16_t array with rule numbers. + */ +#define IPFW_CALLSTACK_SIZE 16 + +/* IP_FW3 header/opcodes */ +typedef struct _ip_fw3_opheader { + uint16_t opcode; /* Operation opcode */ + uint16_t reserved[3]; /* Align to 64-bit boundary */ +} ip_fw3_opheader; + + +/* IPFW extented tables support XXX what namespace ? */ +#define IP_FW_TABLE_XADD 86 /* add entry */ +#define IP_FW_TABLE_XDEL 87 /* delete entry */ +#define IP_FW_TABLE_XGETSIZE 88 /* get table size */ +#define IP_FW_TABLE_XLIST 89 /* list table contents */ + +/* + * The kernel representation of ipfw rules is made of a list of + * 'instructions' (for all practical purposes equivalent to BPF + * instructions), which specify which fields of the packet + * (or its metadata) should be analysed. + * + * Each instruction is stored in a structure which begins with + * "ipfw_insn", and can contain extra fields depending on the + * instruction type (listed below). + * Note that the code is written so that individual instructions + * have a size which is a multiple of 32 bits. This means that, if + * such structures contain pointers or other 64-bit entities, + * (there is just one instance now) they may end up unaligned on + * 64-bit architectures, so the must be handled with care. + * + * "enum ipfw_opcodes" are the opcodes supported. We can have up + * to 256 different opcodes. When adding new opcodes, they should + * be appended to the end of the opcode list before O_LAST_OPCODE, + * this will prevent the ABI from being broken, otherwise users + * will have to recompile ipfw(8) when they update the kernel. + */ + +enum ipfw_opcodes { /* arguments (4 byte each) */ + O_NOP, + + O_IP_SRC, /* u32 = IP */ + O_IP_SRC_MASK, /* ip = IP/mask */ + O_IP_SRC_ME, /* none */ + O_IP_SRC_SET, /* u32=base, arg1=len, bitmap */ + + O_IP_DST, /* u32 = IP */ + O_IP_DST_MASK, /* ip = IP/mask */ + O_IP_DST_ME, /* none */ + O_IP_DST_SET, /* u32=base, arg1=len, bitmap */ + + O_IP_SRCPORT, /* (n)port list:mask 4 byte ea */ + O_IP_DSTPORT, /* (n)port list:mask 4 byte ea */ + O_PROTO, /* arg1=protocol */ + + O_MACADDR2, /* 2 mac addr:mask */ + O_MAC_TYPE, /* same as srcport */ + + O_LAYER2, /* none */ + O_IN, /* none */ + O_FRAG, /* none */ + + O_RECV, /* none */ + O_XMIT, /* none */ + O_VIA, /* none */ + + O_IPOPT, /* arg1 = 2*u8 bitmap */ + O_IPLEN, /* arg1 = len */ + O_IPID, /* arg1 = id */ + + O_IPTOS, /* arg1 = id */ + O_IPPRECEDENCE, /* arg1 = precedence << 5 */ + O_IPTTL, /* arg1 = TTL */ + + O_IPVER, /* arg1 = version */ + O_UID, /* u32 = id */ + O_GID, /* u32 = id */ + O_ESTAB, /* none (tcp established) */ + O_TCPFLAGS, /* arg1 = 2*u8 bitmap */ + O_TCPWIN, /* arg1 = desired win */ + O_TCPSEQ, /* u32 = desired seq. */ + O_TCPACK, /* u32 = desired seq. */ + O_ICMPTYPE, /* u32 = icmp bitmap */ + O_TCPOPTS, /* arg1 = 2*u8 bitmap */ + + O_VERREVPATH, /* none */ + O_VERSRCREACH, /* none */ + + O_PROBE_STATE, /* none */ + O_KEEP_STATE, /* none */ + O_LIMIT, /* ipfw_insn_limit */ + O_LIMIT_PARENT, /* dyn_type, not an opcode. */ + + /* + * These are really 'actions'. + */ + + O_LOG, /* ipfw_insn_log */ + O_PROB, /* u32 = match probability */ + + O_CHECK_STATE, /* none */ + O_ACCEPT, /* none */ + O_DENY, /* none */ + O_REJECT, /* arg1=icmp arg (same as deny) */ + O_COUNT, /* none */ + O_SKIPTO, /* arg1=next rule number */ + O_PIPE, /* arg1=pipe number */ + O_QUEUE, /* arg1=queue number */ + O_DIVERT, /* arg1=port number */ + O_TEE, /* arg1=port number */ + O_FORWARD_IP, /* fwd sockaddr */ + O_FORWARD_MAC, /* fwd mac */ + O_NAT, /* nope */ + O_REASS, /* none */ + + /* + * More opcodes. + */ + O_IPSEC, /* has ipsec history */ + O_IP_SRC_LOOKUP, /* arg1=table number, u32=value */ + O_IP_DST_LOOKUP, /* arg1=table number, u32=value */ + O_ANTISPOOF, /* none */ + O_JAIL, /* u32 = id */ + O_ALTQ, /* u32 = altq classif. qid */ + O_DIVERTED, /* arg1=bitmap (1:loop, 2:out) */ + O_TCPDATALEN, /* arg1 = tcp data len */ + O_IP6_SRC, /* address without mask */ + O_IP6_SRC_ME, /* my addresses */ + O_IP6_SRC_MASK, /* address with the mask */ + O_IP6_DST, + O_IP6_DST_ME, + O_IP6_DST_MASK, + O_FLOW6ID, /* for flow id tag in the ipv6 pkt */ + O_ICMP6TYPE, /* icmp6 packet type filtering */ + O_EXT_HDR, /* filtering for ipv6 extension header */ + O_IP6, + + /* + * actions for ng_ipfw + */ + O_NETGRAPH, /* send to ng_ipfw */ + O_NGTEE, /* copy to ng_ipfw */ + + O_IP4, + + O_UNREACH6, /* arg1=icmpv6 code arg (deny) */ + + O_TAG, /* arg1=tag number */ + O_TAGGED, /* arg1=tag number */ + + O_SETFIB, /* arg1=FIB number */ + O_FIB, /* arg1=FIB desired fib number */ + + O_SOCKARG, /* socket argument */ + + O_CALLRETURN, /* arg1=called rule number */ + + O_FORWARD_IP6, /* fwd sockaddr_in6 */ + + O_LAST_OPCODE /* not an opcode! */ +}; + + +/* + * The extension header are filtered only for presence using a bit + * vector with a flag for each header. + */ +#define EXT_FRAGMENT 0x1 +#define EXT_HOPOPTS 0x2 +#define EXT_ROUTING 0x4 +#define EXT_AH 0x8 +#define EXT_ESP 0x10 +#define EXT_DSTOPTS 0x20 +#define EXT_RTHDR0 0x40 +#define EXT_RTHDR2 0x80 + +/* + * Template for instructions. + * + * ipfw_insn is used for all instructions which require no operands, + * a single 16-bit value (arg1), or a couple of 8-bit values. + * + * For other instructions which require different/larger arguments + * we have derived structures, ipfw_insn_*. + * + * The size of the instruction (in 32-bit words) is in the low + * 6 bits of "len". The 2 remaining bits are used to implement + * NOT and OR on individual instructions. Given a type, you can + * compute the length to be put in "len" using F_INSN_SIZE(t) + * + * F_NOT negates the match result of the instruction. + * + * F_OR is used to build or blocks. By default, instructions + * are evaluated as part of a logical AND. An "or" block + * { X or Y or Z } contains F_OR set in all but the last + * instruction of the block. A match will cause the code + * to skip past the last instruction of the block. + * + * NOTA BENE: in a couple of places we assume that + * sizeof(ipfw_insn) == sizeof(u_int32_t) + * this needs to be fixed. + * + */ +typedef struct _ipfw_insn { /* template for instructions */ + u_int8_t opcode; + u_int8_t len; /* number of 32-bit words */ +#define F_NOT 0x80 +#define F_OR 0x40 +#define F_LEN_MASK 0x3f +#define F_LEN(cmd) ((cmd)->len & F_LEN_MASK) + + u_int16_t arg1; +} ipfw_insn; + +/* + * The F_INSN_SIZE(type) computes the size, in 4-byte words, of + * a given type. + */ +#define F_INSN_SIZE(t) ((sizeof (t))/sizeof(u_int32_t)) + +/* + * This is used to store an array of 16-bit entries (ports etc.) + */ +typedef struct _ipfw_insn_u16 { + ipfw_insn o; + u_int16_t ports[2]; /* there may be more */ +} ipfw_insn_u16; + +/* + * This is used to store an array of 32-bit entries + * (uid, single IPv4 addresses etc.) + */ +typedef struct _ipfw_insn_u32 { + ipfw_insn o; + u_int32_t d[1]; /* one or more */ +} ipfw_insn_u32; + +/* + * This is used to store IP addr-mask pairs. + */ +typedef struct _ipfw_insn_ip { + ipfw_insn o; + struct in_addr addr; + struct in_addr mask; +} ipfw_insn_ip; + +/* + * This is used to forward to a given address (ip). + */ +typedef struct _ipfw_insn_sa { + ipfw_insn o; + struct sockaddr_in sa; +} ipfw_insn_sa; + +/* +* This is used to forward to a given address (ipv6). +*/ +typedef struct _ipfw_insn_sa6 { + ipfw_insn o; + struct sockaddr_in6 sa; +} ipfw_insn_sa6; + +/* + * This is used for MAC addr-mask pairs. + */ +typedef struct _ipfw_insn_mac { + ipfw_insn o; + u_char addr[12]; /* dst[6] + src[6] */ + u_char mask[12]; /* dst[6] + src[6] */ +} ipfw_insn_mac; + +/* + * This is used for interface match rules (recv xx, xmit xx). + */ +typedef struct _ipfw_insn_if { + ipfw_insn o; + union { + struct in_addr ip; + int glob; + } p; + char name[IFNAMSIZ]; +} ipfw_insn_if; + +/* + * This is used for storing an altq queue id number. + */ +typedef struct _ipfw_insn_altq { + ipfw_insn o; + u_int32_t qid; +} ipfw_insn_altq; + +/* + * This is used for limit rules. + */ +typedef struct _ipfw_insn_limit { + ipfw_insn o; + u_int8_t _pad; + u_int8_t limit_mask; /* combination of DYN_* below */ +#define DYN_SRC_ADDR 0x1 +#define DYN_SRC_PORT 0x2 +#define DYN_DST_ADDR 0x4 +#define DYN_DST_PORT 0x8 + + u_int16_t conn_limit; +} ipfw_insn_limit; + +/* + * This is used for log instructions. + */ +typedef struct _ipfw_insn_log { + ipfw_insn o; + u_int32_t max_log; /* how many do we log -- 0 = all */ + u_int32_t log_left; /* how many left to log */ +} ipfw_insn_log; + +/* + * Data structures required by both ipfw(8) and ipfw(4) but not part of the + * management API are protected by IPFW_INTERNAL. + */ +#ifdef IPFW_INTERNAL +/* Server pool support (LSNAT). */ +struct cfg_spool { + LIST_ENTRY(cfg_spool) _next; /* chain of spool instances */ + struct in_addr addr; + u_short port; +}; +#endif + +/* Redirect modes id. */ +#define REDIR_ADDR 0x01 +#define REDIR_PORT 0x02 +#define REDIR_PROTO 0x04 + +#ifdef IPFW_INTERNAL +/* Nat redirect configuration. */ +struct cfg_redir { + LIST_ENTRY(cfg_redir) _next; /* chain of redir instances */ + u_int16_t mode; /* type of redirect mode */ + struct in_addr laddr; /* local ip address */ + struct in_addr paddr; /* public ip address */ + struct in_addr raddr; /* remote ip address */ + u_short lport; /* local port */ + u_short pport; /* public port */ + u_short rport; /* remote port */ + u_short pport_cnt; /* number of public ports */ + u_short rport_cnt; /* number of remote ports */ + int proto; /* protocol: tcp/udp */ + struct alias_link **alink; + /* num of entry in spool chain */ + u_int16_t spool_cnt; + /* chain of spool instances */ + LIST_HEAD(spool_chain, cfg_spool) spool_chain; +}; +#endif + +#define NAT_BUF_LEN 1024 + +#ifdef IPFW_INTERNAL +/* Nat configuration data struct. */ +struct cfg_nat { + /* chain of nat instances */ + LIST_ENTRY(cfg_nat) _next; + int id; /* nat id */ + struct in_addr ip; /* nat ip address */ + char if_name[IF_NAMESIZE]; /* interface name */ + int mode; /* aliasing mode */ + struct libalias *lib; /* libalias instance */ + /* number of entry in spool chain */ + int redir_cnt; + /* chain of redir instances */ + LIST_HEAD(redir_chain, cfg_redir) redir_chain; +}; +#endif + +#define SOF_NAT sizeof(struct cfg_nat) +#define SOF_REDIR sizeof(struct cfg_redir) +#define SOF_SPOOL sizeof(struct cfg_spool) + +/* Nat command. */ +typedef struct _ipfw_insn_nat { + ipfw_insn o; + struct cfg_nat *nat; +} ipfw_insn_nat; + +/* Apply ipv6 mask on ipv6 addr */ +#define APPLY_MASK(addr,mask) \ + (addr)->__u6_addr.__u6_addr32[0] &= (mask)->__u6_addr.__u6_addr32[0]; \ + (addr)->__u6_addr.__u6_addr32[1] &= (mask)->__u6_addr.__u6_addr32[1]; \ + (addr)->__u6_addr.__u6_addr32[2] &= (mask)->__u6_addr.__u6_addr32[2]; \ + (addr)->__u6_addr.__u6_addr32[3] &= (mask)->__u6_addr.__u6_addr32[3]; + +/* Structure for ipv6 */ +typedef struct _ipfw_insn_ip6 { + ipfw_insn o; + struct in6_addr addr6; + struct in6_addr mask6; +} ipfw_insn_ip6; + +/* Used to support icmp6 types */ +typedef struct _ipfw_insn_icmp6 { + ipfw_insn o; + uint32_t d[7]; /* XXX This number si related to the netinet/icmp6.h + * define ICMP6_MAXTYPE + * as follows: n = ICMP6_MAXTYPE/32 + 1 + * Actually is 203 + */ +} ipfw_insn_icmp6; + +/* + * Here we have the structure representing an ipfw rule. + * + * It starts with a general area (with link fields and counters) + * followed by an array of one or more instructions, which the code + * accesses as an array of 32-bit values. + * + * Given a rule pointer r: + * + * r->cmd is the start of the first instruction. + * ACTION_PTR(r) is the start of the first action (things to do + * once a rule matched). + * + * When assembling instruction, remember the following: + * + * + if a rule has a "keep-state" (or "limit") option, then the + * first instruction (at r->cmd) MUST BE an O_PROBE_STATE + * + if a rule has a "log" option, then the first action + * (at ACTION_PTR(r)) MUST be O_LOG + * + if a rule has an "altq" option, it comes after "log" + * + if a rule has an O_TAG option, it comes after "log" and "altq" + * + * NOTE: we use a simple linked list of rules because we never need + * to delete a rule without scanning the list. We do not use + * queue(3) macros for portability and readability. + */ + +struct ip_fw { +#ifdef _X64EMU + int32_t pad1; +#endif + struct ip_fw *x_next; /* linked list of rules */ +#ifdef _X64EMU + int32_t pad2; +#endif + struct ip_fw *next_rule; /* ptr to next [skipto] rule */ + /* 'next_rule' is used to pass up 'set_disable' status */ + + uint16_t act_ofs; /* offset of action in 32-bit units */ + uint16_t cmd_len; /* # of 32-bit words in cmd */ + uint16_t rulenum; /* rule number */ + uint8_t set; /* rule set (0..31) */ +#define RESVD_SET 31 /* set for default and persistent rules */ + uint8_t _pad; /* padding */ + uint32_t id; /* rule id */ + + /* These fields are present in all rules. */ + uint64_t pcnt; /* Packet counter */ + uint64_t bcnt; /* Byte counter */ + uint32_t timestamp; /* tv_sec of last match */ + + ipfw_insn cmd[1]; /* storage for commands */ +}; + +#define ACTION_PTR(rule) \ + (ipfw_insn *)( (u_int32_t *)((rule)->cmd) + ((rule)->act_ofs) ) + +#define RULESIZE(rule) (sizeof(struct ip_fw) + \ + ((struct ip_fw *)(rule))->cmd_len * 4 - 4) + +#if 1 // should be moved to in.h +/* + * This structure is used as a flow mask and a flow id for various + * parts of the code. + * addr_type is used in userland and kernel to mark the address type. + * fib is used in the kernel to record the fib in use. + * _flags is used in the kernel to store tcp flags for dynamic rules. + */ +struct ipfw_flow_id { + uint32_t dst_ip; + uint32_t src_ip; + uint16_t dst_port; + uint16_t src_port; + uint8_t fib; + uint8_t proto; + uint8_t _flags; /* protocol-specific flags */ + uint8_t addr_type; /* 4=ip4, 6=ip6, 1=ether ? */ + struct in6_addr dst_ip6; + struct in6_addr src_ip6; + uint32_t flow_id6; + uint32_t extra; /* queue/pipe or frag_id */ +}; +#endif + +#define IS_IP6_FLOW_ID(id) ((id)->addr_type == 6) + +/* + * Dynamic ipfw rule. + */ +typedef struct _ipfw_dyn_rule ipfw_dyn_rule; + +struct _ipfw_dyn_rule { + ipfw_dyn_rule *next; /* linked list of rules. */ + struct ip_fw *rule; /* pointer to rule */ + /* 'rule' is used to pass up the rule number (from the parent) */ + + ipfw_dyn_rule *parent; /* pointer to parent rule */ + u_int64_t pcnt; /* packet match counter */ + u_int64_t bcnt; /* byte match counter */ + struct ipfw_flow_id id; /* (masked) flow id */ + u_int32_t expire; /* expire time */ + u_int32_t bucket; /* which bucket in hash table */ + u_int32_t state; /* state of this rule (typically a + * combination of TCP flags) + */ + u_int32_t ack_fwd; /* most recent ACKs in forward */ + u_int32_t ack_rev; /* and reverse directions (used */ + /* to generate keepalives) */ + u_int16_t dyn_type; /* rule type */ + u_int16_t count; /* refcount */ +}; + +/* + * Definitions for IP option names. + */ +#define IP_FW_IPOPT_LSRR 0x01 +#define IP_FW_IPOPT_SSRR 0x02 +#define IP_FW_IPOPT_RR 0x04 +#define IP_FW_IPOPT_TS 0x08 + +/* + * Definitions for TCP option names. + */ +#define IP_FW_TCPOPT_MSS 0x01 +#define IP_FW_TCPOPT_WINDOW 0x02 +#define IP_FW_TCPOPT_SACK 0x04 +#define IP_FW_TCPOPT_TS 0x08 +#define IP_FW_TCPOPT_CC 0x10 + +#define ICMP_REJECT_RST 0x100 /* fake ICMP code (send a TCP RST) */ +#define ICMP6_UNREACH_RST 0x100 /* fake ICMPv6 code (send a TCP RST) */ + +/* + * These are used for lookup tables. + */ + +#define IPFW_TABLE_CIDR 1 /* Table for holding IPv4/IPv6 prefixes */ +#define IPFW_TABLE_INTERFACE 2 /* Table for holding interface names */ +#define IPFW_TABLE_MAXTYPE 2 /* Maximum valid number */ + +typedef struct _ipfw_table_entry { + in_addr_t addr; /* network address */ + u_int32_t value; /* value */ + u_int16_t tbl; /* table number */ + u_int8_t masklen; /* mask length */ +} ipfw_table_entry; + +typedef struct _ipfw_table_xentry { + uint16_t len; /* Total entry length */ + uint8_t type; /* entry type */ + uint8_t masklen; /* mask length */ + uint16_t tbl; /* table number */ + uint32_t value; /* value */ + union { + /* Longest field needs to be aligned by 4-byte boundary */ + struct in6_addr addr6; /* IPv6 address */ + char iface[IF_NAMESIZE]; /* interface name */ + } k; +} ipfw_table_xentry; + +typedef struct _ipfw_table { + u_int32_t size; /* size of entries in bytes */ + u_int32_t cnt; /* # of entries */ + u_int16_t tbl; /* table number */ + ipfw_table_entry ent[0]; /* entries */ +} ipfw_table; + +typedef struct _ipfw_xtable { + ip_fw3_opheader opheader; /* eXtended tables are controlled via IP_FW3 */ + uint32_t size; /* size of entries in bytes */ + uint32_t cnt; /* # of entries */ + uint16_t tbl; /* table number */ + uint8_t type; /* table type */ + ipfw_table_xentry xent[0]; /* entries */ +} ipfw_xtable; + +#endif /* _IPFW2_H */ diff --git a/sys/netinet/ip_icmp.h b/sys/netinet/ip_icmp.h new file mode 100644 index 0000000..5c7b851 --- /dev/null +++ b/sys/netinet/ip_icmp.h @@ -0,0 +1,17 @@ +/* + * additional define not present in linux + * should go in glue.h + */ +#ifndef _NETINET_IP_ICMP_H_ +#define _NETINET_IP_ICMP_H_ + +#define ICMP_MAXTYPE 40 /* defined as 18 in compat.h */ +#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ +#define ICMP_TSTAMP 13 /* timestamp request */ +#define ICMP_IREQ 15 /* information request */ +#define ICMP_MASKREQ 17 /* address mask request */ +#define ICMP_UNREACH_HOST 1 /* bad host */ + +#define ICMP_UNREACH 3 /* dest unreachable, codes: */ + +#endif /* _NETINET_IP_ICMP_H_ */ diff --git a/sys/netinet/ipfw/dn_heap.c b/sys/netinet/ipfw/dn_heap.c new file mode 100644 index 0000000..fe2e971 --- /dev/null +++ b/sys/netinet/ipfw/dn_heap.c @@ -0,0 +1,588 @@ +/*- + * Copyright (c) 1998-2002,2010 Luigi Rizzo, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * Binary heap and hash tables, used in dummynet + * + * $Id: dn_heap.c 11480 2012-07-31 08:02:00Z luigi $ + */ + +#include +#include +#ifdef _KERNEL +__FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c 203279 2010-01-31 12:20:29Z luigi $"); +#include +#include +#include +#include +#ifndef log +#define log(x, arg...) +#endif + +#else /* !_KERNEL */ + +#include +#include +#include +#include + +#include "dn_heap.h" +#define log(x, arg...) fprintf(stderr, ## arg) +#define panic(x...) fprintf(stderr, ## x), exit(1) +#define MALLOC_DEFINE(a, b, c) +static void *my_malloc(int s) { return malloc(s); } +static void my_free(void *p) { free(p); } +#define malloc(s, t, w) my_malloc(s) +#define free(p, t) my_free(p) +#endif /* !_KERNEL */ + +MALLOC_DEFINE(M_DN_HEAP, "dummynet", "dummynet heap"); + +/* + * Heap management functions. + * + * In the heap, first node is element 0. Children of i are 2i+1 and 2i+2. + * Some macros help finding parent/children so we can optimize them. + * + * heap_init() is called to expand the heap when needed. + * Increment size in blocks of 16 entries. + * Returns 1 on error, 0 on success + */ +#define HEAP_FATHER(x) ( ( (x) - 1 ) / 2 ) +#define HEAP_LEFT(x) ( (x)+(x) + 1 ) +#define HEAP_SWAP(a, b, buffer) { buffer = a ; a = b ; b = buffer ; } +#define HEAP_INCREMENT 15 + +static int +heap_resize(struct dn_heap *h, unsigned int new_size) +{ + struct dn_heap_entry *p; + + if (h->size >= new_size ) /* have enough room */ + return 0; +#if 1 /* round to the next power of 2 */ + new_size |= new_size >> 1; + new_size |= new_size >> 2; + new_size |= new_size >> 4; + new_size |= new_size >> 8; + new_size |= new_size >> 16; +#else + new_size = (new_size + HEAP_INCREMENT ) & ~HEAP_INCREMENT; +#endif + p = malloc(new_size * sizeof(*p), M_DN_HEAP, M_NOWAIT); + if (p == NULL) { + printf("--- %s, resize %d failed\n", __func__, new_size ); + return 1; /* error */ + } + if (h->size > 0) { + bcopy(h->p, p, h->size * sizeof(*p) ); + free(h->p, M_DN_HEAP); + } + h->p = p; + h->size = new_size; + return 0; +} + +int +heap_init(struct dn_heap *h, int size, int ofs) +{ + if (heap_resize(h, size)) + return 1; + h->elements = 0; + h->ofs = ofs; + return 0; +} + +/* + * Insert element in heap. Normally, p != NULL, we insert p in + * a new position and bubble up. If p == NULL, then the element is + * already in place, and key is the position where to start the + * bubble-up. + * Returns 1 on failure (cannot allocate new heap entry) + * + * If ofs > 0 the position (index, int) of the element in the heap is + * also stored in the element itself at the given offset in bytes. + */ +#define SET_OFFSET(h, i) do { \ + if (h->ofs > 0) \ + *((int32_t *)((char *)(h->p[i].object) + h->ofs)) = i; \ + } while (0) +/* + * RESET_OFFSET is used for sanity checks. It sets ofs + * to an invalid value. + */ +#define RESET_OFFSET(h, i) do { \ + if (h->ofs > 0) \ + *((int32_t *)((char *)(h->p[i].object) + h->ofs)) = -16; \ + } while (0) + +int +heap_insert(struct dn_heap *h, uint64_t key1, void *p) +{ + int son = h->elements; + + //log("%s key %llu p %p\n", __FUNCTION__, key1, p); + if (p == NULL) { /* data already there, set starting point */ + son = key1; + } else { /* insert new element at the end, possibly resize */ + son = h->elements; + if (son == h->size) /* need resize... */ + // XXX expand by 16 or so + if (heap_resize(h, h->elements+16) ) + return 1; /* failure... */ + h->p[son].object = p; + h->p[son].key = key1; + h->elements++; + } + /* make sure that son >= father along the path */ + while (son > 0) { + int father = HEAP_FATHER(son); + struct dn_heap_entry tmp; + + if (DN_KEY_LT( h->p[father].key, h->p[son].key ) ) + break; /* found right position */ + /* son smaller than father, swap and repeat */ + HEAP_SWAP(h->p[son], h->p[father], tmp); + SET_OFFSET(h, son); + son = father; + } + SET_OFFSET(h, son); + return 0; +} + +/* + * remove top element from heap, or obj if obj != NULL + */ +void +heap_extract(struct dn_heap *h, void *obj) +{ + int child, father, max = h->elements - 1; + + if (max < 0) { + printf("--- %s: empty heap 0x%p\n", __FUNCTION__, h); + return; + } + if (obj == NULL) + father = 0; /* default: move up smallest child */ + else { /* extract specific element, index is at offset */ + if (h->ofs <= 0) + panic("%s: extract from middle not set on %p\n", + __FUNCTION__, h); + father = *((int *)((char *)obj + h->ofs)); + if (father < 0 || father >= h->elements) { + panic("%s: father %d out of bound 0..%d\n", + __FUNCTION__, father, h->elements); + } + } + /* + * below, father is the index of the empty element, which + * we replace at each step with the smallest child until we + * reach the bottom level. + */ + // XXX why removing RESET_OFFSET increases runtime by 10% ? + RESET_OFFSET(h, father); + while ( (child = HEAP_LEFT(father)) <= max ) { + if (child != max && + DN_KEY_LT(h->p[child+1].key, h->p[child].key) ) + child++; /* take right child, otherwise left */ + h->p[father] = h->p[child]; + SET_OFFSET(h, father); + father = child; + } + h->elements--; + if (father != max) { + /* + * Fill hole with last entry and bubble up, + * reusing the insert code + */ + h->p[father] = h->p[max]; + heap_insert(h, father, NULL); + } +} + +#if 0 +/* + * change object position and update references + * XXX this one is never used! + */ +static void +heap_move(struct dn_heap *h, uint64_t new_key, void *object) +{ + int temp, i, max = h->elements-1; + struct dn_heap_entry *p, buf; + + if (h->ofs <= 0) + panic("cannot move items on this heap"); + p = h->p; /* shortcut */ + + i = *((int *)((char *)object + h->ofs)); + if (DN_KEY_LT(new_key, p[i].key) ) { /* must move up */ + p[i].key = new_key; + for (; i>0 && + DN_KEY_LT(new_key, p[(temp = HEAP_FATHER(i))].key); + i = temp ) { /* bubble up */ + HEAP_SWAP(p[i], p[temp], buf); + SET_OFFSET(h, i); + } + } else { /* must move down */ + p[i].key = new_key; + while ( (temp = HEAP_LEFT(i)) <= max ) { + /* found left child */ + if (temp != max && + DN_KEY_LT(p[temp+1].key, p[temp].key)) + temp++; /* select child with min key */ + if (DN_KEY_LT(>p[temp].key, new_key)) { + /* go down */ + HEAP_SWAP(p[i], p[temp], buf); + SET_OFFSET(h, i); + } else + break; + i = temp; + } + } + SET_OFFSET(h, i); +} +#endif /* heap_move, unused */ + +/* + * heapify() will reorganize data inside an array to maintain the + * heap property. It is needed when we delete a bunch of entries. + */ +static void +heapify(struct dn_heap *h) +{ + int i; + + for (i = 0; i < h->elements; i++ ) + heap_insert(h, i , NULL); +} + +int +heap_scan(struct dn_heap *h, int (*fn)(void *, uintptr_t), + uintptr_t arg) +{ + int i, ret, found; + + for (i = found = 0 ; i < h->elements ;) { + ret = fn(h->p[i].object, arg); + if (ret & HEAP_SCAN_DEL) { + h->elements-- ; + h->p[i] = h->p[h->elements] ; + found++ ; + } else + i++ ; + if (ret & HEAP_SCAN_END) + break; + } + if (found) + heapify(h); + return found; +} + +/* + * cleanup the heap and free data structure + */ +void +heap_free(struct dn_heap *h) +{ + if (h->size >0 ) + free(h->p, M_DN_HEAP); + bzero(h, sizeof(*h) ); +} + +/* + * hash table support. + */ + +struct dn_ht { + int buckets; /* how many buckets, really buckets - 1*/ + int entries; /* how many entries */ + int ofs; /* offset of link field */ + uint32_t (*hash)(uintptr_t, int, void *arg); + int (*match)(void *_el, uintptr_t key, int, void *); + void *(*newh)(uintptr_t, int, void *); + void **ht; /* bucket heads */ +}; +/* + * Initialize, allocating bucket pointers inline. + * Recycle previous record if possible. + * If the 'newh' function is not supplied, we assume that the + * key passed to ht_find is the same object to be stored in. + */ +struct dn_ht * +dn_ht_init(struct dn_ht *ht, int buckets, int ofs, + uint32_t (*h)(uintptr_t, int, void *), + int (*match)(void *, uintptr_t, int, void *), + void *(*newh)(uintptr_t, int, void *)) +{ + int l; + + /* + * Notes about rounding bucket size to a power of two. + * Given the original bucket size, we compute the nearest lower and + * higher power of two, minus 1 (respectively b_min and b_max) because + * this value will be used to do an AND with the index returned + * by hash function. + * To choice between these two values, the original bucket size is + * compared with b_min. If the original size is greater than 4/3 b_min, + * we round the bucket size to b_max, else to b_min. + * This ratio try to round to the nearest power of two, advantaging + * the greater size if the different between two power is relatively + * big. + * Rounding the bucket size to a power of two avoid the use of + * module when calculating the correct bucket. + * The ht->buckets variable store the bucket size - 1 to simply + * do an AND between the index returned by hash function and ht->bucket + * instead of a module. + */ + int b_min; /* min buckets */ + int b_max; /* max buckets */ + int b_ori; /* original buckets */ + + if (h == NULL || match == NULL) { + printf("--- missing hash or match function"); + return NULL; + } + if (buckets < 1 || buckets > 65536) + return NULL; + + b_ori = buckets; + /* calculate next power of 2, - 1*/ + buckets |= buckets >> 1; + buckets |= buckets >> 2; + buckets |= buckets >> 4; + buckets |= buckets >> 8; + buckets |= buckets >> 16; + + b_max = buckets; /* Next power */ + b_min = buckets >> 1; /* Previous power */ + + /* Calculate the 'nearest' bucket size */ + if (b_min * 4000 / 3000 < b_ori) + buckets = b_max; + else + buckets = b_min; + + if (ht) { /* see if we can reuse */ + if (buckets <= ht->buckets) { + ht->buckets = buckets; + } else { + /* free pointers if not allocated inline */ + if (ht->ht != (void *)(ht + 1)) + free(ht->ht, M_DN_HEAP); + free(ht, M_DN_HEAP); + ht = NULL; + } + } + if (ht == NULL) { + /* Allocate buckets + 1 entries because buckets is use to + * do the AND with the index returned by hash function + */ + l = sizeof(*ht) + (buckets + 1) * sizeof(void **); + ht = malloc(l, M_DN_HEAP, M_NOWAIT | M_ZERO); + } + if (ht) { + ht->ht = (void **)(ht + 1); + ht->buckets = buckets; + ht->ofs = ofs; + ht->hash = h; + ht->match = match; + ht->newh = newh; + } + return ht; +} + +/* dummy callback for dn_ht_free to unlink all */ +static int +do_del(void *obj, void *arg) +{ + return DNHT_SCAN_DEL; +} + +void +dn_ht_free(struct dn_ht *ht, int flags) +{ + if (ht == NULL) + return; + if (flags & DNHT_REMOVE) { + (void)dn_ht_scan(ht, do_del, NULL); + } else { + if (ht->ht && ht->ht != (void *)(ht + 1)) + free(ht->ht, M_DN_HEAP); + free(ht, M_DN_HEAP); + } +} + +int +dn_ht_entries(struct dn_ht *ht) +{ + return ht ? ht->entries : 0; +} + +/* + * Helper function to scan a bucket in the hash table, it + * can only be called on a non-empty bucket for a valid table. + * + * In lookup and scan, consider ht->ht[i] as pointing to the tail + * of the queue (head is NEXTP(tail). The 'empty' value is irrelevant. + * While searching, start analysing p = head, end when p == tail. + * Note that 'tail' is a cache of the _original_ ht->ht[i] + * and is used to check for loop termination. If you remove + * it, you must also adjust 'p' when deleting the 'tail' element. + */ +#define NEXT(_h, _p) *((void **)((char *)(_p) + (_h)->ofs)) +static int +dn_ht_scan_body(struct dn_ht *ht, int *bucket, + int (*fn)(void *, void *), void *arg) +{ + int ret, found = 0, i = *bucket; + void *tail, *pp, *p, *nextp; + + pp = tail = ht->ht[i]; + do { + p = NEXT(ht, pp); + nextp = NEXT(ht, p); + ret = fn(p, arg); + if ((ret & DNHT_SCAN_DEL) == 0) { + pp = p; /* prepare for next loop */ + } else { + found++; + ht->entries--; + /* skip current element */ + if (pp != p) + /* pp == p implies p == tail */ + NEXT(ht, pp) = nextp; + if (p == tail) + ht->ht[i] = (pp != p) ? pp : NULL; + } + if (ret & DNHT_SCAN_END) { + /* Update ht->ht[i] before returning */ + ht->ht[i] = (ht->ht[i] == NULL) ? NULL : pp; + return found; + } + } while (p != tail); + + (*bucket)++; + return found; +} + +/* + * lookup and optionally create or delete element. + * This is an optimized version of the scan so it is coded + * inline. + */ +void * +dn_ht_find(struct dn_ht *ht, uintptr_t key, int flags, void *arg) +{ + int i, found; + void *tail, *pp, *p; /* pp is the prev element, pp is current */ + + if (ht == NULL) /* easy on an empty hash */ + return NULL; + i = (ht->buckets == 1) ? 0 : + (ht->hash(key, flags, arg) & ht->buckets); + + pp = tail = ht->ht[i]; + if (tail) { /* non empty, try a lookup */ + do { + p = NEXT(ht, pp); + found = (flags & DNHT_MATCH_PTR) ? key == (uintptr_t)p : + ht->match(p, key, flags, arg); + if (!found) + continue; + if (flags & DNHT_REMOVE) { + ht->entries--; + if (p != pp) /* skip current element */ + NEXT(ht, pp) = NEXT(ht, p); + if (p == tail) + ht->ht[i] = (pp != p) ? pp : NULL; + } + return p; + } while ( (pp = p) != tail); + } + /* not found */ + if ((flags & DNHT_INSERT) == 0) + return NULL; + p = ht->newh ? ht->newh(key, flags, arg) : (void *)key; + if (p) { + ht->entries++; + if (tail == NULL) { + ht->ht[i] = NEXT(ht, p) = p; + } else { + NEXT(ht, p) = NEXT(ht, tail); + NEXT(ht, tail) = p; + } + } + + return p; +} + +/* + * do a scan with the option to delete the object. + * Similar to the lookup, but the match function is different, + * and we extract 'next' before running the callback because + * the element may be destroyed there. + */ +int +dn_ht_scan(struct dn_ht *ht, int (*fn)(void *, void *), void *arg) +{ + int i, bucket, found = 0; + + if (ht == NULL || fn == NULL) + return 0; + for (i = 0; i <= ht->buckets; i++) { + if (ht->ht[i] == NULL) + continue; /* empty bucket */ + bucket = i; + found += dn_ht_scan_body(ht, &bucket, fn, arg); + if (bucket == i) /* early exit */ + return found; + } + return found; +} + +/* + * Similar to dn_ht_scan(), except that the scan is performed only + * in the bucket 'bucket'. The function returns a correct bucket number if + * the original is invalid. + * If the callback returns DNHT_SCAN_END, the function move the ht->ht[i] + * pointer to the last entry processed. Moreover, the bucket number passed + * by caller is decremented, because usually the caller increment it. + */ +int +dn_ht_scan_bucket(struct dn_ht *ht, int *bucket, int (*fn)(void *, void *), + void *arg) +{ + if (ht == NULL || fn == NULL) + return 0; + if (*bucket > ht->buckets || *bucket < 0) + *bucket = 0; + if (ht->ht[*bucket] == NULL) { + (*bucket)++; + return 0; + } else + return dn_ht_scan_body(ht, bucket, fn, arg); +} diff --git a/sys/netinet/ipfw/dn_heap.h b/sys/netinet/ipfw/dn_heap.h new file mode 100644 index 0000000..09b2ac7 --- /dev/null +++ b/sys/netinet/ipfw/dn_heap.h @@ -0,0 +1,191 @@ +/*- + * Copyright (c) 1998-2010 Luigi Rizzo, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * Binary heap and hash tables, header file + * + * $FreeBSD: head/sys/netinet/ipfw/dn_heap.h 204865 2010-03-08 11:27:08Z luigi $ + */ + +#ifndef _IP_DN_HEAP_H +#define _IP_DN_HEAP_H + +#define DN_KEY_LT(a,b) ((int64_t)((a)-(b)) < 0) +#define DN_KEY_LEQ(a,b) ((int64_t)((a)-(b)) <= 0) + +/* + * This module implements a binary heap supporting random extraction. + * + * A heap entry contains an uint64_t key and a pointer to object. + * DN_KEY_LT(a,b) returns true if key 'a' is smaller than 'b' + * + * The heap is a struct dn_heap plus a dynamically allocated + * array of dn_heap_entry entries. 'size' represents the size of + * the array, 'elements' count entries in use. The topmost + * element has the smallest key. + * The heap supports ordered insert, and extract from the top. + * To extract an object from the middle of the heap, we the object + * must reserve an 'int32_t' to store the position of the object + * in the heap itself, and the location of this field must be + * passed as an argument to heap_init() -- use -1 if the feature + * is not used. + */ +struct dn_heap_entry { + uint64_t key; /* sorting key, smallest comes first */ + void *object; /* object pointer */ +}; + +struct dn_heap { + int size; /* the size of the array */ + int elements; /* elements in use */ + int ofs; /* offset in the object of heap index */ + struct dn_heap_entry *p; /* array of "size" entries */ +}; + +enum { + HEAP_SCAN_DEL = 1, + HEAP_SCAN_END = 2, +}; + +/* + * heap_init() reinitializes the heap setting the size and the offset + * of the index for random extraction (use -1 if not used). + * The 'elements' counter is set to 0. + * + * SET_HEAP_OFS() indicates where, in the object, is stored the index + * for random extractions from the heap. + * + * heap_free() frees the memory associated to a heap. + * + * heap_insert() adds a key-pointer pair to the heap + * + * HEAP_TOP() returns a pointer to the top element of the heap, + * but makes no checks on its existance (XXX should we change ?) + * + * heap_extract() removes the entry at the top, returing the pointer. + * (the key should have been read before). + * + * heap_scan() invokes a callback on each entry of the heap. + * The callback can return a combination of HEAP_SCAN_DEL and + * HEAP_SCAN_END. HEAP_SCAN_DEL means the current element must + * be removed, and HEAP_SCAN_END means to terminate the scan. + * heap_scan() returns the number of elements removed. + * Because the order is not guaranteed, we should use heap_scan() + * only as a last resort mechanism. + */ +#define HEAP_TOP(h) ((h)->p) +#define SET_HEAP_OFS(h, n) do { (h)->ofs = n; } while (0) +int heap_init(struct dn_heap *h, int size, int ofs); +int heap_insert(struct dn_heap *h, uint64_t key1, void *p); +void heap_extract(struct dn_heap *h, void *obj); +void heap_free(struct dn_heap *h); +int heap_scan(struct dn_heap *, int (*)(void *, uintptr_t), uintptr_t); + +/*------------------------------------------------------ + * This module implements a generic hash table with support for + * running callbacks on the entire table. To avoid allocating + * memory during hash table operations, objects must reserve + * space for a link field. XXX if the heap is moderately full, + * an SLIST suffices, and we can tolerate the cost of a hash + * computation on each removal. + * + * dn_ht_init() initializes the table, setting the number of + * buckets, the offset of the link field, the main callbacks. + * Callbacks are: + * + * hash(key, flags, arg) called to return a bucket index. + * match(obj, key, flags, arg) called to determine if key + * matches the current 'obj' in the heap + * newh(key, flags, arg) optional, used to allocate a new + * object during insertions. + * + * dn_ht_free() frees the heap or unlink elements. + * DNHT_REMOVE unlink elements, 0 frees the heap. + * You need two calls to do both. + * + * dn_ht_find() is the main lookup function, which can also be + * used to insert or delete elements in the hash table. + * The final 'arg' is passed to all callbacks. + * + * dn_ht_scan() is used to invoke a callback on all entries of + * the heap, or possibly on just one bucket. The callback + * is invoked with a pointer to the object, and must return + * one of DNHT_SCAN_DEL or DNHT_SCAN_END to request the + * removal of the object from the heap and the end of the + * scan, respectively. + * + * dn_ht_scan_bucket() is similar to dn_ht_scan(), except that it scans + * only the specific bucket of the table. The bucket is a in-out + * parameter and return a valid bucket number if the original + * is invalid. + * + * A combination of flags can be used to modify the operation + * of the dn_ht_find(), and of the callbacks: + * + * DNHT_KEY_IS_OBJ means the key is the object pointer. + * It is usally of interest for the hash and match functions. + * + * DNHT_MATCH_PTR during a lookup, match pointers instead + * of calling match(). Normally used when removing specific + * entries. Does not imply KEY_IS_OBJ as the latter _is_ used + * by the match function. + * + * DNHT_INSERT insert the element if not found. + * Calls new() to allocates a new object unless + * DNHT_KEY_IS_OBJ is set. + * + * DNHT_UNIQUE only insert if object not found. + * XXX should it imply DNHT_INSERT ? + * + * DNHT_REMOVE remove objects if we find them. + */ +struct dn_ht; /* should be opaque */ + +struct dn_ht *dn_ht_init(struct dn_ht *, int buckets, int ofs, + uint32_t (*hash)(uintptr_t, int, void *), + int (*match)(void *, uintptr_t, int, void *), + void *(*newh)(uintptr_t, int, void *)); +void dn_ht_free(struct dn_ht *, int flags); + +void *dn_ht_find(struct dn_ht *, uintptr_t, int, void *); +int dn_ht_scan(struct dn_ht *, int (*)(void *, void *), void *); +int dn_ht_scan_bucket(struct dn_ht *, int * , int (*)(void *, void *), void *); +int dn_ht_entries(struct dn_ht *); + +enum { /* flags values. + * first two are returned by the scan callback to indicate + * to delete the matching element or to end the scan + */ + DNHT_SCAN_DEL = 0x0001, + DNHT_SCAN_END = 0x0002, + DNHT_KEY_IS_OBJ = 0x0004, /* key is the obj pointer */ + DNHT_MATCH_PTR = 0x0008, /* match by pointer, not match() */ + DNHT_INSERT = 0x0010, /* insert if not found */ + DNHT_UNIQUE = 0x0020, /* report error if already there */ + DNHT_REMOVE = 0x0040, /* remove on find or dn_ht_free */ +}; + +#endif /* _IP_DN_HEAP_H */ diff --git a/sys/netinet/ipfw/dn_sched.h b/sys/netinet/ipfw/dn_sched.h new file mode 100644 index 0000000..a755e86 --- /dev/null +++ b/sys/netinet/ipfw/dn_sched.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2010 Riccardo Panicucci, Luigi Rizzo, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * The API to write a packet scheduling algorithm for dummynet. + * + * $FreeBSD: head/sys/netinet/ipfw/dn_sched.h 204591 2010-03-02 17:40:48Z luigi $ + */ + +#ifndef _DN_SCHED_H +#define _DN_SCHED_H + +#define DN_MULTIQUEUE 0x01 +/* + * Descriptor for a scheduling algorithm. + * Contains all function pointers for a given scheduler + * This is typically created when a module is loaded, and stored + * in a global list of schedulers. + */ +struct dn_alg { + uint32_t type; /* the scheduler type */ + const char *name; /* scheduler name */ + uint32_t flags; /* DN_MULTIQUEUE if supports multiple queues */ + + /* + * The following define the size of 3 optional data structures + * that may need to be allocated at runtime, and are appended + * to each of the base data structures: scheduler, sched.inst, + * and queue. We don't have a per-flowset structure. + */ + /* + parameters attached to the template, e.g. + * default queue sizes, weights, quantum size, and so on; + */ + size_t schk_datalen; + + /* + per-instance parameters, such as timestamps, + * containers for queues, etc; + */ + size_t si_datalen; + + size_t q_datalen; /* per-queue parameters (e.g. S,F) */ + + /* + * Methods implemented by the scheduler: + * enqueue enqueue packet 'm' on scheduler 's', queue 'q'. + * q is NULL for !MULTIQUEUE. + * Return 0 on success, 1 on drop (packet consumed anyways). + * Note that q should be interpreted only as a hint + * on the flow that the mbuf belongs to: while a + * scheduler will normally enqueue m into q, it is ok + * to leave q alone and put the mbuf elsewhere. + * This function is called in two cases: + * - when a new packet arrives to the scheduler; + * - when a scheduler is reconfigured. In this case the + * call is issued by the new_queue callback, with a + * non empty queue (q) and m pointing to the first + * mbuf in the queue. For this reason, the function + * should internally check for (m != q->mq.head) + * before calling dn_enqueue(). + * + * dequeue Called when scheduler instance 's' can + * dequeue a packet. Return NULL if none are available. + * XXX what about non work-conserving ? + * + * config called on 'sched X config ...', normally writes + * in the area of size sch_arg + * + * destroy called on 'sched delete', frees everything + * in sch_arg (other parts are handled by more specific + * functions) + * + * new_sched called when a new instance is created, e.g. + * to create the local queue for !MULTIQUEUE, set V or + * copy parameters for WFQ, and so on. + * + * free_sched called when deleting an instance, cleans + * extra data in the per-instance area. + * + * new_fsk called when a flowset is linked to a scheduler, + * e.g. to validate parameters such as weights etc. + * free_fsk when a flowset is unlinked from a scheduler. + * (probably unnecessary) + * + * new_queue called to set the per-queue parameters, + * e.g. S and F, adjust sum of weights in the parent, etc. + * + * The new_queue callback is normally called from when + * creating a new queue. In some cases (such as a + * scheduler change or reconfiguration) it can be called + * with a non empty queue. In this case, the queue + * In case of non empty queue, the new_queue callback could + * need to call the enqueue function. In this case, + * the callback should eventually call enqueue() passing + * as m the first element in the queue. + * + * free_queue actions related to a queue removal, e.g. undo + * all the above. If the queue has data in it, also remove + * from the scheduler. This can e.g. happen during a reconfigure. + * If safe == 1 remove the queue only if the scheduler no longer + * need it, otherwise delete it even if the scheduler is using + * it. Usually, the flag safe is set when the drain routine is + * running to delete idle queues. + */ + int (*enqueue)(struct dn_sch_inst *, struct dn_queue *, + struct mbuf *); + struct mbuf * (*dequeue)(struct dn_sch_inst *); + + int (*config)(struct dn_schk *); + int (*destroy)(struct dn_schk*); + int (*new_sched)(struct dn_sch_inst *); + int (*free_sched)(struct dn_sch_inst *); + int (*new_fsk)(struct dn_fsk *f); + int (*free_fsk)(struct dn_fsk *f); + int (*new_queue)(struct dn_queue *q); + int (*free_queue)(struct dn_queue *q, int safe); + + /* run-time fields */ + int ref_count; /* XXX number of instances in the system */ + SLIST_ENTRY(dn_alg) next; /* Next scheduler in the list */ +}; + +/* MSVC does not support initializers so we need this ugly macro */ +#ifdef _WIN32 +#define _SI(fld) +#else +#define _SI(fld) fld +#endif + +/* + * Additionally, dummynet exports some functions and macros + * to be used by schedulers: + */ + +void dn_free_pkts(struct mbuf *mnext); +int dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop); +/* bound a variable between min and max */ +int ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg); + +/* + * Extract the head of a queue, update stats. Must be the very last + * thing done on a dequeue as the queue itself may go away. + */ +static __inline struct mbuf* +dn_dequeue(struct dn_queue *q) +{ + struct mbuf *m = q->mq.head; + if (m == NULL) + return NULL; + q->mq.head = m->m_nextpkt; + + /* Update stats for the queue */ + q->ni.length--; + q->ni.len_bytes -= m->m_pkthdr.len; + /* When the queue becomes idle, update idle_time (used by RED) + * and also update the count of idle queues (for garbage collection). + */ + if (q->ni.length == 0) { + dn_cfg.idle_queue++; + q->q_time = dn_cfg.curr_time; + } + if (q->_si) { + struct dn_flow *ni = &(q->_si->ni); + /* update stats for the scheduler instance, and keep track + * of idle scheduler instances if needed + */ + ni->length--; + ni->len_bytes -= m->m_pkthdr.len; + if (ni->length == 0) + dn_cfg.idle_si++; + } + return m; +} + +int dn_sched_modevent(module_t mod, int cmd, void *arg); + +#define DECLARE_DNSCHED_MODULE(name, dnsched) \ + static moduledata_t name##_mod = { \ + #name, dn_sched_modevent, dnsched \ + }; \ + DECLARE_MODULE(name, name##_mod, \ + SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); \ + MODULE_DEPEND(name, dummynet, 3, 3, 3); +#endif /* _DN_SCHED_H */ diff --git a/sys/netinet/ipfw/dn_sched_fifo.c b/sys/netinet/ipfw/dn_sched_fifo.c new file mode 100644 index 0000000..d8733c9 --- /dev/null +++ b/sys/netinet/ipfw/dn_sched_fifo.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: dn_sched_fifo.c 11480 2012-07-31 08:02:00Z luigi $ + */ + +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ */ +#include +#include /* ipfw_rule_ref */ +#include /* flow_id */ +#include +#include +#include +#include +#else +#include +#endif + +/* + * This file implements a FIFO scheduler for a single queue. + * The queue is allocated as part of the scheduler instance, + * and there is a single flowset is in the template which stores + * queue size and policy. + * Enqueue and dequeue use the default library functions. + */ +static int +fifo_enqueue(struct dn_sch_inst *si, struct dn_queue *q, struct mbuf *m) +{ + /* XXX if called with q != NULL and m=NULL, this is a + * re-enqueue from an existing scheduler, which we should + * handle. + */ + return dn_enqueue((struct dn_queue *)(si+1), m, 0); +} + +static struct mbuf * +fifo_dequeue(struct dn_sch_inst *si) +{ + return dn_dequeue((struct dn_queue *)(si + 1)); +} + +static int +fifo_new_sched(struct dn_sch_inst *si) +{ + /* This scheduler instance contains the queue */ + struct dn_queue *q = (struct dn_queue *)(si + 1); + + set_oid(&q->ni.oid, DN_QUEUE, sizeof(*q)); + q->_si = si; + q->fs = si->sched->fs; + return 0; +} + +static int +fifo_free_sched(struct dn_sch_inst *si) +{ + struct dn_queue *q = (struct dn_queue *)(si + 1); + dn_free_pkts(q->mq.head); + bzero(q, sizeof(*q)); + return 0; +} + +/* + * FIFO scheduler descriptor + * contains the type of the scheduler, the name, the size of extra + * data structures, and function pointers. + */ +static struct dn_alg fifo_desc = { + _SI( .type = ) DN_SCHED_FIFO, + _SI( .name = ) "FIFO", + _SI( .flags = ) 0, + + _SI( .schk_datalen = ) 0, + _SI( .si_datalen = ) sizeof(struct dn_queue), + _SI( .q_datalen = ) 0, + + _SI( .enqueue = ) fifo_enqueue, + _SI( .dequeue = ) fifo_dequeue, + _SI( .config = ) NULL, + _SI( .destroy = ) NULL, + _SI( .new_sched = ) fifo_new_sched, + _SI( .free_sched = ) fifo_free_sched, + _SI( .new_fsk = ) NULL, + _SI( .free_fsk = ) NULL, + _SI( .new_queue = ) NULL, + _SI( .free_queue = ) NULL, +}; + +DECLARE_DNSCHED_MODULE(dn_fifo, &fifo_desc); diff --git a/sys/netinet/ipfw/dn_sched_prio.c b/sys/netinet/ipfw/dn_sched_prio.c new file mode 100644 index 0000000..7bc67ea --- /dev/null +++ b/sys/netinet/ipfw/dn_sched_prio.c @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: dn_sched_prio.c 11480 2012-07-31 08:02:00Z luigi $ + */ +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ */ +#include +#include /* ipfw_rule_ref */ +#include /* flow_id */ +#include +#include +#include +#include +#else +#include +#endif + +#define DN_SCHED_PRIO 5 //XXX + +#if !defined(_KERNEL) || !defined(__linux__) +#define test_bit(ix, pData) ((*pData) & (1<<(ix))) +#define __set_bit(ix, pData) (*pData) |= (1<<(ix)) +#define __clear_bit(ix, pData) (*pData) &= ~(1<<(ix)) +#endif + +#ifdef __MIPSEL__ +#define __clear_bit(ix, pData) (*pData) &= ~(1<<(ix)) +#endif + +/* Size of the array of queues pointers. */ +#define BITMAP_T unsigned long +#define MAXPRIO (sizeof(BITMAP_T) * 8) + +/* + * The scheduler instance contains an array of pointers to queues, + * one for each priority, and a bitmap listing backlogged queues. + */ +struct prio_si { + BITMAP_T bitmap; /* array bitmap */ + struct dn_queue *q_array[MAXPRIO]; /* Array of queues pointers */ +}; + +/* + * If a queue with the same priority is already backlogged, use + * that one instead of the queue passed as argument. + */ +static int +prio_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) +{ + struct prio_si *si = (struct prio_si *)(_si + 1); + int prio = q->fs->fs.par[0]; + + if (test_bit(prio, &si->bitmap) == 0) { + /* No queue with this priority, insert */ + __set_bit(prio, &si->bitmap); + si->q_array[prio] = q; + } else { /* use the existing queue */ + q = si->q_array[prio]; + } + if (dn_enqueue(q, m, 0)) + return 1; + return 0; +} + +/* + * Packets are dequeued only from the highest priority queue. + * The function ffs() return the lowest bit in the bitmap that rapresent + * the array index (-1) which contains the pointer to the highest priority + * queue. + * After the dequeue, if this queue become empty, it is index is removed + * from the bitmap. + * Scheduler is idle if the bitmap is empty + * + * NOTE: highest priority is 0, lowest is sched->max_prio_q + */ +static struct mbuf * +prio_dequeue(struct dn_sch_inst *_si) +{ + struct prio_si *si = (struct prio_si *)(_si + 1); + struct mbuf *m; + struct dn_queue *q; + int prio; + + if (si->bitmap == 0) /* scheduler idle */ + return NULL; + + prio = ffs(si->bitmap) - 1; + + /* Take the highest priority queue in the scheduler */ + q = si->q_array[prio]; + // assert(q) + + m = dn_dequeue(q); + if (q->mq.head == NULL) { + /* Queue is now empty, remove from scheduler + * and mark it + */ + si->q_array[prio] = NULL; + __clear_bit(prio, &si->bitmap); + } + return m; +} + +static int +prio_new_sched(struct dn_sch_inst *_si) +{ + struct prio_si *si = (struct prio_si *)(_si + 1); + + bzero(si->q_array, sizeof(si->q_array)); + si->bitmap = 0; + + return 0; +} + +static int +prio_new_fsk(struct dn_fsk *fs) +{ + /* Check if the prioritiy is between 0 and MAXPRIO-1 */ + ipdn_bound_var(&fs->fs.par[0], 0, 0, MAXPRIO - 1, "PRIO priority"); + return 0; +} + +static int +prio_new_queue(struct dn_queue *q) +{ + struct prio_si *si = (struct prio_si *)(q->_si + 1); + int prio = q->fs->fs.par[0]; + struct dn_queue *oldq; + + q->ni.oid.subtype = DN_SCHED_PRIO; + + if (q->mq.head == NULL) + return 0; + + /* Queue already full, must insert in the scheduler or append + * mbufs to existing queue. This partly duplicates prio_enqueue + */ + if (test_bit(prio, &si->bitmap) == 0) { + /* No queue with this priority, insert */ + __set_bit(prio, &si->bitmap); + si->q_array[prio] = q; + } else if ( (oldq = si->q_array[prio]) != q) { + /* must append to the existing queue. + * can simply append q->mq.head to q2->... + * and add the counters to those of q2 + */ + oldq->mq.tail->m_nextpkt = q->mq.head; + oldq->mq.tail = q->mq.tail; + oldq->ni.length += q->ni.length; + q->ni.length = 0; + oldq->ni.len_bytes += q->ni.len_bytes; + q->ni.len_bytes = 0; + q->mq.tail = q->mq.head = NULL; + } + return 0; +} + +static int +prio_free_queue(struct dn_queue *q, int safe) +{ + int prio = q->fs->fs.par[0]; + struct prio_si *si = (struct prio_si *)(q->_si + 1); + + if (si->q_array[prio] == q) { + si->q_array[prio] = NULL; + __clear_bit(prio, &si->bitmap); + } + return 0; +} + + +static struct dn_alg prio_desc = { + _SI( .type = ) DN_SCHED_PRIO, + _SI( .name = ) "PRIO", + _SI( .flags = ) DN_MULTIQUEUE, + + /* we need extra space in the si and the queue */ + _SI( .schk_datalen = ) 0, + _SI( .si_datalen = ) sizeof(struct prio_si), + _SI( .q_datalen = ) 0, + + _SI( .enqueue = ) prio_enqueue, + _SI( .dequeue = ) prio_dequeue, + + _SI( .config = ) NULL, + _SI( .destroy = ) NULL, + _SI( .new_sched = ) prio_new_sched, + _SI( .free_sched = ) NULL, + + _SI( .new_fsk = ) prio_new_fsk, + _SI( .free_fsk = ) NULL, + + _SI( .new_queue = ) prio_new_queue, + _SI( .free_queue = ) prio_free_queue, +}; + + +DECLARE_DNSCHED_MODULE(dn_prio, &prio_desc); diff --git a/sys/netinet/ipfw/dn_sched_qfq.c b/sys/netinet/ipfw/dn_sched_qfq.c new file mode 100644 index 0000000..eaf0478 --- /dev/null +++ b/sys/netinet/ipfw/dn_sched_qfq.c @@ -0,0 +1,864 @@ +/* + * Copyright (c) 2010 Fabio Checconi, Luigi Rizzo, Paolo Valente + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: dn_sched_qfq.c 11656 2012-08-07 08:39:06Z luigi $ + */ + +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ */ +#include +#include /* ipfw_rule_ref */ +#include /* flow_id */ +#include +#include +#include +#include +#else +#include +#endif + +#ifdef QFQ_DEBUG +struct qfq_sched; +static void dump_sched(struct qfq_sched *q, const char *msg); +#define NO(x) x +#else +#define NO(x) +#endif +#define DN_SCHED_QFQ 4 // XXX Where? +typedef unsigned long bitmap; + +/* + * bitmaps ops are critical. Some linux versions have __fls + * and the bitmap ops. Some machines have ffs + */ +#if defined(_WIN32) || (defined(__MIPSEL__) && defined(LINUX_24)) +int fls(unsigned int n) +{ + int i = 0; + for (i = 0; n > 0; n >>= 1, i++) + ; + return i; +} +#endif + +#if !defined(_KERNEL) || defined( __FreeBSD__ ) || defined(_WIN32) || (defined(__MIPSEL__) && defined(LINUX_24)) +static inline unsigned long __fls(unsigned long word) +{ + return fls(word) - 1; +} +#endif + +#if !defined(_KERNEL) || !defined(__linux__) +#ifdef QFQ_DEBUG +int test_bit(int ix, bitmap *p) +{ + if (ix < 0 || ix > 31) + D("bad index %d", ix); + return *p & (1< 31) + D("bad index %d", ix); + *p |= (1< 31) + D("bad index %d", ix); + *p &= ~(1<index = 0 + *.__grp->slot_shift + + where MIN_SLOT_SHIFT is derived by difference from the others. + +The max group index corresponds to Lmax/w_min, where +Lmax=1<group mapping. Class weights are + * in the range [1, QFQ_MAX_WEIGHT], we to map each class i to the + * group with the smallest index that can support the L_i / r_i + * configured for the class. + * + * grp->index is the index of the group; and grp->slot_shift + * is the shift for the corresponding (scaled) sigma_i. + * + * When computing the group index, we do (len<i_wsum) +#define IWSUM ((1< 0; +} + +/* Round a precise timestamp to its slotted value. */ +static inline uint64_t qfq_round_down(uint64_t ts, unsigned int shift) +{ + return ts & ~((1ULL << shift) - 1); +} + +/* return the pointer to the group with lowest index in the bitmap */ +static inline struct qfq_group *qfq_ffs(struct qfq_sched *q, + unsigned long bitmap) +{ + int index = ffs(bitmap) - 1; // zero-based + return &q->groups[index]; +} + +/* + * Calculate a flow index, given its weight and maximum packet length. + * index = log_2(maxlen/weight) but we need to apply the scaling. + * This is used only once at flow creation. + */ +static int qfq_calc_index(uint32_t inv_w, unsigned int maxlen) +{ + uint64_t slot_size = (uint64_t)maxlen *inv_w; + unsigned long size_map; + int index = 0; + + size_map = (unsigned long)(slot_size >> QFQ_MIN_SLOT_SHIFT); + if (!size_map) + goto out; + + index = __fls(size_map) + 1; // basically a log_2() + index -= !(slot_size - (1ULL << (index + QFQ_MIN_SLOT_SHIFT - 1))); + + if (index < 0) + index = 0; + +out: + ND("W = %d, L = %d, I = %d\n", ONE_FP/inv_w, maxlen, index); + return index; +} +/*---- end support functions ----*/ + +/*-------- API calls --------------------------------*/ +/* + * Validate and copy parameters from flowset. + */ +static int +qfq_new_queue(struct dn_queue *_q) +{ + struct qfq_sched *q = (struct qfq_sched *)(_q->_si + 1); + struct qfq_class *cl = (struct qfq_class *)_q; + int i; + uint32_t w; /* approximated weight */ + + /* import parameters from the flowset. They should be correct + * already. + */ + w = _q->fs->fs.par[0]; + cl->lmax = _q->fs->fs.par[1]; + if (!w || w > QFQ_MAX_WEIGHT) { + w = 1; + D("rounding weight to 1"); + } + cl->inv_w = ONE_FP/w; + w = ONE_FP/cl->inv_w; + if (q->wsum + w > QFQ_MAX_WSUM) + return EINVAL; + + i = qfq_calc_index(cl->inv_w, cl->lmax); + cl->grp = &q->groups[i]; + q->wsum += w; + // XXX cl->S = q->V; ? + // XXX compute q->i_wsum + return 0; +} + +/* remove an empty queue */ +static int +qfq_free_queue(struct dn_queue *_q, int safe) +{ + struct qfq_sched *q = (struct qfq_sched *)(_q->_si + 1); + struct qfq_class *cl = (struct qfq_class *)_q; + if (cl->inv_w) { + q->wsum -= ONE_FP/cl->inv_w; + cl->inv_w = 0; /* reset weight to avoid run twice */ + } + return 0; +} + +/* Calculate a mask to mimic what would be ffs_from(). */ +static inline unsigned long +mask_from(unsigned long bitmap, int from) +{ + return bitmap & ~((1UL << from) - 1); +} + +/* + * The state computation relies on ER=0, IR=1, EB=2, IB=3 + * First compute eligibility comparing grp->S, q->V, + * then check if someone is blocking us and possibly add EB + */ +static inline unsigned int +qfq_calc_state(struct qfq_sched *q, struct qfq_group *grp) +{ + /* if S > V we are not eligible */ + unsigned int state = qfq_gt(grp->S, q->V); + unsigned long mask = mask_from(q->bitmaps[ER], grp->index); + struct qfq_group *next; + + if (mask) { + next = qfq_ffs(q, mask); + if (qfq_gt(grp->F, next->F)) + state |= EB; + } + + return state; +} + +/* + * In principle + * q->bitmaps[dst] |= q->bitmaps[src] & mask; + * q->bitmaps[src] &= ~mask; + * but we should make sure that src != dst + */ +static inline void +qfq_move_groups(struct qfq_sched *q, unsigned long mask, int src, int dst) +{ + q->bitmaps[dst] |= q->bitmaps[src] & mask; + q->bitmaps[src] &= ~mask; +} + +static inline void +qfq_unblock_groups(struct qfq_sched *q, int index, uint64_t old_finish) +{ + unsigned long mask = mask_from(q->bitmaps[ER], index + 1); + struct qfq_group *next; + + if (mask) { + next = qfq_ffs(q, mask); + if (!qfq_gt(next->F, old_finish)) + return; + } + + mask = (1UL << index) - 1; + qfq_move_groups(q, mask, EB, ER); + qfq_move_groups(q, mask, IB, IR); +} + +/* + * perhaps + * + old_V ^= q->V; + old_V >>= QFQ_MIN_SLOT_SHIFT; + if (old_V) { + ... + } + * + */ +static inline void +qfq_make_eligible(struct qfq_sched *q, uint64_t old_V) +{ + unsigned long mask, vslot, old_vslot; + + vslot = q->V >> QFQ_MIN_SLOT_SHIFT; + old_vslot = old_V >> QFQ_MIN_SLOT_SHIFT; + + if (vslot != old_vslot) { + mask = (2UL << (__fls(vslot ^ old_vslot))) - 1; + qfq_move_groups(q, mask, IR, ER); + qfq_move_groups(q, mask, IB, EB); + } +} + +/* + * XXX we should make sure that slot becomes less than 32. + * This is guaranteed by the input values. + * roundedS is always cl->S rounded on grp->slot_shift bits. + */ +static inline void +qfq_slot_insert(struct qfq_group *grp, struct qfq_class *cl, uint64_t roundedS) +{ + uint64_t slot = (roundedS - grp->S) >> grp->slot_shift; + unsigned int i = (grp->front + slot) % QFQ_MAX_SLOTS; + + cl->next = grp->slots[i]; + grp->slots[i] = cl; + __set_bit(slot, &grp->full_slots); +} + +/* + * remove the entry from the slot + */ +static inline void +qfq_front_slot_remove(struct qfq_group *grp) +{ + struct qfq_class **h = &grp->slots[grp->front]; + + *h = (*h)->next; + if (!*h) + __clear_bit(0, &grp->full_slots); +} + +/* + * Returns the first full queue in a group. As a side effect, + * adjust the bucket list so the first non-empty bucket is at + * position 0 in full_slots. + */ +static inline struct qfq_class * +qfq_slot_scan(struct qfq_group *grp) +{ + int i; + + ND("grp %d full %x", grp->index, grp->full_slots); + if (!grp->full_slots) + return NULL; + + i = ffs(grp->full_slots) - 1; // zero-based + if (i > 0) { + grp->front = (grp->front + i) % QFQ_MAX_SLOTS; + grp->full_slots >>= i; + } + + return grp->slots[grp->front]; +} + +/* + * adjust the bucket list. When the start time of a group decreases, + * we move the index down (modulo QFQ_MAX_SLOTS) so we don't need to + * move the objects. The mask of occupied slots must be shifted + * because we use ffs() to find the first non-empty slot. + * This covers decreases in the group's start time, but what about + * increases of the start time ? + * Here too we should make sure that i is less than 32 + */ +static inline void +qfq_slot_rotate(struct qfq_sched *q, struct qfq_group *grp, uint64_t roundedS) +{ + unsigned int i = (grp->S - roundedS) >> grp->slot_shift; + + grp->full_slots <<= i; + grp->front = (grp->front - i) % QFQ_MAX_SLOTS; +} + + +static inline void +qfq_update_eligible(struct qfq_sched *q, uint64_t old_V) +{ + bitmap ineligible; + + ineligible = q->bitmaps[IR] | q->bitmaps[IB]; + if (ineligible) { + if (!q->bitmaps[ER]) { + struct qfq_group *grp; + grp = qfq_ffs(q, ineligible); + if (qfq_gt(grp->S, q->V)) + q->V = grp->S; + } + qfq_make_eligible(q, old_V); + } +} + +/* + * Updates the class, returns true if also the group needs to be updated. + */ +static inline int +qfq_update_class(struct qfq_sched *q, struct qfq_group *grp, + struct qfq_class *cl) +{ + + cl->S = cl->F; + if (cl->_q.mq.head == NULL) { + qfq_front_slot_remove(grp); + } else { + unsigned int len; + uint64_t roundedS; + + len = cl->_q.mq.head->m_pkthdr.len; + cl->F = cl->S + (uint64_t)len * cl->inv_w; + roundedS = qfq_round_down(cl->S, grp->slot_shift); + if (roundedS == grp->S) + return 0; + + qfq_front_slot_remove(grp); + qfq_slot_insert(grp, cl, roundedS); + } + return 1; +} + +static struct mbuf * +qfq_dequeue(struct dn_sch_inst *si) +{ + struct qfq_sched *q = (struct qfq_sched *)(si + 1); + struct qfq_group *grp; + struct qfq_class *cl; + struct mbuf *m; + uint64_t old_V; + + NO(q->loops++;) + if (!q->bitmaps[ER]) { + NO(if (q->queued) + dump_sched(q, "start dequeue");) + return NULL; + } + + grp = qfq_ffs(q, q->bitmaps[ER]); + + cl = grp->slots[grp->front]; + /* extract from the first bucket in the bucket list */ + m = dn_dequeue(&cl->_q); + + if (!m) { + D("BUG/* non-workconserving leaf */"); + return NULL; + } + NO(q->queued--;) + old_V = q->V; + q->V += (uint64_t)m->m_pkthdr.len * IWSUM; + ND("m is %p F 0x%llx V now 0x%llx", m, cl->F, q->V); + + if (qfq_update_class(q, grp, cl)) { + uint64_t old_F = grp->F; + cl = qfq_slot_scan(grp); + if (!cl) { /* group gone, remove from ER */ + __clear_bit(grp->index, &q->bitmaps[ER]); + // grp->S = grp->F + 1; // XXX debugging only + } else { + uint64_t roundedS = qfq_round_down(cl->S, grp->slot_shift); + unsigned int s; + + if (grp->S == roundedS) + goto skip_unblock; + grp->S = roundedS; + grp->F = roundedS + (2ULL << grp->slot_shift); + /* remove from ER and put in the new set */ + __clear_bit(grp->index, &q->bitmaps[ER]); + s = qfq_calc_state(q, grp); + __set_bit(grp->index, &q->bitmaps[s]); + } + /* we need to unblock even if the group has gone away */ + qfq_unblock_groups(q, grp->index, old_F); + } + +skip_unblock: + qfq_update_eligible(q, old_V); + NO(if (!q->bitmaps[ER] && q->queued) + dump_sched(q, "end dequeue");) + + return m; +} + +/* + * Assign a reasonable start time for a new flow k in group i. + * Admissible values for \hat(F) are multiples of \sigma_i + * no greater than V+\sigma_i . Larger values mean that + * we had a wraparound so we consider the timestamp to be stale. + * + * If F is not stale and F >= V then we set S = F. + * Otherwise we should assign S = V, but this may violate + * the ordering in ER. So, if we have groups in ER, set S to + * the F_j of the first group j which would be blocking us. + * We are guaranteed not to move S backward because + * otherwise our group i would still be blocked. + */ +static inline void +qfq_update_start(struct qfq_sched *q, struct qfq_class *cl) +{ + unsigned long mask; + uint64_t limit, roundedF; + int slot_shift = cl->grp->slot_shift; + + roundedF = qfq_round_down(cl->F, slot_shift); + limit = qfq_round_down(q->V, slot_shift) + (1UL << slot_shift); + + if (!qfq_gt(cl->F, q->V) || qfq_gt(roundedF, limit)) { + /* timestamp was stale */ + mask = mask_from(q->bitmaps[ER], cl->grp->index); + if (mask) { + struct qfq_group *next = qfq_ffs(q, mask); + if (qfq_gt(roundedF, next->F)) { + cl->S = next->F; + return; + } + } + cl->S = q->V; + } else { /* timestamp is not stale */ + cl->S = cl->F; + } +} + +static int +qfq_enqueue(struct dn_sch_inst *si, struct dn_queue *_q, struct mbuf *m) +{ + struct qfq_sched *q = (struct qfq_sched *)(si + 1); + struct qfq_group *grp; + struct qfq_class *cl = (struct qfq_class *)_q; + uint64_t roundedS; + int s; + + NO(q->loops++;) + DX(4, "len %d flow %p inv_w 0x%x grp %d", m->m_pkthdr.len, + _q, cl->inv_w, cl->grp->index); + /* XXX verify that the packet obeys the parameters */ + if (m != _q->mq.head) { + if (dn_enqueue(_q, m, 0)) /* packet was dropped */ + return 1; + NO(q->queued++;) + if (m != _q->mq.head) + return 0; + } + /* If reach this point, queue q was idle */ + grp = cl->grp; + qfq_update_start(q, cl); /* adjust start time */ + /* compute new finish time and rounded start. */ + cl->F = cl->S + (uint64_t)(m->m_pkthdr.len) * cl->inv_w; + roundedS = qfq_round_down(cl->S, grp->slot_shift); + + /* + * insert cl in the correct bucket. + * If cl->S >= grp->S we don't need to adjust the + * bucket list and simply go to the insertion phase. + * Otherwise grp->S is decreasing, we must make room + * in the bucket list, and also recompute the group state. + * Finally, if there were no flows in this group and nobody + * was in ER make sure to adjust V. + */ + if (grp->full_slots) { + if (!qfq_gt(grp->S, cl->S)) + goto skip_update; + /* create a slot for this cl->S */ + qfq_slot_rotate(q, grp, roundedS); + /* group was surely ineligible, remove */ + __clear_bit(grp->index, &q->bitmaps[IR]); + __clear_bit(grp->index, &q->bitmaps[IB]); + } else if (!q->bitmaps[ER] && qfq_gt(roundedS, q->V)) + q->V = roundedS; + + grp->S = roundedS; + grp->F = roundedS + (2ULL << grp->slot_shift); // i.e. 2\sigma_i + s = qfq_calc_state(q, grp); + __set_bit(grp->index, &q->bitmaps[s]); + ND("new state %d 0x%x", s, q->bitmaps[s]); + ND("S %llx F %llx V %llx", cl->S, cl->F, q->V); +skip_update: + qfq_slot_insert(grp, cl, roundedS); + + return 0; +} + + +#if 0 +static inline void +qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp, + struct qfq_class *cl, struct qfq_class **pprev) +{ + unsigned int i, offset; + uint64_t roundedS; + + roundedS = qfq_round_down(cl->S, grp->slot_shift); + offset = (roundedS - grp->S) >> grp->slot_shift; + i = (grp->front + offset) % QFQ_MAX_SLOTS; + +#ifdef notyet + if (!pprev) { + pprev = &grp->slots[i]; + while (*pprev && *pprev != cl) + pprev = &(*pprev)->next; + } +#endif + + *pprev = cl->next; + if (!grp->slots[i]) + __clear_bit(offset, &grp->full_slots); +} + +/* + * called to forcibly destroy a queue. + * If the queue is not in the front bucket, or if it has + * other queues in the front bucket, we can simply remove + * the queue with no other side effects. + * Otherwise we must propagate the event up. + * XXX description to be completed. + */ +static void +qfq_deactivate_class(struct qfq_sched *q, struct qfq_class *cl, + struct qfq_class **pprev) +{ + struct qfq_group *grp = &q->groups[cl->index]; + unsigned long mask; + uint64_t roundedS; + int s; + + cl->F = cl->S; // not needed if the class goes away. + qfq_slot_remove(q, grp, cl, pprev); + + if (!grp->full_slots) { + /* nothing left in the group, remove from all sets. + * Do ER last because if we were blocking other groups + * we must unblock them. + */ + __clear_bit(grp->index, &q->bitmaps[IR]); + __clear_bit(grp->index, &q->bitmaps[EB]); + __clear_bit(grp->index, &q->bitmaps[IB]); + + if (test_bit(grp->index, &q->bitmaps[ER]) && + !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) { + mask = q->bitmaps[ER] & ((1UL << grp->index) - 1); + if (mask) + mask = ~((1UL << __fls(mask)) - 1); + else + mask = ~0UL; + qfq_move_groups(q, mask, EB, ER); + qfq_move_groups(q, mask, IB, IR); + } + __clear_bit(grp->index, &q->bitmaps[ER]); + } else if (!grp->slots[grp->front]) { + cl = qfq_slot_scan(grp); + roundedS = qfq_round_down(cl->S, grp->slot_shift); + if (grp->S != roundedS) { + __clear_bit(grp->index, &q->bitmaps[ER]); + __clear_bit(grp->index, &q->bitmaps[IR]); + __clear_bit(grp->index, &q->bitmaps[EB]); + __clear_bit(grp->index, &q->bitmaps[IB]); + grp->S = roundedS; + grp->F = roundedS + (2ULL << grp->slot_shift); + s = qfq_calc_state(q, grp); + __set_bit(grp->index, &q->bitmaps[s]); + } + } + qfq_update_eligible(q, q->V); +} +#endif + +static int +qfq_new_fsk(struct dn_fsk *f) +{ + ipdn_bound_var(&f->fs.par[0], 1, 1, QFQ_MAX_WEIGHT, "qfq weight"); + ipdn_bound_var(&f->fs.par[1], 1500, 1, 2000, "qfq maxlen"); + ND("weight %d len %d\n", f->fs.par[0], f->fs.par[1]); + return 0; +} + +/* + * initialize a new scheduler instance + */ +static int +qfq_new_sched(struct dn_sch_inst *si) +{ + struct qfq_sched *q = (struct qfq_sched *)(si + 1); + struct qfq_group *grp; + int i; + + for (i = 0; i <= QFQ_MAX_INDEX; i++) { + grp = &q->groups[i]; + grp->index = i; + grp->slot_shift = QFQ_MTU_SHIFT + FRAC_BITS - + (QFQ_MAX_INDEX - i); + } + return 0; +} + +/* + * QFQ scheduler descriptor + */ +static struct dn_alg qfq_desc = { + _SI( .type = ) DN_SCHED_QFQ, + _SI( .name = ) "QFQ", + _SI( .flags = ) DN_MULTIQUEUE, + + _SI( .schk_datalen = ) 0, + _SI( .si_datalen = ) sizeof(struct qfq_sched), + _SI( .q_datalen = ) sizeof(struct qfq_class) - sizeof(struct dn_queue), + + _SI( .enqueue = ) qfq_enqueue, + _SI( .dequeue = ) qfq_dequeue, + + _SI( .config = ) NULL, + _SI( .destroy = ) NULL, + _SI( .new_sched = ) qfq_new_sched, + _SI( .free_sched = ) NULL, + _SI( .new_fsk = ) qfq_new_fsk, + _SI( .free_fsk = ) NULL, + _SI( .new_queue = ) qfq_new_queue, + _SI( .free_queue = ) qfq_free_queue, +}; + +DECLARE_DNSCHED_MODULE(dn_qfq, &qfq_desc); + +#ifdef QFQ_DEBUG +static void +dump_groups(struct qfq_sched *q, uint32_t mask) +{ + int i, j; + + for (i = 0; i < QFQ_MAX_INDEX + 1; i++) { + struct qfq_group *g = &q->groups[i]; + + if (0 == (mask & (1<slots[j]) + D(" bucket %d %p", j, g->slots[j]); + } + D("full_slots 0x%x", g->full_slots); + D(" %2d S 0x%20llx F 0x%llx %c", i, + g->S, g->F, + mask & (1<loops, q->queued, q->V); + D(" ER 0x%08x", q->bitmaps[ER]); + D(" EB 0x%08x", q->bitmaps[EB]); + D(" IR 0x%08x", q->bitmaps[IR]); + D(" IB 0x%08x", q->bitmaps[IB]); + dump_groups(q, 0xffffffff); +}; +#endif /* QFQ_DEBUG */ diff --git a/sys/netinet/ipfw/dn_sched_rr.c b/sys/netinet/ipfw/dn_sched_rr.c new file mode 100644 index 0000000..2a93746 --- /dev/null +++ b/sys/netinet/ipfw/dn_sched_rr.c @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: dn_sched_rr.c 11480 2012-07-31 08:02:00Z luigi $ + */ + +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ */ +#include +#include /* ipfw_rule_ref */ +#include /* flow_id */ +#include +#include +#include +#include +#else +#include +#endif + +#define DN_SCHED_RR 3 // XXX Where? + +struct rr_queue { + struct dn_queue q; /* Standard queue */ + int status; /* 1: queue is in the list */ + int credit; /* Number of bytes to transmit */ + int quantum; /* quantum * C */ + struct rr_queue *qnext; /* */ +}; + +/* struct rr_schk contains global config parameters + * and is right after dn_schk + */ +struct rr_schk { + int min_q; /* Min quantum */ + int max_q; /* Max quantum */ + int q_bytes; /* Bytes per quantum */ +}; + +/* per-instance round robin list, right after dn_sch_inst */ +struct rr_si { + struct rr_queue *head, *tail; /* Pointer to current queue */ +}; + +/* Append a queue to the rr list */ +static inline void +rr_append(struct rr_queue *q, struct rr_si *si) +{ + q->status = 1; /* mark as in-rr_list */ + q->credit = q->quantum; /* initialize credit */ + + /* append to the tail */ + if (si->head == NULL) + si->head = q; + else + si->tail->qnext = q; + si->tail = q; /* advance the tail pointer */ + q->qnext = si->head; /* make it circular */ +} + +/* Remove the head queue from circular list. */ +static inline void +rr_remove_head(struct rr_si *si) +{ + if (si->head == NULL) + return; /* empty queue */ + si->head->status = 0; + + if (si->head == si->tail) { + si->head = si->tail = NULL; + return; + } + + si->head = si->head->qnext; + si->tail->qnext = si->head; +} + +/* Remove a queue from circular list. + * XXX see if ti can be merge with remove_queue() + */ +static inline void +remove_queue_q(struct rr_queue *q, struct rr_si *si) +{ + struct rr_queue *prev; + + if (q->status != 1) + return; + if (q == si->head) { + rr_remove_head(si); + return; + } + + for (prev = si->head; prev; prev = prev->qnext) { + if (prev->qnext != q) + continue; + prev->qnext = q->qnext; + if (q == si->tail) + si->tail = prev; + q->status = 0; + break; + } +} + + +static inline void +next_pointer(struct rr_si *si) +{ + if (si->head == NULL) + return; /* empty queue */ + + si->head = si->head->qnext; + si->tail = si->tail->qnext; +} + +static int +rr_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) +{ + struct rr_si *si; + struct rr_queue *rrq; + + if (m != q->mq.head) { + if (dn_enqueue(q, m, 0)) /* packet was dropped */ + return 1; + if (m != q->mq.head) + return 0; + } + + /* If reach this point, queue q was idle */ + si = (struct rr_si *)(_si + 1); + rrq = (struct rr_queue *)q; + + if (rrq->status == 1) /* Queue is already in the queue list */ + return 0; + + /* Insert the queue in the queue list */ + rr_append(rrq, si); + + return 0; +} + +static struct mbuf * +rr_dequeue(struct dn_sch_inst *_si) +{ + /* Access scheduler instance private data */ + struct rr_si *si = (struct rr_si *)(_si + 1); + struct rr_queue *rrq; + uint64_t len; + + while ( (rrq = si->head) ) { + struct mbuf *m = rrq->q.mq.head; + if ( m == NULL) { + /* empty queue, remove from list */ + rr_remove_head(si); + continue; + } + len = m->m_pkthdr.len; + + if (len > rrq->credit) { + /* Packet too big */ + rrq->credit += rrq->quantum; + /* Try next queue */ + next_pointer(si); + } else { + rrq->credit -= len; + return dn_dequeue(&rrq->q); + } + } + + /* no packet to dequeue*/ + return NULL; +} + +static int +rr_config(struct dn_schk *_schk) +{ + struct rr_schk *schk = (struct rr_schk *)(_schk + 1); + ND("called"); + + /* use reasonable quantums (64..2k bytes, default 1500) */ + schk->min_q = 64; + schk->max_q = 2048; + schk->q_bytes = 1500; /* quantum */ + + return 0; +} + +static int +rr_new_sched(struct dn_sch_inst *_si) +{ + struct rr_si *si = (struct rr_si *)(_si + 1); + + ND("called"); + si->head = si->tail = NULL; + + return 0; +} + +static int +rr_free_sched(struct dn_sch_inst *_si) +{ + ND("called"); + /* Nothing to do? */ + return 0; +} + +static int +rr_new_fsk(struct dn_fsk *fs) +{ + struct rr_schk *schk = (struct rr_schk *)(fs->sched + 1); + /* par[0] is the weight, par[1] is the quantum step */ + ipdn_bound_var(&fs->fs.par[0], 1, + 1, 65536, "RR weight"); + ipdn_bound_var(&fs->fs.par[1], schk->q_bytes, + schk->min_q, schk->max_q, "RR quantum"); + return 0; +} + +static int +rr_new_queue(struct dn_queue *_q) +{ + struct rr_queue *q = (struct rr_queue *)_q; + + _q->ni.oid.subtype = DN_SCHED_RR; + + q->quantum = _q->fs->fs.par[0] * _q->fs->fs.par[1]; + ND("called, q->quantum %d", q->quantum); + q->credit = q->quantum; + q->status = 0; + + if (_q->mq.head != NULL) { + /* Queue NOT empty, insert in the queue list */ + rr_append(q, (struct rr_si *)(_q->_si + 1)); + } + return 0; +} + +static int +rr_free_queue(struct dn_queue *_q, int safe) +{ + struct rr_queue *q = (struct rr_queue *)_q; + + ND("called"); + if (safe) /* Delete only if status == 0 */ + return q->status; + + if (q->status == 1) { + struct rr_si *si = (struct rr_si *)(_q->_si + 1); + remove_queue_q(q, si); + } + return 0; +} + +/* + * RR scheduler descriptor + * contains the type of the scheduler, the name, the size of the + * structures and function pointers. + */ +static struct dn_alg rr_desc = { + _SI( .type = ) DN_SCHED_RR, + _SI( .name = ) "RR", + _SI( .flags = ) DN_MULTIQUEUE, + + _SI( .schk_datalen = ) 0, + _SI( .si_datalen = ) sizeof(struct rr_si), + _SI( .q_datalen = ) sizeof(struct rr_queue) - sizeof(struct dn_queue), + + _SI( .enqueue = ) rr_enqueue, + _SI( .dequeue = ) rr_dequeue, + + _SI( .config = ) rr_config, + _SI( .destroy = ) NULL, + _SI( .new_sched = ) rr_new_sched, + _SI( .free_sched = ) rr_free_sched, + _SI( .new_fsk = ) rr_new_fsk, + _SI( .free_fsk = ) NULL, + _SI( .new_queue = ) rr_new_queue, + _SI( .free_queue = ) rr_free_queue, +}; + + +DECLARE_DNSCHED_MODULE(dn_rr, &rr_desc); diff --git a/sys/netinet/ipfw/dn_sched_wf2q.c b/sys/netinet/ipfw/dn_sched_wf2q.c new file mode 100644 index 0000000..86d0d57 --- /dev/null +++ b/sys/netinet/ipfw/dn_sched_wf2q.c @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa + * Copyright (c) 2000-2002 Luigi Rizzo, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: dn_sched_wf2q.c 11480 2012-07-31 08:02:00Z luigi $ + */ + +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ */ +#include +#include /* ipfw_rule_ref */ +#include /* flow_id */ +#include +#include +#include +#include +#else +#include +#endif + +#ifndef MAX64 +#define MAX64(x,y) (( (int64_t) ( (y)-(x) )) > 0 ) ? (y) : (x) +#endif + +/* + * timestamps are computed on 64 bit using fixed point arithmetic. + * LMAX_BITS, WMAX_BITS are the max number of bits for the packet len + * and sum of weights, respectively. FRAC_BITS is the number of + * fractional bits. We want FRAC_BITS >> WMAX_BITS to avoid too large + * errors when computing the inverse, FRAC_BITS < 32 so we can do 1/w + * using an unsigned 32-bit division, and to avoid wraparounds we need + * LMAX_BITS + WMAX_BITS + FRAC_BITS << 64 + * As an example + * FRAC_BITS = 26, LMAX_BITS=14, WMAX_BITS = 19 + */ +#ifndef FRAC_BITS +#define FRAC_BITS 28 /* shift for fixed point arithmetic */ +#define ONE_FP (1UL << FRAC_BITS) +#endif + +/* + * Private information for the scheduler instance: + * sch_heap (key is Finish time) returns the next queue to serve + * ne_heap (key is Start time) stores not-eligible queues + * idle_heap (key=start/finish time) stores idle flows. It must + * support extract-from-middle. + * A flow is only in 1 of the three heaps. + * XXX todo: use a more efficient data structure, e.g. a tree sorted + * by F with min_subtree(S) in each node + */ +struct wf2qp_si { + struct dn_heap sch_heap; /* top extract - key Finish time */ + struct dn_heap ne_heap; /* top extract - key Start time */ + struct dn_heap idle_heap; /* random extract - key Start=Finish time */ + uint64_t V; /* virtual time */ + uint32_t inv_wsum; /* inverse of sum of weights */ + uint32_t wsum; /* sum of weights */ +}; + +struct wf2qp_queue { + struct dn_queue _q; + uint64_t S, F; /* start time, finish time */ + uint32_t inv_w; /* ONE_FP / weight */ + int32_t heap_pos; /* position (index) of struct in heap */ +}; + +/* + * This file implements a WF2Q+ scheduler as it has been in dummynet + * since 2000. + * The scheduler supports per-flow queues and has O(log N) complexity. + * + * WF2Q+ needs to drain entries from the idle heap so that we + * can keep the sum of weights up to date. We can do it whenever + * we get a chance, or periodically, or following some other + * strategy. The function idle_check() drains at most N elements + * from the idle heap. + */ +static void +idle_check(struct wf2qp_si *si, int n, int force) +{ + struct dn_heap *h = &si->idle_heap; + while (n-- > 0 && h->elements > 0 && + (force || DN_KEY_LT(HEAP_TOP(h)->key, si->V))) { + struct dn_queue *q = HEAP_TOP(h)->object; + struct wf2qp_queue *alg_fq = (struct wf2qp_queue *)q; + + heap_extract(h, NULL); + /* XXX to let the flowset delete the queue we should + * mark it as 'unused' by the scheduler. + */ + alg_fq->S = alg_fq->F + 1; /* Mark timestamp as invalid. */ + si->wsum -= q->fs->fs.par[0]; /* adjust sum of weights */ + if (si->wsum > 0) + si->inv_wsum = ONE_FP/si->wsum; + } +} + +static int +wf2qp_enqueue(struct dn_sch_inst *_si, struct dn_queue *q, struct mbuf *m) +{ + struct dn_fsk *fs = q->fs; + struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); + struct wf2qp_queue *alg_fq; + uint64_t len = m->m_pkthdr.len; + + if (m != q->mq.head) { + if (dn_enqueue(q, m, 0)) /* packet was dropped */ + return 1; + if (m != q->mq.head) /* queue was already busy */ + return 0; + } + + /* If reach this point, queue q was idle */ + alg_fq = (struct wf2qp_queue *)q; + + if (DN_KEY_LT(alg_fq->F, alg_fq->S)) { + /* Fbrand new queue. */ + alg_fq->S = si->V; /* init start time */ + si->wsum += fs->fs.par[0]; /* add weight of new queue. */ + si->inv_wsum = ONE_FP/si->wsum; + } else { /* if it was idle then it was in the idle heap */ + heap_extract(&si->idle_heap, q); + alg_fq->S = MAX64(alg_fq->F, si->V); /* compute new S */ + } + alg_fq->F = alg_fq->S + len * alg_fq->inv_w; + + /* if nothing is backlogged, make sure this flow is eligible */ + if (si->ne_heap.elements == 0 && si->sch_heap.elements == 0) + si->V = MAX64(alg_fq->S, si->V); + + /* + * Look at eligibility. A flow is not eligibile if S>V (when + * this happens, it means that there is some other flow already + * scheduled for the same pipe, so the sch_heap cannot be + * empty). If the flow is not eligible we just store it in the + * ne_heap. Otherwise, we store in the sch_heap. + * Note that for all flows in sch_heap (SCH), S_i <= V, + * and for all flows in ne_heap (NEH), S_i > V. + * So when we need to compute max(V, min(S_i)) forall i in + * SCH+NEH, we only need to look into NEH. + */ + if (DN_KEY_LT(si->V, alg_fq->S)) { + /* S>V means flow Not eligible. */ + if (si->sch_heap.elements == 0) + D("++ ouch! not eligible but empty scheduler!"); + heap_insert(&si->ne_heap, alg_fq->S, q); + } else { + heap_insert(&si->sch_heap, alg_fq->F, q); + } + return 0; +} + +/* XXX invariant: sch > 0 || V >= min(S in neh) */ +static struct mbuf * +wf2qp_dequeue(struct dn_sch_inst *_si) +{ + /* Access scheduler instance private data */ + struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); + struct mbuf *m; + struct dn_queue *q; + struct dn_heap *sch = &si->sch_heap; + struct dn_heap *neh = &si->ne_heap; + struct wf2qp_queue *alg_fq; + + if (sch->elements == 0 && neh->elements == 0) { + /* we have nothing to do. We could kill the idle heap + * altogether and reset V + */ + idle_check(si, 0x7fffffff, 1); + si->V = 0; + si->wsum = 0; /* should be set already */ + return NULL; /* quick return if nothing to do */ + } + idle_check(si, 1, 0); /* drain something from the idle heap */ + + /* make sure at least one element is eligible, bumping V + * and moving entries that have become eligible. + * We need to repeat the first part twice, before and + * after extracting the candidate, or enqueue() will + * find the data structure in a wrong state. + */ + m = NULL; + for(;;) { + /* + * Compute V = max(V, min(S_i)). Remember that all elements + * in sch have by definition S_i <= V so if sch is not empty, + * V is surely the max and we must not update it. Conversely, + * if sch is empty we only need to look at neh. + * We don't need to move the queues, as it will be done at the + * next enqueue + */ + if (sch->elements == 0 && neh->elements > 0) { + si->V = MAX64(si->V, HEAP_TOP(neh)->key); + } + while (neh->elements > 0 && + DN_KEY_LEQ(HEAP_TOP(neh)->key, si->V)) { + q = HEAP_TOP(neh)->object; + alg_fq = (struct wf2qp_queue *)q; + heap_extract(neh, NULL); + heap_insert(sch, alg_fq->F, q); + } + if (m) /* pkt found in previous iteration */ + break; + /* ok we have at least one eligible pkt */ + q = HEAP_TOP(sch)->object; + alg_fq = (struct wf2qp_queue *)q; + m = dn_dequeue(q); + heap_extract(sch, NULL); /* Remove queue from heap. */ + si->V += (uint64_t)(m->m_pkthdr.len) * si->inv_wsum; + alg_fq->S = alg_fq->F; /* Update start time. */ + if (q->mq.head == 0) { /* not backlogged any more. */ + heap_insert(&si->idle_heap, alg_fq->F, q); + } else { /* Still backlogged. */ + /* Update F, store in neh or sch */ + uint64_t len = q->mq.head->m_pkthdr.len; + alg_fq->F += len * alg_fq->inv_w; + if (DN_KEY_LEQ(alg_fq->S, si->V)) { + heap_insert(sch, alg_fq->F, q); + } else { + heap_insert(neh, alg_fq->S, q); + } + } + } + return m; +} + +static int +wf2qp_new_sched(struct dn_sch_inst *_si) +{ + struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); + int ofs = offsetof(struct wf2qp_queue, heap_pos); + + /* all heaps support extract from middle */ + if (heap_init(&si->idle_heap, 16, ofs) || + heap_init(&si->sch_heap, 16, ofs) || + heap_init(&si->ne_heap, 16, ofs)) { + heap_free(&si->ne_heap); + heap_free(&si->sch_heap); + heap_free(&si->idle_heap); + return ENOMEM; + } + return 0; +} + +static int +wf2qp_free_sched(struct dn_sch_inst *_si) +{ + struct wf2qp_si *si = (struct wf2qp_si *)(_si + 1); + + heap_free(&si->sch_heap); + heap_free(&si->ne_heap); + heap_free(&si->idle_heap); + + return 0; +} + +static int +wf2qp_new_fsk(struct dn_fsk *fs) +{ + ipdn_bound_var(&fs->fs.par[0], 1, + 1, 100, "WF2Q+ weight"); + return 0; +} + +static int +wf2qp_new_queue(struct dn_queue *_q) +{ + struct wf2qp_queue *q = (struct wf2qp_queue *)_q; + + _q->ni.oid.subtype = DN_SCHED_WF2QP; + q->F = 0; /* not strictly necessary */ + q->S = q->F + 1; /* mark timestamp as invalid. */ + q->inv_w = ONE_FP / _q->fs->fs.par[0]; + if (_q->mq.head != NULL) { + wf2qp_enqueue(_q->_si, _q, _q->mq.head); + } + return 0; +} + +/* + * Called when the infrastructure removes a queue (e.g. flowset + * is reconfigured). Nothing to do if we did not 'own' the queue, + * otherwise remove it from the right heap and adjust the sum + * of weights. + */ +static int +wf2qp_free_queue(struct dn_queue *q, int safe) +{ + struct wf2qp_queue *alg_fq = (struct wf2qp_queue *)q; + struct wf2qp_si *si = (struct wf2qp_si *)(q->_si + 1); + + if (alg_fq->S >= alg_fq->F + 1) + return 0; /* nothing to do, not in any heap */ + + /* queue is in a scheduler heap */ + if (safe) /* do not delete in safe mode */ + return 1; + + si->wsum -= q->fs->fs.par[0]; + if (si->wsum > 0) + si->inv_wsum = ONE_FP/si->wsum; + + /* extract from the heap. XXX TODO we may need to adjust V + * to make sure the invariants hold. + */ + if (q->mq.head == NULL) { + heap_extract(&si->idle_heap, q); + } else if (DN_KEY_LT(si->V, alg_fq->S)) { + heap_extract(&si->ne_heap, q); + } else { + heap_extract(&si->sch_heap, q); + } + return 0; +} + +/* + * WF2Q+ scheduler descriptor + * contains the type of the scheduler, the name, the size of the + * structures and function pointers. + */ +static struct dn_alg wf2qp_desc = { + _SI( .type = ) DN_SCHED_WF2QP, + _SI( .name = ) "WF2Q+", + _SI( .flags = ) DN_MULTIQUEUE, + + /* we need extra space in the si and the queue */ + _SI( .schk_datalen = ) 0, + _SI( .si_datalen = ) sizeof(struct wf2qp_si), + _SI( .q_datalen = ) sizeof(struct wf2qp_queue) - + sizeof(struct dn_queue), + + _SI( .enqueue = ) wf2qp_enqueue, + _SI( .dequeue = ) wf2qp_dequeue, + + _SI( .config = ) NULL, + _SI( .destroy = ) NULL, + _SI( .new_sched = ) wf2qp_new_sched, + _SI( .free_sched = ) wf2qp_free_sched, + + _SI( .new_fsk = ) wf2qp_new_fsk, + _SI( .free_fsk = ) NULL, + + _SI( .new_queue = ) wf2qp_new_queue, + _SI( .free_queue = ) wf2qp_free_queue, +}; + + +DECLARE_DNSCHED_MODULE(dn_wf2qp, &wf2qp_desc); diff --git a/sys/netinet/ipfw/ip_dn_glue.c b/sys/netinet/ipfw/ip_dn_glue.c new file mode 100644 index 0000000..aa0ac90 --- /dev/null +++ b/sys/netinet/ipfw/ip_dn_glue.c @@ -0,0 +1,846 @@ +/*- + * Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * $Id: ip_dn_glue.c 12500 2013-12-11 23:07:58Z luigi $ + * + * Binary compatibility support for /sbin/ipfw RELENG_7 and RELENG_8 + */ + +#include "opt_inet6.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ +#include +#include /* ip_output(), IP_FORWARDING */ +#include +#include + +#include +#include +#include +#include + +/* FREEBSD7.2 ip_dummynet.h r191715*/ + +struct dn_heap_entry7 { + int64_t key; /* sorting key. Topmost element is smallest one */ + void *object; /* object pointer */ +}; + +struct dn_heap7 { + int size; + int elements; + int offset; /* XXX if > 0 this is the offset of direct ptr to obj */ + struct dn_heap_entry7 *p; /* really an array of "size" entries */ +}; + +/* Common to 7.2 and 8 */ +struct dn_flow_set { + SLIST_ENTRY(dn_flow_set) next; /* linked list in a hash slot */ + + u_short fs_nr ; /* flow_set number */ + u_short flags_fs; +#define DNOLD_HAVE_FLOW_MASK 0x0001 +#define DNOLD_IS_RED 0x0002 +#define DNOLD_IS_GENTLE_RED 0x0004 +#define DNOLD_QSIZE_IS_BYTES 0x0008 /* queue size is measured in bytes */ +#define DNOLD_NOERROR 0x0010 /* do not report ENOBUFS on drops */ +#define DNOLD_HAS_PROFILE 0x0020 /* the pipe has a delay profile. */ +#define DNOLD_IS_PIPE 0x4000 +#define DNOLD_IS_QUEUE 0x8000 + + struct dn_pipe7 *pipe ; /* pointer to parent pipe */ + u_short parent_nr ; /* parent pipe#, 0 if local to a pipe */ + + int weight ; /* WFQ queue weight */ + int qsize ; /* queue size in slots or bytes */ + int plr ; /* pkt loss rate (2^31-1 means 100%) */ + + struct ipfw_flow_id flow_mask ; + + /* hash table of queues onto this flow_set */ + int rq_size ; /* number of slots */ + int rq_elements ; /* active elements */ + struct dn_flow_queue7 **rq; /* array of rq_size entries */ + + u_int32_t last_expired ; /* do not expire too frequently */ + int backlogged ; /* #active queues for this flowset */ + + /* RED parameters */ +#define SCALE_RED 16 +#define SCALE(x) ( (x) << SCALE_RED ) +#define SCALE_VAL(x) ( (x) >> SCALE_RED ) +#define SCALE_MUL(x,y) ( ( (x) * (y) ) >> SCALE_RED ) + int w_q ; /* queue weight (scaled) */ + int max_th ; /* maximum threshold for queue (scaled) */ + int min_th ; /* minimum threshold for queue (scaled) */ + int max_p ; /* maximum value for p_b (scaled) */ + u_int c_1 ; /* max_p/(max_th-min_th) (scaled) */ + u_int c_2 ; /* max_p*min_th/(max_th-min_th) (scaled) */ + u_int c_3 ; /* for GRED, (1-max_p)/max_th (scaled) */ + u_int c_4 ; /* for GRED, 1 - 2*max_p (scaled) */ + u_int * w_q_lookup ; /* lookup table for computing (1-w_q)^t */ + u_int lookup_depth ; /* depth of lookup table */ + int lookup_step ; /* granularity inside the lookup table */ + int lookup_weight ; /* equal to (1-w_q)^t / (1-w_q)^(t+1) */ + int avg_pkt_size ; /* medium packet size */ + int max_pkt_size ; /* max packet size */ +}; +SLIST_HEAD(dn_flow_set_head, dn_flow_set); + +#define DN_IS_PIPE 0x4000 +#define DN_IS_QUEUE 0x8000 +struct dn_flow_queue7 { + struct dn_flow_queue7 *next ; + struct ipfw_flow_id id ; + + struct mbuf *head, *tail ; /* queue of packets */ + u_int len ; + u_int len_bytes ; + + u_long numbytes; + + u_int64_t tot_pkts ; /* statistics counters */ + u_int64_t tot_bytes ; + u_int32_t drops ; + + int hash_slot ; /* debugging/diagnostic */ + + /* RED parameters */ + int avg ; /* average queue length est. (scaled) */ + int count ; /* arrivals since last RED drop */ + int random ; /* random value (scaled) */ + u_int32_t q_time; /* start of queue idle time */ + + /* WF2Q+ support */ + struct dn_flow_set *fs ; /* parent flow set */ + int heap_pos ; /* position (index) of struct in heap */ + int64_t sched_time ; /* current time when queue enters ready_heap */ + + int64_t S,F ; /* start time, finish time */ +}; + +struct dn_pipe7 { /* a pipe */ + SLIST_ENTRY(dn_pipe7) next; /* linked list in a hash slot */ + + int pipe_nr ; /* number */ + int bandwidth; /* really, bytes/tick. */ + int delay ; /* really, ticks */ + + struct mbuf *head, *tail ; /* packets in delay line */ + + /* WF2Q+ */ + struct dn_heap7 scheduler_heap ; /* top extract - key Finish time*/ + struct dn_heap7 not_eligible_heap; /* top extract- key Start time */ + struct dn_heap7 idle_heap ; /* random extract - key Start=Finish time */ + + int64_t V ; /* virtual time */ + int sum; /* sum of weights of all active sessions */ + + int numbytes; + + int64_t sched_time ; /* time pipe was scheduled in ready_heap */ + + /* + * When the tx clock come from an interface (if_name[0] != '\0'), its name + * is stored below, whereas the ifp is filled when the rule is configured. + */ + char if_name[IFNAMSIZ]; + struct ifnet *ifp ; + int ready ; /* set if ifp != NULL and we got a signal from it */ + + struct dn_flow_set fs ; /* used with fixed-rate flows */ +}; +SLIST_HEAD(dn_pipe_head7, dn_pipe7); + + +/* FREEBSD8 ip_dummynet.h r196045 */ +struct dn_flow_queue8 { + struct dn_flow_queue8 *next ; + struct ipfw_flow_id id ; + + struct mbuf *head, *tail ; /* queue of packets */ + u_int len ; + u_int len_bytes ; + + uint64_t numbytes ; /* credit for transmission (dynamic queues) */ + int64_t extra_bits; /* extra bits simulating unavailable channel */ + + u_int64_t tot_pkts ; /* statistics counters */ + u_int64_t tot_bytes ; + u_int32_t drops ; + + int hash_slot ; /* debugging/diagnostic */ + + /* RED parameters */ + int avg ; /* average queue length est. (scaled) */ + int count ; /* arrivals since last RED drop */ + int random ; /* random value (scaled) */ + int64_t idle_time; /* start of queue idle time */ + + /* WF2Q+ support */ + struct dn_flow_set *fs ; /* parent flow set */ + int heap_pos ; /* position (index) of struct in heap */ + int64_t sched_time ; /* current time when queue enters ready_heap */ + + int64_t S,F ; /* start time, finish time */ +}; + +struct dn_pipe8 { /* a pipe */ + SLIST_ENTRY(dn_pipe8) next; /* linked list in a hash slot */ + + int pipe_nr ; /* number */ + int bandwidth; /* really, bytes/tick. */ + int delay ; /* really, ticks */ + + struct mbuf *head, *tail ; /* packets in delay line */ + + /* WF2Q+ */ + struct dn_heap7 scheduler_heap ; /* top extract - key Finish time*/ + struct dn_heap7 not_eligible_heap; /* top extract- key Start time */ + struct dn_heap7 idle_heap ; /* random extract - key Start=Finish time */ + + int64_t V ; /* virtual time */ + int sum; /* sum of weights of all active sessions */ + + /* Same as in dn_flow_queue, numbytes can become large */ + int64_t numbytes; /* bits I can transmit (more or less). */ + uint64_t burst; /* burst size, scaled: bits * hz */ + + int64_t sched_time ; /* time pipe was scheduled in ready_heap */ + int64_t idle_time; /* start of pipe idle time */ + + char if_name[IFNAMSIZ]; + struct ifnet *ifp ; + int ready ; /* set if ifp != NULL and we got a signal from it */ + + struct dn_flow_set fs ; /* used with fixed-rate flows */ + + /* fields to simulate a delay profile */ +#define ED_MAX_NAME_LEN 32 + char name[ED_MAX_NAME_LEN]; + int loss_level; + int samples_no; + int *samples; +}; + +#define ED_MAX_SAMPLES_NO 1024 +struct dn_pipe_max8 { + struct dn_pipe8 pipe; + int samples[ED_MAX_SAMPLES_NO]; +}; +SLIST_HEAD(dn_pipe_head8, dn_pipe8); + +/* + * Changes from 7.2 to 8: + * dn_pipe: + * numbytes from int to int64_t + * add burst (int64_t) + * add idle_time (int64_t) + * add profile + * add struct dn_pipe_max + * add flag DN_HAS_PROFILE + * + * dn_flow_queue + * numbytes from u_long to int64_t + * add extra_bits (int64_t) + * q_time from u_int32_t to int64_t and name idle_time + * + * dn_flow_set unchanged + * + */ + +/* NOTE:XXX copied from dummynet.c */ +#define O_NEXT(p, len) ((void *)((char *)p + len)) +static void +oid_fill(struct dn_id *oid, int len, int type, uintptr_t id) +{ + oid->len = len; + oid->type = type; + oid->subtype = 0; + oid->id = id; +} +/* make room in the buffer and move the pointer forward */ +static void * +o_next(struct dn_id **o, int len, int type) +{ + struct dn_id *ret = *o; + oid_fill(ret, len, type, 0); + *o = O_NEXT(*o, len); + return ret; +} + + +static size_t pipesize7 = sizeof(struct dn_pipe7); +static size_t pipesize8 = sizeof(struct dn_pipe8); +static size_t pipesizemax8 = sizeof(struct dn_pipe_max8); + +/* Indicate 'ipfw' version + * 1: from FreeBSD 7.2 + * 0: from FreeBSD 8 + * -1: unknown (for now is unused) + * + * It is update when a IP_DUMMYNET_DEL or IP_DUMMYNET_CONFIGURE request arrives + * NOTE: if a IP_DUMMYNET_GET arrives and the 'ipfw' version is unknown, + * it is suppose to be the FreeBSD 8 version. + */ +static int is7 = 0; + +static int +convertflags2new(int src) +{ + int dst = 0; + + if (src & DNOLD_HAVE_FLOW_MASK) + dst |= DN_HAVE_MASK; + if (src & DNOLD_QSIZE_IS_BYTES) + dst |= DN_QSIZE_BYTES; + if (src & DNOLD_NOERROR) + dst |= DN_NOERROR; + if (src & DNOLD_IS_RED) + dst |= DN_IS_RED; + if (src & DNOLD_IS_GENTLE_RED) + dst |= DN_IS_GENTLE_RED; + if (src & DNOLD_HAS_PROFILE) + dst |= DN_HAS_PROFILE; + + return dst; +} + +static int +convertflags2old(int src) +{ + int dst = 0; + + if (src & DN_HAVE_MASK) + dst |= DNOLD_HAVE_FLOW_MASK; + if (src & DN_IS_RED) + dst |= DNOLD_IS_RED; + if (src & DN_IS_GENTLE_RED) + dst |= DNOLD_IS_GENTLE_RED; + if (src & DN_NOERROR) + dst |= DNOLD_NOERROR; + if (src & DN_HAS_PROFILE) + dst |= DNOLD_HAS_PROFILE; + if (src & DN_QSIZE_BYTES) + dst |= DNOLD_QSIZE_IS_BYTES; + + return dst; +} + +static int +dn_compat_del(void *v) +{ + struct dn_pipe7 *p = (struct dn_pipe7 *) v; + struct dn_pipe8 *p8 = (struct dn_pipe8 *) v; + struct { + struct dn_id oid; + uintptr_t a[1]; /* add more if we want a list */ + } cmd; + + /* XXX DN_API_VERSION ??? */ + oid_fill((void *)&cmd, sizeof(cmd), DN_CMD_DELETE, DN_API_VERSION); + + if (is7) { + if (p->pipe_nr == 0 && p->fs.fs_nr == 0) + return EINVAL; + if (p->pipe_nr != 0 && p->fs.fs_nr != 0) + return EINVAL; + } else { + if (p8->pipe_nr == 0 && p8->fs.fs_nr == 0) + return EINVAL; + if (p8->pipe_nr != 0 && p8->fs.fs_nr != 0) + return EINVAL; + } + + if (p->pipe_nr != 0) { /* pipe x delete */ + cmd.a[0] = p->pipe_nr; + cmd.oid.subtype = DN_LINK; + } else { /* queue x delete */ + cmd.oid.subtype = DN_FS; + cmd.a[0] = (is7) ? p->fs.fs_nr : p8->fs.fs_nr; + } + + return do_config(&cmd, cmd.oid.len); +} + +static int +dn_compat_config_queue(struct dn_fs *fs, void* v) +{ + struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; + struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; + struct dn_flow_set *f; + + if (is7) + f = &p7->fs; + else + f = &p8->fs; + + fs->fs_nr = f->fs_nr; + fs->sched_nr = f->parent_nr; + fs->flow_mask = f->flow_mask; + fs->buckets = f->rq_size; + fs->qsize = f->qsize; + fs->plr = f->plr; + fs->par[0] = f->weight; + fs->flags = convertflags2new(f->flags_fs); + if (fs->flags & DN_IS_GENTLE_RED || fs->flags & DN_IS_RED) { + fs->w_q = f->w_q; + fs->max_th = f->max_th; + fs->min_th = f->min_th; + fs->max_p = f->max_p; + } + + return 0; +} + +static int +dn_compat_config_pipe(struct dn_sch *sch, struct dn_link *p, + struct dn_fs *fs, void* v) +{ + struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; + struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; + int i = p7->pipe_nr; + + sch->sched_nr = i; + sch->oid.subtype = 0; + p->link_nr = i; + fs->fs_nr = i + 2*DN_MAX_ID; + fs->sched_nr = i + DN_MAX_ID; + + /* Common to 7 and 8 */ + p->bandwidth = p7->bandwidth; + p->delay = p7->delay; + if (!is7) { + /* FreeBSD 8 has burst */ + p->burst = p8->burst; + } + + /* fill the fifo flowset */ + dn_compat_config_queue(fs, v); + fs->fs_nr = i + 2*DN_MAX_ID; + fs->sched_nr = i + DN_MAX_ID; + + /* Move scheduler related parameter from fs to sch */ + sch->buckets = fs->buckets; /*XXX*/ + fs->buckets = 0; + if (fs->flags & DN_HAVE_MASK) { + sch->flags |= DN_HAVE_MASK; + fs->flags &= ~DN_HAVE_MASK; + sch->sched_mask = fs->flow_mask; + bzero(&fs->flow_mask, sizeof(struct ipfw_flow_id)); + } + + return 0; +} + +static int +dn_compat_config_profile(struct dn_profile *pf, struct dn_link *p, + void *v) +{ + struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; + + p8->samples = &(((struct dn_pipe_max8 *)p8)->samples[0]); + + pf->link_nr = p->link_nr; + pf->loss_level = p8->loss_level; +// pf->bandwidth = p->bandwidth; //XXX bandwidth redundant? + pf->samples_no = p8->samples_no; + strncpy(pf->name, p8->name,sizeof(pf->name)); + bcopy(p8->samples, pf->samples, sizeof(pf->samples)); + + return 0; +} + +/* + * If p->pipe_nr != 0 the command is 'pipe x config', so need to create + * the three main struct, else only a flowset is created + */ +static int +dn_compat_configure(void *v) +{ + struct dn_id *buf = NULL, *base; + struct dn_sch *sch = NULL; + struct dn_link *p = NULL; + struct dn_fs *fs = NULL; + struct dn_profile *pf = NULL; + int lmax; + int error; + + struct dn_pipe7 *p7 = (struct dn_pipe7 *)v; + struct dn_pipe8 *p8 = (struct dn_pipe8 *)v; + + int i; /* number of object to configure */ + + lmax = sizeof(struct dn_id); /* command header */ + lmax += sizeof(struct dn_sch) + sizeof(struct dn_link) + + sizeof(struct dn_fs) + sizeof(struct dn_profile); + + base = buf = malloc(lmax, M_DUMMYNET, M_WAITOK|M_ZERO); + o_next(&buf, sizeof(struct dn_id), DN_CMD_CONFIG); + base->id = DN_API_VERSION; + + /* pipe_nr is the same in p7 and p8 */ + i = p7->pipe_nr; + if (i != 0) { /* pipe config */ + sch = o_next(&buf, sizeof(*sch), DN_SCH); + p = o_next(&buf, sizeof(*p), DN_LINK); + fs = o_next(&buf, sizeof(*fs), DN_FS); + + error = dn_compat_config_pipe(sch, p, fs, v); + if (error) { + free(buf, M_DUMMYNET); + return error; + } + if (!is7 && p8->samples_no > 0) { + /* Add profiles*/ + pf = o_next(&buf, sizeof(*pf), DN_PROFILE); + error = dn_compat_config_profile(pf, p, v); + if (error) { + free(buf, M_DUMMYNET); + return error; + } + } + } else { /* queue config */ + fs = o_next(&buf, sizeof(*fs), DN_FS); + error = dn_compat_config_queue(fs, v); + if (error) { + free(buf, M_DUMMYNET); + return error; + } + } + error = do_config(base, (char *)buf - (char *)base); + + if (buf) + free(buf, M_DUMMYNET); + return error; +} + +int +dn_compat_calc_size(void) +{ + int need = 0; + /* XXX use FreeBSD 8 struct size */ + /* NOTE: + * - half scheduler: schk_count/2 + * - all flowset: fsk_count + * - all flowset queues: queue_count + * - all pipe queue: si_count + */ + need += dn_cfg.schk_count * sizeof(struct dn_pipe8) / 2; + need += dn_cfg.fsk_count * sizeof(struct dn_flow_set); + need += dn_cfg.si_count * sizeof(struct dn_flow_queue8); + need += dn_cfg.queue_count * sizeof(struct dn_flow_queue8); + + return need; +} + +int +dn_c_copy_q (void *_ni, void *arg) +{ + struct copy_args *a = arg; + struct dn_flow_queue7 *fq7 = (struct dn_flow_queue7 *)*a->start; + struct dn_flow_queue8 *fq8 = (struct dn_flow_queue8 *)*a->start; + struct dn_flow *ni = (struct dn_flow *)_ni; + int size = 0; + + /* XXX hash slot not set */ + /* No difference between 7.2/8 */ + fq7->len = ni->length; + fq7->len_bytes = ni->len_bytes; + fq7->id = ni->fid; + + if (is7) { + size = sizeof(struct dn_flow_queue7); + fq7->tot_pkts = ni->tot_pkts; + fq7->tot_bytes = ni->tot_bytes; + fq7->drops = ni->drops; + } else { + size = sizeof(struct dn_flow_queue8); + fq8->tot_pkts = ni->tot_pkts; + fq8->tot_bytes = ni->tot_bytes; + fq8->drops = ni->drops; + } + + *a->start += size; + return 0; +} + +int +dn_c_copy_pipe(struct dn_schk *s, struct copy_args *a, int nq) +{ + struct dn_link *l = &s->link; + struct dn_fsk *f = s->fs; + + struct dn_pipe7 *pipe7 = (struct dn_pipe7 *)*a->start; + struct dn_pipe8 *pipe8 = (struct dn_pipe8 *)*a->start; + struct dn_flow_set *fs; + int size = 0; + + if (is7) { + fs = &pipe7->fs; + size = sizeof(struct dn_pipe7); + } else { + fs = &pipe8->fs; + size = sizeof(struct dn_pipe8); + } + + /* These 4 field are the same in pipe7 and pipe8 */ + pipe7->next.sle_next = (struct dn_pipe7 *)DN_IS_PIPE; + pipe7->bandwidth = l->bandwidth; + pipe7->delay = l->delay * 1000 / hz; + pipe7->pipe_nr = l->link_nr - DN_MAX_ID; + + if (!is7) { + if (s->profile) { + struct dn_profile *pf = s->profile; + strncpy(pipe8->name, pf->name, sizeof(pf->name)); + pipe8->loss_level = pf->loss_level; + pipe8->samples_no = pf->samples_no; + } + pipe8->burst = div64(l->burst , 8 * hz); + } + + fs->flow_mask = s->sch.sched_mask; + fs->rq_size = s->sch.buckets ? s->sch.buckets : 1; + + fs->parent_nr = l->link_nr - DN_MAX_ID; + fs->qsize = f->fs.qsize; + fs->plr = f->fs.plr; + fs->w_q = f->fs.w_q; + fs->max_th = f->max_th; + fs->min_th = f->min_th; + fs->max_p = f->fs.max_p; + fs->rq_elements = nq; + + fs->flags_fs = convertflags2old(f->fs.flags); + + *a->start += size; + return 0; +} + + +int +dn_compat_copy_pipe(struct copy_args *a, void *_o) +{ + int have = a->end - *a->start; + int need = 0; + int pipe_size = sizeof(struct dn_pipe8); + int queue_size = sizeof(struct dn_flow_queue8); + int n_queue = 0; /* number of queues */ + + struct dn_schk *s = (struct dn_schk *)_o; + /* calculate needed space: + * - struct dn_pipe + * - if there are instances, dn_queue * n_instances + */ + n_queue = (s->sch.flags & DN_HAVE_MASK ? dn_ht_entries(s->siht) : + (s->siht ? 1 : 0)); + need = pipe_size + queue_size * n_queue; + if (have < need) { + D("have %d < need %d", have, need); + return 1; + } + /* copy pipe */ + dn_c_copy_pipe(s, a, n_queue); + + /* copy queues */ + if (s->sch.flags & DN_HAVE_MASK) + dn_ht_scan(s->siht, dn_c_copy_q, a); + else if (s->siht) + dn_c_copy_q(s->siht, a); + return 0; +} + +int +dn_c_copy_fs(struct dn_fsk *f, struct copy_args *a, int nq) +{ + struct dn_flow_set *fs = (struct dn_flow_set *)*a->start; + + fs->next.sle_next = (struct dn_flow_set *)DN_IS_QUEUE; + fs->fs_nr = f->fs.fs_nr; + fs->qsize = f->fs.qsize; + fs->plr = f->fs.plr; + fs->w_q = f->fs.w_q; + fs->max_th = f->max_th; + fs->min_th = f->min_th; + fs->max_p = f->fs.max_p; + fs->flow_mask = f->fs.flow_mask; + fs->rq_elements = nq; + fs->rq_size = (f->fs.buckets ? f->fs.buckets : 1); + fs->parent_nr = f->fs.sched_nr; + fs->weight = f->fs.par[0]; + + fs->flags_fs = convertflags2old(f->fs.flags); + *a->start += sizeof(struct dn_flow_set); + return 0; +} + +int +dn_compat_copy_queue(struct copy_args *a, void *_o) +{ + int have = a->end - *a->start; + int need = 0; + int fs_size = sizeof(struct dn_flow_set); + int queue_size = sizeof(struct dn_flow_queue8); + + struct dn_fsk *fs = (struct dn_fsk *)_o; + int n_queue = 0; /* number of queues */ + + n_queue = (fs->fs.flags & DN_HAVE_MASK ? dn_ht_entries(fs->qht) : + (fs->qht ? 1 : 0)); + + need = fs_size + queue_size * n_queue; + if (have < need) { + D("have < need"); + return 1; + } + + /* copy flowset */ + dn_c_copy_fs(fs, a, n_queue); + + /* copy queues */ + if (fs->fs.flags & DN_HAVE_MASK) + dn_ht_scan(fs->qht, dn_c_copy_q, a); + else if (fs->qht) + dn_c_copy_q(fs->qht, a); + + return 0; +} + +int +copy_data_helper_compat(void *_o, void *_arg) +{ + struct copy_args *a = _arg; + + if (a->type == DN_COMPAT_PIPE) { + struct dn_schk *s = _o; + if (s->sch.oid.subtype != 1 || s->sch.sched_nr <= DN_MAX_ID) { + return 0; /* not old type */ + } + /* copy pipe parameters, and if instance exists, copy + * other parameters and eventually queues. + */ + if(dn_compat_copy_pipe(a, _o)) + return DNHT_SCAN_END; + } else if (a->type == DN_COMPAT_QUEUE) { + struct dn_fsk *fs = _o; + if (fs->fs.fs_nr >= DN_MAX_ID) + return 0; + if (dn_compat_copy_queue(a, _o)) + return DNHT_SCAN_END; + } + return 0; +} + +/* Main function to manage old requests */ +int +ip_dummynet_compat(struct sockopt *sopt) +{ + int error=0; + void *v = NULL; + struct dn_id oid; + + /* Lenght of data, used to found ipfw version... */ + int len = sopt->sopt_valsize; + + /* len can be 0 if command was dummynet_flush */ + if (len == pipesize7) { + D("setting compatibility with FreeBSD 7.2"); + is7 = 1; + } + else if (len == pipesize8 || len == pipesizemax8) { + D("setting compatibility with FreeBSD 8"); + is7 = 0; + } + + switch (sopt->sopt_name) { + default: + printf("dummynet: -- unknown option %d", sopt->sopt_name); + error = EINVAL; + break; + + case IP_DUMMYNET_FLUSH: + oid_fill(&oid, sizeof(oid), DN_CMD_FLUSH, DN_API_VERSION); + do_config(&oid, oid.len); + break; + + case IP_DUMMYNET_DEL: + v = malloc(len, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, v, len, len); + if (error) + break; + error = dn_compat_del(v); + free(v, M_TEMP); + break; + + case IP_DUMMYNET_CONFIGURE: + v = malloc(len, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, v, len, len); + if (error) + break; + error = dn_compat_configure(v); + free(v, M_TEMP); + break; + + case IP_DUMMYNET_GET: { + void *buf; + int ret; + int original_size = sopt->sopt_valsize; + int size; + + ret = dummynet_get(sopt, &buf); + if (ret) + return 0;//XXX ? + size = sopt->sopt_valsize; + sopt->sopt_valsize = original_size; + D("size=%d, buf=%p", size, buf); + ret = sooptcopyout(sopt, buf, size); + if (ret) + printf(" %s ERROR sooptcopyout\n", __FUNCTION__); + if (buf) + free(buf, M_DUMMYNET); + } + } + + return error; +} + + diff --git a/sys/netinet/ipfw/ip_dn_io.c b/sys/netinet/ipfw/ip_dn_io.c new file mode 100644 index 0000000..fd0dbeb --- /dev/null +++ b/sys/netinet/ipfw/ip_dn_io.c @@ -0,0 +1,962 @@ +/*- + * Copyright (c) 2010 Luigi Rizzo, Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * Dummynet portions related to packet handling. + */ +#include +__FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.c 203321 2010-01-31 21:39:25Z luigi $"); + +#include "opt_inet6.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ +#include +#include + +#include +#include /* ip_len, ip_off */ +#include /* ip_output(), IP_FORWARDING */ +#include +#include +#include +#include +#include +#include + +#include /* various ether_* routines */ + +#include /* for ip6_input, ip6_output prototypes */ +#include + +/* + * We keep a private variable for the simulation time, but we could + * probably use an existing one ("softticks" in sys/kern/kern_timeout.c) + * instead of dn_cfg.curr_time + */ + +struct dn_parms dn_cfg; +//VNET_DEFINE(struct dn_parms, _base_dn_cfg); + +static long tick_last; /* Last tick duration (usec). */ +static long tick_delta; /* Last vs standard tick diff (usec). */ +static long tick_delta_sum; /* Accumulated tick difference (usec).*/ +static long tick_adjustment; /* Tick adjustments done. */ +static long tick_lost; /* Lost(coalesced) ticks number. */ +/* Adjusted vs non-adjusted curr_time difference (ticks). */ +static long tick_diff; + +static unsigned long io_pkt; +static unsigned long io_pkt_fast; +static unsigned long io_pkt_drop; + +/* + * We use a heap to store entities for which we have pending timer events. + * The heap is checked at every tick and all entities with expired events + * are extracted. + */ + +MALLOC_DEFINE(M_DUMMYNET, "dummynet", "dummynet heap"); + +extern void (*bridge_dn_p)(struct mbuf *, struct ifnet *); + +#ifdef SYSCTL_NODE + +SYSBEGIN(f4) + +SYSCTL_DECL(_net_inet); +SYSCTL_DECL(_net_inet_ip); +SYSCTL_NODE(_net_inet_ip, OID_AUTO, dummynet, CTLFLAG_RW, 0, "Dummynet"); + +/* wrapper to pass dn_cfg fields to SYSCTL_* */ +//#define DC(x) (&(VNET_NAME(_base_dn_cfg).x)) +#define DC(x) (&(dn_cfg.x)) +/* parameters */ +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, hash_size, + CTLFLAG_RW, DC(hash_size), 0, "Default hash table size"); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_slot_limit, + CTLFLAG_RW, DC(slot_limit), 0, + "Upper limit in slots for pipe queue."); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_byte_limit, + CTLFLAG_RW, DC(byte_limit), 0, + "Upper limit in bytes for pipe queue."); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, io_fast, + CTLFLAG_RW, DC(io_fast), 0, "Enable fast dummynet io."); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, debug, + CTLFLAG_RW, DC(debug), 0, "Dummynet debug level"); + +/* RED parameters */ +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_lookup_depth, + CTLFLAG_RD, DC(red_lookup_depth), 0, "Depth of RED lookup table"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_avg_pkt_size, + CTLFLAG_RD, DC(red_avg_pkt_size), 0, "RED Medium packet size"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_max_pkt_size, + CTLFLAG_RD, DC(red_max_pkt_size), 0, "RED Max packet size"); + +/* time adjustment */ +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta, + CTLFLAG_RD, &tick_delta, 0, "Last vs standard tick difference (usec)."); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta_sum, + CTLFLAG_RD, &tick_delta_sum, 0, "Accumulated tick difference (usec)."); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_adjustment, + CTLFLAG_RD, &tick_adjustment, 0, "Tick adjustments done."); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_diff, + CTLFLAG_RD, &tick_diff, 0, + "Adjusted vs non-adjusted curr_time difference (ticks)."); +SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_lost, + CTLFLAG_RD, &tick_lost, 0, + "Number of ticks coalesced by dummynet taskqueue."); + +/* Drain parameters */ +SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire, + CTLFLAG_RW, DC(expire), 0, "Expire empty queues/pipes"); +SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire_cycle, + CTLFLAG_RD, DC(expire_cycle), 0, "Expire cycle for queues/pipes"); +SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, expire_object, + CTLFLAG_RW, DC(expire_object), 0, "Min # of objects before start drain routine"); +SYSCTL_UINT(_net_inet_ip_dummynet, OID_AUTO, object_idle_tick, + CTLFLAG_RD, DC(object_idle_tick), 0, "Time (in ticks) to cosiderer an object as idle"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, drain_ratio, + CTLFLAG_RD, DC(drain_ratio), 0, "% of dummynet_task() to dedicate to drain routine"); + +/* statistics */ +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, schk_count, + CTLFLAG_RD, DC(schk_count), 0, "Number of schedulers"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, si_count, + CTLFLAG_RD, DC(si_count), 0, "Number of scheduler instances"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, fsk_count, + CTLFLAG_RD, DC(fsk_count), 0, "Number of flowsets"); +SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, queue_count, + CTLFLAG_RD, DC(queue_count), 0, "Number of queues"); +SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt, + CTLFLAG_RD, &io_pkt, 0, + "Number of packets passed to dummynet."); +SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_fast, + CTLFLAG_RD, &io_pkt_fast, 0, + "Number of packets bypassed dummynet scheduler."); +SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_drop, + CTLFLAG_RD, &io_pkt_drop, 0, + "Number of packets dropped by dummynet."); +#undef DC +SYSEND + +#endif + +static void dummynet_send(struct mbuf *); + +/* + * Packets processed by dummynet have an mbuf tag associated with + * them that carries their dummynet state. + * Outside dummynet, only the 'rule' field is relevant, and it must + * be at the beginning of the structure. + */ +struct dn_pkt_tag { + struct ipfw_rule_ref rule; /* matching rule */ + + /* second part, dummynet specific */ + int dn_dir; /* action when packet comes out.*/ + /* see ip_fw_private.h */ + uint64_t output_time; /* when the pkt is due for delivery*/ + struct ifnet *ifp; /* interface, for ip_output */ + struct _ip6dn_args ip6opt; /* XXX ipv6 options */ +}; + +/* + * Return the mbuf tag holding the dummynet state (it should + * be the first one on the list). + */ +static struct dn_pkt_tag * +dn_tag_get(struct mbuf *m) +{ + struct m_tag *mtag = m_tag_first(m); + KASSERT(mtag != NULL && + mtag->m_tag_cookie == MTAG_ABI_COMPAT && + mtag->m_tag_id == PACKET_TAG_DUMMYNET, + ("packet on dummynet queue w/o dummynet tag!")); + return (struct dn_pkt_tag *)(mtag+1); +} + +static inline void +mq_append(struct mq *q, struct mbuf *m) +{ + if (q->head == NULL) + q->head = m; + else + q->tail->m_nextpkt = m; + q->tail = m; + m->m_nextpkt = NULL; +} + +/* + * Dispose a list of packet. Use a functions so if we need to do + * more work, this is a central point to do it. + */ +void dn_free_pkts(struct mbuf *mnext) +{ + struct mbuf *m; + + while ((m = mnext) != NULL) { + mnext = m->m_nextpkt; + FREE_PKT(m); + } +} + +static int +red_drops (struct dn_queue *q, int len) +{ + /* + * RED algorithm + * + * RED calculates the average queue size (avg) using a low-pass filter + * with an exponential weighted (w_q) moving average: + * avg <- (1-w_q) * avg + w_q * q_size + * where q_size is the queue length (measured in bytes or * packets). + * + * If q_size == 0, we compute the idle time for the link, and set + * avg = (1 - w_q)^(idle/s) + * where s is the time needed for transmitting a medium-sized packet. + * + * Now, if avg < min_th the packet is enqueued. + * If avg > max_th the packet is dropped. Otherwise, the packet is + * dropped with probability P function of avg. + */ + + struct dn_fsk *fs = q->fs; + int64_t p_b = 0; + + /* Queue in bytes or packets? */ + uint32_t q_size = (fs->fs.flags & DN_QSIZE_BYTES) ? + q->ni.len_bytes : q->ni.length; + + /* Average queue size estimation. */ + if (q_size != 0) { + /* Queue is not empty, avg <- avg + (q_size - avg) * w_q */ + int diff = SCALE(q_size) - q->avg; + int64_t v = SCALE_MUL((int64_t)diff, (int64_t)fs->w_q); + + q->avg += (int)v; + } else { + /* + * Queue is empty, find for how long the queue has been + * empty and use a lookup table for computing + * (1 - * w_q)^(idle_time/s) where s is the time to send a + * (small) packet. + * XXX check wraps... + */ + if (q->avg) { + u_int t = div64((dn_cfg.curr_time - q->q_time), fs->lookup_step); + + q->avg = (t < fs->lookup_depth) ? + SCALE_MUL(q->avg, fs->w_q_lookup[t]) : 0; + } + } + + /* Should i drop? */ + if (q->avg < fs->min_th) { + q->count = -1; + return (0); /* accept packet */ + } + if (q->avg >= fs->max_th) { /* average queue >= max threshold */ + if (fs->fs.flags & DN_IS_GENTLE_RED) { + /* + * According to Gentle-RED, if avg is greater than + * max_th the packet is dropped with a probability + * p_b = c_3 * avg - c_4 + * where c_3 = (1 - max_p) / max_th + * c_4 = 1 - 2 * max_p + */ + p_b = SCALE_MUL((int64_t)fs->c_3, (int64_t)q->avg) - + fs->c_4; + } else { + q->count = -1; + return (1); + } + } else if (q->avg > fs->min_th) { + /* + * We compute p_b using the linear dropping function + * p_b = c_1 * avg - c_2 + * where c_1 = max_p / (max_th - min_th) + * c_2 = max_p * min_th / (max_th - min_th) + */ + p_b = SCALE_MUL((int64_t)fs->c_1, (int64_t)q->avg) - fs->c_2; + } + + if (fs->fs.flags & DN_QSIZE_BYTES) + p_b = div64((p_b * len) , fs->max_pkt_size); + if (++q->count == 0) + q->random = random() & 0xffff; + else { + /* + * q->count counts packets arrived since last drop, so a greater + * value of q->count means a greater packet drop probability. + */ + if (SCALE_MUL(p_b, SCALE((int64_t)q->count)) > q->random) { + q->count = 0; + /* After a drop we calculate a new random value. */ + q->random = random() & 0xffff; + return (1); /* drop */ + } + } + /* End of RED algorithm. */ + + return (0); /* accept */ + +} + +/* + * Enqueue a packet in q, subject to space and queue management policy + * (whose parameters are in q->fs). + * Update stats for the queue and the scheduler. + * Return 0 on success, 1 on drop. The packet is consumed anyways. + */ +int +dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop) +{ + struct dn_fs *f; + struct dn_flow *ni; /* stats for scheduler instance */ + uint64_t len; + + if (q->fs == NULL || q->_si == NULL) { + printf("%s fs %p si %p, dropping\n", + __FUNCTION__, q->fs, q->_si); + FREE_PKT(m); + return 1; + } + f = &(q->fs->fs); + ni = &q->_si->ni; + len = m->m_pkthdr.len; + /* Update statistics, then check reasons to drop pkt. */ + q->ni.tot_bytes += len; + q->ni.tot_pkts++; + ni->tot_bytes += len; + ni->tot_pkts++; + if (drop) + goto drop; + if (f->plr && random() < f->plr) + goto drop; + if (f->flags & DN_IS_RED && red_drops(q, m->m_pkthdr.len)) + goto drop; + if (f->flags & DN_QSIZE_BYTES) { + if (q->ni.len_bytes > f->qsize) + goto drop; + } else if (q->ni.length >= f->qsize) { + goto drop; + } + mq_append(&q->mq, m); + if (q->ni.length == 0) { /* queue was idle */ + dn_cfg.idle_queue--; + if (ni->length == 0) /* scheduler was idle */ + dn_cfg.idle_si--; + } + q->ni.length++; + q->ni.len_bytes += len; + ni->length++; + ni->len_bytes += len; + return 0; + +drop: + io_pkt_drop++; + q->ni.drops++; + ni->drops++; + FREE_PKT(m); + return 1; +} + +/* + * Fetch packets from the delay line which are due now. If there are + * leftover packets, reinsert the delay line in the heap. + * Runs under scheduler lock. + */ +static void +transmit_event(struct mq *q, struct delay_line *dline, uint64_t now) +{ + struct mbuf *m; + struct dn_pkt_tag *pkt = NULL; + + dline->oid.subtype = 0; /* not in heap */ + while ((m = dline->mq.head) != NULL) { + pkt = dn_tag_get(m); + if (!DN_KEY_LEQ(pkt->output_time, now)) + break; + dline->mq.head = m->m_nextpkt; + mq_append(q, m); + } + if (m != NULL) { + dline->oid.subtype = 1; /* in heap */ + heap_insert(&dn_cfg.evheap, pkt->output_time, dline); + } +} + +/* + * Convert the additional MAC overheads/delays into an equivalent + * number of bits for the given data rate. The samples are + * in milliseconds so we need to divide by 1000. + */ +static uint64_t +extra_bits(struct mbuf *m, struct dn_schk *s) +{ + int index; + uint64_t bits; + struct dn_profile *pf = s->profile; + + if (!pf || pf->samples_no == 0) + return 0; + index = random() % pf->samples_no; + bits = div64((uint64_t)pf->samples[index] * s->link.bandwidth, 1000); + if (index >= pf->loss_level) { + struct dn_pkt_tag *dt = dn_tag_get(m); + if (dt) + dt->dn_dir = DIR_DROP; + } + return bits; +} + +/* + * Send traffic from a scheduler instance due by 'now'. + * Return a pointer to the head of the queue. + */ +static struct mbuf * +serve_sched(struct mq *q, struct dn_sch_inst *si, uint64_t now) +{ + struct mq def_q; + struct dn_schk *s = si->sched; + struct mbuf *m = NULL; + int delay_line_idle = (si->dline.mq.head == NULL); + int done, bw; + + if (q == NULL) { + q = &def_q; + q->head = NULL; + } + + bw = s->link.bandwidth; + si->kflags &= ~DN_ACTIVE; + + if (bw > 0) + si->credit += (now - si->sched_time) * bw; + else + si->credit = 0; + si->sched_time = now; + done = 0; + while (si->credit >= 0 && (m = s->fp->dequeue(si)) != NULL) { + uint64_t len_scaled; + + /* + * Some schedulers might want wake up the scheduler later. + * To suppor this the caller returns an mbuf with len < 0 + * this will result in a new wake up of the scheduler + * instance between m->m_pkthdr.len ticks. + */ + if (m->m_pkthdr.len < 0) { + si->kflags |= DN_ACTIVE; + heap_insert(&dn_cfg.evheap, now - m->m_pkthdr.len, si); + if (delay_line_idle && done) + transmit_event(q, &si->dline, now); + return NULL; + } + + /* a regular mbuf received */ + done++; + len_scaled = (bw == 0) ? 0 : hz * + (m->m_pkthdr.len * 8 + extra_bits(m, s)); + si->credit -= len_scaled; + /* Move packet in the delay line */ + dn_tag_get(m)->output_time = dn_cfg.curr_time + s->link.delay; + mq_append(&si->dline.mq, m); + } + + /* + * If credit >= 0 the instance is idle, mark time. + * Otherwise put back in the heap, and adjust the output + * time of the last inserted packet, m, which was too early. + */ + if (si->credit >= 0) { + si->idle_time = now; + } else { + uint64_t t; + KASSERT (bw > 0, ("bw=0 and credit<0 ?")); + t = div64(bw - 1 - si->credit, bw); + if (m) + dn_tag_get(m)->output_time += t; + si->kflags |= DN_ACTIVE; + heap_insert(&dn_cfg.evheap, now + t, si); + } + if (delay_line_idle && done) + transmit_event(q, &si->dline, now); + return q->head; +} + +/* + * Support function to read the TSC (or equivalent). We use this + * high resolution timer to adapt the amount of work done for + * expiring the clock. + * Supports Linux and FreeBSD both i386 and amd64 platform + * Supports OpenWRT mips architecture + * + * SMP no special works is needed in + * - In linux 2.6 timers will always run in the same cpu that have added it.See + * (http://book.opensourceproject.org.cn/kernel/kernel3rd/opensource/0596005652/understandlk-chp-6-sect-5.html) + * - FreeBSD8 has a new callout_reset_on() with specify the cpu on which + * the timer must be run + * - Windows runs dummynet_task() on cpu0. + * + * - Linux 2.4 doesn't assure to run a timer in the same cpu every time. + */ +#ifdef HAVE_TSC +uint64_t +readTSC (void) +{ + uint64_t a=0; + +#ifdef __linux__ + /* Linux and openwrt have a macro to read the tsc for i386 and + * amd64. + * Openwrt have patched the kernel and allow use of tsc with mips + * and other platforms + * rdtscll() is a macro defined in include/asm-xxx/msr.h, + * where xxx is the architecture (x86, mips). + */ + rdtscll(a); +#elif defined(_WIN32) + /* Microsoft recommends the use of KeQueryPerformanceCounter() + * insteead of rdtsc(). + */ + KeQueryPerformanceCounter((PLARGE_INTEGER)&a); //XXX not tested! +#elif defined(__FreeBSD__) + /* FreeBSD (i386/amd64) has macro rdtsc() defined in machine/cpufunc.h. + * We could use the macro instead of explicity assembly XXX + */ + return rdtsc(); +#endif + return a; +} +#endif /* HAVE_TSC */ + +/* + * compute avg task period. + * We could do something more complex, possibly. + */ +static void +do_update_cycle(void) +{ +#ifdef HAVE_TSC + uint64_t tmp = readTSC(); +#if defined (LINUX_24) && defined(CONFIG_SMP) + /* on LINUX24 and SMP, we have no guarantees on which cpu runs + * the timer callbacks. If the difference between new and + * old value is negative, we assume that the values come from + * different cpus so we adjust 'new' accordingly. + */ + if (tmp <= dn_cfg.cycle_task_new) + dn_cfg.cycle_task_new = tmp - dn_cfg.cycle_task; +#endif /* !(linux24 && SMP) */ + dn_cfg.cycle_task_old = dn_cfg.cycle_task_new; + dn_cfg.cycle_task_new = tmp; + dn_cfg.cycle_task = dn_cfg.cycle_task_new - dn_cfg.cycle_task_old; + + /* Update the average + * avg = (2^N * avg + new - avg ) / 2^N * avg + * N==4 seems to be a good compromise between clock clock change + * and 'spurious' cycle_task value + */ +#define DN_N 4 + dn_cfg.cycle_task_avg = (dn_cfg.cycle_task_avg << DN_N) + + dn_cfg.cycle_task - dn_cfg.cycle_task_avg; + dn_cfg.cycle_task_avg = dn_cfg.cycle_task_avg >> DN_N; +#undef DN_N + +#endif /* HAVE_TSC */ +} + +static void +do_drain(void) +{ +#ifdef HAVE_TSC + uint64_t dt_max; +#endif + if (!dn_cfg.expire || ++dn_cfg.expire_cycle < dn_cfg.expire) + return; + /* It's time to check if drain routines should be called */ + dn_cfg.expire_cycle = 0; + + dn_cfg.idle_queue_wait = 0; + dn_cfg.idle_si_wait = 0; + /* Do a drain cycle even if there isn't time to do it */ +#ifdef HAVE_TSC + dt_max = dn_cfg.cycle_task_avg * dn_cfg.drain_ratio; +#endif + for (;;) { + int done = 0; + + if (dn_cfg.idle_queue > dn_cfg.expire_object && + dn_cfg.idle_queue_wait < dn_cfg.idle_queue) { + dn_drain_queue(); + done = 1; + } + if (dn_cfg.idle_si > dn_cfg.expire_object && + dn_cfg.idle_si_wait < dn_cfg.idle_si) { + dn_drain_scheduler(); + done = 1; + } + /* time to end ? */ +#ifndef HAVE_TSC + /* If tsc does not exist, do only one drain cycle and exit */ + break; +#else + /* Exit when nothing was done or we have consumed all time */ + if ( (done == 0) || + ((readTSC() - dn_cfg.cycle_task_new) * 100 > dt_max) ) + break; +#endif /* HAVE_TSC */ + } +} + +/* + * The timer handler for dummynet. Time is computed in ticks, but + * but the code is tolerant to the actual rate at which this is called. + * Once complete, the function reschedules itself for the next tick. + */ +void +dummynet_task(void *context, int pending) +{ + struct timeval t; + struct mq q = { NULL, NULL }; /* queue to accumulate results */ + + CURVNET_SET((struct vnet *)context); + + do_update_cycle(); /* compute avg. tick duration */ + + DN_BH_WLOCK(); + + /* Update number of lost(coalesced) ticks. */ + tick_lost += pending - 1; + + getmicrouptime(&t); + /* Last tick duration (usec). */ + tick_last = (t.tv_sec - dn_cfg.prev_t.tv_sec) * 1000000 + + (t.tv_usec - dn_cfg.prev_t.tv_usec); + /* Last tick vs standard tick difference (usec). */ + tick_delta = (tick_last * hz - 1000000) / hz; + /* Accumulated tick difference (usec). */ + tick_delta_sum += tick_delta; + + dn_cfg.prev_t = t; + + /* + * Adjust curr_time if the accumulated tick difference is + * greater than the 'standard' tick. Since curr_time should + * be monotonically increasing, we do positive adjustments + * as required, and throttle curr_time in case of negative + * adjustment. + */ + dn_cfg.curr_time++; + if (tick_delta_sum - tick >= 0) { + int diff = tick_delta_sum / tick; + + dn_cfg.curr_time += diff; + tick_diff += diff; + tick_delta_sum %= tick; + tick_adjustment++; + } else if (tick_delta_sum + tick <= 0) { + dn_cfg.curr_time--; + tick_diff--; + tick_delta_sum += tick; + tick_adjustment++; + } + + /* serve pending events, accumulate in q */ + for (;;) { + struct dn_id *p; /* generic parameter to handler */ + + if (dn_cfg.evheap.elements == 0 || + DN_KEY_LT(dn_cfg.curr_time, HEAP_TOP(&dn_cfg.evheap)->key)) + break; + p = HEAP_TOP(&dn_cfg.evheap)->object; + heap_extract(&dn_cfg.evheap, NULL); + + if (p->type == DN_SCH_I) { + serve_sched(&q, (struct dn_sch_inst *)p, dn_cfg.curr_time); + } else { /* extracted a delay line */ + transmit_event(&q, (struct delay_line *)p, dn_cfg.curr_time); + } + } + do_drain(); + + DN_BH_WUNLOCK(); + dn_reschedule(); + if (q.head != NULL) + dummynet_send(q.head); + CURVNET_RESTORE(); +} + +/* + * forward a chain of packets to the proper destination. + * This runs outside the dummynet lock. + */ +static void +dummynet_send(struct mbuf *m) +{ + struct mbuf *n; + + for (; m != NULL; m = n) { + struct ifnet *ifp = NULL; /* gcc 3.4.6 complains */ + struct m_tag *tag; + int dst; + + n = m->m_nextpkt; + m->m_nextpkt = NULL; + tag = m_tag_first(m); + if (tag == NULL) { /* should not happen */ + dst = DIR_DROP; + } else { + struct dn_pkt_tag *pkt = dn_tag_get(m); + /* extract the dummynet info, rename the tag + * to carry reinject info. + */ + dst = pkt->dn_dir; + ifp = pkt->ifp; + tag->m_tag_cookie = MTAG_IPFW_RULE; + tag->m_tag_id = 0; + } + + switch (dst) { + case DIR_OUT: + SET_HOST_IPLEN(mtod(m, struct ip *)); + ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL); + break ; + + case DIR_IN : + /* put header in network format for ip_input() */ + //SET_NET_IPLEN(mtod(m, struct ip *)); + netisr_dispatch(NETISR_IP, m); + break; + +#ifdef INET6 + case DIR_IN | PROTO_IPV6: + netisr_dispatch(NETISR_IPV6, m); + break; + + case DIR_OUT | PROTO_IPV6: + SET_HOST_IPLEN(mtod(m, struct ip *)); + ip6_output(m, NULL, NULL, IPV6_FORWARDING, NULL, NULL, NULL); + break; +#endif + + case DIR_FWD | PROTO_IFB: /* DN_TO_IFB_FWD: */ + if (bridge_dn_p != NULL) + ((*bridge_dn_p)(m, ifp)); + else + printf("dummynet: if_bridge not loaded\n"); + + break; + + case DIR_IN | PROTO_LAYER2: /* DN_TO_ETH_DEMUX: */ + /* + * The Ethernet code assumes the Ethernet header is + * contiguous in the first mbuf header. + * Insure this is true. + */ + if (m->m_len < ETHER_HDR_LEN && + (m = m_pullup(m, ETHER_HDR_LEN)) == NULL) { + printf("dummynet/ether: pullup failed, " + "dropping packet\n"); + break; + } + ether_demux(m->m_pkthdr.rcvif, m); + break; + + case DIR_OUT | PROTO_LAYER2: /* N_TO_ETH_OUT: */ + ether_output_frame(ifp, m); + break; + + case DIR_DROP: + /* drop the packet after some time */ + FREE_PKT(m); + break; + + default: + printf("dummynet: bad switch %d!\n", dst); + FREE_PKT(m); + break; + } + } +} + +static inline int +tag_mbuf(struct mbuf *m, int dir, struct ip_fw_args *fwa) +{ + struct dn_pkt_tag *dt; + struct m_tag *mtag; + + mtag = m_tag_get(PACKET_TAG_DUMMYNET, + sizeof(*dt), M_NOWAIT | M_ZERO); + if (mtag == NULL) + return 1; /* Cannot allocate packet header. */ + m_tag_prepend(m, mtag); /* Attach to mbuf chain. */ + dt = (struct dn_pkt_tag *)(mtag + 1); + dt->rule = fwa->rule; + dt->rule.info &= IPFW_ONEPASS; /* only keep this info */ + dt->dn_dir = dir; + dt->ifp = fwa->oif; + /* dt->output tame is updated as we move through */ + dt->output_time = dn_cfg.curr_time; + return 0; +} + + +/* + * dummynet hook for packets. + * We use the argument to locate the flowset fs and the sched_set sch + * associated to it. The we apply flow_mask and sched_mask to + * determine the queue and scheduler instances. + * + * dir where shall we send the packet after dummynet. + * *m0 the mbuf with the packet + * ifp the 'ifp' parameter from the caller. + * NULL in ip_input, destination interface in ip_output, + */ +int +dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) +{ + struct mbuf *m = *m0; + struct dn_fsk *fs = NULL; + struct dn_sch_inst *si; + struct dn_queue *q = NULL; /* default */ + + int fs_id = (fwa->rule.info & IPFW_INFO_MASK) + + ((fwa->rule.info & IPFW_IS_PIPE) ? 2*DN_MAX_ID : 0); + DN_BH_WLOCK(); + io_pkt++; + /* we could actually tag outside the lock, but who cares... */ + if (tag_mbuf(m, dir, fwa)) + goto dropit; + if (dn_cfg.busy) { + /* if the upper half is busy doing something expensive, + * lets queue the packet and move forward + */ + mq_append(&dn_cfg.pending, m); + m = *m0 = NULL; /* consumed */ + goto done; /* already active, nothing to do */ + } + /* XXX locate_flowset could be optimised with a direct ref. */ + fs = dn_ht_find(dn_cfg.fshash, fs_id, 0, NULL); + if (fs == NULL) + goto dropit; /* This queue/pipe does not exist! */ + if (fs->sched == NULL) /* should not happen */ + goto dropit; + /* + * If the scheduler supports multiple queues, find the right one + * (otherwise it will be ignored by enqueue). + */ + if (fs->sched->fp->flags & DN_MULTIQUEUE) { + q = ipdn_q_find(fs, &(fwa->f_id)); + if (q == NULL) + goto dropit; + /* The scheduler instance lookup is done only for new queue. + * The callback q_new() will create the scheduler instance + * if needed. + */ + si = q->_si; + } else + si = ipdn_si_find(fs->sched, &(fwa->f_id)); + + if (si == NULL) + goto dropit; + if (fs->sched->fp->enqueue(si, q, m)) { + /* packet was dropped by enqueue() */ + m = *m0 = NULL; + goto dropit; + } + + if (si->kflags & DN_ACTIVE) { + m = *m0 = NULL; /* consumed */ + goto done; /* already active, nothing to do */ + } + + /* compute the initial allowance */ + if (si->idle_time < dn_cfg.curr_time) { + /* Do this only on the first packet on an idle pipe */ + struct dn_link *p = &fs->sched->link; + + si->sched_time = dn_cfg.curr_time; + si->credit = dn_cfg.io_fast ? p->bandwidth : 0; + if (p->burst) { + uint64_t burst = (dn_cfg.curr_time - si->idle_time) * p->bandwidth; + if (burst > p->burst) + burst = p->burst; + si->credit += burst; + } + } + /* pass through scheduler and delay line */ + m = serve_sched(NULL, si, dn_cfg.curr_time); + + /* optimization -- pass it back to ipfw for immediate send */ + /* XXX Don't call dummynet_send() if scheduler return the packet + * just enqueued. This avoid a lock order reversal. + * + */ + if (/*dn_cfg.io_fast &&*/ m == *m0 && (dir & PROTO_LAYER2) == 0 ) { + /* fast io, rename the tag * to carry reinject info. */ + struct m_tag *tag = m_tag_first(m); + + tag->m_tag_cookie = MTAG_IPFW_RULE; + tag->m_tag_id = 0; + io_pkt_fast++; + if (m->m_nextpkt != NULL) { + printf("dummynet: fast io: pkt chain detected!\n"); + m->m_nextpkt = NULL; + } + m = NULL; + } else { + *m0 = NULL; + } +done: + DN_BH_WUNLOCK(); + if (m) + dummynet_send(m); + return 0; + +dropit: + io_pkt_drop++; + DN_BH_WUNLOCK(); + if (m) + FREE_PKT(m); + *m0 = NULL; + return (fs && (fs->fs.flags & DN_NOERROR)) ? 0 : ENOBUFS; +} diff --git a/sys/netinet/ipfw/ip_dn_private.h b/sys/netinet/ipfw/ip_dn_private.h new file mode 100644 index 0000000..ecb4fe2 --- /dev/null +++ b/sys/netinet/ipfw/ip_dn_private.h @@ -0,0 +1,419 @@ +/*- + * Copyright (c) 2010 Luigi Rizzo, Riccardo Panicucci, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * internal dummynet APIs. + * + * $FreeBSD: head/sys/netinet/ipfw/ip_dn_private.h 204591 2010-03-02 17:40:48Z luigi $ + */ + +#ifndef _IP_DN_PRIVATE_H +#define _IP_DN_PRIVATE_H + +/* debugging support + * use ND() to remove debugging, D() to print a line, + * DX(level, ...) to print above a certain level + * If you redefine D() you are expected to redefine all. + */ +#ifndef D +#define ND(fmt, ...) do {} while (0) +#define D1(fmt, ...) do {} while (0) +#define D(fmt, ...) printf("%-10s " fmt "\n", \ + __FUNCTION__, ## __VA_ARGS__) +#define DX(lev, fmt, ...) do { \ + if (dn_cfg.debug > lev) D(fmt, ## __VA_ARGS__); } while (0) +#endif + +MALLOC_DECLARE(M_DUMMYNET); + +#ifndef __linux__ +#define div64(a, b) ((int64_t)(a) / (int64_t)(b)) +#endif + +#define DN_LOCK_INIT() do { \ + mtx_init(&dn_cfg.uh_mtx, "dn_uh", NULL, MTX_DEF); \ + mtx_init(&dn_cfg.bh_mtx, "dn_bh", NULL, MTX_DEF); \ + } while (0) +#define DN_LOCK_DESTROY() do { \ + mtx_destroy(&dn_cfg.uh_mtx); \ + mtx_destroy(&dn_cfg.bh_mtx); \ + } while (0) +#if 0 /* not used yet */ +#define DN_UH_RLOCK() mtx_lock(&dn_cfg.uh_mtx) +#define DN_UH_RUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) +#define DN_UH_WLOCK() mtx_lock(&dn_cfg.uh_mtx) +#define DN_UH_WUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) +#define DN_UH_LOCK_ASSERT() mtx_assert(&dn_cfg.uh_mtx, MA_OWNED) +#endif + +#define DN_BH_RLOCK() mtx_lock(&dn_cfg.uh_mtx) +#define DN_BH_RUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) +#define DN_BH_WLOCK() mtx_lock(&dn_cfg.uh_mtx) +#define DN_BH_WUNLOCK() mtx_unlock(&dn_cfg.uh_mtx) +#define DN_BH_LOCK_ASSERT() mtx_assert(&dn_cfg.uh_mtx, MA_OWNED) + +SLIST_HEAD(dn_schk_head, dn_schk); +SLIST_HEAD(dn_sch_inst_head, dn_sch_inst); +SLIST_HEAD(dn_fsk_head, dn_fsk); +SLIST_HEAD(dn_queue_head, dn_queue); +SLIST_HEAD(dn_alg_head, dn_alg); + +struct mq { /* a basic queue of packets*/ + struct mbuf *head, *tail; +}; + +static inline void +set_oid(struct dn_id *o, int type, int len) +{ + o->type = type; + o->len = len; + o->subtype = 0; +}; + +uint64_t readTSC (void); +/* + * see if tsc (ot other timer) is supported. + * - FreeBSD has rdtsc macro for i386 and amd64 + * - Linux has rdtscll and/or rdtsc (also for openWRT patched kernel source) + * - Windows has KeQueryPerformanceCounter() function that use tsc or other + * timer + */ +#if defined(rdtscll) || defined(rdtsc) || defined(_WIN32) +#define HAVE_TSC +#endif +/* + * configuration and global data for a dummynet instance + * + * When a configuration is modified from userland, 'id' is incremented + * so we can use the value to check for stale pointers. + */ +struct dn_parms { + uint32_t id; /* configuration version */ + + /* defaults (sysctl-accessible) */ + int red_lookup_depth; + int red_avg_pkt_size; + int red_max_pkt_size; + int hash_size; + int max_hash_size; + long byte_limit; /* max queue sizes */ + long slot_limit; + + int io_fast; + int debug; + + /* timekeeping */ + struct timeval prev_t; /* last time dummynet_tick ran */ + struct dn_heap evheap; /* scheduled events */ + + /* counters of objects -- used for reporting space */ + int schk_count; + int si_count; + int fsk_count; + int queue_count; + + /* ticks and other stuff */ + uint64_t curr_time; /* in ticks */ + + /* + * Variables to manage the time spent in the drain routines. + * max_drain is max the fraction of a tick (0..100) to be used + * for draining. + * We also need some variables to store the average number of + * timecounter ticks between calls to the periodic task, etc. + */ + int drain_ratio; + uint64_t cycle_task_new; /* TSC when dummynet_task() starts */ + uint64_t cycle_task_old; /* TSC when prev. dummynet_task() starts */ + uint64_t cycle_task; + uint64_t cycle_task_avg; /* Moving average of cicle_task */ + + /* flowsets and schedulers are in hash tables, with 'hash_size' + * buckets. fshash is looked up at every packet arrival + * so better be generous if we expect many entries. + */ + struct dn_ht *fshash; + struct dn_ht *schedhash; + /* list of flowsets without a scheduler -- use sch_chain */ + struct dn_fsk_head fsu; /* list of unlinked flowsets */ + struct dn_alg_head schedlist; /* list of algorithms */ + + /* Counter of idle objects -- used by drain routine + * We scan when idle_queue (or idle_si) > expire_object. + * The drain routine is called every 'expire' cycles (the counter + * used is expire_cycle). + * We can disable the expire routine by setting expire to 0. + * An object is kept alive for at least object_idle_tick after it + * becomes idle. During the scan, we count the number of objects + * that are idle but not ready in 'idle_si_wait' and 'idle_queue_wait' + */ + int idle_queue; + int idle_queue_wait; /* idle but not expired yet */ + int idle_si; + int idle_si_wait; /* idle but not expired yet */ + uint32_t expire_object; /* threshold for expires */ + uint32_t expire; /* how often to expire */ + uint32_t expire_cycle; + uint32_t object_idle_tick; /* lifetime of objs */ + uint32_t expire_object_examined; /* Burst of object examined */ + + /* drain_fs and drain_sch point to the next bucket to scan when + * draining. + */ + uint32_t drain_fs; + uint32_t drain_sch; + + int init_done; + + /* if the upper half is busy doing something long, + * can set the busy flag and we will enqueue packets in + * a queue for later processing. + */ + int busy; + struct mq pending; + +#ifdef _KERNEL + /* + * This file is normally used in the kernel, unless we do + * some userland tests, in which case we do not need a mtx. + * uh_mtx arbitrates between system calls and also + * protects fshash, schedhash and fsunlinked. + * These structures are readonly for the lower half. + * bh_mtx protects all other structures which may be + * modified upon packet arrivals + */ +#if defined( __linux__ ) || defined( _WIN32 ) + spinlock_t uh_mtx; + spinlock_t bh_mtx; +#else + struct mtx uh_mtx; + struct mtx bh_mtx; +#endif + +#endif /* _KERNEL */ +}; + +/* + * Delay line, contains all packets on output from a link. + * Every scheduler instance has one. + */ +struct delay_line { + struct dn_id oid; + struct dn_sch_inst *si; + struct mq mq; +}; + +/* + * The kernel side of a flowset. It is linked in a hash table + * of flowsets, and in a list of children of their parent scheduler. + * qht is either the queue or (if HAVE_MASK) a hash table queues. + * Note that the mask to use is the (flow_mask|sched_mask), which + * changes as we attach/detach schedulers. So we store it here. + * + * XXX If we want to add scheduler-specific parameters, we need to + * put them in external storage because the scheduler may not be + * available when the fsk is created. + */ +struct dn_fsk { /* kernel side of a flowset */ + struct dn_fs fs; + SLIST_ENTRY(dn_fsk) fsk_next; /* hash chain for fshash */ + + struct ipfw_flow_id fsk_mask; + + /* qht is a hash table of queues, or just a single queue + * a bit in fs.flags tells us which one + */ + struct dn_ht *qht; + struct dn_schk *sched; /* Sched we are linked to */ + SLIST_ENTRY(dn_fsk) sch_chain; /* list of fsk attached to sched */ + + /* bucket index used by drain routine to drain queues for this + * flowset + */ + int drain_bucket; + /* Parameter realted to RED / GRED */ + /* original values are in dn_fs*/ + int w_q ; /* queue weight (scaled) */ + int max_th ; /* maximum threshold for queue (scaled) */ + int min_th ; /* minimum threshold for queue (scaled) */ + int max_p ; /* maximum value for p_b (scaled) */ + + u_int c_1 ; /* max_p/(max_th-min_th) (scaled) */ + u_int c_2 ; /* max_p*min_th/(max_th-min_th) (scaled) */ + u_int c_3 ; /* for GRED, (1-max_p)/max_th (scaled) */ + u_int c_4 ; /* for GRED, 1 - 2*max_p (scaled) */ + u_int * w_q_lookup ; /* lookup table for computing (1-w_q)^t */ + u_int lookup_depth ; /* depth of lookup table */ + int lookup_step ; /* granularity inside the lookup table */ + int lookup_weight ; /* equal to (1-w_q)^t / (1-w_q)^(t+1) */ + int avg_pkt_size ; /* medium packet size */ + int max_pkt_size ; /* max packet size */ +}; + +/* + * A queue is created as a child of a flowset unless it belongs to + * a !MULTIQUEUE scheduler. It is normally in a hash table in the + * flowset. fs always points to the parent flowset. + * si normally points to the sch_inst, unless the flowset has been + * detached from the scheduler -- in this case si == NULL and we + * should not enqueue. + */ +struct dn_queue { + struct dn_flow ni; /* oid, flow_id, stats */ + struct mq mq; /* packets queue */ + struct dn_sch_inst *_si; /* owner scheduler instance */ + SLIST_ENTRY(dn_queue) q_next; /* hash chain list for qht */ + struct dn_fsk *fs; /* parent flowset. */ + + /* RED parameters */ + int avg; /* average queue length est. (scaled) */ + int count; /* arrivals since last RED drop */ + int random; /* random value (scaled) */ + uint64_t q_time; /* start of queue idle time */ + +}; + +/* + * The kernel side of a scheduler. Contains the userland config, + * a link, pointer to extra config arguments from command line, + * kernel flags, and a pointer to the scheduler methods. + * It is stored in a hash table, and holds a list of all + * flowsets and scheduler instances. + * XXX sch must be at the beginning, see schk_hash(). + */ +struct dn_schk { + struct dn_sch sch; + struct dn_alg *fp; /* Pointer to scheduler functions */ + struct dn_link link; /* The link, embedded */ + struct dn_profile *profile; /* delay profile, if any */ + struct dn_id *cfg; /* extra config arguments */ + + SLIST_ENTRY(dn_schk) schk_next; /* hash chain for schedhash */ + + struct dn_fsk_head fsk_list; /* all fsk linked to me */ + struct dn_fsk *fs; /* Flowset for !MULTIQUEUE */ + + /* bucket index used by the drain routine to drain the scheduler + * instance for this flowset. + */ + int drain_bucket; + + /* Hash table of all instances (through sch.sched_mask) + * or single instance if no mask. Always valid. + */ + struct dn_ht *siht; +}; + + +/* + * Scheduler instance. + * Contains variables and all queues relative to a this instance. + * This struct is created a runtime. + */ +struct dn_sch_inst { + struct dn_flow ni; /* oid, flowid and stats */ + SLIST_ENTRY(dn_sch_inst) si_next; /* hash chain for siht */ + struct delay_line dline; + struct dn_schk *sched; /* the template */ + int kflags; /* DN_ACTIVE */ + + int64_t credit; /* bits I can transmit (more or less). */ + uint64_t sched_time; /* time link was scheduled in ready_heap */ + uint64_t idle_time; /* start of scheduler instance idle time */ + + /* q_count is the number of queues that this instance is using. + * The counter is incremented or decremented when + * a reference from the queue is created or deleted. + * It is used to make sure that a scheduler instance can be safely + * deleted by the drain routine. + */ + int q_count; + +}; + + +/* kernel-side flags. Linux has DN_DELETE in fcntl.h + */ +enum { + /* 1 and 2 are reserved for the SCAN flags */ + DN_DESTROY = 0x0004, /* destroy */ + DN_DELETE_FS = 0x0008, /* destroy flowset */ + DN_DETACH = 0x0010, + DN_ACTIVE = 0x0020, /* object is in evheap */ + DN_F_DLINE = 0x0040, /* object is a delay line */ + DN_DEL_SAFE = 0x0080, /* delete a queue only if no longer needed + * by scheduler */ + DN_QHT_IS_Q = 0x0100, /* in flowset, qht is a single queue */ +}; + +extern struct dn_parms dn_cfg; +//VNET_DECLARE(struct dn_parms, _base_dn_cfg); +//#define dn_cfg VNET(_base_dn_cfg) + +int dummynet_io(struct mbuf **, int , struct ip_fw_args *); +void dummynet_task(void *context, int pending); +void dn_reschedule(void); + +struct dn_queue *ipdn_q_find(struct dn_fsk *, struct ipfw_flow_id *); +struct dn_sch_inst *ipdn_si_find(struct dn_schk *, struct ipfw_flow_id *); + +/* + * copy_range is a template for requests for ranges of pipes/queues/scheds. + * The number of ranges is variable and can be derived by o.len. + * As a default, we use a small number of entries so that the struct + * fits easily on the stack and is sufficient for most common requests. + */ +#define DEFAULT_RANGES 5 +struct copy_range { + struct dn_id o; + uint32_t r[ 2 * DEFAULT_RANGES ]; +}; + +struct copy_args { + char **start; + char *end; + int flags; + int type; + struct copy_range *extra; /* extra filtering */ +}; + +struct sockopt; +int ip_dummynet_compat(struct sockopt *sopt); +int dummynet_get(struct sockopt *sopt, void **compat); +int dn_c_copy_q (void *_ni, void *arg); +int dn_c_copy_pipe(struct dn_schk *s, struct copy_args *a, int nq); +int dn_c_copy_fs(struct dn_fsk *f, struct copy_args *a, int nq); +int dn_compat_copy_queue(struct copy_args *a, void *_o); +int dn_compat_copy_pipe(struct copy_args *a, void *_o); +int copy_data_helper_compat(void *_o, void *_arg); +int dn_compat_calc_size(void); +int do_config(void *p, int l); + +/* function to drain idle object */ +void dn_drain_scheduler(void); +void dn_drain_queue(void); + +#endif /* _IP_DN_PRIVATE_H */ diff --git a/sys/netinet/ipfw/ip_dummynet.c b/sys/netinet/ipfw/ip_dummynet.c new file mode 100644 index 0000000..7c63a2d --- /dev/null +++ b/sys/netinet/ipfw/ip_dummynet.c @@ -0,0 +1,2396 @@ +/*- + * Copyright (c) 1998-2002,2010 Luigi Rizzo, Universita` di Pisa + * Portions Copyright (c) 2000 Akamba Corp. + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c 203340 2010-02-01 12:06:37Z luigi $"); + +/* + * Configuration and internal object management for dummynet. + */ + +#include "opt_inet6.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* IFNAMSIZ, struct ifaddr, ifq head, lock.h mutex.h */ +#include +#include /* ip_output(), IP_FORWARDING */ +#include +#include + +#include +#include +#include +#include + +/* which objects to copy */ +#define DN_C_LINK 0x01 +#define DN_C_SCH 0x02 +#define DN_C_FLOW 0x04 +#define DN_C_FS 0x08 +#define DN_C_QUEUE 0x10 + +/* we use this argument in case of a schk_new */ +struct schk_new_arg { + struct dn_alg *fp; + struct dn_sch *sch; +}; + +/*---- callout hooks. ----*/ +static struct callout dn_timeout; +static struct task dn_task; +static struct taskqueue *dn_tq = NULL; + +/* dummynet and ipfw_tick can't be static in windows */ +void +dummynet(void * arg) +{ + + (void)arg; /* UNUSED */ + taskqueue_enqueue(dn_tq, &dn_task); +} + +void +dn_reschedule(void) +{ + callout_reset_on(&dn_timeout, 1, dummynet, NULL, 0); +} +/*----- end of callout hooks -----*/ + +/* Return a scheduler descriptor given the type or name. */ +static struct dn_alg * +find_sched_type(int type, char *name) +{ + struct dn_alg *d; + + SLIST_FOREACH(d, &dn_cfg.schedlist, next) { + if (d->type == type || (name && !strcasecmp(d->name, name))) + return d; + } + return NULL; /* not found */ +} + +int +ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg) +{ + int oldv = *v; + const char *op = NULL; + if (dflt < lo) + dflt = lo; + if (dflt > hi) + dflt = hi; + if (oldv < lo) { + *v = dflt; + op = "Bump"; + } else if (oldv > hi) { + *v = hi; + op = "Clamp"; + } else + return *v; + if (op && msg) + printf("%s %s to %d (was %d)\n", op, msg, *v, oldv); + return *v; +} + +/*---- flow_id mask, hash and compare functions ---*/ +/* + * The flow_id includes the 5-tuple, the queue/pipe number + * which we store in the extra area in host order, + * and for ipv6 also the flow_id6. + * XXX see if we want the tos byte (can store in 'flags') + */ +static struct ipfw_flow_id * +flow_id_mask(struct ipfw_flow_id *mask, struct ipfw_flow_id *id) +{ + int is_v6 = IS_IP6_FLOW_ID(id); + + id->dst_port &= mask->dst_port; + id->src_port &= mask->src_port; + id->proto &= mask->proto; + id->extra &= mask->extra; + if (is_v6) { + APPLY_MASK(&id->dst_ip6, &mask->dst_ip6); + APPLY_MASK(&id->src_ip6, &mask->src_ip6); + id->flow_id6 &= mask->flow_id6; + } else { + id->dst_ip &= mask->dst_ip; + id->src_ip &= mask->src_ip; + } + return id; +} + +/* computes an OR of two masks, result in dst and also returned */ +static struct ipfw_flow_id * +flow_id_or(struct ipfw_flow_id *src, struct ipfw_flow_id *dst) +{ + int is_v6 = IS_IP6_FLOW_ID(dst); + + dst->dst_port |= src->dst_port; + dst->src_port |= src->src_port; + dst->proto |= src->proto; + dst->extra |= src->extra; + if (is_v6) { +#define OR_MASK(_d, _s) \ + (_d)->__u6_addr.__u6_addr32[0] |= (_s)->__u6_addr.__u6_addr32[0]; \ + (_d)->__u6_addr.__u6_addr32[1] |= (_s)->__u6_addr.__u6_addr32[1]; \ + (_d)->__u6_addr.__u6_addr32[2] |= (_s)->__u6_addr.__u6_addr32[2]; \ + (_d)->__u6_addr.__u6_addr32[3] |= (_s)->__u6_addr.__u6_addr32[3]; + OR_MASK(&dst->dst_ip6, &src->dst_ip6); + OR_MASK(&dst->src_ip6, &src->src_ip6); +#undef OR_MASK + dst->flow_id6 |= src->flow_id6; + } else { + dst->dst_ip |= src->dst_ip; + dst->src_ip |= src->src_ip; + } + return dst; +} + +static int +nonzero_mask(struct ipfw_flow_id *m) +{ + if (m->dst_port || m->src_port || m->proto || m->extra) + return 1; + if (IS_IP6_FLOW_ID(m)) { + return + m->dst_ip6.__u6_addr.__u6_addr32[0] || + m->dst_ip6.__u6_addr.__u6_addr32[1] || + m->dst_ip6.__u6_addr.__u6_addr32[2] || + m->dst_ip6.__u6_addr.__u6_addr32[3] || + m->src_ip6.__u6_addr.__u6_addr32[0] || + m->src_ip6.__u6_addr.__u6_addr32[1] || + m->src_ip6.__u6_addr.__u6_addr32[2] || + m->src_ip6.__u6_addr.__u6_addr32[3] || + m->flow_id6; + } else { + return m->dst_ip || m->src_ip; + } +} + +/* XXX we may want a better hash function */ +static uint32_t +flow_id_hash(struct ipfw_flow_id *id) +{ + uint32_t i; + + if (IS_IP6_FLOW_ID(id)) { + uint32_t *d = (uint32_t *)&id->dst_ip6; + uint32_t *s = (uint32_t *)&id->src_ip6; + i = (d[0] ) ^ (d[1]) ^ + (d[2] ) ^ (d[3]) ^ + (d[0] >> 15) ^ (d[1] >> 15) ^ + (d[2] >> 15) ^ (d[3] >> 15) ^ + (s[0] << 1) ^ (s[1] << 1) ^ + (s[2] << 1) ^ (s[3] << 1) ^ + (s[0] << 16) ^ (s[1] << 16) ^ + (s[2] << 16) ^ (s[3] << 16) ^ + (id->dst_port << 1) ^ (id->src_port) ^ + (id->extra) ^ + (id->proto ) ^ (id->flow_id6); + } else { + i = (id->dst_ip) ^ (id->dst_ip >> 15) ^ + (id->src_ip << 1) ^ (id->src_ip >> 16) ^ + (id->extra) ^ + (id->dst_port << 1) ^ (id->src_port) ^ (id->proto); + } + return i; +} + +/* Like bcmp, returns 0 if ids match, 1 otherwise. */ +static int +flow_id_cmp(struct ipfw_flow_id *id1, struct ipfw_flow_id *id2) +{ + int is_v6 = IS_IP6_FLOW_ID(id1); + + if (!is_v6) { + if (IS_IP6_FLOW_ID(id2)) + return 1; /* different address families */ + + return (id1->dst_ip == id2->dst_ip && + id1->src_ip == id2->src_ip && + id1->dst_port == id2->dst_port && + id1->src_port == id2->src_port && + id1->proto == id2->proto && + id1->extra == id2->extra) ? 0 : 1; + } + /* the ipv6 case */ + return ( + !bcmp(&id1->dst_ip6,&id2->dst_ip6, sizeof(id1->dst_ip6)) && + !bcmp(&id1->src_ip6,&id2->src_ip6, sizeof(id1->src_ip6)) && + id1->dst_port == id2->dst_port && + id1->src_port == id2->src_port && + id1->proto == id2->proto && + id1->extra == id2->extra && + id1->flow_id6 == id2->flow_id6) ? 0 : 1; +} +/*--------- end of flow-id mask, hash and compare ---------*/ + +/*--- support functions for the qht hashtable ---- + * Entries are hashed by flow-id + */ +static uint32_t +q_hash(uintptr_t key, int flags, void *arg) +{ + /* compute the hash slot from the flow id */ + struct ipfw_flow_id *id = (flags & DNHT_KEY_IS_OBJ) ? + &((struct dn_queue *)key)->ni.fid : + (struct ipfw_flow_id *)key; + + return flow_id_hash(id); +} + +static int +q_match(void *obj, uintptr_t key, int flags, void *arg) +{ + struct dn_queue *o = (struct dn_queue *)obj; + struct ipfw_flow_id *id2; + + if (flags & DNHT_KEY_IS_OBJ) { + /* compare pointers */ + id2 = &((struct dn_queue *)key)->ni.fid; + } else { + id2 = (struct ipfw_flow_id *)key; + } + return (0 == flow_id_cmp(&o->ni.fid, id2)); +} + +/* + * create a new queue instance for the given 'key'. + */ +static void * +q_new(uintptr_t key, int flags, void *arg) +{ + struct dn_queue *q, *template = arg; + struct dn_fsk *fs = template->fs; + int size = sizeof(*q) + fs->sched->fp->q_datalen; + + q = malloc(size, M_DUMMYNET, M_NOWAIT | M_ZERO); + if (q == NULL) { + D("no memory for new queue"); + return NULL; + } + + set_oid(&q->ni.oid, DN_QUEUE, size); + if (fs->fs.flags & DN_QHT_HASH) + q->ni.fid = *(struct ipfw_flow_id *)key; + q->fs = fs; + q->_si = ipdn_si_find(q->fs->sched, &(template->ni.fid)); + if (q->_si == NULL) { + D("no memory for new si"); + free (q, M_DUMMYNET); + return NULL; + } + + q->_si->q_count++; + + if (fs->sched->fp->new_queue) + fs->sched->fp->new_queue(q); + dn_cfg.queue_count++; + dn_cfg.idle_queue++; + return q; +} + +/* + * Notify schedulers that a queue is going away. + * If (flags & DN_DESTROY), also free the packets. + * The version for callbacks is called q_delete_cb(). + * Returns 1 if the queue is NOT deleted (usually when + * the drain routine try to delete a queue that a scheduler + * instance needs), 0 otherwise. + * NOTE: flag DN_DEL_SAFE means that the queue should be + * deleted only if the scheduler no longer needs it + */ +static int +dn_delete_queue(struct dn_queue *q, int flags) +{ + struct dn_fsk *fs = q->fs; + + // D("fs %p si %p\n", fs, q->_si); + /* notify the parent scheduler that the queue is going away */ + if (fs && fs->sched->fp->free_queue) + if (fs->sched->fp->free_queue(q, flags & DN_DEL_SAFE) == 1) + return 1; /* queue NOT deleted */ + q->_si->q_count--; + q->_si = NULL; + if (flags & DN_DESTROY) { + if (q->mq.head) + dn_free_pkts(q->mq.head); + else + dn_cfg.idle_queue--; + bzero(q, sizeof(*q)); // safety + free(q, M_DUMMYNET); + dn_cfg.queue_count--; + } + return 0; +} + +static int +q_delete_cb(void *q, void *arg) +{ + int flags = (int)(uintptr_t)arg; + dn_delete_queue(q, flags); + return (flags & DN_DESTROY) ? DNHT_SCAN_DEL : 0; +} + +/* + * calls dn_delete_queue/q_delete_cb on all queues, + * which notifies the parent scheduler and possibly drains packets. + * flags & DN_DESTROY: drains queues and destroy qht; + */ +static void +qht_delete(struct dn_fsk *fs, int flags) +{ + ND("fs %d start flags %d qht %p", + fs->fs.fs_nr, flags, fs->qht); + if (!fs->qht) + return; + if (fs->fs.flags & DN_QHT_HASH) { + dn_ht_scan(fs->qht, q_delete_cb, (void *)(uintptr_t)flags); + if (flags & DN_DESTROY) { + dn_ht_free(fs->qht, 0); + fs->qht = NULL; + } + } else { + dn_delete_queue((struct dn_queue *)(fs->qht), flags); + if (flags & DN_DESTROY) + fs->qht = NULL; + } +} + +/* + * Find and possibly create the queue for a MULTIQUEUE scheduler. + * We never call it for !MULTIQUEUE (the queue is in the sch_inst). + */ +struct dn_queue * +ipdn_q_find(struct dn_fsk *fs, struct ipfw_flow_id *id) +{ + struct dn_queue template; + + template.fs = fs; + + if (fs->fs.flags & DN_QHT_HASH) { + struct ipfw_flow_id masked_id; + if (fs->qht == NULL) { + fs->qht = dn_ht_init(NULL, fs->fs.buckets, + offsetof(struct dn_queue, q_next), + q_hash, q_match, q_new); + if (fs->qht == NULL) + return NULL; + } + masked_id = *id; + flow_id_mask(&fs->fsk_mask, &masked_id); + return dn_ht_find(fs->qht, (uintptr_t)&masked_id, + DNHT_INSERT, &template); + } else { + if (fs->qht == NULL) + fs->qht = q_new(0, 0, &template); + return (struct dn_queue *)fs->qht; + } +} +/*--- end of queue hash table ---*/ + +/*--- support functions for the sch_inst hashtable ---- + * + * These are hashed by flow-id + */ +static uint32_t +si_hash(uintptr_t key, int flags, void *arg) +{ + /* compute the hash slot from the flow id */ + struct ipfw_flow_id *id = (flags & DNHT_KEY_IS_OBJ) ? + &((struct dn_sch_inst *)key)->ni.fid : + (struct ipfw_flow_id *)key; + + return flow_id_hash(id); +} + +static int +si_match(void *obj, uintptr_t key, int flags, void *arg) +{ + struct dn_sch_inst *o = obj; + struct ipfw_flow_id *id2; + + id2 = (flags & DNHT_KEY_IS_OBJ) ? + &((struct dn_sch_inst *)key)->ni.fid : + (struct ipfw_flow_id *)key; + return flow_id_cmp(&o->ni.fid, id2) == 0; +} + +static int si_reset_credit(void *_si, void *arg); // XXX si_new use this + +/* + * create a new instance for the given 'key' + * Allocate memory for instance, delay line and scheduler private data. + */ +static void * +si_new(uintptr_t key, int flags, void *arg) +{ + struct dn_schk *s = arg; + struct dn_sch_inst *si; + int l = sizeof(*si) + s->fp->si_datalen; + + si = malloc(l, M_DUMMYNET, M_NOWAIT | M_ZERO); + if (si == NULL) + goto error; + + /* Set length only for the part passed up to userland. */ + set_oid(&si->ni.oid, DN_SCH_I, sizeof(struct dn_flow)); + set_oid(&(si->dline.oid), DN_DELAY_LINE, + sizeof(struct delay_line)); + /* mark si and dline as outside the event queue */ + si->ni.oid.id = si->dline.oid.id = -1; + + si->sched = s; + si->dline.si = si; + + if (s->fp->new_sched && s->fp->new_sched(si)) { + D("new_sched error"); + goto error; + } + if (s->sch.flags & DN_HAVE_MASK) + si->ni.fid = *(struct ipfw_flow_id *)key; + + si_reset_credit(si, NULL); + dn_cfg.si_count++; + dn_cfg.idle_si++; + return si; + +error: + if (si) { + bzero(si, sizeof(*si)); // safety + free(si, M_DUMMYNET); + } + return NULL; +} + +/* + * Callback from siht to delete all scheduler instances. Remove + * si and delay line from the system heap, destroy all queues. + * We assume that all flowset have been notified and do not + * point to us anymore. + */ +static int +si_destroy(void *_si, void *arg) +{ + struct dn_sch_inst *si = _si; + struct dn_schk *s = si->sched; + struct delay_line *dl = &si->dline; + + if (dl->oid.subtype) /* remove delay line from event heap */ + heap_extract(&dn_cfg.evheap, dl); + if (si->ni.length == 0) + dn_cfg.idle_si--; + dn_free_pkts(dl->mq.head); /* drain delay line */ + if (si->kflags & DN_ACTIVE) /* remove si from event heap */ + heap_extract(&dn_cfg.evheap, si); + if (s->fp->free_sched) + s->fp->free_sched(si); + bzero(si, sizeof(*si)); /* safety */ + free(si, M_DUMMYNET); + dn_cfg.si_count--; + return DNHT_SCAN_DEL; +} + +/* + * Find the scheduler instance for this packet. If we need to apply + * a mask, do on a local copy of the flow_id to preserve the original. + * Assume siht is always initialized if we have a mask. + */ +struct dn_sch_inst * +ipdn_si_find(struct dn_schk *s, struct ipfw_flow_id *id) +{ + + if (s->sch.flags & DN_HAVE_MASK) { + struct ipfw_flow_id id_t = *id; + flow_id_mask(&s->sch.sched_mask, &id_t); + return dn_ht_find(s->siht, (uintptr_t)&id_t, + DNHT_INSERT, s); + } + if (!s->siht) + s->siht = si_new(0, 0, s); + return (struct dn_sch_inst *)s->siht; +} + +/* callback to flush credit for the scheduler instance */ +static int +si_reset_credit(void *_si, void *arg) +{ + struct dn_sch_inst *si = _si; + struct dn_link *p = &si->sched->link; + + si->idle_time = dn_cfg.curr_time; + si->credit = p->burst + (dn_cfg.io_fast ? p->bandwidth : 0); + return 0; +} + +static void +schk_reset_credit(struct dn_schk *s) +{ + if (s->sch.flags & DN_HAVE_MASK) + dn_ht_scan(s->siht, si_reset_credit, NULL); + else if (s->siht) + si_reset_credit(s->siht, NULL); +} +/*---- end of sch_inst hashtable ---------------------*/ + +/*------------------------------------------------------- + * flowset hash (fshash) support. Entries are hashed by fs_nr. + * New allocations are put in the fsunlinked list, from which + * they are removed when they point to a specific scheduler. + */ +static uint32_t +fsk_hash(uintptr_t key, int flags, void *arg) +{ + uint32_t i = !(flags & DNHT_KEY_IS_OBJ) ? key : + ((struct dn_fsk *)key)->fs.fs_nr; + + return ( (i>>8)^(i>>4)^i ); +} + +static int +fsk_match(void *obj, uintptr_t key, int flags, void *arg) +{ + struct dn_fsk *fs = obj; + int i = !(flags & DNHT_KEY_IS_OBJ) ? key : + ((struct dn_fsk *)key)->fs.fs_nr; + + return (fs->fs.fs_nr == i); +} + +static void * +fsk_new(uintptr_t key, int flags, void *arg) +{ + struct dn_fsk *fs; + + fs = malloc(sizeof(*fs), M_DUMMYNET, M_NOWAIT | M_ZERO); + if (fs) { + set_oid(&fs->fs.oid, DN_FS, sizeof(fs->fs)); + dn_cfg.fsk_count++; + fs->drain_bucket = 0; + SLIST_INSERT_HEAD(&dn_cfg.fsu, fs, sch_chain); + } + return fs; +} + +/* + * detach flowset from its current scheduler. Flags as follows: + * DN_DETACH removes from the fsk_list + * DN_DESTROY deletes individual queues + * DN_DELETE_FS destroys the flowset (otherwise goes in unlinked). + */ +static void +fsk_detach(struct dn_fsk *fs, int flags) +{ + if (flags & DN_DELETE_FS) + flags |= DN_DESTROY; + ND("fs %d from sched %d flags %s %s %s", + fs->fs.fs_nr, fs->fs.sched_nr, + (flags & DN_DELETE_FS) ? "DEL_FS":"", + (flags & DN_DESTROY) ? "DEL":"", + (flags & DN_DETACH) ? "DET":""); + if (flags & DN_DETACH) { /* detach from the list */ + struct dn_fsk_head *h; + h = fs->sched ? &fs->sched->fsk_list : &dn_cfg.fsu; + SLIST_REMOVE(h, fs, dn_fsk, sch_chain); + } + /* Free the RED parameters, they will be recomputed on + * subsequent attach if needed. + */ + if (fs->w_q_lookup) + free(fs->w_q_lookup, M_DUMMYNET); + fs->w_q_lookup = NULL; + qht_delete(fs, flags); + if (fs->sched && fs->sched->fp->free_fsk) + fs->sched->fp->free_fsk(fs); + fs->sched = NULL; + if (flags & DN_DELETE_FS) { + bzero(fs, sizeof(*fs)); /* safety */ + free(fs, M_DUMMYNET); + dn_cfg.fsk_count--; + } else { + SLIST_INSERT_HEAD(&dn_cfg.fsu, fs, sch_chain); + } +} + +/* + * Detach or destroy all flowsets in a list. + * flags specifies what to do: + * DN_DESTROY: flush all queues + * DN_DELETE_FS: DN_DESTROY + destroy flowset + * DN_DELETE_FS implies DN_DESTROY + */ +static void +fsk_detach_list(struct dn_fsk_head *h, int flags) +{ + struct dn_fsk *fs; + int n = 0; /* only for stats */ + + ND("head %p flags %x", h, flags); + while ((fs = SLIST_FIRST(h))) { + SLIST_REMOVE_HEAD(h, sch_chain); + n++; + fsk_detach(fs, flags); + } + ND("done %d flowsets", n); +} + +/* + * called on 'queue X delete' -- removes the flowset from fshash, + * deletes all queues for the flowset, and removes the flowset. + */ +static int +delete_fs(int i, int locked) +{ + struct dn_fsk *fs; + int err = 0; + + if (!locked) + DN_BH_WLOCK(); + fs = dn_ht_find(dn_cfg.fshash, i, DNHT_REMOVE, NULL); + if (dn_ht_entries(dn_cfg.fshash) == 0) { + dn_ht_free(dn_cfg.fshash, 0); + dn_cfg.fshash = NULL; + } + ND("fs %d found %p", i, fs); + if (fs) { + fsk_detach(fs, DN_DETACH | DN_DELETE_FS); + err = 0; + } else + err = EINVAL; + if (!locked) + DN_BH_WUNLOCK(); + return err; +} + +/*----- end of flowset hashtable support -------------*/ + +/*------------------------------------------------------------ + * Scheduler hash. When searching by index we pass sched_nr, + * otherwise we pass struct dn_sch * which is the first field in + * struct dn_schk so we can cast between the two. We use this trick + * because in the create phase (but it should be fixed). + */ +static uint32_t +schk_hash(uintptr_t key, int flags, void *_arg) +{ + uint32_t i = !(flags & DNHT_KEY_IS_OBJ) ? key : + ((struct dn_schk *)key)->sch.sched_nr; + return ( (i>>8)^(i>>4)^i ); +} + +static int +schk_match(void *obj, uintptr_t key, int flags, void *_arg) +{ + struct dn_schk *s = (struct dn_schk *)obj; + int i = !(flags & DNHT_KEY_IS_OBJ) ? key : + ((struct dn_schk *)key)->sch.sched_nr; + return (s->sch.sched_nr == i); +} + +/* + * Create the entry and intialize with the sched hash if needed. + * Leave s->fp unset so we can tell whether a dn_ht_find() returns + * a new object or a previously existing one. + */ +static void * +schk_new(uintptr_t key, int flags, void *arg) +{ + struct schk_new_arg *a = arg; + struct dn_schk *s; + int l = sizeof(*s) +a->fp->schk_datalen; + + s = malloc(l, M_DUMMYNET, M_NOWAIT | M_ZERO); + if (s == NULL) + return NULL; + set_oid(&s->link.oid, DN_LINK, sizeof(s->link)); + s->sch = *a->sch; // copy initial values + s->link.link_nr = s->sch.sched_nr; + SLIST_INIT(&s->fsk_list); + /* initialize the hash table or create the single instance */ + s->fp = a->fp; /* si_new needs this */ + s->drain_bucket = 0; + if (s->sch.flags & DN_HAVE_MASK) { + s->siht = dn_ht_init(NULL, s->sch.buckets, + offsetof(struct dn_sch_inst, si_next), + si_hash, si_match, si_new); + if (s->siht == NULL) { + free(s, M_DUMMYNET); + return NULL; + } + } + s->fp = NULL; /* mark as a new scheduler */ + dn_cfg.schk_count++; + return s; +} + +/* + * Callback for sched delete. Notify all attached flowsets to + * detach from the scheduler, destroy the internal flowset, and + * all instances. The scheduler goes away too. + * arg is 0 (only detach flowsets and destroy instances) + * DN_DESTROY (detach & delete queues, delete schk) + * or DN_DELETE_FS (delete queues and flowsets, delete schk) + */ +static int +schk_delete_cb(void *obj, void *arg) +{ + struct dn_schk *s = obj; +#if 0 + int a = (int)arg; + ND("sched %d arg %s%s", + s->sch.sched_nr, + a&DN_DESTROY ? "DEL ":"", + a&DN_DELETE_FS ? "DEL_FS":""); +#endif + fsk_detach_list(&s->fsk_list, arg ? DN_DESTROY : 0); + /* no more flowset pointing to us now */ + if (s->sch.flags & DN_HAVE_MASK) { + dn_ht_scan(s->siht, si_destroy, NULL); + dn_ht_free(s->siht, 0); + } + else if (s->siht) + si_destroy(s->siht, NULL); + if (s->profile) { + free(s->profile, M_DUMMYNET); + s->profile = NULL; + } + s->siht = NULL; + if (s->fp->destroy) + s->fp->destroy(s); + bzero(s, sizeof(*s)); // safety + free(obj, M_DUMMYNET); + dn_cfg.schk_count--; + return DNHT_SCAN_DEL; +} + +/* + * called on a 'sched X delete' command. Deletes a single scheduler. + * This is done by removing from the schedhash, unlinking all + * flowsets and deleting their traffic. + */ +static int +delete_schk(int i) +{ + struct dn_schk *s; + + s = dn_ht_find(dn_cfg.schedhash, i, DNHT_REMOVE, NULL); + if (dn_ht_entries(dn_cfg.schedhash) == 0) { + dn_ht_free(dn_cfg.schedhash, 0); + dn_cfg.schedhash = NULL; + } + ND("%d %p", i, s); + if (!s) + return EINVAL; + delete_fs(i + DN_MAX_ID, 1); /* first delete internal fs */ + /* then detach flowsets, delete traffic */ + schk_delete_cb(s, (void*)(uintptr_t)DN_DESTROY); + return 0; +} +/*--- end of schk hashtable support ---*/ + +static int +copy_obj(char **start, char *end, void *_o, const char *msg, int i) +{ + struct dn_id *o = _o; + int have = end - *start; + + if (have < o->len || o->len == 0 || o->type == 0) { + D("(WARN) type %d %s %d have %d need %d", + o->type, msg, i, have, o->len); + return 1; + } + ND("type %d %s %d len %d", o->type, msg, i, o->len); + bcopy(_o, *start, o->len); + if (o->type == DN_LINK) { + /* Adjust burst parameter for link */ + struct dn_link *l = (struct dn_link *)*start; + l->burst = div64(l->burst, 8 * hz); + } else if (o->type == DN_SCH) { + /* Set id->id to the number of instances */ + struct dn_schk *s = _o; + struct dn_id *id = (struct dn_id *)(*start); + id->id = (s->sch.flags & DN_HAVE_MASK) ? + dn_ht_entries(s->siht) : (s->siht ? 1 : 0); + } + *start += o->len; + return 0; +} + +/* Specific function to copy a queue. + * Copies only the user-visible part of a queue (which is in + * a struct dn_flow), and sets len accordingly. + */ +static int +copy_obj_q(char **start, char *end, void *_o, const char *msg, int i) +{ + struct dn_id *o = _o; + int have = end - *start; + int len = sizeof(struct dn_flow); /* see above comment */ + + if (have < len || o->len == 0 || o->type != DN_QUEUE) { + D("ERROR type %d %s %d have %d need %d", + o->type, msg, i, have, len); + return 1; + } + ND("type %d %s %d len %d", o->type, msg, i, len); + bcopy(_o, *start, len); + ((struct dn_id*)(*start))->len = len; + *start += len; + return 0; +} + +static int +copy_q_cb(void *obj, void *arg) +{ + struct dn_queue *q = obj; + struct copy_args *a = arg; + struct dn_flow *ni = (struct dn_flow *)(*a->start); + if (copy_obj_q(a->start, a->end, &q->ni, "queue", -1)) + return DNHT_SCAN_END; + ni->oid.type = DN_FLOW; /* override the DN_QUEUE */ + ni->oid.id = si_hash((uintptr_t)&ni->fid, 0, NULL); + return 0; +} + +static int +copy_q(struct copy_args *a, struct dn_fsk *fs, int flags) +{ + if (!fs->qht) + return 0; + if (fs->fs.flags & DN_QHT_HASH) + dn_ht_scan(fs->qht, copy_q_cb, a); + else + copy_q_cb(fs->qht, a); + return 0; +} + +/* + * This routine only copies the initial part of a profile ? XXX + * XXX marta: I think this routine is called to print a summary + * of the pipe configuration and does not need to show the + * profile samples list. + */ +static int +copy_profile(struct copy_args *a, struct dn_profile *p) +{ + int have = a->end - *a->start; + /* XXX here we check for max length */ + int profile_len = sizeof(struct dn_profile); + + if (p == NULL) + return 0; + if (have < profile_len) { + D("error have %d need %d", have, profile_len); + return 1; + } + bcopy(p, *a->start, profile_len); + ((struct dn_id *)(*a->start))->len = profile_len; + *a->start += profile_len; + return 0; +} + +static int +copy_flowset(struct copy_args *a, struct dn_fsk *fs, int flags) +{ + struct dn_fs *ufs = (struct dn_fs *)(*a->start); + if (!fs) + return 0; + ND("flowset %d", fs->fs.fs_nr); + if (copy_obj(a->start, a->end, &fs->fs, "flowset", fs->fs.fs_nr)) + return DNHT_SCAN_END; + ufs->oid.id = (fs->fs.flags & DN_QHT_HASH) ? + dn_ht_entries(fs->qht) : (fs->qht ? 1 : 0); + if (flags) { /* copy queues */ + copy_q(a, fs, 0); + } + return 0; +} + +static int +copy_si_cb(void *obj, void *arg) +{ + struct dn_sch_inst *si = obj; + struct copy_args *a = arg; + struct dn_flow *ni = (struct dn_flow *)(*a->start); + if (copy_obj(a->start, a->end, &si->ni, "inst", + si->sched->sch.sched_nr)) + return DNHT_SCAN_END; + ni->oid.type = DN_FLOW; /* override the DN_SCH_I */ + ni->oid.id = si_hash((uintptr_t)si, DNHT_KEY_IS_OBJ, NULL); + return 0; +} + +static int +copy_si(struct copy_args *a, struct dn_schk *s, int flags) +{ + if (s->sch.flags & DN_HAVE_MASK) + dn_ht_scan(s->siht, copy_si_cb, a); + else if (s->siht) + copy_si_cb(s->siht, a); + return 0; +} + +/* + * compute a list of children of a scheduler and copy up + */ +static int +copy_fsk_list(struct copy_args *a, struct dn_schk *s, int flags) +{ + struct dn_fsk *fs; + struct dn_id *o; + uint32_t *p; + + int n = 0, space = sizeof(*o); + SLIST_FOREACH(fs, &s->fsk_list, sch_chain) { + if (fs->fs.fs_nr < DN_MAX_ID) + n++; + } + space += n * sizeof(uint32_t); + DX(3, "sched %d has %d flowsets", s->sch.sched_nr, n); + if (a->end - *(a->start) < space) + return DNHT_SCAN_END; + o = (struct dn_id *)(*(a->start)); + o->len = space; + *a->start += o->len; + o->type = DN_TEXT; + p = (uint32_t *)(o+1); + SLIST_FOREACH(fs, &s->fsk_list, sch_chain) + if (fs->fs.fs_nr < DN_MAX_ID) + *p++ = fs->fs.fs_nr; + return 0; +} + +static int +copy_data_helper(void *_o, void *_arg) +{ + struct copy_args *a = _arg; + uint32_t *r = a->extra->r; /* start of first range */ + uint32_t *lim; /* first invalid pointer */ + int n; + + lim = (uint32_t *)((char *)(a->extra) + a->extra->o.len); + + if (a->type == DN_LINK || a->type == DN_SCH) { + /* pipe|sched show, we receive a dn_schk */ + struct dn_schk *s = _o; + + n = s->sch.sched_nr; + if (a->type == DN_SCH && n >= DN_MAX_ID) + return 0; /* not a scheduler */ + if (a->type == DN_LINK && n <= DN_MAX_ID) + return 0; /* not a pipe */ + + /* see if the object is within one of our ranges */ + for (;r < lim; r += 2) { + if (n < r[0] || n > r[1]) + continue; + /* Found a valid entry, copy and we are done */ + if (a->flags & DN_C_LINK) { + if (copy_obj(a->start, a->end, + &s->link, "link", n)) + return DNHT_SCAN_END; + if (copy_profile(a, s->profile)) + return DNHT_SCAN_END; + if (copy_flowset(a, s->fs, 0)) + return DNHT_SCAN_END; + } + if (a->flags & DN_C_SCH) { + if (copy_obj(a->start, a->end, + &s->sch, "sched", n)) + return DNHT_SCAN_END; + /* list all attached flowsets */ + if (copy_fsk_list(a, s, 0)) + return DNHT_SCAN_END; + } + if (a->flags & DN_C_FLOW) + copy_si(a, s, 0); + break; + } + } else if (a->type == DN_FS) { + /* queue show, skip internal flowsets */ + struct dn_fsk *fs = _o; + + n = fs->fs.fs_nr; + if (n >= DN_MAX_ID) + return 0; + /* see if the object is within one of our ranges */ + for (;r < lim; r += 2) { + if (n < r[0] || n > r[1]) + continue; + if (copy_flowset(a, fs, 0)) + return DNHT_SCAN_END; + copy_q(a, fs, 0); + break; /* we are done */ + } + } + return 0; +} + +static inline struct dn_schk * +locate_scheduler(int i) +{ + return dn_ht_find(dn_cfg.schedhash, i, 0, NULL); +} + +/* + * red parameters are in fixed point arithmetic. + */ +static int +config_red(struct dn_fsk *fs) +{ + int64_t s, idle, weight, w0; + int t, i; + + fs->w_q = fs->fs.w_q; + fs->max_p = fs->fs.max_p; + ND("called"); + /* Doing stuff that was in userland */ + i = fs->sched->link.bandwidth; + s = (i <= 0) ? 0 : + hz * dn_cfg.red_avg_pkt_size * 8 * SCALE(1) / i; + + idle = div64((s * 3) , fs->w_q); /* s, fs->w_q scaled; idle not scaled */ + fs->lookup_step = div64(idle , dn_cfg.red_lookup_depth); + /* fs->lookup_step not scaled, */ + if (!fs->lookup_step) + fs->lookup_step = 1; + w0 = weight = SCALE(1) - fs->w_q; //fs->w_q scaled + + for (t = fs->lookup_step; t > 1; --t) + weight = SCALE_MUL(weight, w0); + fs->lookup_weight = (int)(weight); // scaled + + /* Now doing stuff that was in kerneland */ + fs->min_th = SCALE(fs->fs.min_th); + fs->max_th = SCALE(fs->fs.max_th); + + fs->c_1 = fs->max_p / (fs->fs.max_th - fs->fs.min_th); + fs->c_2 = SCALE_MUL(fs->c_1, SCALE(fs->fs.min_th)); + + if (fs->fs.flags & DN_IS_GENTLE_RED) { + fs->c_3 = (SCALE(1) - fs->max_p) / fs->fs.max_th; + fs->c_4 = SCALE(1) - 2 * fs->max_p; + } + + /* If the lookup table already exist, free and create it again. */ + if (fs->w_q_lookup) { + free(fs->w_q_lookup, M_DUMMYNET); + fs->w_q_lookup = NULL; + } + if (dn_cfg.red_lookup_depth == 0) { + printf("\ndummynet: net.inet.ip.dummynet.red_lookup_depth" + "must be > 0\n"); + fs->fs.flags &= ~DN_IS_RED; + fs->fs.flags &= ~DN_IS_GENTLE_RED; + return (EINVAL); + } + fs->lookup_depth = dn_cfg.red_lookup_depth; + fs->w_q_lookup = (u_int *)malloc(fs->lookup_depth * sizeof(int), + M_DUMMYNET, M_NOWAIT); + if (fs->w_q_lookup == NULL) { + printf("dummynet: sorry, cannot allocate red lookup table\n"); + fs->fs.flags &= ~DN_IS_RED; + fs->fs.flags &= ~DN_IS_GENTLE_RED; + return(ENOSPC); + } + + /* Fill the lookup table with (1 - w_q)^x */ + fs->w_q_lookup[0] = SCALE(1) - fs->w_q; + + for (i = 1; i < fs->lookup_depth; i++) + fs->w_q_lookup[i] = + SCALE_MUL(fs->w_q_lookup[i - 1], fs->lookup_weight); + + if (dn_cfg.red_avg_pkt_size < 1) + dn_cfg.red_avg_pkt_size = 512; + fs->avg_pkt_size = dn_cfg.red_avg_pkt_size; + if (dn_cfg.red_max_pkt_size < 1) + dn_cfg.red_max_pkt_size = 1500; + fs->max_pkt_size = dn_cfg.red_max_pkt_size; + ND("exit"); + return 0; +} + +/* Scan all flowset attached to this scheduler and update red */ +static void +update_red(struct dn_schk *s) +{ + struct dn_fsk *fs; + SLIST_FOREACH(fs, &s->fsk_list, sch_chain) { + if (fs && (fs->fs.flags & DN_IS_RED)) + config_red(fs); + } +} + +/* attach flowset to scheduler s, possibly requeue */ +static void +fsk_attach(struct dn_fsk *fs, struct dn_schk *s) +{ + ND("remove fs %d from fsunlinked, link to sched %d", + fs->fs.fs_nr, s->sch.sched_nr); + SLIST_REMOVE(&dn_cfg.fsu, fs, dn_fsk, sch_chain); + fs->sched = s; + SLIST_INSERT_HEAD(&s->fsk_list, fs, sch_chain); + if (s->fp->new_fsk) + s->fp->new_fsk(fs); + /* XXX compute fsk_mask */ + fs->fsk_mask = fs->fs.flow_mask; + if (fs->sched->sch.flags & DN_HAVE_MASK) + flow_id_or(&fs->sched->sch.sched_mask, &fs->fsk_mask); + if (fs->qht) { + /* + * we must drain qht according to the old + * type, and reinsert according to the new one. + * The requeue is complex -- in general we need to + * reclassify every single packet. + * For the time being, let's hope qht is never set + * when we reach this point. + */ + D("XXX TODO requeue from fs %d to sch %d", + fs->fs.fs_nr, s->sch.sched_nr); + fs->qht = NULL; + } + /* set the new type for qht */ + if (nonzero_mask(&fs->fsk_mask)) + fs->fs.flags |= DN_QHT_HASH; + else + fs->fs.flags &= ~DN_QHT_HASH; + + /* XXX config_red() can fail... */ + if (fs->fs.flags & DN_IS_RED) + config_red(fs); +} + +/* update all flowsets which may refer to this scheduler */ +static void +update_fs(struct dn_schk *s) +{ + struct dn_fsk *fs, *tmp; + + SLIST_FOREACH_SAFE(fs, &dn_cfg.fsu, sch_chain, tmp) { + if (s->sch.sched_nr != fs->fs.sched_nr) { + D("fs %d for sch %d not %d still unlinked", + fs->fs.fs_nr, fs->fs.sched_nr, + s->sch.sched_nr); + continue; + } + fsk_attach(fs, s); + } +} + +/* + * Configuration -- to preserve backward compatibility we use + * the following scheme (N is 65536) + * NUMBER SCHED LINK FLOWSET + * 1 .. N-1 (1)WFQ (2)WFQ (3)queue + * N+1 .. 2N-1 (4)FIFO (5)FIFO (6)FIFO for sched 1..N-1 + * 2N+1 .. 3N-1 -- -- (7)FIFO for sched N+1..2N-1 + * + * "pipe i config" configures #1, #2 and #3 + * "sched i config" configures #1 and possibly #6 + * "queue i config" configures #3 + * #1 is configured with 'pipe i config' or 'sched i config' + * #2 is configured with 'pipe i config', and created if not + * existing with 'sched i config' + * #3 is configured with 'queue i config' + * #4 is automatically configured after #1, can only be FIFO + * #5 is automatically configured after #2 + * #6 is automatically created when #1 is !MULTIQUEUE, + * and can be updated. + * #7 is automatically configured after #2 + */ + +/* + * configure a link (and its FIFO instance) + */ +static int +config_link(struct dn_link *p, struct dn_id *arg) +{ + int i; + + if (p->oid.len != sizeof(*p)) { + D("invalid pipe len %d", p->oid.len); + return EINVAL; + } + i = p->link_nr; + if (i <= 0 || i >= DN_MAX_ID) + return EINVAL; + /* + * The config program passes parameters as follows: + * bw = bits/second (0 means no limits), + * delay = ms, must be translated into ticks. + * qsize = slots/bytes + * burst ??? + */ + p->delay = (p->delay * hz) / 1000; + /* Scale burst size: bytes -> bits * hz */ + p->burst *= 8 * hz; + + DN_BH_WLOCK(); + /* do it twice, base link and FIFO link */ + for (; i < 2*DN_MAX_ID; i += DN_MAX_ID) { + struct dn_schk *s = locate_scheduler(i); + if (s == NULL) { + DN_BH_WUNLOCK(); + D("sched %d not found", i); + return EINVAL; + } + /* remove profile if exists */ + if (s->profile) { + free(s->profile, M_DUMMYNET); + s->profile = NULL; + } + /* copy all parameters */ + s->link.oid = p->oid; + s->link.link_nr = i; + s->link.delay = p->delay; + if (s->link.bandwidth != p->bandwidth) { + /* XXX bandwidth changes, need to update red params */ + s->link.bandwidth = p->bandwidth; + update_red(s); + } + s->link.burst = p->burst; + schk_reset_credit(s); + } + dn_cfg.id++; + DN_BH_WUNLOCK(); + return 0; +} + +/* + * configure a flowset. Can be called from inside with locked=1, + */ +static struct dn_fsk * +config_fs(struct dn_fs *nfs, struct dn_id *arg, int locked) +{ + int i; + struct dn_fsk *fs; + + if (nfs->oid.len != sizeof(*nfs)) { + D("invalid flowset len %d", nfs->oid.len); + return NULL; + } + i = nfs->fs_nr; + if (i <= 0 || i >= 3*DN_MAX_ID) + return NULL; + ND("flowset %d", i); + /* XXX other sanity checks */ + if (nfs->flags & DN_QSIZE_BYTES) { + ipdn_bound_var(&nfs->qsize, 16384, + 1500, dn_cfg.byte_limit, NULL); // "queue byte size"); + } else { + ipdn_bound_var(&nfs->qsize, 50, + 1, dn_cfg.slot_limit, NULL); // "queue slot size"); + } + if (nfs->flags & DN_HAVE_MASK) { + /* make sure we have some buckets */ + ipdn_bound_var((int *)&nfs->buckets, dn_cfg.hash_size, + 1, dn_cfg.max_hash_size, "flowset buckets"); + } else { + nfs->buckets = 1; /* we only need 1 */ + } + if (!locked) + DN_BH_WLOCK(); + if (dn_cfg.fshash == NULL) + dn_cfg.fshash = dn_ht_init(NULL, dn_cfg.hash_size, + offsetof(struct dn_fsk, fsk_next), + fsk_hash, fsk_match, fsk_new); + do { /* exit with break when done */ + struct dn_schk *s; + int flags = nfs->sched_nr ? DNHT_INSERT : 0; + int j; + int oldc = dn_cfg.fsk_count; + fs = dn_ht_find(dn_cfg.fshash, i, flags, NULL); + if (fs == NULL) { + D("missing sched for flowset %d", i); + break; + } + /* grab some defaults from the existing one */ + if (nfs->sched_nr == 0) /* reuse */ + nfs->sched_nr = fs->fs.sched_nr; + for (j = 0; j < sizeof(nfs->par)/sizeof(nfs->par[0]); j++) { + if (nfs->par[j] == -1) /* reuse */ + nfs->par[j] = fs->fs.par[j]; + } + if (bcmp(&fs->fs, nfs, sizeof(*nfs)) == 0) { + ND("flowset %d unchanged", i); + break; /* no change, nothing to do */ + } + if (oldc != dn_cfg.fsk_count) /* new item */ + dn_cfg.id++; + s = locate_scheduler(nfs->sched_nr); + /* detach from old scheduler if needed, preserving + * queues if we need to reattach. Then update the + * configuration, and possibly attach to the new sched. + */ + DX(2, "fs %d changed sched %d@%p to %d@%p", + fs->fs.fs_nr, + fs->fs.sched_nr, fs->sched, nfs->sched_nr, s); + if (fs->sched) { + int flags = s ? DN_DETACH : (DN_DETACH | DN_DESTROY); + flags |= DN_DESTROY; /* XXX temporary */ + fsk_detach(fs, flags); + } + fs->fs = *nfs; /* copy configuration */ + if (s != NULL) + fsk_attach(fs, s); + } while (0); + if (!locked) + DN_BH_WUNLOCK(); + return fs; +} + +/* + * config/reconfig a scheduler and its FIFO variant. + * For !MULTIQUEUE schedulers, also set up the flowset. + * + * On reconfigurations (detected because s->fp is set), + * detach existing flowsets preserving traffic, preserve link, + * and delete the old scheduler creating a new one. + */ +static int +config_sched(struct dn_sch *_nsch, struct dn_id *arg) +{ + struct dn_schk *s; + struct schk_new_arg a; /* argument for schk_new */ + int i; + struct dn_link p; /* copy of oldlink */ + struct dn_profile *pf = NULL; /* copy of old link profile */ + /* Used to preserv mask parameter */ + struct ipfw_flow_id new_mask; + int new_buckets = 0; + int new_flags = 0; + int pipe_cmd; + int err = ENOMEM; + + a.sch = _nsch; + if (a.sch->oid.len != sizeof(*a.sch)) { + D("bad sched len %d", a.sch->oid.len); + return EINVAL; + } + i = a.sch->sched_nr; + if (i <= 0 || i >= DN_MAX_ID) + return EINVAL; + /* make sure we have some buckets */ + if (a.sch->flags & DN_HAVE_MASK) + ipdn_bound_var((int *)&a.sch->buckets, dn_cfg.hash_size, + 1, dn_cfg.max_hash_size, "sched buckets"); + /* XXX other sanity checks */ + bzero(&p, sizeof(p)); + + pipe_cmd = a.sch->flags & DN_PIPE_CMD; + a.sch->flags &= ~DN_PIPE_CMD; //XXX do it even if is not set? + if (pipe_cmd) { + /* Copy mask parameter */ + new_mask = a.sch->sched_mask; + new_buckets = a.sch->buckets; + new_flags = a.sch->flags; + } + DN_BH_WLOCK(); + if (dn_cfg.schedhash == NULL) + dn_cfg.schedhash = dn_ht_init(NULL, dn_cfg.hash_size, + offsetof(struct dn_schk, schk_next), + schk_hash, schk_match, schk_new); +again: /* run twice, for wfq and fifo */ + /* + * lookup the type. If not supplied, use the previous one + * or default to WF2Q+. Otherwise, return an error. + */ + dn_cfg.id++; + a.fp = find_sched_type(a.sch->oid.subtype, a.sch->name); + if (a.fp != NULL) { + /* found. Lookup or create entry */ + s = dn_ht_find(dn_cfg.schedhash, i, DNHT_INSERT, &a); + } else if (a.sch->oid.subtype == 0 && !a.sch->name[0]) { + /* No type. search existing s* or retry with WF2Q+ */ + s = dn_ht_find(dn_cfg.schedhash, i, 0, &a); + if (s != NULL) { + a.fp = s->fp; + /* Scheduler exists, skip to FIFO scheduler + * if command was pipe config... + */ + if (pipe_cmd) + goto next; + } else { + /* New scheduler, create a wf2q+ with no mask + * if command was pipe config... + */ + if (pipe_cmd) { + /* clear mask parameter */ + bzero(&a.sch->sched_mask, sizeof(new_mask)); + a.sch->buckets = 0; + a.sch->flags &= ~DN_HAVE_MASK; + } + a.sch->oid.subtype = DN_SCHED_WF2QP; + goto again; + } + } else { + D("invalid scheduler type %d %s", + a.sch->oid.subtype, a.sch->name); + err = EINVAL; + goto error; + } + /* normalize name and subtype */ + a.sch->oid.subtype = a.fp->type; + bzero(a.sch->name, sizeof(a.sch->name)); + strlcpy(a.sch->name, a.fp->name, sizeof(a.sch->name)); + if (s == NULL) { + D("cannot allocate scheduler %d", i); + goto error; + } + /* restore existing link if any */ + if (p.link_nr) { + s->link = p; + if (!pf || pf->link_nr != p.link_nr) { /* no saved value */ + s->profile = NULL; /* XXX maybe not needed */ + } else { + size_t pf_size = sizeof(struct dn_profile) + + s->profile->samples_no * sizeof(int); + + s->profile = malloc(pf_size, + M_DUMMYNET, M_NOWAIT | M_ZERO); + if (s->profile == NULL) { + D("cannot allocate profile"); + goto error; //XXX + } + bcopy(pf, s->profile, pf_size); + } + } + p.link_nr = 0; + if (s->fp == NULL) { + DX(2, "sched %d new type %s", i, a.fp->name); + } else if (s->fp != a.fp || + bcmp(a.sch, &s->sch, sizeof(*a.sch)) ) { + /* already existing. */ + DX(2, "sched %d type changed from %s to %s", + i, s->fp->name, a.fp->name); + DX(4, " type/sub %d/%d -> %d/%d", + s->sch.oid.type, s->sch.oid.subtype, + a.sch->oid.type, a.sch->oid.subtype); + if (s->link.link_nr == 0) + D("XXX WARNING link 0 for sched %d", i); + p = s->link; /* preserve link */ + if (s->profile) {/* preserve profile */ + if (!pf) + pf = malloc(sizeof(*pf), + M_DUMMYNET, M_NOWAIT | M_ZERO); + if (pf) /* XXX should issue a warning otherwise */ + bcopy(s->profile, pf, sizeof(*pf)); + } + /* remove from the hash */ + dn_ht_find(dn_cfg.schedhash, i, DNHT_REMOVE, NULL); + /* Detach flowsets, preserve queues. */ + // schk_delete_cb(s, NULL); + // XXX temporarily, kill queues + schk_delete_cb(s, (void *)DN_DESTROY); + goto again; + } else { + DX(4, "sched %d unchanged type %s", i, a.fp->name); + } + /* complete initialization */ + s->sch = *a.sch; + s->fp = a.fp; + s->cfg = arg; + // XXX schk_reset_credit(s); + /* create the internal flowset if needed, + * trying to reuse existing ones if available + */ + if (!(s->fp->flags & DN_MULTIQUEUE) && !s->fs) { + s->fs = dn_ht_find(dn_cfg.fshash, i, 0, NULL); + if (!s->fs) { + struct dn_fs fs; + bzero(&fs, sizeof(fs)); + set_oid(&fs.oid, DN_FS, sizeof(fs)); + fs.fs_nr = i + DN_MAX_ID; + fs.sched_nr = i; + s->fs = config_fs(&fs, NULL, 1 /* locked */); + } + if (!s->fs) { + schk_delete_cb(s, (void *)DN_DESTROY); + D("error creating internal fs for %d", i); + goto error; + } + } + /* call init function after the flowset is created */ + if (s->fp->config) + s->fp->config(s); + update_fs(s); +next: + if (i < DN_MAX_ID) { /* now configure the FIFO instance */ + i += DN_MAX_ID; + if (pipe_cmd) { + /* Restore mask parameter for FIFO */ + a.sch->sched_mask = new_mask; + a.sch->buckets = new_buckets; + a.sch->flags = new_flags; + } else { + /* sched config shouldn't modify the FIFO scheduler */ + if (dn_ht_find(dn_cfg.schedhash, i, 0, &a) != NULL) { + /* FIFO already exist, don't touch it */ + err = 0; /* and this is not an error */ + goto error; + } + } + a.sch->sched_nr = i; + a.sch->oid.subtype = DN_SCHED_FIFO; + bzero(a.sch->name, sizeof(a.sch->name)); + goto again; + } + err = 0; +error: + DN_BH_WUNLOCK(); + if (pf) + free(pf, M_DUMMYNET); + return err; +} + +/* + * attach a profile to a link + */ +static int +config_profile(struct dn_profile *pf, struct dn_id *arg) +{ + struct dn_schk *s; + int i, olen, err = 0; + + if (pf->oid.len < sizeof(*pf)) { + D("short profile len %d", pf->oid.len); + return EINVAL; + } + i = pf->link_nr; + if (i <= 0 || i >= DN_MAX_ID) + return EINVAL; + /* XXX other sanity checks */ + DN_BH_WLOCK(); + for (; i < 2*DN_MAX_ID; i += DN_MAX_ID) { + s = locate_scheduler(i); + + if (s == NULL) { + err = EINVAL; + break; + } + dn_cfg.id++; + /* + * If we had a profile and the new one does not fit, + * or it is deleted, then we need to free memory. + */ + if (s->profile && (pf->samples_no == 0 || + s->profile->oid.len < pf->oid.len)) { + free(s->profile, M_DUMMYNET); + s->profile = NULL; + } + if (pf->samples_no == 0) + continue; + /* + * new profile, possibly allocate memory + * and copy data. + */ + if (s->profile == NULL) + s->profile = malloc(pf->oid.len, + M_DUMMYNET, M_NOWAIT | M_ZERO); + if (s->profile == NULL) { + D("no memory for profile %d", i); + err = ENOMEM; + break; + } + /* preserve larger length XXX double check */ + olen = s->profile->oid.len; + if (olen < pf->oid.len) + olen = pf->oid.len; + bcopy(pf, s->profile, pf->oid.len); + s->profile->oid.len = olen; + } + DN_BH_WUNLOCK(); + return err; +} + +/* + * Delete all objects: + */ +static void +dummynet_flush(void) +{ + + /* delete all schedulers and related links/queues/flowsets */ + dn_ht_scan(dn_cfg.schedhash, schk_delete_cb, + (void *)(uintptr_t)DN_DELETE_FS); + /* delete all remaining (unlinked) flowsets */ + DX(4, "still %d unlinked fs", dn_cfg.fsk_count); + dn_ht_free(dn_cfg.fshash, DNHT_REMOVE); + fsk_detach_list(&dn_cfg.fsu, DN_DELETE_FS); + + dn_ht_free(dn_cfg.schedhash, DNHT_REMOVE); + /* Reinitialize system heap... */ + heap_init(&dn_cfg.evheap, 16, offsetof(struct dn_id, id)); +} + +/* + * Main handler for configuration. We are guaranteed to be called + * with an oid which is at least a dn_id. + * - the first object is the command (config, delete, flush, ...) + * - config_link must be issued after the corresponding config_sched + * - parameters (DN_TXT) for an object must preceed the object + * processed on a config_sched. + */ +int +do_config(void *p, int l) +{ + struct dn_id *next, *o; + int err = 0, err2 = 0; + struct dn_id *arg = NULL; + uintptr_t *a; + + o = p; + if (o->id != DN_API_VERSION) { + D("invalid api version got %d need %d", + o->id, DN_API_VERSION); + return EINVAL; + } + for (; l >= sizeof(*o); o = next) { + struct dn_id *prev = arg; + if (o->len < sizeof(*o) || l < o->len) { + D("bad len o->len %d len %d", o->len, l); + err = EINVAL; + break; + } + l -= o->len; + next = (struct dn_id *)((char *)o + o->len); + err = 0; + switch (o->type) { + default: + D("cmd %d not implemented", o->type); + break; + +#ifdef EMULATE_SYSCTL + /* sysctl emulation. + * if we recognize the command, jump to the correct + * handler and return + */ + case DN_SYSCTL_SET: + err = kesysctl_emu_set(p, l); + return err; +#endif + + case DN_CMD_CONFIG: /* simply a header */ + break; + + case DN_CMD_DELETE: + /* the argument is in the first uintptr_t after o */ + a = (uintptr_t *)(o+1); + if (o->len < sizeof(*o) + sizeof(*a)) { + err = EINVAL; + break; + } + switch (o->subtype) { + case DN_LINK: + /* delete base and derived schedulers */ + DN_BH_WLOCK(); + err = delete_schk(*a); + err2 = delete_schk(*a + DN_MAX_ID); + DN_BH_WUNLOCK(); + if (!err) + err = err2; + break; + + default: + D("invalid delete type %d", + o->subtype); + err = EINVAL; + break; + + case DN_FS: + err = (*a <1 || *a >= DN_MAX_ID) ? + EINVAL : delete_fs(*a, 0) ; + break; + } + break; + + case DN_CMD_FLUSH: + DN_BH_WLOCK(); + dummynet_flush(); + DN_BH_WUNLOCK(); + break; + case DN_TEXT: /* store argument the next block */ + prev = NULL; + arg = o; + break; + case DN_LINK: + err = config_link((struct dn_link *)o, arg); + break; + case DN_PROFILE: + err = config_profile((struct dn_profile *)o, arg); + break; + case DN_SCH: + err = config_sched((struct dn_sch *)o, arg); + break; + case DN_FS: + err = (NULL==config_fs((struct dn_fs *)o, arg, 0)); + break; + } + if (prev) + arg = NULL; + if (err != 0) + break; + } + return err; +} + +static int +compute_space(struct dn_id *cmd, struct copy_args *a) +{ + int x = 0, need = 0; + int profile_size = sizeof(struct dn_profile); + + /* NOTE about compute space: + * NP = dn_cfg.schk_count + * NSI = dn_cfg.si_count + * NF = dn_cfg.fsk_count + * NQ = dn_cfg.queue_count + * - ipfw pipe show + * (NP/2)*(dn_link + dn_sch + dn_id + dn_fs) only half scheduler + * link, scheduler template, flowset + * integrated in scheduler and header + * for flowset list + * (NSI)*(dn_flow) all scheduler instance (includes + * the queue instance) + * - ipfw sched show + * (NP/2)*(dn_link + dn_sch + dn_id + dn_fs) only half scheduler + * link, scheduler template, flowset + * integrated in scheduler and header + * for flowset list + * (NSI * dn_flow) all scheduler instances + * (NF * sizeof(uint_32)) space for flowset list linked to scheduler + * (NQ * dn_queue) all queue [XXXfor now not listed] + * - ipfw queue show + * (NF * dn_fs) all flowset + * (NQ * dn_queue) all queues + */ + switch (cmd->subtype) { + default: + return -1; + /* XXX where do LINK and SCH differ ? */ + /* 'ipfw sched show' could list all queues associated to + * a scheduler. This feature for now is disabled + */ + case DN_LINK: /* pipe show */ + x = DN_C_LINK | DN_C_SCH | DN_C_FLOW; + need += dn_cfg.schk_count * + (sizeof(struct dn_fs) + profile_size) / 2; + need += dn_cfg.fsk_count * sizeof(uint32_t); + break; + case DN_SCH: /* sched show */ + need += dn_cfg.schk_count * + (sizeof(struct dn_fs) + profile_size) / 2; + need += dn_cfg.fsk_count * sizeof(uint32_t); + x = DN_C_SCH | DN_C_LINK | DN_C_FLOW; + break; + case DN_FS: /* queue show */ + x = DN_C_FS | DN_C_QUEUE; + break; + case DN_GET_COMPAT: /* compatibility mode */ + need = dn_compat_calc_size(); + break; + } + a->flags = x; + if (x & DN_C_SCH) { + need += dn_cfg.schk_count * sizeof(struct dn_sch) / 2; + /* NOT also, each fs might be attached to a sched */ + need += dn_cfg.schk_count * sizeof(struct dn_id) / 2; + } + if (x & DN_C_FS) + need += dn_cfg.fsk_count * sizeof(struct dn_fs); + if (x & DN_C_LINK) { + need += dn_cfg.schk_count * sizeof(struct dn_link) / 2; + } + /* + * When exporting a queue to userland, only pass up the + * struct dn_flow, which is the only visible part. + */ + + if (x & DN_C_QUEUE) + need += dn_cfg.queue_count * sizeof(struct dn_flow); + if (x & DN_C_FLOW) + need += dn_cfg.si_count * (sizeof(struct dn_flow)); + return need; +} + +/* + * If compat != NULL dummynet_get is called in compatibility mode. + * *compat will be the pointer to the buffer to pass to ipfw + */ +int +dummynet_get(struct sockopt *sopt, void **compat) +{ + int have, i, need, error; + char *start = NULL, *buf; + size_t sopt_valsize; + struct dn_id *cmd; + struct copy_args a; + struct copy_range r; + int l = sizeof(struct dn_id); + + bzero(&a, sizeof(a)); + bzero(&r, sizeof(r)); + + /* save and restore original sopt_valsize around copyin */ + sopt_valsize = sopt->sopt_valsize; + + cmd = &r.o; + + if (!compat) { + /* copy at least an oid, and possibly a full object */ + error = sooptcopyin(sopt, cmd, sizeof(r), sizeof(*cmd)); + sopt->sopt_valsize = sopt_valsize; + if (error) + goto done; + l = cmd->len; +#ifdef EMULATE_SYSCTL + /* sysctl emulation. */ + if (cmd->type == DN_SYSCTL_GET) + return kesysctl_emu_get(sopt); +#endif + if (l > sizeof(r)) { + /* request larger than default, allocate buffer */ + cmd = malloc(l, M_DUMMYNET, M_WAITOK); + error = sooptcopyin(sopt, cmd, l, l); + sopt->sopt_valsize = sopt_valsize; + if (error) + goto done; + } + } else { /* compatibility */ + error = 0; + cmd->type = DN_CMD_GET; + cmd->len = sizeof(struct dn_id); + cmd->subtype = DN_GET_COMPAT; + // cmd->id = sopt_valsize; + D("compatibility mode"); + } + a.extra = (struct copy_range *)cmd; + if (cmd->len == sizeof(*cmd)) { /* no range, create a default */ + uint32_t *rp = (uint32_t *)(cmd + 1); + cmd->len += 2* sizeof(uint32_t); + rp[0] = 1; + rp[1] = DN_MAX_ID - 1; + if (cmd->subtype == DN_LINK) { + rp[0] += DN_MAX_ID; + rp[1] += DN_MAX_ID; + } + } + /* Count space (under lock) and allocate (outside lock). + * Exit with lock held if we manage to get enough buffer. + * Try a few times then give up. + */ + for (have = 0, i = 0; i < 10; i++) { + DN_BH_WLOCK(); + need = compute_space(cmd, &a); + + /* if there is a range, ignore value from compute_space() */ + if (l > sizeof(*cmd)) + need = sopt_valsize - sizeof(*cmd); + + if (need < 0) { + DN_BH_WUNLOCK(); + error = EINVAL; + goto done; + } + need += sizeof(*cmd); + cmd->id = need; + if (have >= need) + break; + + DN_BH_WUNLOCK(); + if (start) + free(start, M_DUMMYNET); + start = NULL; + if (need > sopt_valsize) + break; + + have = need; + start = malloc(have, M_DUMMYNET, M_WAITOK | M_ZERO); + } + + if (start == NULL) { + if (compat) { + *compat = NULL; + error = 1; // XXX + } else { + error = sooptcopyout(sopt, cmd, sizeof(*cmd)); + } + goto done; + } + ND("have %d:%d sched %d, %d:%d links %d, %d:%d flowsets %d, " + "%d:%d si %d, %d:%d queues %d", + dn_cfg.schk_count, sizeof(struct dn_sch), DN_SCH, + dn_cfg.schk_count, sizeof(struct dn_link), DN_LINK, + dn_cfg.fsk_count, sizeof(struct dn_fs), DN_FS, + dn_cfg.si_count, sizeof(struct dn_flow), DN_SCH_I, + dn_cfg.queue_count, sizeof(struct dn_queue), DN_QUEUE); + sopt->sopt_valsize = sopt_valsize; + a.type = cmd->subtype; + + if (compat == NULL) { + bcopy(cmd, start, sizeof(*cmd)); + ((struct dn_id*)(start))->len = sizeof(struct dn_id); + buf = start + sizeof(*cmd); + } else + buf = start; + a.start = &buf; + a.end = start + have; + /* start copying other objects */ + if (compat) { + a.type = DN_COMPAT_PIPE; + dn_ht_scan(dn_cfg.schedhash, copy_data_helper_compat, &a); + a.type = DN_COMPAT_QUEUE; + dn_ht_scan(dn_cfg.fshash, copy_data_helper_compat, &a); + } else if (a.type == DN_FS) { + dn_ht_scan(dn_cfg.fshash, copy_data_helper, &a); + } else { + dn_ht_scan(dn_cfg.schedhash, copy_data_helper, &a); + } + DN_BH_WUNLOCK(); + + if (compat) { + *compat = start; + sopt->sopt_valsize = buf - start; + /* free() is done by ip_dummynet_compat() */ + start = NULL; //XXX hack + } else { + error = sooptcopyout(sopt, start, buf - start); + } +done: + if (cmd && cmd != &r.o) + free(cmd, M_DUMMYNET); + if (start) + free(start, M_DUMMYNET); + return error; +} + +/* + * Functions to drain idle objects -- see dummynet_task() for some notes + */ +/* Callback called on scheduler instance to delete it if idle */ +static int +drain_scheduler_cb(void *_si, void *_arg) +{ + struct dn_sch_inst *si = _si; + int *arg = _arg; + int empty; + + if ( (*arg++) > dn_cfg.expire_object_examined) + return DNHT_SCAN_END; + + if ((si->kflags & DN_ACTIVE) || si->dline.mq.head != NULL) + return 0; + + /* + * if the scheduler is multiqueue, q_count also reflects empty + * queues that point to si, so we need to check si->q_count to + * tell whether we can remove the instance. + */ + if (si->ni.length == 0) { + /* si was marked as idle: + * remove it or increment idle_si_wait counter + */ + empty = (si->sched->fp->flags & DN_MULTIQUEUE) ? + (si->q_count == 0) : 1; + if (empty && + (si->idle_time < dn_cfg.curr_time - dn_cfg.object_idle_tick)) + return si_destroy(si, NULL); + else + dn_cfg.idle_si_wait++; + } + return 0; +} + +/* Callback called on scheduler to check if it has instances */ +static int +drain_scheduler_sch_cb(void *_s, void *_arg) +{ + struct dn_schk *s = _s; + int *arg = _arg; + + if (s->sch.flags & DN_HAVE_MASK) { + dn_ht_scan_bucket(s->siht, &s->drain_bucket, + drain_scheduler_cb, _arg); + } else { + if (s->siht) { + if (drain_scheduler_cb(s->siht, _arg) == DNHT_SCAN_DEL) + s->siht = NULL; + } + } + return ( (*arg++) > dn_cfg.expire_object_examined) ? DNHT_SCAN_END : 0; +} + +/* Called every tick, try to delete a 'bucket' of scheduler */ +void +dn_drain_scheduler(void) +{ + int arg = 0; + + dn_ht_scan_bucket(dn_cfg.schedhash, (int *)&dn_cfg.drain_sch, + drain_scheduler_sch_cb, &arg); +} + +/* Callback called on queue to delete if it is idle */ +static int +drain_queue_cb(void *_q, void *_arg) +{ + struct dn_queue *q = _q; + int *arg = _arg; + + if ( (*arg++) > dn_cfg.expire_object_examined) + return DNHT_SCAN_END; + + if (q->ni.length == 0) { + if (q->q_time < dn_cfg.curr_time - dn_cfg.object_idle_tick) { + if (dn_delete_queue(q, DN_DESTROY | DN_DEL_SAFE) == 0) + return DNHT_SCAN_DEL; /* queue is deleted */ + } else + dn_cfg.idle_queue_wait++; + } + + return 0; /* queue isn't deleted */ +} + +/* Callback called on flowset used to check if it has queues */ +static int +drain_queue_fs_cb(void *_fs, void *_arg) +{ + struct dn_fsk *fs = _fs; + int *arg = _arg; + + if (fs->fs.flags & DN_QHT_HASH) { + /* Flowset has a hash table for queues */ + dn_ht_scan_bucket(fs->qht, &fs->drain_bucket, + drain_queue_cb, _arg); + } else { + /* No hash table for this flowset, null the pointer + * if the queue is deleted + */ + if (fs->qht) { + if (drain_queue_cb(fs->qht, _arg) == DNHT_SCAN_DEL) + fs->qht = NULL; + } + } + return ( (*arg++) > dn_cfg.expire_object_examined) ? DNHT_SCAN_END : 0; +} + +/* Called every tick, try to delete a 'bucket' of queue */ +void +dn_drain_queue(void) +{ + int arg = 0; + + /* scan a bucket of flowset */ + dn_ht_scan_bucket(dn_cfg.fshash, (int *)&dn_cfg.drain_fs, + drain_queue_fs_cb, &arg); +} + +/* + * Handler for the various dummynet socket options + */ +static int +ip_dn_ctl(struct sockopt *sopt) +{ + void *p = NULL; + int error, l; + + error = priv_check(sopt->sopt_td, PRIV_NETINET_DUMMYNET); + if (error) + return (error); + + /* Disallow sets in really-really secure mode. */ + if (sopt->sopt_dir == SOPT_SET) { + error = securelevel_ge(sopt->sopt_td->td_ucred, 3); + if (error) + return (error); + } + + switch (sopt->sopt_name) { + default : + D("dummynet: unknown option %d", sopt->sopt_name); + error = EINVAL; + break; + + case IP_DUMMYNET_FLUSH: + case IP_DUMMYNET_CONFIGURE: + case IP_DUMMYNET_DEL: /* remove a pipe or queue */ + case IP_DUMMYNET_GET: + D("dummynet: compat option %d", sopt->sopt_name); + error = ip_dummynet_compat(sopt); + break; + + case IP_DUMMYNET3 : + if (sopt->sopt_dir == SOPT_GET) { + error = dummynet_get(sopt, NULL); + break; + } + l = sopt->sopt_valsize; + if (l < sizeof(struct dn_id) || l > 12000) { + D("argument len %d invalid", l); + break; + } + p = malloc(l, M_TEMP, M_WAITOK); // XXX can it fail ? + error = sooptcopyin(sopt, p, l, l); + if (error) + break ; + error = do_config(p, l); + break; + } + + if (p != NULL) + free(p, M_TEMP); + + return error ; +} + + +static void +ip_dn_init(void) +{ + if (dn_cfg.init_done) + return; + printf("DUMMYNET %p with IPv6 initialized (100409)\n", curvnet); + dn_cfg.init_done = 1; + /* Set defaults here. MSVC does not accept initializers, + * and this is also useful for vimages + */ + /* queue limits */ + dn_cfg.slot_limit = 100; /* Foot shooting limit for queues. */ + dn_cfg.byte_limit = 1024 * 1024; + dn_cfg.expire = 1; + + /* RED parameters */ + dn_cfg.red_lookup_depth = 256; /* default lookup table depth */ + dn_cfg.red_avg_pkt_size = 512; /* default medium packet size */ + dn_cfg.red_max_pkt_size = 1500; /* default max packet size */ + + /* hash tables */ + dn_cfg.max_hash_size = 1024; /* max in the hash tables */ + + if (dn_cfg.hash_size == 0) /* XXX or <= 0 ? */ + dn_cfg.hash_size = 64; /* default hash size */ + + /* hash tables for schedulers and flowsets are created + * when the first scheduler/flowset is inserted. + * This is done to allow to use the right hash_size value. + * When the last object is deleted, the table is destroyed, + * so a new hash_size value can be used. + * XXX rehash is not supported for now + */ + dn_cfg.schedhash = NULL; + dn_cfg.fshash = NULL; + /* bucket index to drain object */ + dn_cfg.drain_fs = 0; + dn_cfg.drain_sch = 0; + + if (dn_cfg.expire_object == 0) + dn_cfg.expire_object = 50; + if (dn_cfg.object_idle_tick == 0) + dn_cfg.object_idle_tick = 1000; + if (dn_cfg.expire_object_examined == 0) + dn_cfg.expire_object_examined = 10; + if (dn_cfg.drain_ratio == 0) + dn_cfg.drain_ratio = 1; + + // XXX what if we don't have a tsc ? +#ifdef HAVE_TSC + dn_cfg.cycle_task_new = dn_cfg.cycle_task_old = readTSC(); +#endif + heap_init(&dn_cfg.evheap, 16, offsetof(struct dn_id, id)); + SLIST_INIT(&dn_cfg.fsu); + SLIST_INIT(&dn_cfg.schedlist); + + DN_LOCK_INIT(); + + TASK_INIT(&dn_task, 0, dummynet_task, curvnet); + dn_tq = taskqueue_create_fast("dummynet", M_NOWAIT, + taskqueue_thread_enqueue, &dn_tq); + taskqueue_start_threads(&dn_tq, 1, PI_NET, "dummynet"); + + callout_init(&dn_timeout, CALLOUT_MPSAFE); + callout_reset_on(&dn_timeout, 1, dummynet, NULL, 0); + + /* Initialize curr_time adjustment mechanics. */ + getmicrouptime(&dn_cfg.prev_t); +} + +#ifdef KLD_MODULE +static void +ip_dn_destroy(int last) +{ + callout_drain(&dn_timeout); + + DN_BH_WLOCK(); + if (last) { + ND("removing last instance\n"); + ip_dn_ctl_ptr = NULL; + ip_dn_io_ptr = NULL; + } + + dummynet_flush(); + DN_BH_WUNLOCK(); + taskqueue_drain(dn_tq, &dn_task); + taskqueue_free(dn_tq); + + dn_ht_free(dn_cfg.schedhash, 0); + dn_ht_free(dn_cfg.fshash, 0); + heap_free(&dn_cfg.evheap); + + DN_LOCK_DESTROY(); +} +#endif /* KLD_MODULE */ + +static int +dummynet_modevent(module_t mod, int type, void *data) +{ + + if (type == MOD_LOAD) { + if (ip_dn_io_ptr) { + printf("DUMMYNET already loaded\n"); + return EEXIST ; + } + ip_dn_init(); + ip_dn_ctl_ptr = ip_dn_ctl; + ip_dn_io_ptr = dummynet_io; + return 0; + } else if (type == MOD_UNLOAD) { +#if !defined(KLD_MODULE) + printf("dummynet statically compiled, cannot unload\n"); + return EINVAL ; +#else + ip_dn_destroy(1 /* last */); + return 0; +#endif + } else + return EOPNOTSUPP; +} + +/* modevent helpers for the modules */ +static int +load_dn_sched(struct dn_alg *d) +{ + struct dn_alg *s; + + if (d == NULL) + return 1; /* error */ + ip_dn_init(); /* just in case, we need the lock */ + + /* Check that mandatory funcs exists */ + if (d->enqueue == NULL || d->dequeue == NULL) { + D("missing enqueue or dequeue for %s", d->name); + return 1; + } + + /* Search if scheduler already exists */ + DN_BH_WLOCK(); + SLIST_FOREACH(s, &dn_cfg.schedlist, next) { + if (strcmp(s->name, d->name) == 0) { + D("%s already loaded", d->name); + break; /* scheduler already exists */ + } + } + if (s == NULL) + SLIST_INSERT_HEAD(&dn_cfg.schedlist, d, next); + DN_BH_WUNLOCK(); + D("dn_sched %s %sloaded", d->name, s ? "not ":""); + return s ? 1 : 0; +} + +static int +unload_dn_sched(struct dn_alg *s) +{ + struct dn_alg *tmp, *r; + int err = EINVAL; + + ND("called for %s", s->name); + + DN_BH_WLOCK(); + SLIST_FOREACH_SAFE(r, &dn_cfg.schedlist, next, tmp) { + if (strcmp(s->name, r->name) != 0) + continue; + ND("ref_count = %d", r->ref_count); + err = (r->ref_count != 0) ? EBUSY : 0; + if (err == 0) + SLIST_REMOVE(&dn_cfg.schedlist, r, dn_alg, next); + break; + } + DN_BH_WUNLOCK(); + D("dn_sched %s %sunloaded", s->name, err ? "not ":""); + return err; +} + +int +dn_sched_modevent(module_t mod, int cmd, void *arg) +{ + struct dn_alg *sch = arg; + + if (cmd == MOD_LOAD) + return load_dn_sched(sch); + else if (cmd == MOD_UNLOAD) + return unload_dn_sched(sch); + else + return EINVAL; +} + +static moduledata_t dummynet_mod = { + "dummynet", dummynet_modevent, NULL +}; + +#define DN_SI_SUB SI_SUB_PROTO_IFATTACHDOMAIN +#define DN_MODEV_ORD (SI_ORDER_ANY - 128) /* after ipfw */ +DECLARE_MODULE(dummynet, dummynet_mod, DN_SI_SUB, DN_MODEV_ORD); +MODULE_DEPEND(dummynet, ipfw, 2, 2, 2); +MODULE_VERSION(dummynet, 3); + +/* + * Starting up. Done in order after dummynet_modevent() has been called. + * VNET_SYSINIT is also called for each existing vnet and each new vnet. + */ +//VNET_SYSINIT(vnet_dn_init, DN_SI_SUB, DN_MODEV_ORD+2, ip_dn_init, NULL); + +/* + * Shutdown handlers up shop. These are done in REVERSE ORDER, but still + * after dummynet_modevent() has been called. Not called on reboot. + * VNET_SYSUNINIT is also called for each exiting vnet as it exits. + * or when the module is unloaded. + */ +//VNET_SYSUNINIT(vnet_dn_uninit, DN_SI_SUB, DN_MODEV_ORD+2, ip_dn_destroy, NULL); + +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c new file mode 100644 index 0000000..c95f896 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw2.c @@ -0,0 +1,2491 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw2.c 200601 2009-12-16 10:48:40Z luigi $"); + +/* + * The FreeBSD IP packet firewall, main file + */ + +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_inet.h" +#ifndef INET +#error "IPFIREWALL requires INET" +#endif /* INET */ +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for ETHERTYPE_IP */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef INET6 +#include +#include +#include +#endif + +#include /* XXX for in_cksum */ + +#ifdef MAC +#include +#endif + +/* + * static variables followed by global ones. + * All ipfw global variables are here. + */ + +/* ipfw_vnet_ready controls when we are open for business */ +static VNET_DEFINE(int, ipfw_vnet_ready) = 0; +#define V_ipfw_vnet_ready VNET(ipfw_vnet_ready) + +static VNET_DEFINE(int, fw_deny_unknown_exthdrs); +#define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs) + +#ifdef IPFIREWALL_DEFAULT_TO_ACCEPT +static int default_to_accept = 1; +#else +static int default_to_accept; +#endif + +VNET_DEFINE(int, autoinc_step); + +/* + * Each rule belongs to one of 32 different sets (0..31). + * The variable set_disable contains one bit per set. + * If the bit is set, all rules in the corresponding set + * are disabled. Set RESVD_SET(31) is reserved for the default rule + * and rules that are not deleted by the flush command, + * and CANNOT be disabled. + * Rules in set RESVD_SET can only be deleted individually. + */ +VNET_DEFINE(u_int32_t, set_disable); +#define V_set_disable VNET(set_disable) + +VNET_DEFINE(int, fw_verbose); +/* counter for ipfw_log(NULL...) */ +VNET_DEFINE(u_int64_t, norule_counter); +VNET_DEFINE(int, verbose_limit); + +/* layer3_chain contains the list of rules for layer 3 */ +VNET_DEFINE(struct ip_fw_chain, layer3_chain); + +ipfw_nat_t *ipfw_nat_ptr = NULL; +struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); +ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; +ipfw_nat_cfg_t *ipfw_nat_del_ptr; +ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; +ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; + +#ifdef SYSCTL_NODE +uint32_t dummy_def = IPFW_DEFAULT_RULE; +uint32_t dummy_tables_max = IPFW_TABLES_MAX; + +SYSBEGIN(f3) + +SYSCTL_NODE(_net_inet_ip, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, one_pass, + CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_one_pass), 0, + "Only do a single pass through ipfw when using dummynet(4)"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, autoinc_step, + CTLFLAG_RW, &VNET_NAME(autoinc_step), 0, + "Rule number auto-increment step"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, verbose, + CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_verbose), 0, + "Log matches to ipfw rules"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, verbose_limit, + CTLFLAG_RW, &VNET_NAME(verbose_limit), 0, + "Set upper limit of matches of ipfw rules logged"); +SYSCTL_UINT(_net_inet_ip_fw, OID_AUTO, default_rule, CTLFLAG_RD, + &dummy_def, 0, + "The default/max possible rule number."); +SYSCTL_UINT(_net_inet_ip_fw, OID_AUTO, tables_max, CTLFLAG_RD, + &dummy_tables_max, 0, + "The maximum number of tables."); +SYSCTL_INT(_net_inet_ip_fw, OID_AUTO, default_to_accept, CTLFLAG_RDTUN, + &default_to_accept, 0, + "Make the default rule accept all packets."); +TUNABLE_INT("net.inet.ip.fw.default_to_accept", &default_to_accept); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, static_count, + CTLFLAG_RD, &VNET_NAME(layer3_chain.n_rules), 0, + "Number of static rules"); + +#ifdef INET6 +SYSCTL_DECL(_net_inet6_ip6); +SYSCTL_NODE(_net_inet6_ip6, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); +SYSCTL_VNET_INT(_net_inet6_ip6_fw, OID_AUTO, deny_unknown_exthdrs, + CTLFLAG_RW | CTLFLAG_SECURE, &VNET_NAME(fw_deny_unknown_exthdrs), 0, + "Deny packets with unknown IPv6 Extension Headers"); +#endif /* INET6 */ + +SYSEND + +#endif /* SYSCTL_NODE */ + + +/* + * Some macros used in the various matching options. + * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T + * Other macros just cast void * into the appropriate type + */ +#define L3HDR(T, ip) ((T *)((u_int32_t *)(ip) + (ip)->ip_hl)) +#define TCP(p) ((struct tcphdr *)(p)) +#define SCTP(p) ((struct sctphdr *)(p)) +#define UDP(p) ((struct udphdr *)(p)) +#define ICMP(p) ((struct icmphdr *)(p)) +#define ICMP6(p) ((struct icmp6_hdr *)(p)) + +static __inline int +icmptype_match(struct icmphdr *icmp, ipfw_insn_u32 *cmd) +{ + int type = icmp->icmp_type; + + return (type <= ICMP_MAXTYPE && (cmd->d[0] & (1<icmp_type; + + return (type <= ICMP_MAXTYPE && (TT & (1<arg1 or cmd->d[0]. + * + * We scan options and store the bits we find set. We succeed if + * + * (want_set & ~bits) == 0 && (want_clear & ~bits) == want_clear + * + * The code is sometimes optimized not to store additional variables. + */ + +static int +flags_match(ipfw_insn *cmd, u_int8_t bits) +{ + u_char want_clear; + bits = ~bits; + + if ( ((cmd->arg1 & 0xff) & bits) != 0) + return 0; /* some bits we want set were clear */ + want_clear = (cmd->arg1 >> 8) & 0xff; + if ( (want_clear & bits) != want_clear) + return 0; /* some bits we want clear were set */ + return 1; +} + +static int +ipopts_match(struct ip *ip, ipfw_insn *cmd) +{ + int optlen, bits = 0; + u_char *cp = (u_char *)(ip + 1); + int x = (ip->ip_hl << 2) - sizeof (struct ip); + + for (; x > 0; x -= optlen, cp += optlen) { + int opt = cp[IPOPT_OPTVAL]; + + if (opt == IPOPT_EOL) + break; + if (opt == IPOPT_NOP) + optlen = 1; + else { + optlen = cp[IPOPT_OLEN]; + if (optlen <= 0 || optlen > x) + return 0; /* invalid or truncated */ + } + switch (opt) { + + default: + break; + + case IPOPT_LSRR: + bits |= IP_FW_IPOPT_LSRR; + break; + + case IPOPT_SSRR: + bits |= IP_FW_IPOPT_SSRR; + break; + + case IPOPT_RR: + bits |= IP_FW_IPOPT_RR; + break; + + case IPOPT_TS: + bits |= IP_FW_IPOPT_TS; + break; + } + } + return (flags_match(cmd, bits)); +} + +static int +tcpopts_match(struct tcphdr *tcp, ipfw_insn *cmd) +{ + int optlen, bits = 0; + u_char *cp = (u_char *)(tcp + 1); + int x = (tcp->th_off << 2) - sizeof(struct tcphdr); + + for (; x > 0; x -= optlen, cp += optlen) { + int opt = cp[0]; + if (opt == TCPOPT_EOL) + break; + if (opt == TCPOPT_NOP) + optlen = 1; + else { + optlen = cp[1]; + if (optlen <= 0) + break; + } + + switch (opt) { + + default: + break; + + case TCPOPT_MAXSEG: + bits |= IP_FW_TCPOPT_MSS; + break; + + case TCPOPT_WINDOW: + bits |= IP_FW_TCPOPT_WINDOW; + break; + + case TCPOPT_SACK_PERMITTED: + case TCPOPT_SACK: + bits |= IP_FW_TCPOPT_SACK; + break; + + case TCPOPT_TIMESTAMP: + bits |= IP_FW_TCPOPT_TS; + break; + + } + } + return (flags_match(cmd, bits)); +} + +static int +iface_match(struct ifnet *ifp, ipfw_insn_if *cmd) +{ + if (ifp == NULL) /* no iface with this packet, match fails */ + return 0; + /* Check by name or by IP address */ + if (cmd->name[0] != '\0') { /* match by name */ + /* Check name */ + if (cmd->p.glob) { + if (fnmatch(cmd->name, ifp->if_xname, 0) == 0) + return(1); + } else { + if (strncmp(ifp->if_xname, cmd->name, IFNAMSIZ) == 0) + return(1); + } + } else { +#ifdef __FreeBSD__ /* and OSX too ? */ + struct ifaddr *ia; + + if_addr_rlock(ifp); + TAILQ_FOREACH(ia, &ifp->if_addrhead, ifa_link) { + if (ia->ifa_addr->sa_family != AF_INET) + continue; + if (cmd->p.ip.s_addr == ((struct sockaddr_in *) + (ia->ifa_addr))->sin_addr.s_addr) { + if_addr_runlock(ifp); + return(1); /* match */ + } + } + if_addr_runlock(ifp); +#endif /* __FreeBSD__ */ + } + return(0); /* no match, fail ... */ +} + +/* + * The verify_path function checks if a route to the src exists and + * if it is reachable via ifp (when provided). + * + * The 'verrevpath' option checks that the interface that an IP packet + * arrives on is the same interface that traffic destined for the + * packet's source address would be routed out of. + * The 'versrcreach' option just checks that the source address is + * reachable via any route (except default) in the routing table. + * These two are a measure to block forged packets. This is also + * commonly known as "anti-spoofing" or Unicast Reverse Path + * Forwarding (Unicast RFP) in Cisco-ese. The name of the knobs + * is purposely reminiscent of the Cisco IOS command, + * + * ip verify unicast reverse-path + * ip verify unicast source reachable-via any + * + * which implements the same functionality. But note that the syntax + * is misleading, and the check may be performed on all IP packets + * whether unicast, multicast, or broadcast. + */ +static int +verify_path(struct in_addr src, struct ifnet *ifp, u_int fib) +{ +#ifndef __FreeBSD__ + return 0; +#else + struct route ro; + struct sockaddr_in *dst; + + bzero(&ro, sizeof(ro)); + + dst = (struct sockaddr_in *)&(ro.ro_dst); + dst->sin_family = AF_INET; + dst->sin_len = sizeof(*dst); + dst->sin_addr = src; + in_rtalloc_ign(&ro, 0, fib); + + if (ro.ro_rt == NULL) + return 0; + + /* + * If ifp is provided, check for equality with rtentry. + * We should use rt->rt_ifa->ifa_ifp, instead of rt->rt_ifp, + * in order to pass packets injected back by if_simloop(): + * if useloopback == 1 routing entry (via lo0) for our own address + * may exist, so we need to handle routing assymetry. + */ + if (ifp != NULL && ro.ro_rt->rt_ifa->ifa_ifp != ifp) { + RTFREE(ro.ro_rt); + return 0; + } + + /* if no ifp provided, check if rtentry is not default route */ + if (ifp == NULL && + satosin(rt_key(ro.ro_rt))->sin_addr.s_addr == INADDR_ANY) { + RTFREE(ro.ro_rt); + return 0; + } + + /* or if this is a blackhole/reject route */ + if (ifp == NULL && ro.ro_rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) { + RTFREE(ro.ro_rt); + return 0; + } + + /* found valid route */ + RTFREE(ro.ro_rt); + return 1; +#endif /* __FreeBSD__ */ +} + +#ifdef INET6 +/* + * ipv6 specific rules here... + */ +static __inline int +icmp6type_match (int type, ipfw_insn_u32 *cmd) +{ + return (type <= ICMP6_MAXTYPE && (cmd->d[type/32] & (1<<(type%32)) ) ); +} + +static int +flow6id_match( int curr_flow, ipfw_insn_u32 *cmd ) +{ + int i; + for (i=0; i <= cmd->o.arg1; ++i ) + if (curr_flow == cmd->d[i] ) + return 1; + return 0; +} + +/* support for IP6_*_ME opcodes */ +static int +search_ip6_addr_net (struct in6_addr * ip6_addr) +{ + struct ifnet *mdc; + struct ifaddr *mdc2; + struct in6_ifaddr *fdm; + struct in6_addr copia; + + TAILQ_FOREACH(mdc, &V_ifnet, if_link) { + if_addr_rlock(mdc); + TAILQ_FOREACH(mdc2, &mdc->if_addrhead, ifa_link) { + if (mdc2->ifa_addr->sa_family == AF_INET6) { + fdm = (struct in6_ifaddr *)mdc2; + copia = fdm->ia_addr.sin6_addr; + /* need for leaving scope_id in the sock_addr */ + in6_clearscope(&copia); + if (IN6_ARE_ADDR_EQUAL(ip6_addr, &copia)) { + if_addr_runlock(mdc); + return 1; + } + } + } + if_addr_runlock(mdc); + } + return 0; +} + +static int +verify_path6(struct in6_addr *src, struct ifnet *ifp) +{ + struct route_in6 ro; + struct sockaddr_in6 *dst; + + bzero(&ro, sizeof(ro)); + + dst = (struct sockaddr_in6 * )&(ro.ro_dst); + dst->sin6_family = AF_INET6; + dst->sin6_len = sizeof(*dst); + dst->sin6_addr = *src; + /* XXX MRT 0 for ipv6 at this time */ + rtalloc_ign((struct route *)&ro, 0); + + if (ro.ro_rt == NULL) + return 0; + + /* + * if ifp is provided, check for equality with rtentry + * We should use rt->rt_ifa->ifa_ifp, instead of rt->rt_ifp, + * to support the case of sending packets to an address of our own. + * (where the former interface is the first argument of if_simloop() + * (=ifp), the latter is lo0) + */ + if (ifp != NULL && ro.ro_rt->rt_ifa->ifa_ifp != ifp) { + RTFREE(ro.ro_rt); + return 0; + } + + /* if no ifp provided, check if rtentry is not default route */ + if (ifp == NULL && + IN6_IS_ADDR_UNSPECIFIED(&satosin6(rt_key(ro.ro_rt))->sin6_addr)) { + RTFREE(ro.ro_rt); + return 0; + } + + /* or if this is a blackhole/reject route */ + if (ifp == NULL && ro.ro_rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) { + RTFREE(ro.ro_rt); + return 0; + } + + /* found valid route */ + RTFREE(ro.ro_rt); + return 1; + +} + +static int +is_icmp6_query(int icmp6_type) +{ + if ((icmp6_type <= ICMP6_MAXTYPE) && + (icmp6_type == ICMP6_ECHO_REQUEST || + icmp6_type == ICMP6_MEMBERSHIP_QUERY || + icmp6_type == ICMP6_WRUREQUEST || + icmp6_type == ICMP6_FQDN_QUERY || + icmp6_type == ICMP6_NI_QUERY)) + return (1); + + return (0); +} + +static void +send_reject6(struct ip_fw_args *args, int code, u_int hlen, struct ip6_hdr *ip6) +{ + struct mbuf *m; + + m = args->m; + if (code == ICMP6_UNREACH_RST && args->f_id.proto == IPPROTO_TCP) { + struct tcphdr *tcp; + tcp = (struct tcphdr *)((char *)ip6 + hlen); + + if ((tcp->th_flags & TH_RST) == 0) { + struct mbuf *m0; + m0 = ipfw_send_pkt(args->m, &(args->f_id), + ntohl(tcp->th_seq), ntohl(tcp->th_ack), + tcp->th_flags | TH_RST); + if (m0 != NULL) + ip6_output(m0, NULL, NULL, 0, NULL, NULL, + NULL); + } + FREE_PKT(m); + } else if (code != ICMP6_UNREACH_RST) { /* Send an ICMPv6 unreach. */ +#if 0 + /* + * Unlike above, the mbufs need to line up with the ip6 hdr, + * as the contents are read. We need to m_adj() the + * needed amount. + * The mbuf will however be thrown away so we can adjust it. + * Remember we did an m_pullup on it already so we + * can make some assumptions about contiguousness. + */ + if (args->L3offset) + m_adj(m, args->L3offset); +#endif + icmp6_error(m, ICMP6_DST_UNREACH, code, 0); + } else + FREE_PKT(m); + + args->m = NULL; +} + +#endif /* INET6 */ + + +/* + * sends a reject message, consuming the mbuf passed as an argument. + */ +static void +send_reject(struct ip_fw_args *args, int code, int iplen, struct ip *ip) +{ + +#if 0 + /* XXX When ip is not guaranteed to be at mtod() we will + * need to account for this */ + * The mbuf will however be thrown away so we can adjust it. + * Remember we did an m_pullup on it already so we + * can make some assumptions about contiguousness. + */ + if (args->L3offset) + m_adj(m, args->L3offset); +#endif + if (code != ICMP_REJECT_RST) { /* Send an ICMP unreach */ + /* We need the IP header in host order for icmp_error(). */ + SET_HOST_IPLEN(ip); + icmp_error(args->m, ICMP_UNREACH, code, 0L, 0); + } else if (args->f_id.proto == IPPROTO_TCP) { + struct tcphdr *const tcp = + L3HDR(struct tcphdr, mtod(args->m, struct ip *)); + if ( (tcp->th_flags & TH_RST) == 0) { + struct mbuf *m; + m = ipfw_send_pkt(args->m, &(args->f_id), + ntohl(tcp->th_seq), ntohl(tcp->th_ack), + tcp->th_flags | TH_RST); + if (m != NULL) + ip_output(m, NULL, NULL, 0, NULL, NULL); + } + FREE_PKT(args->m); + } else + FREE_PKT(args->m); + args->m = NULL; +} + +/* + * Support for uid/gid/jail lookup. These tests are expensive + * (because we may need to look into the list of active sockets) + * so we cache the results. ugid_lookupp is 0 if we have not + * yet done a lookup, 1 if we succeeded, and -1 if we tried + * and failed. The function always returns the match value. + * We could actually spare the variable and use *uc, setting + * it to '(void *)check_uidgid if we have no info, NULL if + * we tried and failed, or any other value if successful. + */ +static int +check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, + struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, + u_int16_t src_port, int *ugid_lookupp, + struct ucred **uc, struct inpcb *inp) +{ +#ifndef __FreeBSD__ + return cred_check(insn, proto, oif, + dst_ip, dst_port, src_ip, src_port, + (struct bsd_ucred *)uc, ugid_lookupp, ((struct mbuf *)inp)->m_skb); +#else /* FreeBSD */ + struct inpcbinfo *pi; + int wildcard; + struct inpcb *pcb; + int match; + + /* + * Check to see if the UDP or TCP stack supplied us with + * the PCB. If so, rather then holding a lock and looking + * up the PCB, we can use the one that was supplied. + */ + if (inp && *ugid_lookupp == 0) { + INP_LOCK_ASSERT(inp); + if (inp->inp_socket != NULL) { + *uc = crhold(inp->inp_cred); + *ugid_lookupp = 1; + } else + *ugid_lookupp = -1; + } + /* + * If we have already been here and the packet has no + * PCB entry associated with it, then we can safely + * assume that this is a no match. + */ + if (*ugid_lookupp == -1) + return (0); + if (proto == IPPROTO_TCP) { + wildcard = 0; + pi = &V_tcbinfo; + } else if (proto == IPPROTO_UDP) { + wildcard = INPLOOKUP_WILDCARD; + pi = &V_udbinfo; + } else + return 0; + match = 0; + if (*ugid_lookupp == 0) { + INP_INFO_RLOCK(pi); + pcb = (oif) ? + in_pcblookup_hash(pi, + dst_ip, htons(dst_port), + src_ip, htons(src_port), + wildcard, oif) : + in_pcblookup_hash(pi, + src_ip, htons(src_port), + dst_ip, htons(dst_port), + wildcard, NULL); + if (pcb != NULL) { + *uc = crhold(pcb->inp_cred); + *ugid_lookupp = 1; + } + INP_INFO_RUNLOCK(pi); + if (*ugid_lookupp == 0) { + /* + * We tried and failed, set the variable to -1 + * so we will not try again on this packet. + */ + *ugid_lookupp = -1; + return (0); + } + } + if (insn->o.opcode == O_UID) + match = ((*uc)->cr_uid == (uid_t)insn->d[0]); + else if (insn->o.opcode == O_GID) + match = groupmember((gid_t)insn->d[0], *uc); + else if (insn->o.opcode == O_JAIL) + match = ((*uc)->cr_prison->pr_id == (int)insn->d[0]); + return match; +#endif /* __FreeBSD__ */ +} + +/* + * Helper function to set args with info on the rule after the matching + * one. slot is precise, whereas we guess rule_id as they are + * assigned sequentially. + */ +static inline void +set_match(struct ip_fw_args *args, int slot, + struct ip_fw_chain *chain) +{ + args->rule.chain_id = chain->id; + args->rule.slot = slot + 1; /* we use 0 as a marker */ + args->rule.rule_id = 1 + chain->map[slot]->id; + args->rule.rulenum = chain->map[slot]->rulenum; +} + +/* + * The main check routine for the firewall. + * + * All arguments are in args so we can modify them and return them + * back to the caller. + * + * Parameters: + * + * args->m (in/out) The packet; we set to NULL when/if we nuke it. + * Starts with the IP header. + * args->eh (in) Mac header if present, NULL for layer3 packet. + * args->L3offset Number of bytes bypassed if we came from L2. + * e.g. often sizeof(eh) ** NOTYET ** + * args->oif Outgoing interface, NULL if packet is incoming. + * The incoming interface is in the mbuf. (in) + * args->divert_rule (in/out) + * Skip up to the first rule past this rule number; + * upon return, non-zero port number for divert or tee. + * + * args->rule Pointer to the last matching rule (in/out) + * args->next_hop Socket we are forwarding to (out). + * args->f_id Addresses grabbed from the packet (out) + * args->rule.info a cookie depending on rule action + * + * Return value: + * + * IP_FW_PASS the packet must be accepted + * IP_FW_DENY the packet must be dropped + * IP_FW_DIVERT divert packet, port in m_tag + * IP_FW_TEE tee packet, port in m_tag + * IP_FW_DUMMYNET to dummynet, pipe in args->cookie + * IP_FW_NETGRAPH into netgraph, cookie args->cookie + * args->rule contains the matching rule, + * args->rule.info has additional information. + * + */ +int +ipfw_chk(struct ip_fw_args *args) +{ + + /* + * Local variables holding state while processing a packet: + * + * IMPORTANT NOTE: to speed up the processing of rules, there + * are some assumption on the values of the variables, which + * are documented here. Should you change them, please check + * the implementation of the various instructions to make sure + * that they still work. + * + * args->eh The MAC header. It is non-null for a layer2 + * packet, it is NULL for a layer-3 packet. + * **notyet** + * args->L3offset Offset in the packet to the L3 (IP or equiv.) header. + * + * m | args->m Pointer to the mbuf, as received from the caller. + * It may change if ipfw_chk() does an m_pullup, or if it + * consumes the packet because it calls send_reject(). + * XXX This has to change, so that ipfw_chk() never modifies + * or consumes the buffer. + * ip is the beginning of the ip(4 or 6) header. + * Calculated by adding the L3offset to the start of data. + * (Until we start using L3offset, the packet is + * supposed to start with the ip header). + */ + struct mbuf *m = args->m; + struct ip *ip = mtod(m, struct ip *); + + /* + * For rules which contain uid/gid or jail constraints, cache + * a copy of the users credentials after the pcb lookup has been + * executed. This will speed up the processing of rules with + * these types of constraints, as well as decrease contention + * on pcb related locks. + */ +#ifndef __FreeBSD__ + struct bsd_ucred ucred_cache; +#else + struct ucred *ucred_cache = NULL; +#endif + int ucred_lookup = 0; + + /* + * oif | args->oif If NULL, ipfw_chk has been called on the + * inbound path (ether_input, ip_input). + * If non-NULL, ipfw_chk has been called on the outbound path + * (ether_output, ip_output). + */ + struct ifnet *oif = args->oif; + + int f_pos = 0; /* index of current rule in the array */ + int retval = 0; + + /* + * hlen The length of the IP header. + */ + u_int hlen = 0; /* hlen >0 means we have an IP pkt */ + + /* + * offset The offset of a fragment. offset != 0 means that + * we have a fragment at this offset of an IPv4 packet. + * offset == 0 means that (if this is an IPv4 packet) + * this is the first or only fragment. + * For IPv6 offset == 0 means there is no Fragment Header. + * If offset != 0 for IPv6 always use correct mask to + * get the correct offset because we add IP6F_MORE_FRAG + * to be able to dectect the first fragment which would + * otherwise have offset = 0. + */ + u_short offset = 0; + + /* + * Local copies of addresses. They are only valid if we have + * an IP packet. + * + * proto The protocol. Set to 0 for non-ip packets, + * or to the protocol read from the packet otherwise. + * proto != 0 means that we have an IPv4 packet. + * + * src_port, dst_port port numbers, in HOST format. Only + * valid for TCP and UDP packets. + * + * src_ip, dst_ip ip addresses, in NETWORK format. + * Only valid for IPv4 packets. + */ + uint8_t proto; + uint16_t src_port = 0, dst_port = 0; /* NOTE: host format */ + struct in_addr src_ip, dst_ip; /* NOTE: network format */ + uint16_t iplen=0; + int pktlen; + uint16_t etype = 0; /* Host order stored ether type */ + + /* + * dyn_dir = MATCH_UNKNOWN when rules unchecked, + * MATCH_NONE when checked and not matched (q = NULL), + * MATCH_FORWARD or MATCH_REVERSE otherwise (q != NULL) + */ + int dyn_dir = MATCH_UNKNOWN; + ipfw_dyn_rule *q = NULL; + struct ip_fw_chain *chain = &V_layer3_chain; + + /* + * We store in ulp a pointer to the upper layer protocol header. + * In the ipv4 case this is easy to determine from the header, + * but for ipv6 we might have some additional headers in the middle. + * ulp is NULL if not found. + */ + void *ulp = NULL; /* upper layer protocol pointer. */ + + /* XXX ipv6 variables */ + int is_ipv6 = 0; + uint8_t icmp6_type = 0; + uint16_t ext_hd = 0; /* bits vector for extension header filtering */ + /* end of ipv6 variables */ + + int is_ipv4 = 0; + + int done = 0; /* flag to exit the outer loop */ + + if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready)) + return (IP_FW_PASS); /* accept */ + + dst_ip.s_addr = 0; /* make sure it is initialized */ + src_ip.s_addr = 0; /* make sure it is initialized */ + pktlen = m->m_pkthdr.len; + args->f_id.fib = M_GETFIB(m); /* note mbuf not altered) */ + proto = args->f_id.proto = 0; /* mark f_id invalid */ + /* XXX 0 is a valid proto: IP/IPv6 Hop-by-Hop Option */ + +/* + * PULLUP_TO(len, p, T) makes sure that len + sizeof(T) is contiguous, + * then it sets p to point at the offset "len" in the mbuf. WARNING: the + * pointer might become stale after other pullups (but we never use it + * this way). + */ +#define PULLUP_TO(_len, p, T) \ +do { \ + int x = (_len) + sizeof(T); \ + if ((m)->m_len < x) { \ + args->m = m = m_pullup(m, x); \ + if (m == NULL) \ + goto pullup_failed; \ + } \ + p = (mtod(m, char *) + (_len)); \ +} while (0) + + /* + * if we have an ether header, + */ + if (args->eh) + etype = ntohs(args->eh->ether_type); + + /* Identify IP packets and fill up variables. */ + if (pktlen >= sizeof(struct ip6_hdr) && + (args->eh == NULL || etype == ETHERTYPE_IPV6) && ip->ip_v == 6) { + struct ip6_hdr *ip6 = (struct ip6_hdr *)ip; + is_ipv6 = 1; + args->f_id.addr_type = 6; + hlen = sizeof(struct ip6_hdr); + proto = ip6->ip6_nxt; + + /* Search extension headers to find upper layer protocols */ + while (ulp == NULL) { + switch (proto) { + case IPPROTO_ICMPV6: + PULLUP_TO(hlen, ulp, struct icmp6_hdr); + icmp6_type = ICMP6(ulp)->icmp6_type; + break; + + case IPPROTO_TCP: + PULLUP_TO(hlen, ulp, struct tcphdr); + dst_port = TCP(ulp)->th_dport; + src_port = TCP(ulp)->th_sport; + /* save flags for dynamic rules */ + args->f_id._flags = TCP(ulp)->th_flags; + break; + + case IPPROTO_SCTP: + PULLUP_TO(hlen, ulp, struct sctphdr); + src_port = SCTP(ulp)->src_port; + dst_port = SCTP(ulp)->dest_port; + break; + + case IPPROTO_UDP: + PULLUP_TO(hlen, ulp, struct udphdr); + dst_port = UDP(ulp)->uh_dport; + src_port = UDP(ulp)->uh_sport; + break; + + case IPPROTO_HOPOPTS: /* RFC 2460 */ + PULLUP_TO(hlen, ulp, struct ip6_hbh); + ext_hd |= EXT_HOPOPTS; + hlen += (((struct ip6_hbh *)ulp)->ip6h_len + 1) << 3; + proto = ((struct ip6_hbh *)ulp)->ip6h_nxt; + ulp = NULL; + break; + + case IPPROTO_ROUTING: /* RFC 2460 */ + PULLUP_TO(hlen, ulp, struct ip6_rthdr); + switch (((struct ip6_rthdr *)ulp)->ip6r_type) { + case 0: + ext_hd |= EXT_RTHDR0; + break; + case 2: + ext_hd |= EXT_RTHDR2; + break; + default: + printf("IPFW2: IPV6 - Unknown Routing " + "Header type(%d)\n", + ((struct ip6_rthdr *)ulp)->ip6r_type); + if (V_fw_deny_unknown_exthdrs) + return (IP_FW_DENY); + break; + } + ext_hd |= EXT_ROUTING; + hlen += (((struct ip6_rthdr *)ulp)->ip6r_len + 1) << 3; + proto = ((struct ip6_rthdr *)ulp)->ip6r_nxt; + ulp = NULL; + break; + + case IPPROTO_FRAGMENT: /* RFC 2460 */ + PULLUP_TO(hlen, ulp, struct ip6_frag); + ext_hd |= EXT_FRAGMENT; + hlen += sizeof (struct ip6_frag); + proto = ((struct ip6_frag *)ulp)->ip6f_nxt; + offset = ((struct ip6_frag *)ulp)->ip6f_offlg & + IP6F_OFF_MASK; + /* Add IP6F_MORE_FRAG for offset of first + * fragment to be != 0. */ + offset |= ((struct ip6_frag *)ulp)->ip6f_offlg & + IP6F_MORE_FRAG; + if (offset == 0) { + printf("IPFW2: IPV6 - Invalid Fragment " + "Header\n"); + if (V_fw_deny_unknown_exthdrs) + return (IP_FW_DENY); + break; + } + args->f_id.extra = + ntohl(((struct ip6_frag *)ulp)->ip6f_ident); + ulp = NULL; + break; + + case IPPROTO_DSTOPTS: /* RFC 2460 */ + PULLUP_TO(hlen, ulp, struct ip6_hbh); + ext_hd |= EXT_DSTOPTS; + hlen += (((struct ip6_hbh *)ulp)->ip6h_len + 1) << 3; + proto = ((struct ip6_hbh *)ulp)->ip6h_nxt; + ulp = NULL; + break; + + case IPPROTO_AH: /* RFC 2402 */ + PULLUP_TO(hlen, ulp, struct ip6_ext); + ext_hd |= EXT_AH; + hlen += (((struct ip6_ext *)ulp)->ip6e_len + 2) << 2; + proto = ((struct ip6_ext *)ulp)->ip6e_nxt; + ulp = NULL; + break; + + case IPPROTO_ESP: /* RFC 2406 */ + PULLUP_TO(hlen, ulp, uint32_t); /* SPI, Seq# */ + /* Anything past Seq# is variable length and + * data past this ext. header is encrypted. */ + ext_hd |= EXT_ESP; + break; + + case IPPROTO_NONE: /* RFC 2460 */ + /* + * Packet ends here, and IPv6 header has + * already been pulled up. If ip6e_len!=0 + * then octets must be ignored. + */ + ulp = ip; /* non-NULL to get out of loop. */ + break; + + case IPPROTO_OSPFIGP: + /* XXX OSPF header check? */ + PULLUP_TO(hlen, ulp, struct ip6_ext); + break; + + case IPPROTO_PIM: + /* XXX PIM header check? */ + PULLUP_TO(hlen, ulp, struct pim); + break; + + case IPPROTO_CARP: + PULLUP_TO(hlen, ulp, struct carp_header); + if (((struct carp_header *)ulp)->carp_version != + CARP_VERSION) + return (IP_FW_DENY); + if (((struct carp_header *)ulp)->carp_type != + CARP_ADVERTISEMENT) + return (IP_FW_DENY); + break; + + case IPPROTO_IPV6: /* RFC 2893 */ + PULLUP_TO(hlen, ulp, struct ip6_hdr); + break; + + case IPPROTO_IPV4: /* RFC 2893 */ + PULLUP_TO(hlen, ulp, struct ip); + break; + + default: + printf("IPFW2: IPV6 - Unknown Extension " + "Header(%d), ext_hd=%x\n", proto, ext_hd); + if (V_fw_deny_unknown_exthdrs) + return (IP_FW_DENY); + PULLUP_TO(hlen, ulp, struct ip6_ext); + break; + } /*switch */ + } + ip = mtod(m, struct ip *); + ip6 = (struct ip6_hdr *)ip; + args->f_id.src_ip6 = ip6->ip6_src; + args->f_id.dst_ip6 = ip6->ip6_dst; + args->f_id.src_ip = 0; + args->f_id.dst_ip = 0; + args->f_id.flow_id6 = ntohl(ip6->ip6_flow); + } else if (pktlen >= sizeof(struct ip) && + (args->eh == NULL || etype == ETHERTYPE_IP) && ip->ip_v == 4) { + is_ipv4 = 1; + hlen = ip->ip_hl << 2; + args->f_id.addr_type = 4; + + /* + * Collect parameters into local variables for faster matching. + */ + proto = ip->ip_p; + src_ip = ip->ip_src; + dst_ip = ip->ip_dst; + offset = ntohs(ip->ip_off) & IP_OFFMASK; + iplen = ntohs(ip->ip_len); + pktlen = iplen < pktlen ? iplen : pktlen; + + if (offset == 0) { + switch (proto) { + case IPPROTO_TCP: + PULLUP_TO(hlen, ulp, struct tcphdr); + dst_port = TCP(ulp)->th_dport; + src_port = TCP(ulp)->th_sport; + /* save flags for dynamic rules */ + args->f_id._flags = TCP(ulp)->th_flags; + break; + + case IPPROTO_UDP: + PULLUP_TO(hlen, ulp, struct udphdr); + dst_port = UDP(ulp)->uh_dport; + src_port = UDP(ulp)->uh_sport; + break; + + case IPPROTO_ICMP: + PULLUP_TO(hlen, ulp, struct icmphdr); + //args->f_id.flags = ICMP(ulp)->icmp_type; + break; + + default: + break; + } + } + + ip = mtod(m, struct ip *); + args->f_id.src_ip = ntohl(src_ip.s_addr); + args->f_id.dst_ip = ntohl(dst_ip.s_addr); + } +#undef PULLUP_TO + if (proto) { /* we may have port numbers, store them */ + args->f_id.proto = proto; + args->f_id.src_port = src_port = ntohs(src_port); + args->f_id.dst_port = dst_port = ntohs(dst_port); + } + + IPFW_RLOCK(chain); + if (! V_ipfw_vnet_ready) { /* shutting down, leave NOW. */ + IPFW_RUNLOCK(chain); + return (IP_FW_PASS); /* accept */ + } + if (args->rule.slot) { + /* + * Packet has already been tagged as a result of a previous + * match on rule args->rule aka args->rule_id (PIPE, QUEUE, + * REASS, NETGRAPH, DIVERT/TEE...) + * Validate the slot and continue from the next one + * if still present, otherwise do a lookup. + */ + f_pos = (args->rule.chain_id == chain->id) ? + args->rule.slot : + ipfw_find_rule(chain, args->rule.rulenum, + args->rule.rule_id); + } else { + f_pos = 0; + } + + /* + * Now scan the rules, and parse microinstructions for each rule. + * We have two nested loops and an inner switch. Sometimes we + * need to break out of one or both loops, or re-enter one of + * the loops with updated variables. Loop variables are: + * + * f_pos (outer loop) points to the current rule. + * On output it points to the matching rule. + * done (outer loop) is used as a flag to break the loop. + * l (inner loop) residual length of current rule. + * cmd points to the current microinstruction. + * + * We break the inner loop by setting l=0 and possibly + * cmdlen=0 if we don't want to advance cmd. + * We break the outer loop by setting done=1 + * We can restart the inner loop by setting l>0 and f_pos, f, cmd + * as needed. + */ + for (; f_pos < chain->n_rules; f_pos++) { + ipfw_insn *cmd; + uint32_t tablearg = 0; + int l, cmdlen, skip_or; /* skip rest of OR block */ + struct ip_fw *f; + + f = chain->map[f_pos]; + if (V_set_disable & (1 << f->set) ) + continue; + + skip_or = 0; + for (l = f->cmd_len, cmd = f->cmd ; l > 0 ; + l -= cmdlen, cmd += cmdlen) { + int match; + + /* + * check_body is a jump target used when we find a + * CHECK_STATE, and need to jump to the body of + * the target rule. + */ + +/* check_body: */ + cmdlen = F_LEN(cmd); + /* + * An OR block (insn_1 || .. || insn_n) has the + * F_OR bit set in all but the last instruction. + * The first match will set "skip_or", and cause + * the following instructions to be skipped until + * past the one with the F_OR bit clear. + */ + if (skip_or) { /* skip this instruction */ + if ((cmd->len & F_OR) == 0) + skip_or = 0; /* next one is good */ + continue; + } + match = 0; /* set to 1 if we succeed */ + + switch (cmd->opcode) { + /* + * The first set of opcodes compares the packet's + * fields with some pattern, setting 'match' if a + * match is found. At the end of the loop there is + * logic to deal with F_NOT and F_OR flags associated + * with the opcode. + */ + case O_NOP: + match = 1; + break; + + case O_FORWARD_MAC: + printf("ipfw: opcode %d unimplemented\n", + cmd->opcode); + break; + + case O_GID: + case O_UID: + case O_JAIL: + /* + * We only check offset == 0 && proto != 0, + * as this ensures that we have a + * packet with the ports info. + */ + if (offset!=0) + break; + if (is_ipv6) /* XXX to be fixed later */ + break; + if (proto == IPPROTO_TCP || + proto == IPPROTO_UDP) + match = check_uidgid( + (ipfw_insn_u32 *)cmd, + proto, oif, + dst_ip, dst_port, + src_ip, src_port, &ucred_lookup, +#ifdef __FreeBSD__ + &ucred_cache, args->inp); +#else + (void *)&ucred_cache, + (struct inpcb *)args->m); +#endif + break; + + case O_RECV: + match = iface_match(m->m_pkthdr.rcvif, + (ipfw_insn_if *)cmd); + break; + + case O_XMIT: + match = iface_match(oif, (ipfw_insn_if *)cmd); + break; + + case O_VIA: + match = iface_match(oif ? oif : + m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd); + break; + + case O_MACADDR2: + if (args->eh != NULL) { /* have MAC header */ + u_int32_t *want = (u_int32_t *) + ((ipfw_insn_mac *)cmd)->addr; + u_int32_t *mask = (u_int32_t *) + ((ipfw_insn_mac *)cmd)->mask; + u_int32_t *hdr = (u_int32_t *)args->eh; + + match = + ( want[0] == (hdr[0] & mask[0]) && + want[1] == (hdr[1] & mask[1]) && + want[2] == (hdr[2] & mask[2]) ); + } + break; + + case O_MAC_TYPE: + if (args->eh != NULL) { + u_int16_t *p = + ((ipfw_insn_u16 *)cmd)->ports; + int i; + + for (i = cmdlen - 1; !match && i>0; + i--, p += 2) + match = (etype >= p[0] && + etype <= p[1]); + } + break; + + case O_FRAG: + match = (offset != 0); + break; + + case O_IN: /* "out" is "not in" */ + match = (oif == NULL); + break; + + case O_LAYER2: + match = (args->eh != NULL); + break; + + case O_DIVERTED: + { + /* For diverted packets, args->rule.info + * contains the divert port (in host format) + * reason and direction. + */ + uint32_t i = args->rule.info; + match = (i&IPFW_IS_MASK) == IPFW_IS_DIVERT && + cmd->arg1 & ((i & IPFW_INFO_IN) ? 1 : 2); + } + break; + + case O_PROTO: + /* + * We do not allow an arg of 0 so the + * check of "proto" only suffices. + */ + match = (proto == cmd->arg1); + break; + + case O_IP_SRC: + match = is_ipv4 && + (((ipfw_insn_ip *)cmd)->addr.s_addr == + src_ip.s_addr); + break; + + case O_IP_SRC_LOOKUP: + case O_IP_DST_LOOKUP: + if (is_ipv4) { + uint32_t key = + (cmd->opcode == O_IP_DST_LOOKUP) ? + dst_ip.s_addr : src_ip.s_addr; + uint32_t v = 0; + + if (cmdlen > F_INSN_SIZE(ipfw_insn_u32)) { + /* generic lookup. The key must be + * in 32bit big-endian format. + */ + v = ((ipfw_insn_u32 *)cmd)->d[1]; + if (v == 0) + key = dst_ip.s_addr; + else if (v == 1) + key = src_ip.s_addr; + else if (v == 6) /* dscp */ + key = (ip->ip_tos >> 2) & 0x3f; + else if (offset != 0) + break; + else if (proto != IPPROTO_TCP && + proto != IPPROTO_UDP) + break; + else if (v == 2) + key = htonl(dst_port); + else if (v == 3) + key = htonl(src_port); + else if (v == 4 || v == 5) { + check_uidgid( + (ipfw_insn_u32 *)cmd, + proto, oif, + dst_ip, dst_port, + src_ip, src_port, &ucred_lookup, +#ifdef __FreeBSD__ + &ucred_cache, args->inp); + if (v == 4 /* O_UID */) + key = ucred_cache->cr_uid; + else if (v == 5 /* O_JAIL */) + key = ucred_cache->cr_prison->pr_id; +#else /* !__FreeBSD__ */ + (void *)&ucred_cache, + (struct inpcb *)args->m); + if (v ==4 /* O_UID */) + key = ucred_cache.uid; + else if (v == 5 /* O_JAIL */) + key = ucred_cache.xid; +#endif /* !__FreeBSD__ */ + key = htonl(key); + } else + break; + } + match = ipfw_lookup_table(chain, + cmd->arg1, key, &v); + if (!match) + break; + if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) + match = + ((ipfw_insn_u32 *)cmd)->d[0] == v; + else + tablearg = v; + } + break; + + case O_IP_SRC_MASK: + case O_IP_DST_MASK: + if (is_ipv4) { + uint32_t a = + (cmd->opcode == O_IP_DST_MASK) ? + dst_ip.s_addr : src_ip.s_addr; + uint32_t *p = ((ipfw_insn_u32 *)cmd)->d; + int i = cmdlen-1; + + for (; !match && i>0; i-= 2, p+= 2) + match = (p[0] == (a & p[1])); + } + break; + + case O_IP_SRC_ME: + if (is_ipv4) { + struct ifnet *tif; + + INADDR_TO_IFP(src_ip, tif); + match = (tif != NULL); + break; + } +#ifdef INET6 + /* FALLTHROUGH */ + case O_IP6_SRC_ME: + match= is_ipv6 && search_ip6_addr_net(&args->f_id.src_ip6); +#endif + break; + + case O_IP_DST_SET: + case O_IP_SRC_SET: + if (is_ipv4) { + u_int32_t *d = (u_int32_t *)(cmd+1); + u_int32_t addr = + cmd->opcode == O_IP_DST_SET ? + args->f_id.dst_ip : + args->f_id.src_ip; + + if (addr < d[0]) + break; + addr -= d[0]; /* subtract base */ + match = (addr < cmd->arg1) && + ( d[ 1 + (addr>>5)] & + (1<<(addr & 0x1f)) ); + } + break; + + case O_IP_DST: + match = is_ipv4 && + (((ipfw_insn_ip *)cmd)->addr.s_addr == + dst_ip.s_addr); + break; + + case O_IP_DST_ME: + if (is_ipv4) { + struct ifnet *tif; + + INADDR_TO_IFP(dst_ip, tif); + match = (tif != NULL); + break; + } +#ifdef INET6 + /* FALLTHROUGH */ + case O_IP6_DST_ME: + match= is_ipv6 && search_ip6_addr_net(&args->f_id.dst_ip6); +#endif + break; + + + case O_IP_SRCPORT: + case O_IP_DSTPORT: + /* + * offset == 0 && proto != 0 is enough + * to guarantee that we have a + * packet with port info. + */ + if ((proto==IPPROTO_UDP || proto==IPPROTO_TCP) + && offset == 0) { + u_int16_t x = + (cmd->opcode == O_IP_SRCPORT) ? + src_port : dst_port ; + u_int16_t *p = + ((ipfw_insn_u16 *)cmd)->ports; + int i; + + for (i = cmdlen - 1; !match && i>0; + i--, p += 2) + match = (x>=p[0] && x<=p[1]); + } + break; + + case O_ICMPTYPE: + match = (offset == 0 && proto==IPPROTO_ICMP && + icmptype_match(ICMP(ulp), (ipfw_insn_u32 *)cmd) ); + break; + +#ifdef INET6 + case O_ICMP6TYPE: + match = is_ipv6 && offset == 0 && + proto==IPPROTO_ICMPV6 && + icmp6type_match( + ICMP6(ulp)->icmp6_type, + (ipfw_insn_u32 *)cmd); + break; +#endif /* INET6 */ + + case O_IPOPT: + match = (is_ipv4 && + ipopts_match(ip, cmd) ); + break; + + case O_IPVER: + match = (is_ipv4 && + cmd->arg1 == ip->ip_v); + break; + + case O_IPID: + case O_IPLEN: + case O_IPTTL: + if (is_ipv4) { /* only for IP packets */ + uint16_t x; + uint16_t *p; + int i; + + if (cmd->opcode == O_IPLEN) + x = iplen; + else if (cmd->opcode == O_IPTTL) + x = ip->ip_ttl; + else /* must be IPID */ + x = ntohs(ip->ip_id); + if (cmdlen == 1) { + match = (cmd->arg1 == x); + break; + } + /* otherwise we have ranges */ + p = ((ipfw_insn_u16 *)cmd)->ports; + i = cmdlen - 1; + for (; !match && i>0; i--, p += 2) + match = (x >= p[0] && x <= p[1]); + } + break; + + case O_IPPRECEDENCE: + match = (is_ipv4 && + (cmd->arg1 == (ip->ip_tos & 0xe0)) ); + break; + + case O_IPTOS: + match = (is_ipv4 && + flags_match(cmd, ip->ip_tos)); + break; + + case O_TCPDATALEN: + if (proto == IPPROTO_TCP && offset == 0) { + struct tcphdr *tcp; + uint16_t x; + uint16_t *p; + int i; + + tcp = TCP(ulp); + x = iplen - + ((ip->ip_hl + tcp->th_off) << 2); + if (cmdlen == 1) { + match = (cmd->arg1 == x); + break; + } + /* otherwise we have ranges */ + p = ((ipfw_insn_u16 *)cmd)->ports; + i = cmdlen - 1; + for (; !match && i>0; i--, p += 2) + match = (x >= p[0] && x <= p[1]); + } + break; + + case O_TCPFLAGS: + match = (proto == IPPROTO_TCP && offset == 0 && + flags_match(cmd, TCP(ulp)->th_flags)); + break; + + case O_TCPOPTS: + match = (proto == IPPROTO_TCP && offset == 0 && + tcpopts_match(TCP(ulp), cmd)); + break; + + case O_TCPSEQ: + match = (proto == IPPROTO_TCP && offset == 0 && + ((ipfw_insn_u32 *)cmd)->d[0] == + TCP(ulp)->th_seq); + break; + + case O_TCPACK: + match = (proto == IPPROTO_TCP && offset == 0 && + ((ipfw_insn_u32 *)cmd)->d[0] == + TCP(ulp)->th_ack); + break; + + case O_TCPWIN: + match = (proto == IPPROTO_TCP && offset == 0 && + cmd->arg1 == TCP(ulp)->th_win); + break; + + case O_ESTAB: + /* reject packets which have SYN only */ + /* XXX should i also check for TH_ACK ? */ + match = (proto == IPPROTO_TCP && offset == 0 && + (TCP(ulp)->th_flags & + (TH_RST | TH_ACK | TH_SYN)) != TH_SYN); + break; + + case O_ALTQ: { + struct pf_mtag *at; + ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; + + match = 1; + at = pf_find_mtag(m); + if (at != NULL && at->qid != 0) + break; + at = pf_get_mtag(m); + if (at == NULL) { + /* + * Let the packet fall back to the + * default ALTQ. + */ + break; + } + at->qid = altq->qid; + if (is_ipv4) + at->af = AF_INET; + else + at->af = AF_LINK; + at->hdr = ip; + break; + } + + case O_LOG: + ipfw_log(f, hlen, args, m, + oif, offset, tablearg, ip); + match = 1; + break; + + case O_PROB: + match = (random()<((ipfw_insn_u32 *)cmd)->d[0]); + break; + + case O_VERREVPATH: + /* Outgoing packets automatically pass/match */ + match = ((oif != NULL) || + (m->m_pkthdr.rcvif == NULL) || + ( +#ifdef INET6 + is_ipv6 ? + verify_path6(&(args->f_id.src_ip6), + m->m_pkthdr.rcvif) : +#endif + verify_path(src_ip, m->m_pkthdr.rcvif, + args->f_id.fib))); + break; + + case O_VERSRCREACH: + /* Outgoing packets automatically pass/match */ + match = (hlen > 0 && ((oif != NULL) || +#ifdef INET6 + is_ipv6 ? + verify_path6(&(args->f_id.src_ip6), + NULL) : +#endif + verify_path(src_ip, NULL, args->f_id.fib))); + break; + + case O_ANTISPOOF: + /* Outgoing packets automatically pass/match */ + if (oif == NULL && hlen > 0 && + ( (is_ipv4 && in_localaddr(src_ip)) +#ifdef INET6 + || (is_ipv6 && + in6_localaddr(&(args->f_id.src_ip6))) +#endif + )) + match = +#ifdef INET6 + is_ipv6 ? verify_path6( + &(args->f_id.src_ip6), + m->m_pkthdr.rcvif) : +#endif + verify_path(src_ip, + m->m_pkthdr.rcvif, + args->f_id.fib); + else + match = 1; + break; + + case O_IPSEC: +#ifdef IPSEC + match = (m_tag_find(m, + PACKET_TAG_IPSEC_IN_DONE, NULL) != NULL); +#endif + /* otherwise no match */ + break; + +#ifdef INET6 + case O_IP6_SRC: + match = is_ipv6 && + IN6_ARE_ADDR_EQUAL(&args->f_id.src_ip6, + &((ipfw_insn_ip6 *)cmd)->addr6); + break; + + case O_IP6_DST: + match = is_ipv6 && + IN6_ARE_ADDR_EQUAL(&args->f_id.dst_ip6, + &((ipfw_insn_ip6 *)cmd)->addr6); + break; + case O_IP6_SRC_MASK: + case O_IP6_DST_MASK: + if (is_ipv6) { + int i = cmdlen - 1; + struct in6_addr p; + struct in6_addr *d = + &((ipfw_insn_ip6 *)cmd)->addr6; + + for (; !match && i > 0; d += 2, + i -= F_INSN_SIZE(struct in6_addr) + * 2) { + p = (cmd->opcode == + O_IP6_SRC_MASK) ? + args->f_id.src_ip6: + args->f_id.dst_ip6; + APPLY_MASK(&p, &d[1]); + match = + IN6_ARE_ADDR_EQUAL(&d[0], + &p); + } + } + break; + + case O_FLOW6ID: + match = is_ipv6 && + flow6id_match(args->f_id.flow_id6, + (ipfw_insn_u32 *) cmd); + break; + + case O_EXT_HDR: + match = is_ipv6 && + (ext_hd & ((ipfw_insn *) cmd)->arg1); + break; + + case O_IP6: + match = is_ipv6; + break; +#endif + + case O_IP4: + match = is_ipv4; + break; + + case O_TAG: { + struct m_tag *mtag; + uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + + /* Packet is already tagged with this tag? */ + mtag = m_tag_locate(m, MTAG_IPFW, tag, NULL); + + /* We have `untag' action when F_NOT flag is + * present. And we must remove this mtag from + * mbuf and reset `match' to zero (`match' will + * be inversed later). + * Otherwise we should allocate new mtag and + * push it into mbuf. + */ + if (cmd->len & F_NOT) { /* `untag' action */ + if (mtag != NULL) + m_tag_delete(m, mtag); + match = 0; + } else if (mtag == NULL) { + if ((mtag = m_tag_alloc(MTAG_IPFW, + tag, 0, M_NOWAIT)) != NULL) + m_tag_prepend(m, mtag); + match = 1; + } + break; + } + + case O_FIB: /* try match the specified fib */ + if (args->f_id.fib == cmd->arg1) + match = 1; + break; + + case O_TAGGED: { + struct m_tag *mtag; + uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + + if (cmdlen == 1) { + match = m_tag_locate(m, MTAG_IPFW, + tag, NULL) != NULL; + break; + } + + /* we have ranges */ + for (mtag = m_tag_first(m); + mtag != NULL && !match; + mtag = m_tag_next(m, mtag)) { + uint16_t *p; + int i; + + if (mtag->m_tag_cookie != MTAG_IPFW) + continue; + + p = ((ipfw_insn_u16 *)cmd)->ports; + i = cmdlen - 1; + for(; !match && i > 0; i--, p += 2) + match = + mtag->m_tag_id >= p[0] && + mtag->m_tag_id <= p[1]; + } + break; + } + + /* + * The second set of opcodes represents 'actions', + * i.e. the terminal part of a rule once the packet + * matches all previous patterns. + * Typically there is only one action for each rule, + * and the opcode is stored at the end of the rule + * (but there are exceptions -- see below). + * + * In general, here we set retval and terminate the + * outer loop (would be a 'break 3' in some language, + * but we need to set l=0, done=1) + * + * Exceptions: + * O_COUNT and O_SKIPTO actions: + * instead of terminating, we jump to the next rule + * (setting l=0), or to the SKIPTO target (setting + * f/f_len, cmd and l as needed), respectively. + * + * O_TAG, O_LOG and O_ALTQ action parameters: + * perform some action and set match = 1; + * + * O_LIMIT and O_KEEP_STATE: these opcodes are + * not real 'actions', and are stored right + * before the 'action' part of the rule. + * These opcodes try to install an entry in the + * state tables; if successful, we continue with + * the next opcode (match=1; break;), otherwise + * the packet must be dropped (set retval, + * break loops with l=0, done=1) + * + * O_PROBE_STATE and O_CHECK_STATE: these opcodes + * cause a lookup of the state table, and a jump + * to the 'action' part of the parent rule + * if an entry is found, or + * (CHECK_STATE only) a jump to the next rule if + * the entry is not found. + * The result of the lookup is cached so that + * further instances of these opcodes become NOPs. + * The jump to the next rule is done by setting + * l=0, cmdlen=0. + */ + case O_LIMIT: + case O_KEEP_STATE: + if (ipfw_install_state(f, + (ipfw_insn_limit *)cmd, args, tablearg)) { + /* error or limit violation */ + retval = IP_FW_DENY; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + } + match = 1; + break; + + case O_PROBE_STATE: + case O_CHECK_STATE: + /* + * dynamic rules are checked at the first + * keep-state or check-state occurrence, + * with the result being stored in dyn_dir. + * The compiler introduces a PROBE_STATE + * instruction for us when we have a + * KEEP_STATE (because PROBE_STATE needs + * to be run first). + */ + if (dyn_dir == MATCH_UNKNOWN && + (q = ipfw_lookup_dyn_rule(&args->f_id, + &dyn_dir, proto == IPPROTO_TCP ? + TCP(ulp) : NULL)) + != NULL) { + /* + * Found dynamic entry, update stats + * and jump to the 'action' part of + * the parent rule by setting + * f, cmd, l and clearing cmdlen. + */ + q->pcnt++; + q->bcnt += pktlen; + /* XXX we would like to have f_pos + * readily accessible in the dynamic + * rule, instead of having to + * lookup q->rule. + */ + f = q->rule; + f_pos = ipfw_find_rule(chain, + f->rulenum, f->id); + cmd = ACTION_PTR(f); + l = f->cmd_len - f->act_ofs; + ipfw_dyn_unlock(); + cmdlen = 0; + match = 1; + break; + } + /* + * Dynamic entry not found. If CHECK_STATE, + * skip to next rule, if PROBE_STATE just + * ignore and continue with next opcode. + */ + if (cmd->opcode == O_CHECK_STATE) + l = 0; /* exit inner loop */ + match = 1; + break; + + case O_ACCEPT: + retval = 0; /* accept */ + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_PIPE: + case O_QUEUE: + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + if (cmd->opcode == O_PIPE) + args->rule.info |= IPFW_IS_PIPE; + if (V_fw_one_pass) + args->rule.info |= IPFW_ONEPASS; + retval = IP_FW_DUMMYNET; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_DIVERT: + case O_TEE: + if (args->eh) /* not on layer 2 */ + break; + /* otherwise this is terminal */ + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + retval = (cmd->opcode == O_DIVERT) ? + IP_FW_DIVERT : IP_FW_TEE; + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + break; + + case O_COUNT: + f->pcnt++; /* update stats */ + f->bcnt += pktlen; + f->timestamp = time_uptime; + l = 0; /* exit inner loop */ + break; + + case O_SKIPTO: + f->pcnt++; /* update stats */ + f->bcnt += pktlen; + f->timestamp = time_uptime; + /* If possible use cached f_pos (in f->next_rule), + * whose version is written in f->next_rule + * (horrible hacks to avoid changing the ABI). + */ + if (cmd->arg1 != IP_FW_TABLEARG && + (uintptr_t)f->x_next == chain->id) { + f_pos = (uintptr_t)f->next_rule; + } else { + int i = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + /* make sure we do not jump backward */ + if (i <= f->rulenum) + i = f->rulenum + 1; + f_pos = ipfw_find_rule(chain, i, 0); + /* update the cache */ + if (cmd->arg1 != IP_FW_TABLEARG) { + f->next_rule = + (void *)(uintptr_t)f_pos; + f->x_next = + (void *)(uintptr_t)chain->id; + } + } + /* + * Skip disabled rules, and re-enter + * the inner loop with the correct + * f_pos, f, l and cmd. + * Also clear cmdlen and skip_or + */ + for (; f_pos < chain->n_rules - 1 && + (V_set_disable & + (1 << chain->map[f_pos]->set)); + f_pos++) + ; + /* Re-enter the inner loop at the skipto rule. */ + f = chain->map[f_pos]; + l = f->cmd_len; + cmd = f->cmd; + match = 1; + cmdlen = 0; + skip_or = 0; + continue; + break; /* not reached */ + + case O_REJECT: + /* + * Drop the packet and send a reject notice + * if the packet is not ICMP (or is an ICMP + * query), and it is not multicast/broadcast. + */ + if (hlen > 0 && is_ipv4 && offset == 0 && + (proto != IPPROTO_ICMP || + is_icmp_query(ICMP(ulp))) && + !(m->m_flags & (M_BCAST|M_MCAST)) && + !IN_MULTICAST(ntohl(dst_ip.s_addr))) { + send_reject(args, cmd->arg1, iplen, ip); + m = args->m; + } + /* FALLTHROUGH */ +#ifdef INET6 + case O_UNREACH6: + if (hlen > 0 && is_ipv6 && + ((offset & IP6F_OFF_MASK) == 0) && + (proto != IPPROTO_ICMPV6 || + (is_icmp6_query(icmp6_type) == 1)) && + !(m->m_flags & (M_BCAST|M_MCAST)) && + !IN6_IS_ADDR_MULTICAST(&args->f_id.dst_ip6)) { + send_reject6( + args, cmd->arg1, hlen, + (struct ip6_hdr *)ip); + m = args->m; + } + /* FALLTHROUGH */ +#endif + case O_DENY: + retval = IP_FW_DENY; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_FORWARD_IP: + if (args->eh) /* not valid on layer2 pkts */ + break; + if (!q || dyn_dir == MATCH_FORWARD) { + struct sockaddr_in *sa; + sa = &(((ipfw_insn_sa *)cmd)->sa); + if (sa->sin_addr.s_addr == INADDR_ANY) { + bcopy(sa, &args->hopstore, + sizeof(*sa)); + args->hopstore.sin_addr.s_addr = + htonl(tablearg); + args->next_hop = &args->hopstore; + } else { + args->next_hop = sa; + } + } + retval = IP_FW_PASS; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_NETGRAPH: + case O_NGTEE: + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + if (V_fw_one_pass) + args->rule.info |= IPFW_ONEPASS; + retval = (cmd->opcode == O_NETGRAPH) ? + IP_FW_NETGRAPH : IP_FW_NGTEE; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_SETFIB: + f->pcnt++; /* update stats */ + f->bcnt += pktlen; + f->timestamp = time_uptime; + M_SETFIB(m, cmd->arg1); + args->f_id.fib = cmd->arg1; + l = 0; /* exit inner loop */ + break; + + case O_NAT: + if (!IPFW_NAT_LOADED) { + retval = IP_FW_DENY; + } else { + struct cfg_nat *t; + int nat_id; + + set_match(args, f_pos, chain); + t = ((ipfw_insn_nat *)cmd)->nat; + if (t == NULL) { + nat_id = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + t = (*lookup_nat_ptr)(&chain->nat, nat_id); + + if (t == NULL) { + retval = IP_FW_DENY; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + } + if (cmd->arg1 != IP_FW_TABLEARG) + ((ipfw_insn_nat *)cmd)->nat = t; + } + retval = ipfw_nat_ptr(args, t, m); + } + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; + + case O_REASS: { + int ip_off; + + f->pcnt++; + f->bcnt += pktlen; + l = 0; /* in any case exit inner loop */ + ip_off = ntohs(ip->ip_off); + + /* if not fragmented, go to next rule */ + if ((ip_off & (IP_MF | IP_OFFMASK)) == 0) + break; + /* + * ip_reass() expects len & off in host + * byte order. + */ + SET_HOST_IPLEN(ip); + + args->m = m = ip_reass(m); + + /* + * do IP header checksum fixup. + */ + if (m == NULL) { /* fragment got swallowed */ + retval = IP_FW_DENY; + } else { /* good, packet complete */ + int hlen; + + ip = mtod(m, struct ip *); + hlen = ip->ip_hl << 2; + SET_NET_IPLEN(ip); + ip->ip_sum = 0; + if (hlen == sizeof(struct ip)) + ip->ip_sum = in_cksum_hdr(ip); + else + ip->ip_sum = in_cksum(m, hlen); + retval = IP_FW_REASS; + set_match(args, f_pos, chain); + } + done = 1; /* exit outer loop */ + break; + } + + default: + panic("-- unknown opcode %d\n", cmd->opcode); + } /* end of switch() on opcodes */ + /* + * if we get here with l=0, then match is irrelevant. + */ + + if (cmd->len & F_NOT) + match = !match; + + if (match) { + if (cmd->len & F_OR) + skip_or = 1; + } else { + if (!(cmd->len & F_OR)) /* not an OR block, */ + break; /* try next rule */ + } + + } /* end of inner loop, scan opcodes */ + + if (done) + break; + +/* next_rule:; */ /* try next rule */ + + } /* end of outer for, scan rules */ + + if (done) { + struct ip_fw *rule = chain->map[f_pos]; + /* Update statistics */ + rule->pcnt++; + rule->bcnt += pktlen; + rule->timestamp = time_uptime; + } else { + retval = IP_FW_DENY; + printf("ipfw: ouch!, skip past end of rules, denying packet\n"); + } + IPFW_RUNLOCK(chain); +#ifdef __FreeBSD__ + if (ucred_cache != NULL) + crfree(ucred_cache); +#endif + return (retval); + +pullup_failed: + if (V_fw_verbose) + printf("ipfw: pullup failed\n"); + return (IP_FW_DENY); +} + +/* + * Module and VNET glue + */ + +/* + * Stuff that must be initialised only on boot or module load + */ +static int +ipfw_init(void) +{ + int error = 0; + + ipfw_dyn_attach(); + /* + * Only print out this stuff the first time around, + * when called from the sysinit code. + */ + printf("ipfw2 " +#ifdef INET6 + "(+ipv6) " +#endif + "initialized, divert %s, nat %s, " + "rule-based forwarding " +#ifdef IPFIREWALL_FORWARD + "enabled, " +#else + "disabled, " +#endif + "default to %s, logging ", +#ifdef IPDIVERT + "enabled", +#else + "loadable", +#endif +#ifdef IPFIREWALL_NAT + "enabled", +#else + "loadable", +#endif + default_to_accept ? "accept" : "deny"); + + /* + * Note: V_xxx variables can be accessed here but the vnet specific + * initializer may not have been called yet for the VIMAGE case. + * Tuneables will have been processed. We will print out values for + * the default vnet. + * XXX This should all be rationalized AFTER 8.0 + */ + if (V_fw_verbose == 0) + printf("disabled\n"); + else if (V_verbose_limit == 0) + printf("unlimited\n"); + else + printf("limited to %d packets/entry by default\n", + V_verbose_limit); + + ipfw_log_bpf(1); /* init */ + return (error); +} + +/* + * Called for the removal of the last instance only on module unload. + */ +static void +ipfw_destroy(void) +{ + + ipfw_log_bpf(0); /* uninit */ + ipfw_dyn_detach(); + printf("IP firewall unloaded\n"); +} + +/* + * Stuff that must be initialized for every instance + * (including the first of course). + */ +static int +vnet_ipfw_init(const void *unused) +{ + int error; + struct ip_fw *rule = NULL; + struct ip_fw_chain *chain; + + chain = &V_layer3_chain; + + /* First set up some values that are compile time options */ + V_autoinc_step = 100; /* bounded to 1..1000 in add_rule() */ + V_fw_deny_unknown_exthdrs = 1; +#ifdef IPFIREWALL_VERBOSE + V_fw_verbose = 1; +#endif +#ifdef IPFIREWALL_VERBOSE_LIMIT + V_verbose_limit = IPFIREWALL_VERBOSE_LIMIT; +#endif +#ifdef IPFIREWALL_NAT + LIST_INIT(&chain->nat); +#endif + + /* insert the default rule and create the initial map */ + chain->n_rules = 1; + chain->static_len = sizeof(struct ip_fw); + chain->map = malloc(sizeof(struct ip_fw *), M_IPFW, M_NOWAIT | M_ZERO); + if (chain->map) + rule = malloc(chain->static_len, M_IPFW, M_NOWAIT | M_ZERO); + if (rule == NULL) { + if (chain->map) + free(chain->map, M_IPFW); + printf("ipfw2: ENOSPC initializing default rule " + "(support disabled)\n"); + return (ENOSPC); + } + error = ipfw_init_tables(chain); + if (error) { + panic("init_tables"); /* XXX Marko fix this ! */ + } + + /* fill and insert the default rule */ + rule->act_ofs = 0; + rule->rulenum = IPFW_DEFAULT_RULE; + rule->cmd_len = 1; + rule->set = RESVD_SET; + rule->cmd[0].len = 1; + rule->cmd[0].opcode = default_to_accept ? O_ACCEPT : O_DENY; + chain->rules = chain->default_rule = chain->map[0] = rule; + chain->id = rule->id = 1; + + IPFW_LOCK_INIT(chain); + ipfw_dyn_init(); + + /* First set up some values that are compile time options */ + V_ipfw_vnet_ready = 1; /* Open for business */ + + /* + * Hook the sockopt handler, and the layer2 (V_ip_fw_chk_ptr) + * and pfil hooks for ipv4 and ipv6. Even if the latter two fail + * we still keep the module alive because the sockopt and + * layer2 paths are still useful. + * ipfw[6]_hook return 0 on success, ENOENT on failure, + * so we can ignore the exact return value and just set a flag. + * + * Note that V_fw[6]_enable are manipulated by a SYSCTL_PROC so + * changes in the underlying (per-vnet) variables trigger + * immediate hook()/unhook() calls. + * In layer2 we have the same behaviour, except that V_ether_ipfw + * is checked on each packet because there are no pfil hooks. + */ + V_ip_fw_ctl_ptr = ipfw_ctl; + V_ip_fw_chk_ptr = ipfw_chk; + error = ipfw_attach_hooks(1); + return (error); +} + +/* + * Called for the removal of each instance. + */ +static int +vnet_ipfw_uninit(const void *unused) +{ + struct ip_fw *reap, *rule; + struct ip_fw_chain *chain = &V_layer3_chain; + int i; + + V_ipfw_vnet_ready = 0; /* tell new callers to go away */ + /* + * disconnect from ipv4, ipv6, layer2 and sockopt. + * Then grab, release and grab again the WLOCK so we make + * sure the update is propagated and nobody will be in. + */ + (void)ipfw_attach_hooks(0 /* detach */); + V_ip_fw_chk_ptr = NULL; + V_ip_fw_ctl_ptr = NULL; + IPFW_UH_WLOCK(chain); + IPFW_UH_WUNLOCK(chain); + IPFW_UH_WLOCK(chain); + + IPFW_WLOCK(chain); + IPFW_WUNLOCK(chain); + IPFW_WLOCK(chain); + + ipfw_dyn_uninit(0); /* run the callout_drain */ + ipfw_destroy_tables(chain); + reap = NULL; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + rule->x_next = reap; + reap = rule; + } + if (chain->map) + free(chain->map, M_IPFW); + IPFW_WUNLOCK(chain); + IPFW_UH_WUNLOCK(chain); + if (reap != NULL) + ipfw_reap_rules(reap); + IPFW_LOCK_DESTROY(chain); + ipfw_dyn_uninit(1); /* free the remaining parts */ + return 0; +} + +/* + * Module event handler. + * In general we have the choice of handling most of these events by the + * event handler or by the (VNET_)SYS(UN)INIT handlers. I have chosen to + * use the SYSINIT handlers as they are more capable of expressing the + * flow of control during module and vnet operations, so this is just + * a skeleton. Note there is no SYSINIT equivalent of the module + * SHUTDOWN handler, but we don't have anything to do in that case anyhow. + */ +static int +ipfw_modevent(module_t mod, int type, void *unused) +{ + int err = 0; + + switch (type) { + case MOD_LOAD: + /* Called once at module load or + * system boot if compiled in. */ + break; + case MOD_QUIESCE: + /* Called before unload. May veto unloading. */ + break; + case MOD_UNLOAD: + /* Called during unload. */ + break; + case MOD_SHUTDOWN: + /* Called during system shutdown. */ + break; + default: + err = EOPNOTSUPP; + break; + } + return err; +} + +static moduledata_t ipfwmod = { + "ipfw", + ipfw_modevent, + 0 +}; + +/* Define startup order. */ +#define IPFW_SI_SUB_FIREWALL SI_SUB_PROTO_IFATTACHDOMAIN +#define IPFW_MODEVENT_ORDER (SI_ORDER_ANY - 255) /* On boot slot in here. */ +#define IPFW_MODULE_ORDER (IPFW_MODEVENT_ORDER + 1) /* A little later. */ +#define IPFW_VNET_ORDER (IPFW_MODEVENT_ORDER + 2) /* Later still. */ + +DECLARE_MODULE(ipfw, ipfwmod, IPFW_SI_SUB_FIREWALL, IPFW_MODEVENT_ORDER); +MODULE_VERSION(ipfw, 2); +/* should declare some dependencies here */ + +/* + * Starting up. Done in order after ipfwmod() has been called. + * VNET_SYSINIT is also called for each existing vnet and each new vnet. + */ +SYSINIT(ipfw_init, IPFW_SI_SUB_FIREWALL, IPFW_MODULE_ORDER, + ipfw_init, NULL); +VNET_SYSINIT(vnet_ipfw_init, IPFW_SI_SUB_FIREWALL, IPFW_VNET_ORDER, + vnet_ipfw_init, NULL); + +/* + * Closing up shop. These are done in REVERSE ORDER, but still + * after ipfwmod() has been called. Not called on reboot. + * VNET_SYSUNINIT is also called for each exiting vnet as it exits. + * or when the module is unloaded. + */ +SYSUNINIT(ipfw_destroy, IPFW_SI_SUB_FIREWALL, IPFW_MODULE_ORDER, + ipfw_destroy, NULL); +VNET_SYSUNINIT(vnet_ipfw_uninit, IPFW_SI_SUB_FIREWALL, IPFW_VNET_ORDER, + vnet_ipfw_uninit, NULL); +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_dynamic.c b/sys/netinet/ipfw/ip_fw_dynamic.c new file mode 100644 index 0000000..2bdd299 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_dynamic.c @@ -0,0 +1,1241 @@ +/*- + * Copyright (c) 2002 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_dynamic.c 200601 2009-12-16 10:48:40Z luigi $"); + +#define DEB(x) +#define DDB(x) x + +/* + * Dynamic rule support for ipfw + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for ETHERTYPE_IP */ +#include +#include + +#include +#include +#include /* ip_defttl */ +#include +#include +#include +#include + +#include /* IN6_ARE_ADDR_EQUAL */ +#ifdef INET6 +#include +#include +#endif + +#include /* XXX for in_cksum */ + +#ifdef MAC +#include +#endif + +/* + * Description of dynamic rules. + * + * Dynamic rules are stored in lists accessed through a hash table + * (ipfw_dyn_v) whose size is curr_dyn_buckets. This value can + * be modified through the sysctl variable dyn_buckets which is + * updated when the table becomes empty. + * + * XXX currently there is only one list, ipfw_dyn. + * + * When a packet is received, its address fields are first masked + * with the mask defined for the rule, then hashed, then matched + * against the entries in the corresponding list. + * Dynamic rules can be used for different purposes: + * + stateful rules; + * + enforcing limits on the number of sessions; + * + in-kernel NAT (not implemented yet) + * + * The lifetime of dynamic rules is regulated by dyn_*_lifetime, + * measured in seconds and depending on the flags. + * + * The total number of dynamic rules is stored in dyn_count. + * The max number of dynamic rules is dyn_max. When we reach + * the maximum number of rules we do not create anymore. This is + * done to avoid consuming too much memory, but also too much + * time when searching on each packet (ideally, we should try instead + * to put a limit on the length of the list on each bucket...). + * + * Each dynamic rule holds a pointer to the parent ipfw rule so + * we know what action to perform. Dynamic rules are removed when + * the parent rule is deleted. XXX we should make them survive. + * + * There are some limitations with dynamic rules -- we do not + * obey the 'randomized match', and we do not do multiple + * passes through the firewall. XXX check the latter!!! + */ + +/* + * Static variables followed by global ones + */ +static VNET_DEFINE(ipfw_dyn_rule **, ipfw_dyn_v); +static VNET_DEFINE(u_int32_t, dyn_buckets); +static VNET_DEFINE(u_int32_t, curr_dyn_buckets); +static VNET_DEFINE(struct callout, ipfw_timeout); +#define V_ipfw_dyn_v VNET(ipfw_dyn_v) +#define V_dyn_buckets VNET(dyn_buckets) +#define V_curr_dyn_buckets VNET(curr_dyn_buckets) +#define V_ipfw_timeout VNET(ipfw_timeout) + +static uma_zone_t ipfw_dyn_rule_zone; +#ifndef __FreeBSD__ +DEFINE_SPINLOCK(ipfw_dyn_mtx); +#else +static struct mtx ipfw_dyn_mtx; /* mutex guarding dynamic rules */ +#endif + +#define IPFW_DYN_LOCK_INIT() \ + mtx_init(&ipfw_dyn_mtx, "IPFW dynamic rules", NULL, MTX_DEF) +#define IPFW_DYN_LOCK_DESTROY() mtx_destroy(&ipfw_dyn_mtx) +#define IPFW_DYN_LOCK() mtx_lock(&ipfw_dyn_mtx) +#define IPFW_DYN_UNLOCK() mtx_unlock(&ipfw_dyn_mtx) +#define IPFW_DYN_LOCK_ASSERT() mtx_assert(&ipfw_dyn_mtx, MA_OWNED) + +void +ipfw_dyn_unlock(void) +{ + IPFW_DYN_UNLOCK(); +} + +/* + * Timeouts for various events in handing dynamic rules. + */ +static VNET_DEFINE(u_int32_t, dyn_ack_lifetime); +static VNET_DEFINE(u_int32_t, dyn_syn_lifetime); +static VNET_DEFINE(u_int32_t, dyn_fin_lifetime); +static VNET_DEFINE(u_int32_t, dyn_rst_lifetime); +static VNET_DEFINE(u_int32_t, dyn_udp_lifetime); +static VNET_DEFINE(u_int32_t, dyn_short_lifetime); + +#define V_dyn_ack_lifetime VNET(dyn_ack_lifetime) +#define V_dyn_syn_lifetime VNET(dyn_syn_lifetime) +#define V_dyn_fin_lifetime VNET(dyn_fin_lifetime) +#define V_dyn_rst_lifetime VNET(dyn_rst_lifetime) +#define V_dyn_udp_lifetime VNET(dyn_udp_lifetime) +#define V_dyn_short_lifetime VNET(dyn_short_lifetime) + +/* + * Keepalives are sent if dyn_keepalive is set. They are sent every + * dyn_keepalive_period seconds, in the last dyn_keepalive_interval + * seconds of lifetime of a rule. + * dyn_rst_lifetime and dyn_fin_lifetime should be strictly lower + * than dyn_keepalive_period. + */ + +static VNET_DEFINE(u_int32_t, dyn_keepalive_interval); +static VNET_DEFINE(u_int32_t, dyn_keepalive_period); +static VNET_DEFINE(u_int32_t, dyn_keepalive); + +#define V_dyn_keepalive_interval VNET(dyn_keepalive_interval) +#define V_dyn_keepalive_period VNET(dyn_keepalive_period) +#define V_dyn_keepalive VNET(dyn_keepalive) + +static VNET_DEFINE(u_int32_t, dyn_count); /* # of dynamic rules */ +static VNET_DEFINE(u_int32_t, dyn_max); /* max # of dynamic rules */ + +#define V_dyn_count VNET(dyn_count) +#define V_dyn_max VNET(dyn_max) + +#ifdef SYSCTL_NODE + +SYSBEGIN(f2) + +SYSCTL_DECL(_net_inet_ip_fw); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_buckets, + CTLFLAG_RW, &VNET_NAME(dyn_buckets), 0, + "Number of dyn. buckets"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, curr_dyn_buckets, + CTLFLAG_RD, &VNET_NAME(curr_dyn_buckets), 0, + "Current Number of dyn. buckets"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_count, + CTLFLAG_RD, &VNET_NAME(dyn_count), 0, + "Number of dyn. rules"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_max, + CTLFLAG_RW, &VNET_NAME(dyn_max), 0, + "Max number of dyn. rules"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_ack_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_ack_lifetime), 0, + "Lifetime of dyn. rules for acks"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_syn_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_syn_lifetime), 0, + "Lifetime of dyn. rules for syn"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_fin_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_fin_lifetime), 0, + "Lifetime of dyn. rules for fin"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_rst_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_rst_lifetime), 0, + "Lifetime of dyn. rules for rst"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_udp_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_udp_lifetime), 0, + "Lifetime of dyn. rules for UDP"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_short_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_short_lifetime), 0, + "Lifetime of dyn. rules for other situations"); +SYSCTL_VNET_UINT(_net_inet_ip_fw, OID_AUTO, dyn_keepalive, + CTLFLAG_RW, &VNET_NAME(dyn_keepalive), 0, + "Enable keepalives for dyn. rules"); + +SYSEND + +#endif /* SYSCTL_NODE */ + + +static __inline int +hash_packet6(struct ipfw_flow_id *id) +{ + u_int32_t i; + i = (id->dst_ip6.__u6_addr.__u6_addr32[2]) ^ + (id->dst_ip6.__u6_addr.__u6_addr32[3]) ^ + (id->src_ip6.__u6_addr.__u6_addr32[2]) ^ + (id->src_ip6.__u6_addr.__u6_addr32[3]) ^ + (id->dst_port) ^ (id->src_port); + return i; +} + +/* + * IMPORTANT: the hash function for dynamic rules must be commutative + * in source and destination (ip,port), because rules are bidirectional + * and we want to find both in the same bucket. + */ +static __inline int +hash_packet(struct ipfw_flow_id *id) +{ + u_int32_t i; + +#ifdef INET6 + if (IS_IP6_FLOW_ID(id)) + i = hash_packet6(id); + else +#endif /* INET6 */ + i = (id->dst_ip) ^ (id->src_ip) ^ (id->dst_port) ^ (id->src_port); + i &= (V_curr_dyn_buckets - 1); + return i; +} + +static __inline void +unlink_dyn_rule_print(struct ipfw_flow_id *id) +{ + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN], dst[INET6_ADDRSTRLEN]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + +#ifdef INET6 + if (IS_IP6_FLOW_ID(id)) { + ip6_sprintf(src, &id->src_ip6); + ip6_sprintf(dst, &id->dst_ip6); + } else +#endif + { + da.s_addr = htonl(id->src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(id->dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: unlink entry %s %d -> %s %d, %d left\n", + src, id->src_port, dst, id->dst_port, V_dyn_count - 1); +} + +/** + * unlink a dynamic rule from a chain. prev is a pointer to + * the previous one, q is a pointer to the rule to delete, + * head is a pointer to the head of the queue. + * Modifies q and potentially also head. + */ +#define UNLINK_DYN_RULE(prev, head, q) { \ + ipfw_dyn_rule *old_q = q; \ + \ + /* remove a refcount to the parent */ \ + if (q->dyn_type == O_LIMIT) \ + q->parent->count--; \ + DEB(unlink_dyn_rule_print(&q->id);) \ + if (prev != NULL) \ + prev->next = q = q->next; \ + else \ + head = q = q->next; \ + V_dyn_count--; \ + uma_zfree(ipfw_dyn_rule_zone, old_q); } + +#define TIME_LEQ(a,b) ((int)((a)-(b)) <= 0) + +/** + * Remove dynamic rules pointing to "rule", or all of them if rule == NULL. + * + * If keep_me == NULL, rules are deleted even if not expired, + * otherwise only expired rules are removed. + * + * The value of the second parameter is also used to point to identify + * a rule we absolutely do not want to remove (e.g. because we are + * holding a reference to it -- this is the case with O_LIMIT_PARENT + * rules). The pointer is only used for comparison, so any non-null + * value will do. + */ +static void +remove_dyn_rule(struct ip_fw *rule, ipfw_dyn_rule *keep_me) +{ + static u_int32_t last_remove = 0; + +#define FORCE (keep_me == NULL) + + ipfw_dyn_rule *prev, *q; + int i, pass = 0, max_pass = 0; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL || V_dyn_count == 0) + return; + /* do not expire more than once per second, it is useless */ + if (!FORCE && last_remove == time_uptime) + return; + last_remove = time_uptime; + + /* + * because O_LIMIT refer to parent rules, during the first pass only + * remove child and mark any pending LIMIT_PARENT, and remove + * them in a second pass. + */ +next_pass: + for (i = 0 ; i < V_curr_dyn_buckets ; i++) { + for (prev=NULL, q = V_ipfw_dyn_v[i] ; q ; ) { + /* + * Logic can become complex here, so we split tests. + */ + if (q == keep_me) + goto next; + if (rule != NULL && rule != q->rule) + goto next; /* not the one we are looking for */ + if (q->dyn_type == O_LIMIT_PARENT) { + /* + * handle parent in the second pass, + * record we need one. + */ + max_pass = 1; + if (pass == 0) + goto next; + if (FORCE && q->count != 0 ) { + /* XXX should not happen! */ + printf("ipfw: OUCH! cannot remove rule," + " count %d\n", q->count); + } + } else { + if (!FORCE && + !TIME_LEQ( q->expire, time_uptime )) + goto next; + } + if (q->dyn_type != O_LIMIT_PARENT || !q->count) { + UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); + continue; + } +next: + prev=q; + q=q->next; + } + } + if (pass++ < max_pass) + goto next_pass; +} + +void +ipfw_remove_dyn_children(struct ip_fw *rule) +{ + IPFW_DYN_LOCK(); + remove_dyn_rule(rule, NULL /* force removal */); + IPFW_DYN_UNLOCK(); +} + +/** + * lookup a dynamic rule, locked version + */ +static ipfw_dyn_rule * +lookup_dyn_rule_locked(struct ipfw_flow_id *pkt, int *match_direction, + struct tcphdr *tcp) +{ + /* + * stateful ipfw extensions. + * Lookup into dynamic session queue + */ +#define MATCH_REVERSE 0 +#define MATCH_FORWARD 1 +#define MATCH_NONE 2 +#define MATCH_UNKNOWN 3 + int i, dir = MATCH_NONE; + ipfw_dyn_rule *prev, *q=NULL; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL) + goto done; /* not found */ + i = hash_packet( pkt ); + for (prev=NULL, q = V_ipfw_dyn_v[i] ; q != NULL ; ) { + if (q->dyn_type == O_LIMIT_PARENT && q->count) + goto next; + if (TIME_LEQ( q->expire, time_uptime)) { /* expire entry */ + UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); + continue; + } + if (pkt->proto == q->id.proto && + q->dyn_type != O_LIMIT_PARENT) { + if (IS_IP6_FLOW_ID(pkt)) { + if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.src_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.dst_ip6)) && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port ) { + dir = MATCH_FORWARD; + break; + } + if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.dst_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.src_ip6)) && + pkt->src_port == q->id.dst_port && + pkt->dst_port == q->id.src_port ) { + dir = MATCH_REVERSE; + break; + } + } else { + if (pkt->src_ip == q->id.src_ip && + pkt->dst_ip == q->id.dst_ip && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port ) { + dir = MATCH_FORWARD; + break; + } + if (pkt->src_ip == q->id.dst_ip && + pkt->dst_ip == q->id.src_ip && + pkt->src_port == q->id.dst_port && + pkt->dst_port == q->id.src_port ) { + dir = MATCH_REVERSE; + break; + } + } + } +next: + prev = q; + q = q->next; + } + if (q == NULL) + goto done; /* q = NULL, not found */ + + if ( prev != NULL) { /* found and not in front */ + prev->next = q->next; + q->next = V_ipfw_dyn_v[i]; + V_ipfw_dyn_v[i] = q; + } + if (pkt->proto == IPPROTO_TCP) { /* update state according to flags */ + u_char flags = pkt->_flags & (TH_FIN|TH_SYN|TH_RST); + +#define BOTH_SYN (TH_SYN | (TH_SYN << 8)) +#define BOTH_FIN (TH_FIN | (TH_FIN << 8)) + q->state |= (dir == MATCH_FORWARD ) ? flags : (flags << 8); + switch (q->state) { + case TH_SYN: /* opening */ + q->expire = time_uptime + V_dyn_syn_lifetime; + break; + + case BOTH_SYN: /* move to established */ + case BOTH_SYN | TH_FIN : /* one side tries to close */ + case BOTH_SYN | (TH_FIN << 8) : + if (tcp) { +#define _SEQ_GE(a,b) ((int)(a) - (int)(b) >= 0) + u_int32_t ack = ntohl(tcp->th_ack); + if (dir == MATCH_FORWARD) { + if (q->ack_fwd == 0 || _SEQ_GE(ack, q->ack_fwd)) + q->ack_fwd = ack; + else { /* ignore out-of-sequence */ + break; + } + } else { + if (q->ack_rev == 0 || _SEQ_GE(ack, q->ack_rev)) + q->ack_rev = ack; + else { /* ignore out-of-sequence */ + break; + } + } + } + q->expire = time_uptime + V_dyn_ack_lifetime; + break; + + case BOTH_SYN | BOTH_FIN: /* both sides closed */ + if (V_dyn_fin_lifetime >= V_dyn_keepalive_period) + V_dyn_fin_lifetime = V_dyn_keepalive_period - 1; + q->expire = time_uptime + V_dyn_fin_lifetime; + break; + + default: +#if 0 + /* + * reset or some invalid combination, but can also + * occur if we use keep-state the wrong way. + */ + if ( (q->state & ((TH_RST << 8)|TH_RST)) == 0) + printf("invalid state: 0x%x\n", q->state); +#endif + if (V_dyn_rst_lifetime >= V_dyn_keepalive_period) + V_dyn_rst_lifetime = V_dyn_keepalive_period - 1; + q->expire = time_uptime + V_dyn_rst_lifetime; + break; + } + } else if (pkt->proto == IPPROTO_UDP) { + q->expire = time_uptime + V_dyn_udp_lifetime; + } else { + /* other protocols */ + q->expire = time_uptime + V_dyn_short_lifetime; + } +done: + if (match_direction) + *match_direction = dir; + return q; +} + +ipfw_dyn_rule * +ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, int *match_direction, + struct tcphdr *tcp) +{ + ipfw_dyn_rule *q; + + IPFW_DYN_LOCK(); + q = lookup_dyn_rule_locked(pkt, match_direction, tcp); + if (q == NULL) + IPFW_DYN_UNLOCK(); + /* NB: return table locked when q is not NULL */ + return q; +} + +static void +realloc_dynamic_table(void) +{ + IPFW_DYN_LOCK_ASSERT(); + + /* + * Try reallocation, make sure we have a power of 2 and do + * not allow more than 64k entries. In case of overflow, + * default to 1024. + */ + + if (V_dyn_buckets > 65536) + V_dyn_buckets = 1024; + if ((V_dyn_buckets & (V_dyn_buckets-1)) != 0) { /* not a power of 2 */ + V_dyn_buckets = V_curr_dyn_buckets; /* reset */ + return; + } + V_curr_dyn_buckets = V_dyn_buckets; + if (V_ipfw_dyn_v != NULL) + free(V_ipfw_dyn_v, M_IPFW); + for (;;) { + V_ipfw_dyn_v = malloc(V_curr_dyn_buckets * sizeof(ipfw_dyn_rule *), + M_IPFW, M_NOWAIT | M_ZERO); + if (V_ipfw_dyn_v != NULL || V_curr_dyn_buckets <= 2) + break; + V_curr_dyn_buckets /= 2; + } +} + +/** + * Install state of type 'type' for a dynamic session. + * The hash table contains two type of rules: + * - regular rules (O_KEEP_STATE) + * - rules for sessions with limited number of sess per user + * (O_LIMIT). When they are created, the parent is + * increased by 1, and decreased on delete. In this case, + * the third parameter is the parent rule and not the chain. + * - "parent" rules for the above (O_LIMIT_PARENT). + */ +static ipfw_dyn_rule * +add_dyn_rule(struct ipfw_flow_id *id, u_int8_t dyn_type, struct ip_fw *rule) +{ + ipfw_dyn_rule *r; + int i; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL || + (V_dyn_count == 0 && V_dyn_buckets != V_curr_dyn_buckets)) { + realloc_dynamic_table(); + if (V_ipfw_dyn_v == NULL) + return NULL; /* failed ! */ + } + i = hash_packet(id); + + r = uma_zalloc(ipfw_dyn_rule_zone, M_NOWAIT | M_ZERO); + if (r == NULL) { + printf ("ipfw: sorry cannot allocate state\n"); + return NULL; + } + + /* increase refcount on parent, and set pointer */ + if (dyn_type == O_LIMIT) { + ipfw_dyn_rule *parent = (ipfw_dyn_rule *)rule; + if ( parent->dyn_type != O_LIMIT_PARENT) + panic("invalid parent"); + parent->count++; + r->parent = parent; + rule = parent->rule; + } + + r->id = *id; + r->expire = time_uptime + V_dyn_syn_lifetime; + r->rule = rule; + r->dyn_type = dyn_type; + r->pcnt = r->bcnt = 0; + r->count = 0; + + r->bucket = i; + r->next = V_ipfw_dyn_v[i]; + V_ipfw_dyn_v[i] = r; + V_dyn_count++; + DEB({ + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN]; + char dst[INET6_ADDRSTRLEN]; +#else + char src[INET_ADDRSTRLEN]; + char dst[INET_ADDRSTRLEN]; +#endif + +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(r->id))) { + ip6_sprintf(src, &r->id.src_ip6); + ip6_sprintf(dst, &r->id.dst_ip6); + } else +#endif + { + da.s_addr = htonl(r->id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(r->id.dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: add dyn entry ty %d %s %d -> %s %d, total %d\n", + dyn_type, src, r->id.src_port, dst, r->id.dst_port, + V_dyn_count); + }) + return r; +} + +/** + * lookup dynamic parent rule using pkt and rule as search keys. + * If the lookup fails, then install one. + */ +static ipfw_dyn_rule * +lookup_dyn_parent(struct ipfw_flow_id *pkt, struct ip_fw *rule) +{ + ipfw_dyn_rule *q; + int i; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v) { + int is_v6 = IS_IP6_FLOW_ID(pkt); + i = hash_packet( pkt ); + for (q = V_ipfw_dyn_v[i] ; q != NULL ; q=q->next) + if (q->dyn_type == O_LIMIT_PARENT && + rule== q->rule && + pkt->proto == q->id.proto && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port && + ( + (is_v6 && + IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.src_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.dst_ip6))) || + (!is_v6 && + pkt->src_ip == q->id.src_ip && + pkt->dst_ip == q->id.dst_ip) + ) + ) { + q->expire = time_uptime + V_dyn_short_lifetime; + DEB(printf("ipfw: lookup_dyn_parent found 0x%p\n",q);) + return q; + } + } + return add_dyn_rule(pkt, O_LIMIT_PARENT, rule); +} + +/** + * Install dynamic state for rule type cmd->o.opcode + * + * Returns 1 (failure) if state is not installed because of errors or because + * session limitations are enforced. + */ +int +ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, + struct ip_fw_args *args, uint32_t tablearg) +{ + static int last_log; + ipfw_dyn_rule *q; + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + + src[0] = '\0'; + dst[0] = '\0'; + + IPFW_DYN_LOCK(); + + DEB( +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + ip6_sprintf(src, &args->f_id.src_ip6); + ip6_sprintf(dst, &args->f_id.dst_ip6); + } else +#endif + { + da.s_addr = htonl(args->f_id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(args->f_id.dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: %s: type %d %s %u -> %s %u\n", + __func__, cmd->o.opcode, src, args->f_id.src_port, + dst, args->f_id.dst_port); + src[0] = '\0'; + dst[0] = '\0'; + ) + + q = lookup_dyn_rule_locked(&args->f_id, NULL, NULL); + + if (q != NULL) { /* should never occur */ + if (last_log != time_uptime) { + last_log = time_uptime; + printf("ipfw: %s: entry already present, done\n", + __func__); + } + IPFW_DYN_UNLOCK(); + return (0); + } + + if (V_dyn_count >= V_dyn_max) + /* Run out of slots, try to remove any expired rule. */ + remove_dyn_rule(NULL, (ipfw_dyn_rule *)1); + + if (V_dyn_count >= V_dyn_max) { + if (last_log != time_uptime) { + last_log = time_uptime; + printf("ipfw: %s: Too many dynamic rules\n", __func__); + } + IPFW_DYN_UNLOCK(); + return (1); /* cannot install, notify caller */ + } + + switch (cmd->o.opcode) { + case O_KEEP_STATE: /* bidir rule */ + add_dyn_rule(&args->f_id, O_KEEP_STATE, rule); + break; + + case O_LIMIT: { /* limit number of sessions */ + struct ipfw_flow_id id; + ipfw_dyn_rule *parent; + uint32_t conn_limit; + uint16_t limit_mask = cmd->limit_mask; + + conn_limit = (cmd->conn_limit == IP_FW_TABLEARG) ? + tablearg : cmd->conn_limit; + + DEB( + if (cmd->conn_limit == IP_FW_TABLEARG) + printf("ipfw: %s: O_LIMIT rule, conn_limit: %u " + "(tablearg)\n", __func__, conn_limit); + else + printf("ipfw: %s: O_LIMIT rule, conn_limit: %u\n", + __func__, conn_limit); + ) + + id.dst_ip = id.src_ip = id.dst_port = id.src_port = 0; + id.proto = args->f_id.proto; + id.addr_type = args->f_id.addr_type; + id.fib = M_GETFIB(args->m); + + if (IS_IP6_FLOW_ID (&(args->f_id))) { + if (limit_mask & DYN_SRC_ADDR) + id.src_ip6 = args->f_id.src_ip6; + if (limit_mask & DYN_DST_ADDR) + id.dst_ip6 = args->f_id.dst_ip6; + } else { + if (limit_mask & DYN_SRC_ADDR) + id.src_ip = args->f_id.src_ip; + if (limit_mask & DYN_DST_ADDR) + id.dst_ip = args->f_id.dst_ip; + } + if (limit_mask & DYN_SRC_PORT) + id.src_port = args->f_id.src_port; + if (limit_mask & DYN_DST_PORT) + id.dst_port = args->f_id.dst_port; + if ((parent = lookup_dyn_parent(&id, rule)) == NULL) { + printf("ipfw: %s: add parent failed\n", __func__); + IPFW_DYN_UNLOCK(); + return (1); + } + + if (parent->count >= conn_limit) { + /* See if we can remove some expired rule. */ + remove_dyn_rule(rule, parent); + if (parent->count >= conn_limit) { + if (V_fw_verbose && last_log != time_uptime) { + last_log = time_uptime; +#ifdef INET6 + /* + * XXX IPv6 flows are not + * supported yet. + */ + if (IS_IP6_FLOW_ID(&(args->f_id))) { + char ip6buf[INET6_ADDRSTRLEN]; + snprintf(src, sizeof(src), + "[%s]", ip6_sprintf(ip6buf, + &args->f_id.src_ip6)); + snprintf(dst, sizeof(dst), + "[%s]", ip6_sprintf(ip6buf, + &args->f_id.dst_ip6)); + } else +#endif + { + da.s_addr = + htonl(args->f_id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = + htonl(args->f_id.dst_ip); + inet_ntoa_r(da, dst); + } + log(LOG_SECURITY | LOG_DEBUG, + "ipfw: %d %s %s:%u -> %s:%u, %s\n", + parent->rule->rulenum, + "drop session", + src, (args->f_id.src_port), + dst, (args->f_id.dst_port), + "too many entries"); + } + IPFW_DYN_UNLOCK(); + return (1); + } + } + add_dyn_rule(&args->f_id, O_LIMIT, (struct ip_fw *)parent); + break; + } + default: + printf("ipfw: %s: unknown dynamic rule type %u\n", + __func__, cmd->o.opcode); + IPFW_DYN_UNLOCK(); + return (1); + } + + /* XXX just set lifetime */ + lookup_dyn_rule_locked(&args->f_id, NULL, NULL); + + IPFW_DYN_UNLOCK(); + return (0); +} + +/* + * Generate a TCP packet, containing either a RST or a keepalive. + * When flags & TH_RST, we are sending a RST packet, because of a + * "reset" action matched the packet. + * Otherwise we are sending a keepalive, and flags & TH_ + * The 'replyto' mbuf is the mbuf being replied to, if any, and is required + * so that MAC can label the reply appropriately. + */ +struct mbuf * +ipfw_send_pkt(struct mbuf *replyto, struct ipfw_flow_id *id, u_int32_t seq, + u_int32_t ack, int flags) +{ + struct mbuf *m = NULL; /* stupid compiler */ + int len, dir; + struct ip *h = NULL; /* stupid compiler */ +#ifdef INET6 + struct ip6_hdr *h6 = NULL; +#endif + struct tcphdr *th = NULL; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) + return (NULL); + + M_SETFIB(m, id->fib); +#ifdef MAC + if (replyto != NULL) + mac_netinet_firewall_reply(replyto, m); + else + mac_netinet_firewall_send(m); +#else + (void)replyto; /* don't warn about unused arg */ +#endif + + switch (id->addr_type) { + case 4: + len = sizeof(struct ip) + sizeof(struct tcphdr); + break; +#ifdef INET6 + case 6: + len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr); + break; +#endif + default: + /* XXX: log me?!? */ + FREE_PKT(m); + return (NULL); + } + dir = ((flags & (TH_SYN | TH_RST)) == TH_SYN); + + m->m_data += max_linkhdr; + m->m_flags |= M_SKIP_FIREWALL; + m->m_pkthdr.len = m->m_len = len; + m->m_pkthdr.rcvif = NULL; + bzero(m->m_data, len); + + switch (id->addr_type) { + case 4: + h = mtod(m, struct ip *); + + /* prepare for checksum */ + h->ip_p = IPPROTO_TCP; + h->ip_len = htons(sizeof(struct tcphdr)); + if (dir) { + h->ip_src.s_addr = htonl(id->src_ip); + h->ip_dst.s_addr = htonl(id->dst_ip); + } else { + h->ip_src.s_addr = htonl(id->dst_ip); + h->ip_dst.s_addr = htonl(id->src_ip); + } + + th = (struct tcphdr *)(h + 1); + break; +#ifdef INET6 + case 6: + h6 = mtod(m, struct ip6_hdr *); + + /* prepare for checksum */ + h6->ip6_nxt = IPPROTO_TCP; + h6->ip6_plen = htons(sizeof(struct tcphdr)); + if (dir) { + h6->ip6_src = id->src_ip6; + h6->ip6_dst = id->dst_ip6; + } else { + h6->ip6_src = id->dst_ip6; + h6->ip6_dst = id->src_ip6; + } + + th = (struct tcphdr *)(h6 + 1); + break; +#endif + } + + if (dir) { + th->th_sport = htons(id->src_port); + th->th_dport = htons(id->dst_port); + } else { + th->th_sport = htons(id->dst_port); + th->th_dport = htons(id->src_port); + } + th->th_off = sizeof(struct tcphdr) >> 2; + + if (flags & TH_RST) { + if (flags & TH_ACK) { + th->th_seq = htonl(ack); + th->th_flags = TH_RST; + } else { + if (flags & TH_SYN) + seq++; + th->th_ack = htonl(seq); + th->th_flags = TH_RST | TH_ACK; + } + } else { + /* + * Keepalive - use caller provided sequence numbers + */ + th->th_seq = htonl(seq); + th->th_ack = htonl(ack); + th->th_flags = TH_ACK; + } + + switch (id->addr_type) { + case 4: + th->th_sum = in_cksum(m, len); + + /* finish the ip header */ + h->ip_v = 4; + h->ip_hl = sizeof(*h) >> 2; + h->ip_tos = IPTOS_LOWDELAY; + h->ip_off = 0; + /* ip_len must be in host format for ip_output */ + h->ip_len = len; + h->ip_ttl = V_ip_defttl; + h->ip_sum = 0; + break; +#ifdef INET6 + case 6: + th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(*h6), + sizeof(struct tcphdr)); + + /* finish the ip6 header */ + h6->ip6_vfc |= IPV6_VERSION; + h6->ip6_hlim = IPV6_DEFHLIM; + break; +#endif + } + + return (m); +} + +/* + * This procedure is only used to handle keepalives. It is invoked + * every dyn_keepalive_period + */ + /* dummynet() and ipfw_tick() can't be static in windows */ +void +ipfw_tick(void * vnetx) +{ + struct mbuf *m0, *m, *mnext, **mtailp; +#ifdef INET6 + struct mbuf *m6, **m6_tailp; +#endif + int i; + ipfw_dyn_rule *q; +#ifdef VIMAGE + struct vnet *vp = vnetx; +#endif + + CURVNET_SET(vp); + if (V_dyn_keepalive == 0 || V_ipfw_dyn_v == NULL || V_dyn_count == 0) + goto done; + + /* + * We make a chain of packets to go out here -- not deferring + * until after we drop the IPFW dynamic rule lock would result + * in a lock order reversal with the normal packet input -> ipfw + * call stack. + */ + m0 = NULL; + mtailp = &m0; +#ifdef INET6 + m6 = NULL; + m6_tailp = &m6; +#endif + IPFW_DYN_LOCK(); + for (i = 0 ; i < V_curr_dyn_buckets ; i++) { + for (q = V_ipfw_dyn_v[i] ; q ; q = q->next ) { + if (q->dyn_type == O_LIMIT_PARENT) + continue; + if (q->id.proto != IPPROTO_TCP) + continue; + if ( (q->state & BOTH_SYN) != BOTH_SYN) + continue; + if (TIME_LEQ(time_uptime + V_dyn_keepalive_interval, + q->expire)) + continue; /* too early */ + if (TIME_LEQ(q->expire, time_uptime)) + continue; /* too late, rule expired */ + + m = ipfw_send_pkt(NULL, &(q->id), q->ack_rev - 1, + q->ack_fwd, TH_SYN); + mnext = ipfw_send_pkt(NULL, &(q->id), q->ack_fwd - 1, + q->ack_rev, 0); + + switch (q->id.addr_type) { + case 4: + if (m != NULL) { + *mtailp = m; + mtailp = &(*mtailp)->m_nextpkt; + } + if (mnext != NULL) { + *mtailp = mnext; + mtailp = &(*mtailp)->m_nextpkt; + } + break; +#ifdef INET6 + case 6: + if (m != NULL) { + *m6_tailp = m; + m6_tailp = &(*m6_tailp)->m_nextpkt; + } + if (mnext != NULL) { + *m6_tailp = mnext; + m6_tailp = &(*m6_tailp)->m_nextpkt; + } + break; +#endif + } + + m = mnext = NULL; + } + } + IPFW_DYN_UNLOCK(); + for (m = mnext = m0; m != NULL; m = mnext) { + mnext = m->m_nextpkt; + m->m_nextpkt = NULL; + ip_output(m, NULL, NULL, 0, NULL, NULL); + } +#ifdef INET6 + for (m = mnext = m6; m != NULL; m = mnext) { + mnext = m->m_nextpkt; + m->m_nextpkt = NULL; + ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL); + } +#endif +done: + callout_reset_on(&V_ipfw_timeout, V_dyn_keepalive_period * hz, + ipfw_tick, vnetx, 0); + CURVNET_RESTORE(); +} + +void +ipfw_dyn_attach(void) +{ + ipfw_dyn_rule_zone = uma_zcreate("IPFW dynamic rule", + sizeof(ipfw_dyn_rule), NULL, NULL, NULL, NULL, + UMA_ALIGN_PTR, 0); + + IPFW_DYN_LOCK_INIT(); +} + +void +ipfw_dyn_detach(void) +{ + uma_zdestroy(ipfw_dyn_rule_zone); + IPFW_DYN_LOCK_DESTROY(); +} + +void +ipfw_dyn_init(void) +{ + V_ipfw_dyn_v = NULL; + V_dyn_buckets = 256; /* must be power of 2 */ + V_curr_dyn_buckets = 256; /* must be power of 2 */ + + V_dyn_ack_lifetime = 300; + V_dyn_syn_lifetime = 20; + V_dyn_fin_lifetime = 1; + V_dyn_rst_lifetime = 1; + V_dyn_udp_lifetime = 10; + V_dyn_short_lifetime = 5; + + V_dyn_keepalive_interval = 20; + V_dyn_keepalive_period = 5; + V_dyn_keepalive = 1; /* do send keepalives */ + + V_dyn_max = 4096; /* max # of dynamic rules */ + callout_init(&V_ipfw_timeout, CALLOUT_MPSAFE); + callout_reset_on(&V_ipfw_timeout, hz, ipfw_tick, curvnet, 0); +} + +void +ipfw_dyn_uninit(int pass) +{ + if (pass == 0) + callout_drain(&V_ipfw_timeout); + else { + if (V_ipfw_dyn_v != NULL) + free(V_ipfw_dyn_v, M_IPFW); + } +} + +int +ipfw_dyn_len(void) +{ + return (V_ipfw_dyn_v == NULL) ? 0 : + (V_dyn_count * sizeof(ipfw_dyn_rule)); +} + +void +ipfw_get_dynamic(char **pbp, const char *ep) +{ + ipfw_dyn_rule *p, *last = NULL; + char *bp; + int i; + + if (V_ipfw_dyn_v == NULL) + return; + bp = *pbp; + + IPFW_DYN_LOCK(); + for (i = 0 ; i < V_curr_dyn_buckets; i++) + for (p = V_ipfw_dyn_v[i] ; p != NULL; p = p->next) { + if (bp + sizeof *p <= ep) { + ipfw_dyn_rule *dst = + (ipfw_dyn_rule *)bp; + bcopy(p, dst, sizeof *p); + bcopy(&(p->rule->rulenum), &(dst->rule), + sizeof(p->rule->rulenum)); + /* + * store set number into high word of + * dst->rule pointer. + */ + bcopy(&(p->rule->set), + (char *)&dst->rule + + sizeof(p->rule->rulenum), + sizeof(p->rule->set)); + /* + * store a non-null value in "next". + * The userland code will interpret a + * NULL here as a marker + * for the last dynamic rule. + */ + bcopy(&dst, &dst->next, sizeof(dst)); + last = dst; + dst->expire = + TIME_LEQ(dst->expire, time_uptime) ? + 0 : dst->expire - time_uptime ; + bp += sizeof(ipfw_dyn_rule); + } + } + IPFW_DYN_UNLOCK(); + if (last != NULL) /* mark last dynamic rule */ + bzero(&last->next, sizeof(last)); + *pbp = bp; +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c new file mode 100644 index 0000000..55b5c26 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -0,0 +1,449 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_log.c 209845 2010-07-09 11:27:33Z glebius $"); + +/* + * Logging support for ipfw + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include /* for ETHERTYPE_IP */ +#include +#include +#include /* for IFT_ETHER */ +#include /* for BPF */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef INET6 +#include /* ip6_sprintf() */ +#endif + +#ifdef MAC +#include +#endif + +/* + * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T + * Other macros just cast void * into the appropriate type + */ +#define L3HDR(T, ip) ((T *)((u_int32_t *)(ip) + (ip)->ip_hl)) +#define TCP(p) ((struct tcphdr *)(p)) +#define SCTP(p) ((struct sctphdr *)(p)) +#define UDP(p) ((struct udphdr *)(p)) +#define ICMP(p) ((struct icmphdr *)(p)) +#define ICMP6(p) ((struct icmp6_hdr *)(p)) + +#define SNPARGS(buf, len) buf + len, sizeof(buf) > len ? sizeof(buf) - len : 0 +#define SNP(buf) buf, sizeof(buf) + +#ifdef WITHOUT_BPF +void +ipfw_log_bpf(int onoff) +{ +} +#else /* !WITHOUT_BPF */ +static struct ifnet *log_if; /* hook to attach to bpf */ + +/* we use this dummy function for all ifnet callbacks */ +static int +log_dummy(struct ifnet *ifp, u_long cmd, caddr_t addr) +{ + return EINVAL; +} + +static int +ipfw_log_output(struct ifnet *ifp, struct mbuf *m, + struct sockaddr *dst, struct route *ro) +{ + if (m != NULL) + m_freem(m); + return EINVAL; +} + +static void +ipfw_log_start(struct ifnet* ifp) +{ + panic("ipfw_log_start() must not be called"); +} + +static const u_char ipfwbroadcastaddr[6] = + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + +void +ipfw_log_bpf(int onoff) +{ + struct ifnet *ifp; + + if (onoff) { + if (log_if) + return; + ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) + return; + if_initname(ifp, "ipfw", 0); + ifp->if_mtu = 65536; + ifp->if_flags = IFF_UP | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = (void *)log_dummy; + ifp->if_ioctl = log_dummy; + ifp->if_start = ipfw_log_start; + ifp->if_output = ipfw_log_output; + ifp->if_addrlen = 6; + ifp->if_hdrlen = 14; + if_attach(ifp); + ifp->if_broadcastaddr = ipfwbroadcastaddr; + ifp->if_baudrate = IF_Mbps(10); + bpfattach(ifp, DLT_EN10MB, 14); + log_if = ifp; + } else { + if (log_if) { + ether_ifdetach(log_if); + if_free(log_if); + } + log_if = NULL; + } +} +#endif /* !WITHOUT_BPF */ + +/* + * We enter here when we have a rule with O_LOG. + * XXX this function alone takes about 2Kbytes of code! + */ +void +ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, + struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, + struct ip *ip) +{ + char *action; + int limit_reached = 0; + char action2[40], proto[128], fragment[32]; + + if (V_fw_verbose == 0) { +#ifndef WITHOUT_BPF + + if (log_if == NULL || log_if->if_bpf == NULL) + return; + + if (args->eh) /* layer2, use orig hdr */ + BPF_MTAP2(log_if, args->eh, ETHER_HDR_LEN, m); + else + /* Add fake header. Later we will store + * more info in the header. + */ + BPF_MTAP2(log_if, "DDDDDDSSSSSS\x08\x00", ETHER_HDR_LEN, m); +#endif /* !WITHOUT_BPF */ + return; + } + /* the old 'log' function */ + fragment[0] = '\0'; + proto[0] = '\0'; + + if (f == NULL) { /* bogus pkt */ + if (V_verbose_limit != 0 && V_norule_counter >= V_verbose_limit) + return; + V_norule_counter++; + if (V_norule_counter == V_verbose_limit) + limit_reached = V_verbose_limit; + action = "Refuse"; + } else { /* O_LOG is the first action, find the real one */ + ipfw_insn *cmd = ACTION_PTR(f); + ipfw_insn_log *l = (ipfw_insn_log *)cmd; + + if (l->max_log != 0 && l->log_left == 0) + return; + l->log_left--; + if (l->log_left == 0) + limit_reached = l->max_log; + cmd += F_LEN(cmd); /* point to first action */ + if (cmd->opcode == O_ALTQ) { + ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; + + snprintf(SNPARGS(action2, 0), "Altq %d", + altq->qid); + cmd += F_LEN(cmd); + } + if (cmd->opcode == O_PROB) + cmd += F_LEN(cmd); + + if (cmd->opcode == O_TAG) + cmd += F_LEN(cmd); + + action = action2; + switch (cmd->opcode) { + case O_DENY: + action = "Deny"; + break; + + case O_REJECT: + if (cmd->arg1==ICMP_REJECT_RST) + action = "Reset"; + else if (cmd->arg1==ICMP_UNREACH_HOST) + action = "Reject"; + else + snprintf(SNPARGS(action2, 0), "Unreach %d", + cmd->arg1); + break; + + case O_UNREACH6: + if (cmd->arg1==ICMP6_UNREACH_RST) + action = "Reset"; + else + snprintf(SNPARGS(action2, 0), "Unreach %d", + cmd->arg1); + break; + + case O_ACCEPT: + action = "Accept"; + break; + case O_COUNT: + action = "Count"; + break; + case O_DIVERT: + snprintf(SNPARGS(action2, 0), "Divert %d", + cmd->arg1); + break; + case O_TEE: + snprintf(SNPARGS(action2, 0), "Tee %d", + cmd->arg1); + break; + case O_SETFIB: + snprintf(SNPARGS(action2, 0), "SetFib %d", + cmd->arg1); + break; + case O_SKIPTO: + snprintf(SNPARGS(action2, 0), "SkipTo %d", + cmd->arg1); + break; + case O_PIPE: + snprintf(SNPARGS(action2, 0), "Pipe %d", + cmd->arg1); + break; + case O_QUEUE: + snprintf(SNPARGS(action2, 0), "Queue %d", + cmd->arg1); + break; + case O_FORWARD_IP: { + ipfw_insn_sa *sa = (ipfw_insn_sa *)cmd; + int len; + struct in_addr dummyaddr; + if (sa->sa.sin_addr.s_addr == INADDR_ANY) + dummyaddr.s_addr = htonl(tablearg); + else + dummyaddr.s_addr = sa->sa.sin_addr.s_addr; + + len = snprintf(SNPARGS(action2, 0), "Forward to %s", + inet_ntoa(dummyaddr)); + + if (sa->sa.sin_port) + snprintf(SNPARGS(action2, len), ":%d", + sa->sa.sin_port); + } + break; + case O_NETGRAPH: + snprintf(SNPARGS(action2, 0), "Netgraph %d", + cmd->arg1); + break; + case O_NGTEE: + snprintf(SNPARGS(action2, 0), "Ngtee %d", + cmd->arg1); + break; + case O_NAT: + action = "Nat"; + break; + case O_REASS: + action = "Reass"; + break; + default: + action = "UNKNOWN"; + break; + } + } + + if (hlen == 0) { /* non-ip */ + snprintf(SNPARGS(proto, 0), "MAC"); + + } else { + int len; +#ifdef INET6 + char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + struct icmphdr *icmp; + struct tcphdr *tcp; + struct udphdr *udp; +#ifdef INET6 + struct ip6_hdr *ip6 = NULL; + struct icmp6_hdr *icmp6; +#endif + src[0] = '\0'; + dst[0] = '\0'; +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + char ip6buf[INET6_ADDRSTRLEN]; + snprintf(src, sizeof(src), "[%s]", + ip6_sprintf(ip6buf, &args->f_id.src_ip6)); + snprintf(dst, sizeof(dst), "[%s]", + ip6_sprintf(ip6buf, &args->f_id.dst_ip6)); + + ip6 = (struct ip6_hdr *)ip; + tcp = (struct tcphdr *)(((char *)ip) + hlen); + udp = (struct udphdr *)(((char *)ip) + hlen); + } else +#endif + { + tcp = L3HDR(struct tcphdr, ip); + udp = L3HDR(struct udphdr, ip); + + inet_ntoa_r(ip->ip_src, src); + inet_ntoa_r(ip->ip_dst, dst); + } + + switch (args->f_id.proto) { + case IPPROTO_TCP: + len = snprintf(SNPARGS(proto, 0), "TCP %s", src); + if (offset == 0) + snprintf(SNPARGS(proto, len), ":%d %s:%d", + ntohs(tcp->th_sport), + dst, + ntohs(tcp->th_dport)); + else + snprintf(SNPARGS(proto, len), " %s", dst); + break; + + case IPPROTO_UDP: + len = snprintf(SNPARGS(proto, 0), "UDP %s", src); + if (offset == 0) + snprintf(SNPARGS(proto, len), ":%d %s:%d", + ntohs(udp->uh_sport), + dst, + ntohs(udp->uh_dport)); + else + snprintf(SNPARGS(proto, len), " %s", dst); + break; + + case IPPROTO_ICMP: + icmp = L3HDR(struct icmphdr, ip); + if (offset == 0) + len = snprintf(SNPARGS(proto, 0), + "ICMP:%u.%u ", + icmp->icmp_type, icmp->icmp_code); + else + len = snprintf(SNPARGS(proto, 0), "ICMP "); + len += snprintf(SNPARGS(proto, len), "%s", src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; +#ifdef INET6 + case IPPROTO_ICMPV6: + icmp6 = (struct icmp6_hdr *)(((char *)ip) + hlen); + if (offset == 0) + len = snprintf(SNPARGS(proto, 0), + "ICMPv6:%u.%u ", + icmp6->icmp6_type, icmp6->icmp6_code); + else + len = snprintf(SNPARGS(proto, 0), "ICMPv6 "); + len += snprintf(SNPARGS(proto, len), "%s", src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; +#endif + default: + len = snprintf(SNPARGS(proto, 0), "P:%d %s", + args->f_id.proto, src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; + } + +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + if (offset & (IP6F_OFF_MASK | IP6F_MORE_FRAG)) + snprintf(SNPARGS(fragment, 0), + " (frag %08x:%d@%d%s)", + args->f_id.extra, + ntohs(ip6->ip6_plen) - hlen, + ntohs(offset & IP6F_OFF_MASK) << 3, + (offset & IP6F_MORE_FRAG) ? "+" : ""); + } else +#endif + { + int ipoff, iplen; + ipoff = ntohs(ip->ip_off); + iplen = ntohs(ip->ip_len); + if (ipoff & (IP_MF | IP_OFFMASK)) + snprintf(SNPARGS(fragment, 0), + " (frag %d:%d@%d%s)", + ntohs(ip->ip_id), iplen - (ip->ip_hl << 2), + offset << 3, + (ipoff & IP_MF) ? "+" : ""); + } + } +#ifdef __FreeBSD__ + if (oif || m->m_pkthdr.rcvif) + log(LOG_SECURITY | LOG_INFO, + "ipfw: %d %s %s %s via %s%s\n", + f ? f->rulenum : -1, + action, proto, oif ? "out" : "in", + oif ? oif->if_xname : m->m_pkthdr.rcvif->if_xname, + fragment); + else +#endif + log(LOG_SECURITY | LOG_INFO, + "ipfw: %d %s %s [no if info]%s\n", + f ? f->rulenum : -1, + action, proto, fragment); + if (limit_reached) + log(LOG_SECURITY | LOG_NOTICE, + "ipfw: limit %d reached on entry %d\n", + limit_reached, f ? f->rulenum : -1); +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_lookup.c b/sys/netinet/ipfw/ip_fw_lookup.c new file mode 100644 index 0000000..bf04cb6 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_lookup.c @@ -0,0 +1,304 @@ +/*- + * Copyright (c) 2009 Luigi Rizzo Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw_table.c 200601 2009-12-16 10:48:40Z luigi $"); + +/* + * Rule and pipe lookup support for ipfw. + * + +ipfw and dummynet need to quickly find objects (rules, pipes) +that may be dynamically created or destroyed. +To address the problem, we label each new object with a unique +32-bit identifier whose low K bits are the index in a lookup +table. All existing objects are referred by the lookup table, +and identifiers are chosen so that for each slot there is +at most one active object (whose identifier points to the slot). +This is almost a hash table, except that we can pick the +identifiers after looking at the table's occupation so +we have a trivial hash function and are collision free. + +With this structure, operations are very fast and simple: +- the table has N entries s[i] with two fields, 'id' and 'ptr', + with N <= M = 2^k (M is an upper bound to the size of the table); +- initially, all slots have s[i].id = i, and the pointers + are used to build a freelist (tailq). +- a slot is considered empty if ptr == NULL or s[0] <= ptr < s[N]. + This is easy to detect and we can use ptr to build the freelist. +- when a new object is created, we put it in the empty slot i at the + head of the freelist, and set the id to s[i].id; +- when an object is destroyed, we append its slot i to the end + of the freelist, and set s[i].id += M (note M, not N). +- on a lookup for id = X, we look at slot i = X & (M-1), + and consider the lookup successful only if the slot is not + empty and s[i].id == X; +- wraps occur at most every F * 2^32/M operations, where F is + the number of free slots. Because F is usually a reasonable + fraction of M, we should not worry too much. +- if the table fills up, we can extend it by increasing N +- shrinking the table is more difficult as we might create + collisions during the rehashing. + * + */ + +#include +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +MALLOC_DEFINE(M_IPFW_LUT, "ipfw_lookup", "IpFw lookup"); +#define Malloc(n) malloc(n, M_IPFW_LUT, M_WAITOK) +#define Calloc(n) calloc(n, M_IPFW_LUT, M_WAITOK | M_ZERO) +#define Free(p) free(p, M_IPFW_LUT) + +#define log(x, arg...) + +#else /* !_KERNEL */ +#include +#include +#include +#include +#define Malloc(n) malloc(n) +#define Calloc(n) calloc(1, n) +#define Free(p) free(p) +#define log(x, arg...) fprintf(stderr, "%s: " x "\n", __FUNCTION__, ##arg) +#endif /* !_KERNEL */ + +struct entry { + uint32_t id; + struct entry *ptr; +}; + +struct lookup_table { + int _size; + int used; + int mask; /* 2^k -1, used for hashing */ + struct entry *f_head, *f_tail; /* freelist */ + struct entry * s; /* slots, array of N entries */ +}; + +static __inline int empty(struct lookup_table *head, const void *p) +{ + const struct entry *ep = p; + return (ep == NULL || + (ep >= head->s && ep < &head->s[head->_size])); +} + +/* + * init or reinit a table + */ +struct lookup_table * +ipfw_lut_init(struct lookup_table *head, int new_size, int mask) +{ + int i; + struct entry *s; /* the new slots */ + struct entry *fh, *ft; /* the freelist */ + + if (head != NULL) { + mask = head->mask; + if (new_size <= head->_size) + return head; + if (new_size >= mask+1) { + log("size larger than mask"); + return NULL; + } + } else { + log("old is null, initialize"); + head = Calloc(sizeof(*head)); + if (head == NULL) + return NULL; + if (new_size >= mask) + mask = new_size; + if (mask & (mask -1)) { + for (i = 1; i < mask; i += i) + ; + log("mask %d not 2^k, round up to %d", mask, i); + mask = i; + } + mask = head->mask = mask - 1; + } + + s = Calloc(new_size * sizeof(*s)); + if (s == NULL) + return NULL; + if (!head->s) { + head->s = s; + head->_size = 1; + } + fh = ft = NULL; + /* remap the entries, adjust the freelist */ + for (i = 0; i < new_size; i++) { + s[i].id = (i >= head->_size) ? i : head->s[i].id; + if (i < head->_size && !empty(head, head->s[i].ptr)) { + s[i].ptr = head->s[i].ptr; + continue; + } + if (fh == NULL) + fh = &s[i]; + else + ft->ptr = &s[i]; + ft = &s[i]; + } + head->f_head = fh; + head->f_tail = ft; + + /* write lock on the structure, to protect the readers */ + fh = head->s; + head->s = s; + head->_size = new_size; + /* release write lock */ + if (fh != s) + Free(fh); + log("done"); + return head; +} + +/* insert returns the id */ +int +ipfw_lut_insert(struct lookup_table *head, void *d) +{ + struct entry *e; + + e = head->f_head; + if (e == NULL) + return -1; + head->f_head = e->ptr; + e->ptr = d; + head->used++; + return e->id; +} + +/* delete, returns the original entry */ +void * +ipfw_lut_delete(struct lookup_table *head, int id) +{ + int i = id & head->mask; + void *result; + struct entry *e; + + if (i >= head->_size) + return NULL; + e = &head->s[i]; + if (e->id != id) + return NULL; + result = e->ptr; + /* write lock to invalidate the entry to readers */ + e->id += head->mask + 1; /* prepare for next insert */ + e->ptr = NULL; + /* release write lock */ + if (head->f_head == NULL) + head->f_head = e; + else + head->f_tail->ptr = e; + head->f_tail = e; + head->used--; + return result; +} + +void * +ipfw_lut_lookup(struct lookup_table *head, int id) +{ + int i = id & head->mask; + struct entry *e; + + if (i >= head->_size) + return NULL; + e = &head->s[i]; + return (e->id == id) ? e->ptr : NULL; +} + +void +ipfw_lut_dump(struct lookup_table *head) +{ + int i; + + log("head %p size %d used %d freelist %d", + head, head->_size, head->used, head->f_head ? + head->f_head - head->s : -1); + for (i = 0; i < head->_size; i++) { + struct entry *e = &head->s[i]; + char ee = empty(head, e->ptr) ? 'E' : ' '; + log("%5d %5d %c %p", i, e->id, ee, + ee == 'E' && e->ptr != NULL ? + (void *)((struct entry *)e->ptr - head->s) : e->ptr); + } +} + +#ifndef _KERNEL +void dump_p(struct lookup_table *p, int *map) +{ + int i; + for (i = 0; i < p->_size; i++) { + int id = (int)ipfw_lut_lookup(p, map[i]); + log("%3d: %3d: %c", map[i] % 64, i, id); + } +} +int main(int argc, char *argv[]) +{ + int i, j, l; +#define S 1000 + int map[S]; + struct lookup_table *p; + struct lookup_table *p1; + const char *m = "nel mezzo del cammin di nostra vita mi ritrovai" + " in una selva oscura e la diritta via era smarrita!"; + + fprintf(stderr, "testing lookup\n"); + + l = strlen(m); + + p = ipfw_lut_init(NULL, 120, 33); + + ipfw_lut_dump(p); + for (i = 0; i < l; i++) { + int x = m[i]; + int id = ipfw_lut_insert(p, (void *)x); + //ipfw_lut_dump(p); + map[i] = id; + for (j=0; j < 10; j++) { + id = ipfw_lut_insert(p, (void *)'a'); + // ipfw_lut_dump(p); + ipfw_lut_delete(p, id); + // ipfw_lut_dump(p); + } + // ipfw_lut_dump(p); + } + dump_p(p, map); + p1 = ipfw_lut_init(p, 23, 0); + if (!p1) + return 1; + dump_p(p1, map); + p1 = ipfw_lut_init(p1, 120, 0); + if (!p1) + return 1; + dump_p(p1, map); + return 0; +} +#endif +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_nat.c b/sys/netinet/ipfw/ip_fw_nat.c new file mode 100644 index 0000000..d093924 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_nat.c @@ -0,0 +1,605 @@ +/*- + * Copyright (c) 2008 Paolo Pisati + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw_nat.c 200975 2009-12-25 01:15:39Z luigi $"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPFW_INTERNAL /* Access to protected data structures in ip_fw.h. */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* XXX for in_cksum */ + +static VNET_DEFINE(eventhandler_tag, ifaddr_event_tag); +#define V_ifaddr_event_tag VNET(ifaddr_event_tag) + +static void +ifaddr_change(void *arg, struct ifnet *ifp) +{ + struct cfg_nat *ptr; + struct ifaddr *ifa; + struct ip_fw_chain *chain; + + (void)arg; + chain = &V_layer3_chain; + IPFW_WLOCK(chain); + /* Check every nat entry... */ + LIST_FOREACH(ptr, &chain->nat, _next) { + /* ...using nic 'ifp->if_xname' as dynamic alias address. */ + if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) != 0) + continue; + if_addr_rlock(ifp); + TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { + if (ifa->ifa_addr == NULL) + continue; + if (ifa->ifa_addr->sa_family != AF_INET) + continue; + ptr->ip = ((struct sockaddr_in *) + (ifa->ifa_addr))->sin_addr; + LibAliasSetAddress(ptr->lib, ptr->ip); + } + if_addr_runlock(ifp); + } + IPFW_WUNLOCK(chain); +} + +/* + * delete the pointers for nat entry ix, or all of them if ix < 0 + */ +static void +flush_nat_ptrs(struct ip_fw_chain *chain, const int ix) +{ + int i; + ipfw_insn_nat *cmd; + + IPFW_WLOCK_ASSERT(chain); + for (i = 0; i < chain->n_rules; i++) { + cmd = (ipfw_insn_nat *)ACTION_PTR(chain->map[i]); + /* XXX skip log and the like ? */ + if (cmd->o.opcode == O_NAT && cmd->nat != NULL && + (ix < 0 || cmd->nat->id == ix)) + cmd->nat = NULL; + } +} + +static void +del_redir_spool_cfg(struct cfg_nat *n, struct redir_chain *head) +{ + struct cfg_redir *r, *tmp_r; + struct cfg_spool *s, *tmp_s; + int i, num; + + LIST_FOREACH_SAFE(r, head, _next, tmp_r) { + num = 1; /* Number of alias_link to delete. */ + switch (r->mode) { + case REDIR_PORT: + num = r->pport_cnt; + /* FALLTHROUGH */ + case REDIR_ADDR: + case REDIR_PROTO: + /* Delete all libalias redirect entry. */ + for (i = 0; i < num; i++) + LibAliasRedirectDelete(n->lib, r->alink[i]); + /* Del spool cfg if any. */ + LIST_FOREACH_SAFE(s, &r->spool_chain, _next, tmp_s) { + LIST_REMOVE(s, _next); + free(s, M_IPFW); + } + free(r->alink, M_IPFW); + LIST_REMOVE(r, _next); + free(r, M_IPFW); + break; + default: + printf("unknown redirect mode: %u\n", r->mode); + /* XXX - panic?!?!? */ + break; + } + } +} + +static int +add_redir_spool_cfg(char *buf, struct cfg_nat *ptr) +{ + struct cfg_redir *r, *ser_r; + struct cfg_spool *s, *ser_s; + int cnt, off, i; + + for (cnt = 0, off = 0; cnt < ptr->redir_cnt; cnt++) { + ser_r = (struct cfg_redir *)&buf[off]; + r = malloc(SOF_REDIR, M_IPFW, M_WAITOK | M_ZERO); + memcpy(r, ser_r, SOF_REDIR); + LIST_INIT(&r->spool_chain); + off += SOF_REDIR; + r->alink = malloc(sizeof(struct alias_link *) * r->pport_cnt, + M_IPFW, M_WAITOK | M_ZERO); + switch (r->mode) { + case REDIR_ADDR: + r->alink[0] = LibAliasRedirectAddr(ptr->lib, r->laddr, + r->paddr); + break; + case REDIR_PORT: + for (i = 0 ; i < r->pport_cnt; i++) { + /* If remotePort is all ports, set it to 0. */ + u_short remotePortCopy = r->rport + i; + if (r->rport_cnt == 1 && r->rport == 0) + remotePortCopy = 0; + r->alink[i] = LibAliasRedirectPort(ptr->lib, + r->laddr, htons(r->lport + i), r->raddr, + htons(remotePortCopy), r->paddr, + htons(r->pport + i), r->proto); + if (r->alink[i] == NULL) { + r->alink[0] = NULL; + break; + } + } + break; + case REDIR_PROTO: + r->alink[0] = LibAliasRedirectProto(ptr->lib ,r->laddr, + r->raddr, r->paddr, r->proto); + break; + default: + printf("unknown redirect mode: %u\n", r->mode); + break; + } + /* XXX perhaps return an error instead of panic ? */ + if (r->alink[0] == NULL) + panic("LibAliasRedirect* returned NULL"); + /* LSNAT handling. */ + for (i = 0; i < r->spool_cnt; i++) { + ser_s = (struct cfg_spool *)&buf[off]; + s = malloc(SOF_REDIR, M_IPFW, M_WAITOK | M_ZERO); + memcpy(s, ser_s, SOF_SPOOL); + LibAliasAddServer(ptr->lib, r->alink[0], + s->addr, htons(s->port)); + off += SOF_SPOOL; + /* Hook spool entry. */ + LIST_INSERT_HEAD(&r->spool_chain, s, _next); + } + /* And finally hook this redir entry. */ + LIST_INSERT_HEAD(&ptr->redir_chain, r, _next); + } + return (1); +} + +static int +ipfw_nat(struct ip_fw_args *args, struct cfg_nat *t, struct mbuf *m) +{ + struct mbuf *mcl; + struct ip *ip; + /* XXX - libalias duct tape */ + int ldt, retval; + char *c; + + ldt = 0; + retval = 0; + mcl = m_megapullup(m, m->m_pkthdr.len); + if (mcl == NULL) { + args->m = NULL; + return (IP_FW_DENY); + } + ip = mtod(mcl, struct ip *); + + /* + * XXX - Libalias checksum offload 'duct tape': + * + * locally generated packets have only pseudo-header checksum + * calculated and libalias will break it[1], so mark them for + * later fix. Moreover there are cases when libalias modifies + * tcp packet data[2], mark them for later fix too. + * + * [1] libalias was never meant to run in kernel, so it does + * not have any knowledge about checksum offloading, and + * expects a packet with a full internet checksum. + * Unfortunately, packets generated locally will have just the + * pseudo header calculated, and when libalias tries to adjust + * the checksum it will actually compute a wrong value. + * + * [2] when libalias modifies tcp's data content, full TCP + * checksum has to be recomputed: the problem is that + * libalias does not have any idea about checksum offloading. + * To work around this, we do not do checksumming in LibAlias, + * but only mark the packets in th_x2 field. If we receive a + * marked packet, we calculate correct checksum for it + * aware of offloading. Why such a terrible hack instead of + * recalculating checksum for each packet? + * Because the previous checksum was not checked! + * Recalculating checksums for EVERY packet will hide ALL + * transmission errors. Yes, marked packets still suffer from + * this problem. But, sigh, natd(8) has this problem, too. + * + * TODO: -make libalias mbuf aware (so + * it can handle delayed checksum and tso) + */ + + if (mcl->m_pkthdr.rcvif == NULL && + mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) + ldt = 1; + + c = mtod(mcl, char *); + if (args->oif == NULL) + retval = LibAliasIn(t->lib, c, + mcl->m_len + M_TRAILINGSPACE(mcl)); + else + retval = LibAliasOut(t->lib, c, + mcl->m_len + M_TRAILINGSPACE(mcl)); + if (retval == PKT_ALIAS_RESPOND) { + m->m_flags |= M_SKIP_FIREWALL; + retval = PKT_ALIAS_OK; + } + if (retval != PKT_ALIAS_OK && + retval != PKT_ALIAS_FOUND_HEADER_FRAGMENT) { + /* XXX - should i add some logging? */ + m_free(mcl); + args->m = NULL; + return (IP_FW_DENY); + } + mcl->m_pkthdr.len = mcl->m_len = ntohs(ip->ip_len); + + /* + * XXX - libalias checksum offload + * 'duct tape' (see above) + */ + + if ((ip->ip_off & htons(IP_OFFMASK)) == 0 && + ip->ip_p == IPPROTO_TCP) { + struct tcphdr *th; + + th = (struct tcphdr *)(ip + 1); + if (th->th_x2) + ldt = 1; + } + + if (ldt) { + struct tcphdr *th; + struct udphdr *uh; + u_short cksum; + + ip->ip_len = ntohs(ip->ip_len); + cksum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, + htons(ip->ip_p + ip->ip_len - (ip->ip_hl << 2))); + + switch (ip->ip_p) { + case IPPROTO_TCP: + th = (struct tcphdr *)(ip + 1); + /* + * Maybe it was set in + * libalias... + */ + th->th_x2 = 0; + th->th_sum = cksum; + mcl->m_pkthdr.csum_data = + offsetof(struct tcphdr, th_sum); + break; + case IPPROTO_UDP: + uh = (struct udphdr *)(ip + 1); + uh->uh_sum = cksum; + mcl->m_pkthdr.csum_data = + offsetof(struct udphdr, uh_sum); + break; + } + /* No hw checksum offloading: do it ourselves */ + if ((mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) == 0) { + in_delayed_cksum(mcl); + mcl->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; + } + ip->ip_len = htons(ip->ip_len); + } + args->m = mcl; + return (IP_FW_NAT); +} + +static struct cfg_nat * +lookup_nat(struct nat_list *l, int nat_id) +{ + struct cfg_nat *res; + + LIST_FOREACH(res, l, _next) { + if (res->id == nat_id) + break; + } + return res; +} + +static int +ipfw_nat_cfg(struct sockopt *sopt) +{ + struct cfg_nat *ptr, *ser_n; + char *buf; + struct ip_fw_chain *chain = &V_layer3_chain; + + buf = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); + sooptcopyin(sopt, buf, NAT_BUF_LEN, sizeof(struct cfg_nat)); + ser_n = (struct cfg_nat *)buf; + + /* check valid parameter ser_n->id > 0 ? */ + /* + * Find/create nat rule. + */ + IPFW_WLOCK(chain); + ptr = lookup_nat(&chain->nat, ser_n->id); + if (ptr == NULL) { + /* New rule: allocate and init new instance. */ + ptr = malloc(sizeof(struct cfg_nat), + M_IPFW, M_NOWAIT | M_ZERO); + if (ptr == NULL) { + IPFW_WUNLOCK(chain); + free(buf, M_IPFW); + return (ENOSPC); + } + ptr->lib = LibAliasInit(NULL); + if (ptr->lib == NULL) { + IPFW_WUNLOCK(chain); + free(ptr, M_IPFW); + free(buf, M_IPFW); + return (EINVAL); + } + LIST_INIT(&ptr->redir_chain); + } else { + /* Entry already present: temporarly unhook it. */ + LIST_REMOVE(ptr, _next); + flush_nat_ptrs(chain, ser_n->id); + } + IPFW_WUNLOCK(chain); + + /* + * Basic nat configuration. + */ + ptr->id = ser_n->id; + /* + * XXX - what if this rule doesn't nat any ip and just + * redirect? + * do we set aliasaddress to 0.0.0.0? + */ + ptr->ip = ser_n->ip; + ptr->redir_cnt = ser_n->redir_cnt; + ptr->mode = ser_n->mode; + LibAliasSetMode(ptr->lib, ser_n->mode, ser_n->mode); + LibAliasSetAddress(ptr->lib, ptr->ip); + memcpy(ptr->if_name, ser_n->if_name, IF_NAMESIZE); + + /* + * Redir and LSNAT configuration. + */ + /* Delete old cfgs. */ + del_redir_spool_cfg(ptr, &ptr->redir_chain); + /* Add new entries. */ + add_redir_spool_cfg(&buf[(sizeof(struct cfg_nat))], ptr); + free(buf, M_IPFW); + IPFW_WLOCK(chain); + LIST_INSERT_HEAD(&chain->nat, ptr, _next); + IPFW_WUNLOCK(chain); + return (0); +} + +static int +ipfw_nat_del(struct sockopt *sopt) +{ + struct cfg_nat *ptr; + struct ip_fw_chain *chain = &V_layer3_chain; + int i; + + sooptcopyin(sopt, &i, sizeof i, sizeof i); + /* XXX validate i */ + IPFW_WLOCK(chain); + ptr = lookup_nat(&chain->nat, i); + if (ptr == NULL) { + IPFW_WUNLOCK(chain); + return (EINVAL); + } + LIST_REMOVE(ptr, _next); + flush_nat_ptrs(chain, i); + IPFW_WUNLOCK(chain); + del_redir_spool_cfg(ptr, &ptr->redir_chain); + LibAliasUninit(ptr->lib); + free(ptr, M_IPFW); + return (0); +} + +static int +ipfw_nat_get_cfg(struct sockopt *sopt) +{ + uint8_t *data; + struct cfg_nat *n; + struct cfg_redir *r; + struct cfg_spool *s; + int nat_cnt, off; + struct ip_fw_chain *chain; + int err = ENOSPC; + + chain = &V_layer3_chain; + nat_cnt = 0; + off = sizeof(nat_cnt); + + data = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); + IPFW_RLOCK(chain); + /* Serialize all the data. */ + LIST_FOREACH(n, &chain->nat, _next) { + nat_cnt++; + if (off + SOF_NAT >= NAT_BUF_LEN) + goto nospace; + bcopy(n, &data[off], SOF_NAT); + off += SOF_NAT; + LIST_FOREACH(r, &n->redir_chain, _next) { + if (off + SOF_REDIR >= NAT_BUF_LEN) + goto nospace; + bcopy(r, &data[off], SOF_REDIR); + off += SOF_REDIR; + LIST_FOREACH(s, &r->spool_chain, _next) { + if (off + SOF_SPOOL >= NAT_BUF_LEN) + goto nospace; + bcopy(s, &data[off], SOF_SPOOL); + off += SOF_SPOOL; + } + } + } + err = 0; /* all good */ +nospace: + IPFW_RUNLOCK(chain); + if (err == 0) { + bcopy(&nat_cnt, data, sizeof(nat_cnt)); + sooptcopyout(sopt, data, NAT_BUF_LEN); + } else { + printf("serialized data buffer not big enough:" + "please increase NAT_BUF_LEN\n"); + } + free(data, M_IPFW); + return (err); +} + +static int +ipfw_nat_get_log(struct sockopt *sopt) +{ + uint8_t *data; + struct cfg_nat *ptr; + int i, size; + struct ip_fw_chain *chain; + + chain = &V_layer3_chain; + + IPFW_RLOCK(chain); + /* one pass to count, one to copy the data */ + i = 0; + LIST_FOREACH(ptr, &chain->nat, _next) { + if (ptr->lib->logDesc == NULL) + continue; + i++; + } + size = i * (LIBALIAS_BUF_SIZE + sizeof(int)); + data = malloc(size, M_IPFW, M_NOWAIT | M_ZERO); + if (data == NULL) { + IPFW_RUNLOCK(chain); + return (ENOSPC); + } + i = 0; + LIST_FOREACH(ptr, &chain->nat, _next) { + if (ptr->lib->logDesc == NULL) + continue; + bcopy(&ptr->id, &data[i], sizeof(int)); + i += sizeof(int); + bcopy(ptr->lib->logDesc, &data[i], LIBALIAS_BUF_SIZE); + i += LIBALIAS_BUF_SIZE; + } + IPFW_RUNLOCK(chain); + sooptcopyout(sopt, data, size); + free(data, M_IPFW); + return(0); +} + +static void +ipfw_nat_init(void) +{ + + IPFW_WLOCK(&V_layer3_chain); + /* init ipfw hooks */ + ipfw_nat_ptr = ipfw_nat; + lookup_nat_ptr = lookup_nat; + ipfw_nat_cfg_ptr = ipfw_nat_cfg; + ipfw_nat_del_ptr = ipfw_nat_del; + ipfw_nat_get_cfg_ptr = ipfw_nat_get_cfg; + ipfw_nat_get_log_ptr = ipfw_nat_get_log; + IPFW_WUNLOCK(&V_layer3_chain); + V_ifaddr_event_tag = EVENTHANDLER_REGISTER( + ifaddr_event, ifaddr_change, + NULL, EVENTHANDLER_PRI_ANY); +} + +static void +ipfw_nat_destroy(void) +{ + struct cfg_nat *ptr, *ptr_temp; + struct ip_fw_chain *chain; + + chain = &V_layer3_chain; + IPFW_WLOCK(chain); + LIST_FOREACH_SAFE(ptr, &chain->nat, _next, ptr_temp) { + LIST_REMOVE(ptr, _next); + del_redir_spool_cfg(ptr, &ptr->redir_chain); + LibAliasUninit(ptr->lib); + free(ptr, M_IPFW); + } + EVENTHANDLER_DEREGISTER(ifaddr_event, V_ifaddr_event_tag); + flush_nat_ptrs(chain, -1 /* flush all */); + /* deregister ipfw_nat */ + ipfw_nat_ptr = NULL; + lookup_nat_ptr = NULL; + ipfw_nat_cfg_ptr = NULL; + ipfw_nat_del_ptr = NULL; + ipfw_nat_get_cfg_ptr = NULL; + ipfw_nat_get_log_ptr = NULL; + IPFW_WUNLOCK(chain); +} + +static int +ipfw_nat_modevent(module_t mod, int type, void *unused) +{ + int err = 0; + + switch (type) { + case MOD_LOAD: + ipfw_nat_init(); + break; + + case MOD_UNLOAD: + ipfw_nat_destroy(); + break; + + default: + return EOPNOTSUPP; + break; + } + return err; +} + +static moduledata_t ipfw_nat_mod = { + "ipfw_nat", + ipfw_nat_modevent, + 0 +}; + +DECLARE_MODULE(ipfw_nat, ipfw_nat_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); +MODULE_DEPEND(ipfw_nat, libalias, 1, 1, 1); +MODULE_DEPEND(ipfw_nat, ipfw, 2, 2, 2); +MODULE_VERSION(ipfw_nat, 1); +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_pfil.c b/sys/netinet/ipfw/ip_fw_pfil.c new file mode 100644 index 0000000..a125ef2 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_pfil.c @@ -0,0 +1,415 @@ +/*- + * Copyright (c) 2004 Andre Oppermann, Internet Business Solutions AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_pfil.c 200601 2009-12-16 10:48:40Z luigi $"); + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif /* KLD_MODULE */ +#include "opt_inet6.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +static VNET_DEFINE(int, fw_enable) = 1; +#define V_fw_enable VNET(fw_enable) + +#ifdef INET6 +static VNET_DEFINE(int, fw6_enable) = 1; +#define V_fw6_enable VNET(fw6_enable) +#endif + +int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); + +/* Forward declarations. */ +static int ipfw_divert(struct mbuf **, int, struct ipfw_rule_ref *, int); + +#ifdef SYSCTL_NODE + +SYSBEGIN(f1) + +SYSCTL_DECL(_net_inet_ip_fw); +SYSCTL_VNET_PROC(_net_inet_ip_fw, OID_AUTO, enable, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_enable), 0, + ipfw_chg_hook, "I", "Enable ipfw"); +#ifdef INET6 +SYSCTL_DECL(_net_inet6_ip6_fw); +SYSCTL_VNET_PROC(_net_inet6_ip6_fw, OID_AUTO, enable, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw6_enable), 0, + ipfw_chg_hook, "I", "Enable ipfw+6"); +#endif /* INET6 */ + +SYSEND + +#endif /* SYSCTL_NODE */ + +/* + * The pfilter hook to pass packets to ipfw_chk and then to + * dummynet, divert, netgraph or other modules. + * The packet may be consumed. + */ +int +ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, + struct inpcb *inp) +{ + struct ip_fw_args args; + struct m_tag *tag; + int ipfw; + int ret; + + /* all the processing now uses ip_len in net format */ + if (mtod(*m0, struct ip *)->ip_v == 4) + SET_NET_IPLEN(mtod(*m0, struct ip *)); + + /* convert dir to IPFW values */ + dir = (dir == PFIL_IN) ? DIR_IN : DIR_OUT; + bzero(&args, sizeof(args)); + +again: + /* + * extract and remove the tag if present. If we are left + * with onepass, optimize the outgoing path. + */ + tag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL); + if (tag != NULL) { + args.rule = *((struct ipfw_rule_ref *)(tag+1)); + m_tag_delete(*m0, tag); + if (args.rule.info & IPFW_ONEPASS) { + SET_HOST_IPLEN(mtod(*m0, struct ip *)); + return 0; + } + } + + args.m = *m0; + args.oif = dir == DIR_OUT ? ifp : NULL; + args.inp = inp; + + ipfw = ipfw_chk(&args); + *m0 = args.m; + + KASSERT(*m0 != NULL || ipfw == IP_FW_DENY, ("%s: m0 is NULL", + __func__)); + + /* breaking out of the switch means drop */ + ret = 0; /* default return value for pass */ + switch (ipfw) { + case IP_FW_PASS: + /* next_hop may be set by ipfw_chk */ + if (args.next_hop == NULL) + break; /* pass */ +#ifndef IPFIREWALL_FORWARD + ret = EACCES; +#else + { + struct m_tag *fwd_tag; + + /* Incoming packets should not be tagged so we do not + * m_tag_find. Outgoing packets may be tagged, so we + * reuse the tag if present. + */ + fwd_tag = (dir == DIR_IN) ? NULL : + m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag != NULL) { + m_tag_unlink(*m0, fwd_tag); + } else { + fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, + sizeof(struct sockaddr_in), M_NOWAIT); + if (fwd_tag == NULL) { + ret = EACCES; + break; /* i.e. drop */ + } + } + bcopy(args.next_hop, (fwd_tag+1), sizeof(struct sockaddr_in)); + m_tag_prepend(*m0, fwd_tag); + + if (in_localip(args.next_hop->sin_addr)) + (*m0)->m_flags |= M_FASTFWD_OURS; + } +#endif + break; + + case IP_FW_DENY: + ret = EACCES; + break; /* i.e. drop */ + + case IP_FW_DUMMYNET: + ret = EACCES; + if (ip_dn_io_ptr == NULL) + break; /* i.e. drop */ + if (mtod(*m0, struct ip *)->ip_v == 4) + ret = ip_dn_io_ptr(m0, dir, &args); + else if (mtod(*m0, struct ip *)->ip_v == 6) + ret = ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args); + else + break; /* drop it */ + /* + * XXX should read the return value. + * dummynet normally eats the packet and sets *m0=NULL + * unless the packet can be sent immediately. In this + * case args is updated and we should re-run the + * check without clearing args. + */ + if (*m0 != NULL) + goto again; + break; + + case IP_FW_TEE: + case IP_FW_DIVERT: + if (ip_divert_ptr == NULL) { + ret = EACCES; + break; /* i.e. drop */ + } + ret = ipfw_divert(m0, dir, &args.rule, + (ipfw == IP_FW_TEE) ? 1 : 0); + /* continue processing for the original packet (tee). */ + if (*m0) + goto again; + break; + + case IP_FW_NGTEE: + case IP_FW_NETGRAPH: + if (ng_ipfw_input_p == NULL) { + ret = EACCES; + break; /* i.e. drop */ + } + ret = ng_ipfw_input_p(m0, dir, &args, + (ipfw == IP_FW_NGTEE) ? 1 : 0); + if (ipfw == IP_FW_NGTEE) /* ignore errors for NGTEE */ + goto again; /* continue with packet */ + break; + + case IP_FW_NAT: + /* honor one-pass in case of successful nat */ + if (V_fw_one_pass) + break; /* ret is already 0 */ + goto again; + + case IP_FW_REASS: + goto again; /* continue with packet */ + + default: + KASSERT(0, ("%s: unknown retval", __func__)); + } + + if (ret != 0) { + if (*m0) + FREE_PKT(*m0); + *m0 = NULL; + } + if (*m0 && mtod(*m0, struct ip *)->ip_v == 4) + SET_HOST_IPLEN(mtod(*m0, struct ip *)); + return ret; +} + +/* do the divert, return 1 on error 0 on success */ +static int +ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule, + int tee) +{ + /* + * ipfw_chk() has already tagged the packet with the divert tag. + * If tee is set, copy packet and return original. + * If not tee, consume packet and send it to divert socket. + */ + struct mbuf *clone; + struct ip *ip; + struct m_tag *tag; + + /* Cloning needed for tee? */ + if (tee == 0) { + clone = *m0; /* use the original mbuf */ + *m0 = NULL; + } else { + clone = m_dup(*m0, M_DONTWAIT); + /* If we cannot duplicate the mbuf, we sacrifice the divert + * chain and continue with the tee-ed packet. + */ + if (clone == NULL) + return 1; + } + + /* + * Divert listeners can normally handle non-fragmented packets, + * but we can only reass in the non-tee case. + * This means that listeners on a tee rule may get fragments, + * and have to live with that. + * Note that we now have the 'reass' ipfw option so if we care + * we can do it before a 'tee'. + */ + ip = mtod(clone, struct ip *); + if (!tee && ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) { + int hlen; + struct mbuf *reass; + + SET_HOST_IPLEN(ip); /* ip_reass wants host order */ + reass = ip_reass(clone); /* Reassemble packet. */ + if (reass == NULL) + return 0; /* not an error */ + /* if reass = NULL then it was consumed by ip_reass */ + /* + * IP header checksum fixup after reassembly and leave header + * in network byte order. + */ + ip = mtod(reass, struct ip *); + hlen = ip->ip_hl << 2; + SET_NET_IPLEN(ip); + ip->ip_sum = 0; + if (hlen == sizeof(struct ip)) + ip->ip_sum = in_cksum_hdr(ip); + else + ip->ip_sum = in_cksum(reass, hlen); + clone = reass; + } + /* attach a tag to the packet with the reinject info */ + tag = m_tag_alloc(MTAG_IPFW_RULE, 0, + sizeof(struct ipfw_rule_ref), M_NOWAIT); + if (tag == NULL) { + FREE_PKT(clone); + return 1; + } + *((struct ipfw_rule_ref *)(tag+1)) = *rule; + m_tag_prepend(clone, tag); + + /* Do the dirty job... */ + ip_divert_ptr(clone, incoming); + return 0; +} + +/* + * attach or detach hooks for a given protocol family + */ +static int +ipfw_hook(int onoff, int pf) +{ + struct pfil_head *pfh; + + pfh = pfil_head_get(PFIL_TYPE_AF, pf); + if (pfh == NULL) + return ENOENT; + + (void) (onoff ? pfil_add_hook : pfil_remove_hook) + (ipfw_check_hook, NULL, PFIL_IN | PFIL_OUT | PFIL_WAITOK, pfh); + + return 0; +} + +int +ipfw_attach_hooks(int arg) +{ + int error = 0; + + if (arg == 0) /* detach */ + ipfw_hook(0, AF_INET); + else if (V_fw_enable && ipfw_hook(1, AF_INET) != 0) { + error = ENOENT; /* see ip_fw_pfil.c::ipfw_hook() */ + printf("ipfw_hook() error\n"); + } +#ifdef INET6 + if (arg == 0) /* detach */ + ipfw_hook(0, AF_INET6); + else if (V_fw6_enable && ipfw_hook(1, AF_INET6) != 0) { + error = ENOENT; + printf("ipfw6_hook() error\n"); + } +#endif + return error; +} + +int +ipfw_chg_hook(SYSCTL_HANDLER_ARGS) +{ + int enable; + int oldenable; + int error; + int af; + + if (arg1 == &VNET_NAME(fw_enable)) { + enable = V_fw_enable; + af = AF_INET; + } +#ifdef INET6 + else if (arg1 == &VNET_NAME(fw6_enable)) { + enable = V_fw6_enable; + af = AF_INET6; + } +#endif + else + return (EINVAL); + + oldenable = enable; + + error = sysctl_handle_int(oidp, &enable, 0, req); + + if (error) + return (error); + + enable = (enable) ? 1 : 0; + + if (enable == oldenable) + return (0); + + error = ipfw_hook(enable, af); + if (error) + return (error); + if (af == AF_INET) + V_fw_enable = enable; +#ifdef INET6 + else if (af == AF_INET6) + V_fw6_enable = enable; +#endif + + return (0); +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_private.h b/sys/netinet/ipfw/ip_fw_private.h new file mode 100644 index 0000000..334face --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_private.h @@ -0,0 +1,301 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: head/sys/netinet/ipfw/ip_fw_private.h 200601 2009-12-16 10:48:40Z luigi $ + */ + +#ifndef _IPFW2_PRIVATE_H +#define _IPFW2_PRIVATE_H + +/* + * Internal constants and data structures used by ipfw components + * and not meant to be exported outside the kernel. + */ + +#ifdef _KERNEL + +/* + * For platforms that do not have SYSCTL support, we wrap the + * SYSCTL_* into a function (one per file) to collect the values + * into an array at module initialization. The wrapping macros, + * SYSBEGIN() and SYSEND, are empty in the default case. + */ +#ifndef SYSBEGIN +#define SYSBEGIN(x) +#endif +#ifndef SYSEND +#define SYSEND +#endif + +/* Return values from ipfw_chk() */ +enum { + IP_FW_PASS = 0, + IP_FW_DENY, + IP_FW_DIVERT, + IP_FW_TEE, + IP_FW_DUMMYNET, + IP_FW_NETGRAPH, + IP_FW_NGTEE, + IP_FW_NAT, + IP_FW_REASS, +}; + +/* + * Structure for collecting parameters to dummynet for ip6_output forwarding + */ +struct _ip6dn_args { + struct ip6_pktopts *opt_or; + struct route_in6 ro_or; + int flags_or; + struct ip6_moptions *im6o_or; + struct ifnet *origifp_or; + struct ifnet *ifp_or; + struct sockaddr_in6 dst_or; + u_long mtu_or; + struct route_in6 ro_pmtu_or; +}; + + +/* + * Arguments for calling ipfw_chk() and dummynet_io(). We put them + * all into a structure because this way it is easier and more + * efficient to pass variables around and extend the interface. + */ +struct ip_fw_args { + struct mbuf *m; /* the mbuf chain */ + struct ifnet *oif; /* output interface */ + struct sockaddr_in *next_hop; /* forward address */ + + /* + * On return, it points to the matching rule. + * On entry, rule.slot > 0 means the info is valid and + * contains the the starting rule for an ipfw search. + * If chain_id == chain->id && slot >0 then jump to that slot. + * Otherwise, we locate the first rule >= rulenum:rule_id + */ + struct ipfw_rule_ref rule; /* match/restart info */ + + struct ether_header *eh; /* for bridged packets */ + + struct ipfw_flow_id f_id; /* grabbed from IP header */ + //uint32_t cookie; /* a cookie depending on rule action */ + struct inpcb *inp; + + struct _ip6dn_args dummypar; /* dummynet->ip6_output */ + struct sockaddr_in hopstore; /* store here if cannot use a pointer */ +}; + +MALLOC_DECLARE(M_IPFW); + +/* + * Hooks sometime need to know the direction of the packet + * (divert, dummynet, netgraph, ...) + * We use a generic definition here, with bit0-1 indicating the + * direction, bit 2 indicating layer2 or 3, bit 3-4 indicating the + * specific protocol + * indicating the protocol (if necessary) + */ +enum { + DIR_MASK = 0x3, + DIR_OUT = 0, + DIR_IN = 1, + DIR_FWD = 2, + DIR_DROP = 3, + PROTO_LAYER2 = 0x4, /* set for layer 2 */ + /* PROTO_DEFAULT = 0, */ + PROTO_IPV4 = 0x08, + PROTO_IPV6 = 0x10, + PROTO_IFB = 0x0c, /* layer2 + ifbridge */ + /* PROTO_OLDBDG = 0x14, unused, old bridge */ +}; + +/* wrapper for freeing a packet, in case we need to do more work */ +#ifndef FREE_PKT +#if defined(__linux__) || defined(_WIN32) +#define FREE_PKT(m) netisr_dispatch(-1, m) +#else +#define FREE_PKT(m) m_freem(m) +#endif +#endif /* !FREE_PKT */ + +/* + * Function definitions. + */ + +/* attach (arg = 1) or detach (arg = 0) hooks */ +int ipfw_attach_hooks(int); +#ifdef NOTYET +void ipfw_nat_destroy(void); +#endif + +/* In ip_fw_log.c */ +struct ip; +void ipfw_log_bpf(int); +void ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, + struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, + struct ip *ip); +VNET_DECLARE(u_int64_t, norule_counter); +#define V_norule_counter VNET(norule_counter) +VNET_DECLARE(int, verbose_limit); +#define V_verbose_limit VNET(verbose_limit) + +/* In ip_fw_dynamic.c */ + +enum { /* result for matching dynamic rules */ + MATCH_REVERSE = 0, + MATCH_FORWARD, + MATCH_NONE, + MATCH_UNKNOWN, +}; + +/* + * The lock for dynamic rules is only used once outside the file, + * and only to release the result of lookup_dyn_rule(). + * Eventually we may implement it with a callback on the function. + */ +void ipfw_dyn_unlock(void); + +struct tcphdr; +struct mbuf *ipfw_send_pkt(struct mbuf *, struct ipfw_flow_id *, + u_int32_t, u_int32_t, int); +int ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, + struct ip_fw_args *args, uint32_t tablearg); +ipfw_dyn_rule *ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, + int *match_direction, struct tcphdr *tcp); +void ipfw_remove_dyn_children(struct ip_fw *rule); +void ipfw_get_dynamic(char **bp, const char *ep); + +void ipfw_dyn_attach(void); /* uma_zcreate .... */ +void ipfw_dyn_detach(void); /* uma_zdestroy ... */ +void ipfw_dyn_init(void); /* per-vnet initialization */ +void ipfw_dyn_uninit(int); /* per-vnet deinitialization */ +int ipfw_dyn_len(void); + +/* common variables */ +VNET_DECLARE(int, fw_one_pass); +#define V_fw_one_pass VNET(fw_one_pass) + +VNET_DECLARE(int, fw_verbose); +#define V_fw_verbose VNET(fw_verbose) + +VNET_DECLARE(struct ip_fw_chain, layer3_chain); +#define V_layer3_chain VNET(layer3_chain) + +VNET_DECLARE(u_int32_t, set_disable); +#define V_set_disable VNET(set_disable) + +VNET_DECLARE(int, autoinc_step); +#define V_autoinc_step VNET(autoinc_step) + +struct ip_fw_chain { + struct ip_fw *rules; /* list of rules */ + struct ip_fw *reap; /* list of rules to reap */ + struct ip_fw *default_rule; + int n_rules; /* number of static rules */ + int static_len; /* total len of static rules */ + struct ip_fw **map; /* array of rule ptrs to ease lookup */ + LIST_HEAD(nat_list, cfg_nat) nat; /* list of nat entries */ + struct radix_node_head *tables[IPFW_TABLES_MAX]; +#if defined( __linux__ ) || defined( _WIN32 ) + spinlock_t rwmtx; + spinlock_t uh_lock; +#else + struct rwlock rwmtx; + struct rwlock uh_lock; /* lock for upper half */ +#endif + uint32_t id; /* ruleset id */ +}; + +struct sockopt; /* used by tcp_var.h */ + +/* + * The lock is heavily used by ip_fw2.c (the main file) and ip_fw_nat.c + * so the variable and the macros must be here. + */ + +#define IPFW_LOCK_INIT(_chain) do { \ + rw_init(&(_chain)->rwmtx, "IPFW static rules"); \ + rw_init(&(_chain)->uh_lock, "IPFW UH lock"); \ + } while (0) + +#define IPFW_LOCK_DESTROY(_chain) do { \ + rw_destroy(&(_chain)->rwmtx); \ + rw_destroy(&(_chain)->uh_lock); \ + } while (0) + +#define IPFW_WLOCK_ASSERT(_chain) rw_assert(&(_chain)->rwmtx, RA_WLOCKED) + +#define IPFW_RLOCK(p) rw_rlock(&(p)->rwmtx) +#define IPFW_RUNLOCK(p) rw_runlock(&(p)->rwmtx) +#define IPFW_WLOCK(p) rw_wlock(&(p)->rwmtx) +#define IPFW_WUNLOCK(p) rw_wunlock(&(p)->rwmtx) + +#define IPFW_UH_RLOCK(p) rw_rlock(&(p)->uh_lock) +#define IPFW_UH_RUNLOCK(p) rw_runlock(&(p)->uh_lock) +#define IPFW_UH_WLOCK(p) rw_wlock(&(p)->uh_lock) +#define IPFW_UH_WUNLOCK(p) rw_wunlock(&(p)->uh_lock) + +/* In ip_fw_sockopt.c */ +int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id); +int ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule); +int ipfw_ctl(struct sockopt *sopt); +int ipfw_chk(struct ip_fw_args *args); +void ipfw_reap_rules(struct ip_fw *head); + +/* In ip_fw_pfil */ +int ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, + struct inpcb *inp); + +/* In ip_fw_table.c */ +struct radix_node; +int ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint32_t *val); +int ipfw_init_tables(struct ip_fw_chain *ch); +void ipfw_destroy_tables(struct ip_fw_chain *ch); +int ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl); +int ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen, uint32_t value); +int ipfw_dump_table_entry(struct radix_node *rn, void *arg); +int ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen); +int ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt); +int ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl); + +/* In ip_fw_nat.c -- XXX to be moved to ip_var.h */ + +extern struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); + +typedef int ipfw_nat_t(struct ip_fw_args *, struct cfg_nat *, struct mbuf *); +typedef int ipfw_nat_cfg_t(struct sockopt *); + +extern ipfw_nat_t *ipfw_nat_ptr; +#define IPFW_NAT_LOADED (ipfw_nat_ptr != NULL) + +extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; + +#endif /* _KERNEL */ +#endif /* _IPFW2_PRIVATE_H */ diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c new file mode 100644 index 0000000..6938aca --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_sockopt.c @@ -0,0 +1,1343 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Supported by: Valeria Paoli + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_sockopt.c 206339 2010-04-07 08:23:58Z luigi $"); + +/* + * Sockopt support for ipfw. The routines here implement + * the upper half of the ipfw code. + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include /* struct m_tag used by nested headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include /* hooks */ +#include +#include + +#ifdef MAC +#include +#endif + +MALLOC_DEFINE(M_IPFW, "IpFw/IpAcct", "IpFw/IpAcct chain's"); + +/* + * static variables followed by global ones (none in this file) + */ + +/* + * Find the smallest rule >= key, id. + * We could use bsearch but it is so simple that we code it directly + */ +int +ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id) +{ + int i, lo, hi; + struct ip_fw *r; + + for (lo = 0, hi = chain->n_rules - 1; lo < hi;) { + i = (lo + hi) / 2; + r = chain->map[i]; + if (r->rulenum < key) + lo = i + 1; /* continue from the next one */ + else if (r->rulenum > key) + hi = i; /* this might be good */ + else if (r->id < id) + lo = i + 1; /* continue from the next one */ + else /* r->id >= id */ + hi = i; /* this might be good */ + }; + return hi; +} + +/* + * allocate a new map, returns the chain locked. extra is the number + * of entries to add or delete. + */ +static struct ip_fw ** +get_map(struct ip_fw_chain *chain, int extra, int locked) +{ + + for (;;) { + struct ip_fw **map; + int i; + + i = chain->n_rules + extra; + map = malloc(i * sizeof(struct ip_fw *), M_IPFW, + locked ? M_NOWAIT : M_WAITOK); + if (map == NULL) { + printf("%s: cannot allocate map\n", __FUNCTION__); + return NULL; + } + if (!locked) + IPFW_UH_WLOCK(chain); + if (i >= chain->n_rules + extra) /* good */ + return map; + /* otherwise we lost the race, free and retry */ + if (!locked) + IPFW_UH_WUNLOCK(chain); + free(map, M_IPFW); + } +} + +/* + * swap the maps. It is supposed to be called with IPFW_UH_WLOCK + */ +static struct ip_fw ** +swap_map(struct ip_fw_chain *chain, struct ip_fw **new_map, int new_len) +{ + struct ip_fw **old_map; + + IPFW_WLOCK(chain); + chain->id++; + chain->n_rules = new_len; + old_map = chain->map; + chain->map = new_map; + IPFW_WUNLOCK(chain); + return old_map; +} + +/* + * Add a new rule to the list. Copy the rule into a malloc'ed area, then + * possibly create a rule number and add the rule to the list. + * Update the rule_number in the input struct so the caller knows it as well. + * XXX DO NOT USE FOR THE DEFAULT RULE. + * Must be called without IPFW_UH held + */ +int +ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule) +{ + struct ip_fw *rule; + int i, l, insert_before; + struct ip_fw **map; /* the new array of pointers */ + + if (chain->rules == NULL || input_rule->rulenum > IPFW_DEFAULT_RULE-1) + return (EINVAL); + + l = RULESIZE(input_rule); + rule = malloc(l, M_IPFW, M_WAITOK | M_ZERO); + if (rule == NULL) + return (ENOSPC); + /* get_map returns with IPFW_UH_WLOCK if successful */ + map = get_map(chain, 1, 0 /* not locked */); + if (map == NULL) { + free(rule, M_IPFW); + return ENOSPC; + } + + bcopy(input_rule, rule, l); + /* clear fields not settable from userland */ + rule->x_next = NULL; + rule->next_rule = NULL; + rule->pcnt = 0; + rule->bcnt = 0; + rule->timestamp = 0; + + if (V_autoinc_step < 1) + V_autoinc_step = 1; + else if (V_autoinc_step > 1000) + V_autoinc_step = 1000; + /* find the insertion point, we will insert before */ + insert_before = rule->rulenum ? rule->rulenum + 1 : IPFW_DEFAULT_RULE; + i = ipfw_find_rule(chain, insert_before, 0); + /* duplicate first part */ + if (i > 0) + bcopy(chain->map, map, i * sizeof(struct ip_fw *)); + map[i] = rule; + /* duplicate remaining part, we always have the default rule */ + bcopy(chain->map + i, map + i + 1, + sizeof(struct ip_fw *) *(chain->n_rules - i)); + if (rule->rulenum == 0) { + /* write back the number */ + rule->rulenum = i > 0 ? map[i-1]->rulenum : 0; + if (rule->rulenum < IPFW_DEFAULT_RULE - V_autoinc_step) + rule->rulenum += V_autoinc_step; + input_rule->rulenum = rule->rulenum; + } + + rule->id = chain->id + 1; + map = swap_map(chain, map, chain->n_rules + 1); + chain->static_len += l; + IPFW_UH_WUNLOCK(chain); + if (map) + free(map, M_IPFW); + return (0); +} + +/* + * Reclaim storage associated with a list of rules. This is + * typically the list created using remove_rule. + * A NULL pointer on input is handled correctly. + */ +void +ipfw_reap_rules(struct ip_fw *head) +{ + struct ip_fw *rule; + + while ((rule = head) != NULL) { + head = head->x_next; + free(rule, M_IPFW); + } +} + +/* + * Used by del_entry() to check if a rule should be kept. + * Returns 1 if the rule must be kept, 0 otherwise. + * + * Called with cmd = {0,1,5}. + * cmd == 0 matches on rule numbers, excludes rules in RESVD_SET if n == 0 ; + * cmd == 1 matches on set numbers only, rule numbers are ignored; + * cmd == 5 matches on rule and set numbers. + * + * n == 0 is a wildcard for rule numbers, there is no wildcard for sets. + * + * Rules to keep are + * (default || reserved || !match_set || !match_number) + * where + * default ::= (rule->rulenum == IPFW_DEFAULT_RULE) + * // the default rule is always protected + * + * reserved ::= (cmd == 0 && n == 0 && rule->set == RESVD_SET) + * // RESVD_SET is protected only if cmd == 0 and n == 0 ("ipfw flush") + * + * match_set ::= (cmd == 0 || rule->set == set) + * // set number is ignored for cmd == 0 + * + * match_number ::= (cmd == 1 || n == 0 || n == rule->rulenum) + * // number is ignored for cmd == 1 or n == 0 + * + */ +static int +keep_rule(struct ip_fw *rule, uint8_t cmd, uint8_t set, uint32_t n) +{ + return + (rule->rulenum == IPFW_DEFAULT_RULE) || + (cmd == 0 && n == 0 && rule->set == RESVD_SET) || + !(cmd == 0 || rule->set == set) || + !(cmd == 1 || n == 0 || n == rule->rulenum); +} + +/** + * Remove all rules with given number, or do set manipulation. + * Assumes chain != NULL && *chain != NULL. + * + * The argument is an uint32_t. The low 16 bit are the rule or set number; + * the next 8 bits are the new set; the top 8 bits indicate the command: + * + * 0 delete rules numbered "rulenum" + * 1 delete rules in set "rulenum" + * 2 move rules "rulenum" to set "new_set" + * 3 move rules from set "rulenum" to set "new_set" + * 4 swap sets "rulenum" and "new_set" + * 5 delete rules "rulenum" and set "new_set" + */ +static int +del_entry(struct ip_fw_chain *chain, uint32_t arg) +{ + struct ip_fw *rule; + uint32_t num; /* rule number or old_set */ + uint8_t cmd, new_set; + int start, end, i, ofs, n; + struct ip_fw **map = NULL; + int error = 0; + + num = arg & 0xffff; + cmd = (arg >> 24) & 0xff; + new_set = (arg >> 16) & 0xff; + + if (cmd > 5 || new_set > RESVD_SET) + return EINVAL; + if (cmd == 0 || cmd == 2 || cmd == 5) { + if (num >= IPFW_DEFAULT_RULE) + return EINVAL; + } else { + if (num > RESVD_SET) /* old_set */ + return EINVAL; + } + + IPFW_UH_WLOCK(chain); /* arbitrate writers */ + chain->reap = NULL; /* prepare for deletions */ + + switch (cmd) { + case 0: /* delete rules "num" (num == 0 matches all) */ + case 1: /* delete all rules in set N */ + case 5: /* delete rules with number N and set "new_set". */ + + /* + * Locate first rule to delete (start), the rule after + * the last one to delete (end), and count how many + * rules to delete (n). Always use keep_rule() to + * determine which rules to keep. + */ + n = 0; + if (cmd == 1) { + /* look for a specific set including RESVD_SET. + * Must scan the entire range, ignore num. + */ + new_set = num; + for (start = -1, end = i = 0; i < chain->n_rules; i++) { + if (keep_rule(chain->map[i], cmd, new_set, 0)) + continue; + if (start < 0) + start = i; + end = i; + n++; + } + end++; /* first non-matching */ + } else { + /* Optimized search on rule numbers */ + start = ipfw_find_rule(chain, num, 0); + for (end = start; end < chain->n_rules; end++) { + rule = chain->map[end]; + if (num > 0 && rule->rulenum != num) + break; + if (!keep_rule(rule, cmd, new_set, num)) + n++; + } + } + + if (n == 0) { + /* A flush request (arg == 0) on empty ruleset + * returns with no error. On the contrary, + * if there is no match on a specific request, + * we return EINVAL. + */ + error = (arg == 0) ? 0 : EINVAL; + break; + } + + /* We have something to delete. Allocate the new map */ + map = get_map(chain, -n, 1 /* locked */); + if (map == NULL) { + error = EINVAL; + break; + } + + /* 1. bcopy the initial part of the map */ + if (start > 0) + bcopy(chain->map, map, start * sizeof(struct ip_fw *)); + /* 2. copy active rules between start and end */ + for (i = ofs = start; i < end; i++) { + rule = chain->map[i]; + if (keep_rule(rule, cmd, new_set, num)) + map[ofs++] = rule; + } + /* 3. copy the final part of the map */ + bcopy(chain->map + end, map + ofs, + (chain->n_rules - end) * sizeof(struct ip_fw *)); + /* 4. swap the maps (under BH_LOCK) */ + map = swap_map(chain, map, chain->n_rules - n); + /* 5. now remove the rules deleted from the old map */ + for (i = start; i < end; i++) { + int l; + rule = map[i]; + if (keep_rule(rule, cmd, new_set, num)) + continue; + l = RULESIZE(rule); + chain->static_len -= l; + ipfw_remove_dyn_children(rule); + rule->x_next = chain->reap; + chain->reap = rule; + } + break; + + /* + * In the next 3 cases the loop stops at (n_rules - 1) + * because the default rule is never eligible.. + */ + + case 2: /* move rules with given RULE number to new set */ + for (i = 0; i < chain->n_rules - 1; i++) { + rule = chain->map[i]; + if (rule->rulenum == num) + rule->set = new_set; + } + break; + + case 3: /* move rules with given SET number to new set */ + for (i = 0; i < chain->n_rules - 1; i++) { + rule = chain->map[i]; + if (rule->set == num) + rule->set = new_set; + } + break; + + case 4: /* swap two sets */ + for (i = 0; i < chain->n_rules - 1; i++) { + rule = chain->map[i]; + if (rule->set == num) + rule->set = new_set; + else if (rule->set == new_set) + rule->set = num; + } + break; + } + + rule = chain->reap; + chain->reap = NULL; + IPFW_UH_WUNLOCK(chain); + ipfw_reap_rules(rule); + if (map) + free(map, M_IPFW); + return error; +} + +/* + * Clear counters for a specific rule. + * Normally run under IPFW_UH_RLOCK, but these are idempotent ops + * so we only care that rules do not disappear. + */ +static void +clear_counters(struct ip_fw *rule, int log_only) +{ + ipfw_insn_log *l = (ipfw_insn_log *)ACTION_PTR(rule); + + if (log_only == 0) { + rule->bcnt = rule->pcnt = 0; + rule->timestamp = 0; + } + if (l->o.opcode == O_LOG) + l->log_left = l->max_log; +} + +/** + * Reset some or all counters on firewall rules. + * The argument `arg' is an u_int32_t. The low 16 bit are the rule number, + * the next 8 bits are the set number, the top 8 bits are the command: + * 0 work with rules from all set's; + * 1 work with rules only from specified set. + * Specified rule number is zero if we want to clear all entries. + * log_only is 1 if we only want to reset logs, zero otherwise. + */ +static int +zero_entry(struct ip_fw_chain *chain, u_int32_t arg, int log_only) +{ + struct ip_fw *rule; + char *msg; + int i; + + uint16_t rulenum = arg & 0xffff; + uint8_t set = (arg >> 16) & 0xff; + uint8_t cmd = (arg >> 24) & 0xff; + + if (cmd > 1) + return (EINVAL); + if (cmd == 1 && set > RESVD_SET) + return (EINVAL); + + IPFW_UH_RLOCK(chain); + if (rulenum == 0) { + V_norule_counter = 0; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + /* Skip rules not in our set. */ + if (cmd == 1 && rule->set != set) + continue; + clear_counters(rule, log_only); + } + msg = log_only ? "All logging counts reset" : + "Accounting cleared"; + } else { + int cleared = 0; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + if (rule->rulenum == rulenum) { + if (cmd == 0 || rule->set == set) + clear_counters(rule, log_only); + cleared = 1; + } + if (rule->rulenum > rulenum) + break; + } + if (!cleared) { /* we did not find any matching rules */ + IPFW_UH_RUNLOCK(chain); + return (EINVAL); + } + msg = log_only ? "logging count reset" : "cleared"; + } + IPFW_UH_RUNLOCK(chain); + + if (V_fw_verbose) { + int lev = LOG_SECURITY | LOG_NOTICE; + + if (rulenum) + log(lev, "ipfw: Entry %d %s.\n", rulenum, msg); + else + log(lev, "ipfw: %s.\n", msg); + } + return (0); +} + +/* + * Check validity of the structure before insert. + * Rules are simple, so this mostly need to check rule sizes. + */ +static int +check_ipfw_struct(struct ip_fw *rule, int size) +{ + int l, cmdlen = 0; + int have_action=0; + ipfw_insn *cmd; + + if (size < sizeof(*rule)) { + printf("ipfw: rule too short\n"); + return (EINVAL); + } + /* first, check for valid size */ + l = RULESIZE(rule); + if (l != size) { + printf("ipfw: size mismatch (have %d want %d)\n", size, l); + return (EINVAL); + } + if (rule->act_ofs >= rule->cmd_len) { + printf("ipfw: bogus action offset (%u > %u)\n", + rule->act_ofs, rule->cmd_len - 1); + return (EINVAL); + } + /* + * Now go for the individual checks. Very simple ones, basically only + * instruction sizes. + */ + for (l = rule->cmd_len, cmd = rule->cmd ; + l > 0 ; l -= cmdlen, cmd += cmdlen) { + cmdlen = F_LEN(cmd); + if (cmdlen > l) { + printf("ipfw: opcode %d size truncated\n", + cmd->opcode); + return EINVAL; + } + switch (cmd->opcode) { + case O_PROBE_STATE: + case O_KEEP_STATE: + case O_PROTO: + case O_IP_SRC_ME: + case O_IP_DST_ME: + case O_LAYER2: + case O_IN: + case O_FRAG: + case O_DIVERTED: + case O_IPOPT: + case O_IPTOS: + case O_IPPRECEDENCE: + case O_IPVER: + case O_TCPWIN: + case O_TCPFLAGS: + case O_TCPOPTS: + case O_ESTAB: + case O_VERREVPATH: + case O_VERSRCREACH: + case O_ANTISPOOF: + case O_IPSEC: +#ifdef INET6 + case O_IP6_SRC_ME: + case O_IP6_DST_ME: + case O_EXT_HDR: + case O_IP6: +#endif + case O_IP4: + case O_TAG: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + break; + + case O_FIB: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + if (cmd->arg1 >= rt_numfibs) { + printf("ipfw: invalid fib number %d\n", + cmd->arg1); + return EINVAL; + } + break; + + case O_SETFIB: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + if (cmd->arg1 >= rt_numfibs) { + printf("ipfw: invalid fib number %d\n", + cmd->arg1); + return EINVAL; + } + goto check_action; + + case O_UID: + case O_GID: + case O_JAIL: + case O_IP_SRC: + case O_IP_DST: + case O_TCPSEQ: + case O_TCPACK: + case O_PROB: + case O_ICMPTYPE: + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32)) + goto bad_size; + break; + + case O_LIMIT: + if (cmdlen != F_INSN_SIZE(ipfw_insn_limit)) + goto bad_size; + break; + + case O_LOG: + if (cmdlen != F_INSN_SIZE(ipfw_insn_log)) + goto bad_size; + + ((ipfw_insn_log *)cmd)->log_left = + ((ipfw_insn_log *)cmd)->max_log; + + break; + + case O_IP_SRC_MASK: + case O_IP_DST_MASK: + /* only odd command lengths */ + if ( !(cmdlen & 1) || cmdlen > 31) + goto bad_size; + break; + + case O_IP_SRC_SET: + case O_IP_DST_SET: + if (cmd->arg1 == 0 || cmd->arg1 > 256) { + printf("ipfw: invalid set size %d\n", + cmd->arg1); + return EINVAL; + } + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + + (cmd->arg1+31)/32 ) + goto bad_size; + break; + + case O_IP_SRC_LOOKUP: + case O_IP_DST_LOOKUP: + if (cmd->arg1 >= IPFW_TABLES_MAX) { + printf("ipfw: invalid table number %d\n", + cmd->arg1); + return (EINVAL); + } + if (cmdlen != F_INSN_SIZE(ipfw_insn) && + cmdlen != F_INSN_SIZE(ipfw_insn_u32) + 1 && + cmdlen != F_INSN_SIZE(ipfw_insn_u32)) + goto bad_size; + break; + + case O_MACADDR2: + if (cmdlen != F_INSN_SIZE(ipfw_insn_mac)) + goto bad_size; + break; + + case O_NOP: + case O_IPID: + case O_IPTTL: + case O_IPLEN: + case O_TCPDATALEN: + case O_TAGGED: + if (cmdlen < 1 || cmdlen > 31) + goto bad_size; + break; + + case O_MAC_TYPE: + case O_IP_SRCPORT: + case O_IP_DSTPORT: /* XXX artificial limit, 30 port pairs */ + if (cmdlen < 2 || cmdlen > 31) + goto bad_size; + break; + + case O_RECV: + case O_XMIT: + case O_VIA: + if (cmdlen != F_INSN_SIZE(ipfw_insn_if)) + goto bad_size; + break; + + case O_ALTQ: + if (cmdlen != F_INSN_SIZE(ipfw_insn_altq)) + goto bad_size; + break; + + case O_PIPE: + case O_QUEUE: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + goto check_action; + + case O_FORWARD_IP: +#ifdef IPFIREWALL_FORWARD + if (cmdlen != F_INSN_SIZE(ipfw_insn_sa)) + goto bad_size; + goto check_action; +#else + return EINVAL; +#endif + + case O_DIVERT: + case O_TEE: + if (ip_divert_ptr == NULL) + return EINVAL; + else + goto check_size; + case O_NETGRAPH: + case O_NGTEE: + if (ng_ipfw_input_p == NULL) + return EINVAL; + else + goto check_size; + case O_NAT: + if (!IPFW_NAT_LOADED) + return EINVAL; + if (cmdlen != F_INSN_SIZE(ipfw_insn_nat)) + goto bad_size; + goto check_action; + case O_FORWARD_MAC: /* XXX not implemented yet */ + case O_CHECK_STATE: + case O_COUNT: + case O_ACCEPT: + case O_DENY: + case O_REJECT: +#ifdef INET6 + case O_UNREACH6: +#endif + case O_SKIPTO: + case O_REASS: +check_size: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; +check_action: + if (have_action) { + printf("ipfw: opcode %d, multiple actions" + " not allowed\n", + cmd->opcode); + return EINVAL; + } + have_action = 1; + if (l != cmdlen) { + printf("ipfw: opcode %d, action must be" + " last opcode\n", + cmd->opcode); + return EINVAL; + } + break; +#ifdef INET6 + case O_IP6_SRC: + case O_IP6_DST: + if (cmdlen != F_INSN_SIZE(struct in6_addr) + + F_INSN_SIZE(ipfw_insn)) + goto bad_size; + break; + + case O_FLOW6ID: + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + + ((ipfw_insn_u32 *)cmd)->o.arg1) + goto bad_size; + break; + + case O_IP6_SRC_MASK: + case O_IP6_DST_MASK: + if ( !(cmdlen & 1) || cmdlen > 127) + goto bad_size; + break; + case O_ICMP6TYPE: + if( cmdlen != F_INSN_SIZE( ipfw_insn_icmp6 ) ) + goto bad_size; + break; +#endif + + default: + switch (cmd->opcode) { +#ifndef INET6 + case O_IP6_SRC_ME: + case O_IP6_DST_ME: + case O_EXT_HDR: + case O_IP6: + case O_UNREACH6: + case O_IP6_SRC: + case O_IP6_DST: + case O_FLOW6ID: + case O_IP6_SRC_MASK: + case O_IP6_DST_MASK: + case O_ICMP6TYPE: + printf("ipfw: no IPv6 support in kernel\n"); + return EPROTONOSUPPORT; +#endif + default: + printf("ipfw: opcode %d, unknown opcode\n", + cmd->opcode); + return EINVAL; + } + } + } + if (have_action == 0) { + printf("ipfw: missing action\n"); + return EINVAL; + } + return 0; + +bad_size: + printf("ipfw: opcode %d size %d wrong\n", + cmd->opcode, cmdlen); + return EINVAL; +} + + +/* + * Translation of requests for compatibility with FreeBSD 7.2/8. + * a static variable tells us if we have an old client from userland, + * and if necessary we translate requests and responses between the + * two formats. + */ +static int is7 = 0; + +struct ip_fw7 { + struct ip_fw7 *next; /* linked list of rules */ + struct ip_fw7 *next_rule; /* ptr to next [skipto] rule */ + /* 'next_rule' is used to pass up 'set_disable' status */ + + uint16_t act_ofs; /* offset of action in 32-bit units */ + uint16_t cmd_len; /* # of 32-bit words in cmd */ + uint16_t rulenum; /* rule number */ + uint8_t set; /* rule set (0..31) */ + // #define RESVD_SET 31 /* set for default and persistent rules */ + uint8_t _pad; /* padding */ + // uint32_t id; /* rule id, only in v.8 */ + /* These fields are present in all rules. */ + uint64_t pcnt; /* Packet counter */ + uint64_t bcnt; /* Byte counter */ + uint32_t timestamp; /* tv_sec of last match */ + + ipfw_insn cmd[1]; /* storage for commands */ +}; + + int convert_rule_to_7(struct ip_fw *rule); +int convert_rule_to_8(struct ip_fw *rule); + +#ifndef RULESIZE7 +#define RULESIZE7(rule) (sizeof(struct ip_fw7) + \ + ((struct ip_fw7 *)(rule))->cmd_len * 4 - 4) +#endif + + +/* + * Copy the static and dynamic rules to the supplied buffer + * and return the amount of space actually used. + * Must be run under IPFW_UH_RLOCK + */ +static size_t +ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space) +{ + char *bp = buf; + char *ep = bp + space; + struct ip_fw *rule, *dst; + int l, i; + time_t boot_seconds; + + boot_seconds = boottime.tv_sec; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + + if (is7) { + /* Convert rule to FreeBSd 7.2 format */ + l = RULESIZE7(rule); + if (bp + l + sizeof(uint32_t) <= ep) { + int error; + bcopy(rule, bp, l + sizeof(uint32_t)); + error = convert_rule_to_7((struct ip_fw *) bp); + if (error) + return 0; /*XXX correct? */ + /* + * XXX HACK. Store the disable mask in the "next" + * pointer in a wild attempt to keep the ABI the same. + * Why do we do this on EVERY rule? + */ + bcopy(&V_set_disable, + &(((struct ip_fw7 *)bp)->next_rule), + sizeof(V_set_disable)); + if (((struct ip_fw7 *)bp)->timestamp) + ((struct ip_fw7 *)bp)->timestamp += boot_seconds; + bp += l; + } + continue; /* go to next rule */ + } + + /* normal mode, don't touch rules */ + l = RULESIZE(rule); + if (bp + l > ep) { /* should not happen */ + printf("overflow dumping static rules\n"); + break; + } + dst = (struct ip_fw *)bp; + bcopy(rule, dst, l); + /* + * XXX HACK. Store the disable mask in the "next" + * pointer in a wild attempt to keep the ABI the same. + * Why do we do this on EVERY rule? + */ + bcopy(&V_set_disable, &dst->next_rule, sizeof(V_set_disable)); + if (dst->timestamp) + dst->timestamp += boot_seconds; + bp += l; + } + ipfw_get_dynamic(&bp, ep); /* protected by the dynamic lock */ + return (bp - (char *)buf); +} + + +/** + * {set|get}sockopt parser. + */ +int +ipfw_ctl(struct sockopt *sopt) +{ +#define RULE_MAXSIZE (256*sizeof(u_int32_t)) + int error; + size_t size; + struct ip_fw *buf, *rule; + struct ip_fw_chain *chain; + u_int32_t rulenum[2]; + + error = priv_check(sopt->sopt_td, PRIV_NETINET_IPFW); + if (error) + return (error); + + /* + * Disallow modifications in really-really secure mode, but still allow + * the logging counters to be reset. + */ + if (sopt->sopt_name == IP_FW_ADD || + (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) { + error = securelevel_ge(sopt->sopt_td->td_ucred, 3); + if (error) + return (error); + } + + chain = &V_layer3_chain; + error = 0; + + switch (sopt->sopt_name) { + case IP_FW_GET: + /* + * pass up a copy of the current rules. Static rules + * come first (the last of which has number IPFW_DEFAULT_RULE), + * followed by a possibly empty list of dynamic rule. + * The last dynamic rule has NULL in the "next" field. + * + * Note that the calculated size is used to bound the + * amount of data returned to the user. The rule set may + * change between calculating the size and returning the + * data in which case we'll just return what fits. + */ + for (;;) { + int len = 0, want; + + size = chain->static_len; + size += ipfw_dyn_len(); + if (size >= sopt->sopt_valsize) + break; + buf = malloc(size, M_TEMP, M_WAITOK); + if (buf == NULL) + break; + IPFW_UH_RLOCK(chain); + /* check again how much space we need */ + want = chain->static_len + ipfw_dyn_len(); + if (size >= want) + len = ipfw_getrules(chain, buf, size); + IPFW_UH_RUNLOCK(chain); + if (size >= want) + error = sooptcopyout(sopt, buf, len); + free(buf, M_TEMP); + if (size >= want) + break; + } + break; + + case IP_FW_FLUSH: + /* locking is done within del_entry() */ + error = del_entry(chain, 0); /* special case, rule=0, cmd=0 means all */ + break; + + case IP_FW_ADD: + rule = malloc(RULE_MAXSIZE, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, rule, RULE_MAXSIZE, + sizeof(struct ip_fw7) ); + + /* + * If the size of commands equals RULESIZE7 then we assume + * a FreeBSD7.2 binary is talking to us (set is7=1). + * is7 is persistent so the next 'ipfw list' command + * will use this format. + * NOTE: If wrong version is guessed (this can happen if + * the first ipfw command is 'ipfw [pipe] list') + * the ipfw binary may crash or loop infinitly... + */ + if (sopt->sopt_valsize == RULESIZE7(rule)) { + is7 = 1; + error = convert_rule_to_8(rule); + if (error) + return error; + if (error == 0) + error = check_ipfw_struct(rule, RULESIZE(rule)); + } else { + is7 = 0; + if (error == 0) + error = check_ipfw_struct(rule, sopt->sopt_valsize); + } + if (error == 0) { + /* locking is done within ipfw_add_rule() */ + error = ipfw_add_rule(chain, rule); + size = RULESIZE(rule); + if (!error && sopt->sopt_dir == SOPT_GET) { + if (is7) { + error = convert_rule_to_7(rule); + size = RULESIZE7(rule); + if (error) + return error; + } + error = sooptcopyout(sopt, rule, size); + } + } + free(rule, M_TEMP); + break; + + case IP_FW_DEL: + /* + * IP_FW_DEL is used for deleting single rules or sets, + * and (ab)used to atomically manipulate sets. Argument size + * is used to distinguish between the two: + * sizeof(u_int32_t) + * delete single rule or set of rules, + * or reassign rules (or sets) to a different set. + * 2*sizeof(u_int32_t) + * atomic disable/enable sets. + * first u_int32_t contains sets to be disabled, + * second u_int32_t contains sets to be enabled. + */ + error = sooptcopyin(sopt, rulenum, + 2*sizeof(u_int32_t), sizeof(u_int32_t)); + if (error) + break; + size = sopt->sopt_valsize; + if (size == sizeof(u_int32_t) && rulenum[0] != 0) { + /* delete or reassign, locking done in del_entry() */ + error = del_entry(chain, rulenum[0]); + } else if (size == 2*sizeof(u_int32_t)) { /* set enable/disable */ + IPFW_UH_WLOCK(chain); + V_set_disable = + (V_set_disable | rulenum[0]) & ~rulenum[1] & + ~(1<sopt_val != 0) { + error = sooptcopyin(sopt, rulenum, + sizeof(u_int32_t), sizeof(u_int32_t)); + if (error) + break; + } + error = zero_entry(chain, rulenum[0], + sopt->sopt_name == IP_FW_RESETLOG); + break; + + /*--- TABLE manipulations are protected by the IPFW_LOCK ---*/ + case IP_FW_TABLE_ADD: + { + ipfw_table_entry ent; + + error = sooptcopyin(sopt, &ent, + sizeof(ent), sizeof(ent)); + if (error) + break; + error = ipfw_add_table_entry(chain, ent.tbl, + ent.addr, ent.masklen, ent.value); + } + break; + + case IP_FW_TABLE_DEL: + { + ipfw_table_entry ent; + + error = sooptcopyin(sopt, &ent, + sizeof(ent), sizeof(ent)); + if (error) + break; + error = ipfw_del_table_entry(chain, ent.tbl, + ent.addr, ent.masklen); + } + break; + + case IP_FW_TABLE_FLUSH: + { + u_int16_t tbl; + + error = sooptcopyin(sopt, &tbl, + sizeof(tbl), sizeof(tbl)); + if (error) + break; + IPFW_WLOCK(chain); + error = ipfw_flush_table(chain, tbl); + IPFW_WUNLOCK(chain); + } + break; + + case IP_FW_TABLE_GETSIZE: + { + u_int32_t tbl, cnt; + + if ((error = sooptcopyin(sopt, &tbl, sizeof(tbl), + sizeof(tbl)))) + break; + IPFW_RLOCK(chain); + error = ipfw_count_table(chain, tbl, &cnt); + IPFW_RUNLOCK(chain); + if (error) + break; + error = sooptcopyout(sopt, &cnt, sizeof(cnt)); + } + break; + + case IP_FW_TABLE_LIST: + { + ipfw_table *tbl; + + if (sopt->sopt_valsize < sizeof(*tbl)) { + error = EINVAL; + break; + } + size = sopt->sopt_valsize; + tbl = malloc(size, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, tbl, size, sizeof(*tbl)); + if (error) { + free(tbl, M_TEMP); + break; + } + tbl->size = (size - sizeof(*tbl)) / + sizeof(ipfw_table_entry); + IPFW_RLOCK(chain); + error = ipfw_dump_table(chain, tbl); + IPFW_RUNLOCK(chain); + if (error) { + free(tbl, M_TEMP); + break; + } + error = sooptcopyout(sopt, tbl, size); + free(tbl, M_TEMP); + } + break; + + /*--- NAT operations are protected by the IPFW_LOCK ---*/ + case IP_FW_NAT_CFG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_cfg_ptr(sopt); + else { + printf("IP_FW_NAT_CFG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_DEL: + if (IPFW_NAT_LOADED) + error = ipfw_nat_del_ptr(sopt); + else { + printf("IP_FW_NAT_DEL: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_GET_CONFIG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_get_cfg_ptr(sopt); + else { + printf("IP_FW_NAT_GET_CFG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_GET_LOG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_get_log_ptr(sopt); + else { + printf("IP_FW_NAT_GET_LOG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + default: + printf("ipfw: ipfw_ctl invalid option %d\n", sopt->sopt_name); + error = EINVAL; + } + + return (error); +#undef RULE_MAXSIZE +} + + +#define RULE_MAXSIZE (256*sizeof(u_int32_t)) + +/* Functions to convert rules 7.2 <==> 8.0 */ +int +convert_rule_to_7(struct ip_fw *rule) +{ + /* Used to modify original rule */ + struct ip_fw7 *rule7 = (struct ip_fw7 *)rule; + /* copy of original rule, version 8 */ + struct ip_fw *tmp; + + /* Used to copy commands */ + ipfw_insn *ccmd, *dst; + int ll = 0, ccmdlen = 0; + + tmp = malloc(RULE_MAXSIZE, M_TEMP, M_NOWAIT | M_ZERO); + if (tmp == NULL) { + return 1; //XXX error + } + bcopy(rule, tmp, RULE_MAXSIZE); + + /* Copy fields */ + rule7->_pad = tmp->_pad; + rule7->set = tmp->set; + rule7->rulenum = tmp->rulenum; + rule7->cmd_len = tmp->cmd_len; + rule7->act_ofs = tmp->act_ofs; + rule7->next_rule = (struct ip_fw7 *)tmp->next_rule; + rule7->next = (struct ip_fw7 *)tmp->x_next; + rule7->cmd_len = tmp->cmd_len; + rule7->pcnt = tmp->pcnt; + rule7->bcnt = tmp->bcnt; + rule7->timestamp = tmp->timestamp; + + /* Copy commands */ + for (ll = tmp->cmd_len, ccmd = tmp->cmd, dst = rule7->cmd ; + ll > 0 ; ll -= ccmdlen, ccmd += ccmdlen, dst += ccmdlen) { + ccmdlen = F_LEN(ccmd); + + bcopy(ccmd, dst, F_LEN(ccmd)*sizeof(uint32_t)); + + if (dst->opcode > O_NAT) + /* O_REASS doesn't exists in 7.2 version, so + * decrement opcode if it is after O_REASS + */ + dst->opcode--; + + if (ccmdlen > ll) { + printf("ipfw: opcode %d size truncated\n", + ccmd->opcode); + return EINVAL; + } + } + free(tmp, M_TEMP); + + return 0; +} + +int +convert_rule_to_8(struct ip_fw *rule) +{ + /* Used to modify original rule */ + struct ip_fw7 *rule7 = (struct ip_fw7 *) rule; + + /* Used to copy commands */ + ipfw_insn *ccmd, *dst; + int ll = 0, ccmdlen = 0; + + /* Copy of original rule */ + struct ip_fw7 *tmp = malloc(RULE_MAXSIZE, M_TEMP, M_NOWAIT | M_ZERO); + if (tmp == NULL) { + return 1; //XXX error + } + + bcopy(rule7, tmp, RULE_MAXSIZE); + + for (ll = tmp->cmd_len, ccmd = tmp->cmd, dst = rule->cmd ; + ll > 0 ; ll -= ccmdlen, ccmd += ccmdlen, dst += ccmdlen) { + ccmdlen = F_LEN(ccmd); + + bcopy(ccmd, dst, F_LEN(ccmd)*sizeof(uint32_t)); + + if (dst->opcode > O_NAT) + /* O_REASS doesn't exists in 7.2 version, so + * increment opcode if it is after O_REASS + */ + dst->opcode++; + + if (ccmdlen > ll) { + printf("ipfw: opcode %d size truncated\n", + ccmd->opcode); + return EINVAL; + } + } + + rule->_pad = tmp->_pad; + rule->set = tmp->set; + rule->rulenum = tmp->rulenum; + rule->cmd_len = tmp->cmd_len; + rule->act_ofs = tmp->act_ofs; + rule->next_rule = (struct ip_fw *)tmp->next_rule; + rule->x_next = (struct ip_fw *)tmp->next; + rule->cmd_len = tmp->cmd_len; + rule->id = 0; /* XXX see if is ok = 0 */ + rule->pcnt = tmp->pcnt; + rule->bcnt = tmp->bcnt; + rule->timestamp = tmp->timestamp; + + free (tmp, M_TEMP); + return 0; +} + +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_table.c b/sys/netinet/ipfw/ip_fw_table.c new file mode 100644 index 0000000..d8973d5 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_table.c @@ -0,0 +1,286 @@ +/*- + * Copyright (c) 2004 Ruslan Ermilov and Vsevolod Lobko. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_fw_table.c 200601 2009-12-16 10:48:40Z luigi $"); + +/* + * Lookup table support for ipfw + * + * Lookup tables are implemented (at the moment) using the radix + * tree used for routing tables. Tables store key-value entries, where + * keys are network prefixes (addr/masklen), and values are integers. + * As a degenerate case we can interpret keys as 32-bit integers + * (with a /32 mask). + * + * The table is protected by the IPFW lock even for manipulation coming + * from userland, because operations are typically fast. + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include /* ip_fw.h requires IFNAMSIZ */ +#include +#include +#include + +#include +#include /* struct ipfw_rule_ref */ +#include +#include /* LIST_HEAD */ +#include + +#ifdef MAC +#include +#endif + +MALLOC_DEFINE(M_IPFW_TBL, "ipfw_tbl", "IpFw tables"); + +struct table_entry { + struct radix_node rn[2]; + struct sockaddr_in addr, mask; + u_int32_t value; +}; + +/* + * The radix code expects addr and mask to be array of bytes, + * with the first byte being the length of the array. rn_inithead + * is called with the offset in bits of the lookup key within the + * array. If we use a sockaddr_in as the underlying type, + * sin_len is conveniently located at offset 0, sin_addr is at + * offset 4 and normally aligned. + * But for portability, let's avoid assumption and make the code explicit + */ +#define KEY_LEN(v) *((uint8_t *)&(v)) +#define KEY_OFS (8*offsetof(struct sockaddr_in, sin_addr)) + +int +ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen, uint32_t value) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct radix_node *rn; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + ent = malloc(sizeof(*ent), M_IPFW_TBL, M_NOWAIT | M_ZERO); + if (ent == NULL) + return (ENOMEM); + ent->value = value; + KEY_LEN(ent->addr) = KEY_LEN(ent->mask) = 8; + ent->mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); + ent->addr.sin_addr.s_addr = addr & ent->mask.sin_addr.s_addr; + IPFW_WLOCK(ch); + rn = rnh->rnh_addaddr(&ent->addr, &ent->mask, rnh, (void *)ent); + if (rn == NULL) { + IPFW_WUNLOCK(ch); + free(ent, M_IPFW_TBL); + return (EEXIST); + } + IPFW_WUNLOCK(ch); + return (0); +} + +int +ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct sockaddr_in sa, mask; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + KEY_LEN(sa) = KEY_LEN(mask) = 8; + mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); + sa.sin_addr.s_addr = addr & mask.sin_addr.s_addr; + IPFW_WLOCK(ch); + ent = (struct table_entry *)rnh->rnh_deladdr(&sa, &mask, rnh); + if (ent == NULL) { + IPFW_WUNLOCK(ch); + return (ESRCH); + } + IPFW_WUNLOCK(ch); + free(ent, M_IPFW_TBL); + return (0); +} + +static int +flush_table_entry(struct radix_node *rn, void *arg) +{ + struct radix_node_head * const rnh = arg; + struct table_entry *ent; + + ent = (struct table_entry *) + rnh->rnh_deladdr(rn->rn_key, rn->rn_mask, rnh); + if (ent != NULL) + free(ent, M_IPFW_TBL); + return (0); +} + +int +ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl) +{ + struct radix_node_head *rnh; + + IPFW_WLOCK_ASSERT(ch); + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + KASSERT(rnh != NULL, ("NULL IPFW table")); + rnh->rnh_walktree(rnh, flush_table_entry, rnh); + return (0); +} + +void +ipfw_destroy_tables(struct ip_fw_chain *ch) +{ + uint16_t tbl; + struct radix_node_head *rnh; + + IPFW_WLOCK_ASSERT(ch); + + for (tbl = 0; tbl < IPFW_TABLES_MAX; tbl++) { + ipfw_flush_table(ch, tbl); + rnh = ch->tables[tbl]; + rn_detachhead((void **)&rnh); + } +} + +int +ipfw_init_tables(struct ip_fw_chain *ch) +{ + int i; + uint16_t j; + + for (i = 0; i < IPFW_TABLES_MAX; i++) { + if (!rn_inithead((void **)&ch->tables[i], KEY_OFS)) { + for (j = 0; j < i; j++) { + (void) ipfw_flush_table(ch, j); + } + return (ENOMEM); + } + } + return (0); +} + +int +ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint32_t *val) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct sockaddr_in sa; + + if (tbl >= IPFW_TABLES_MAX) + return (0); + rnh = ch->tables[tbl]; + KEY_LEN(sa) = 8; + sa.sin_addr.s_addr = addr; + ent = (struct table_entry *)(rnh->rnh_lookup(&sa, NULL, rnh)); + if (ent != NULL) { + *val = ent->value; + return (1); + } + return (0); +} + +static int +count_table_entry(struct radix_node *rn, void *arg) +{ + u_int32_t * const cnt = arg; + + (*cnt)++; + return (0); +} + +int +ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt) +{ + struct radix_node_head *rnh; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + *cnt = 0; + rnh->rnh_walktree(rnh, count_table_entry, cnt); + return (0); +} + +static int +dump_table_entry(struct radix_node *rn, void *arg) +{ + struct table_entry * const n = (struct table_entry *)rn; + ipfw_table * const tbl = arg; + ipfw_table_entry *ent; + + if (tbl->cnt == tbl->size) + return (1); + ent = &tbl->ent[tbl->cnt]; + ent->tbl = tbl->tbl; + if (in_nullhost(n->mask.sin_addr)) + ent->masklen = 0; + else + ent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr)); + ent->addr = n->addr.sin_addr.s_addr; + ent->value = n->value; + tbl->cnt++; + return (0); +} + +int +ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl) +{ + struct radix_node_head *rnh; + + if (tbl->tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl->tbl]; + tbl->cnt = 0; + rnh->rnh_walktree(rnh, dump_table_entry, tbl); + return (0); +} +/* end of file */ diff --git a/sys/netinet/tcp.h b/sys/netinet/tcp.h new file mode 100644 index 0000000..5af35a7 --- /dev/null +++ b/sys/netinet/tcp.h @@ -0,0 +1,228 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)tcp.h 8.1 (Berkeley) 6/10/93 + * $FreeBSD: src/sys/netinet/tcp.h,v 1.40.2.2 2008/07/31 06:10:25 kmacy Exp $ + */ + +#ifndef _NETINET_TCP_H_ +#define _NETINET_TCP_H_ + +#include + +#define __BSD_VISIBLE 1 + +#if __BSD_VISIBLE + +typedef u_int32_t tcp_seq; + +#define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ +#define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ + +/* + * TCP header. + * Per RFC 793, September, 1981. + */ +struct tcphdr { + u_short th_sport; /* source port */ + u_short th_dport; /* destination port */ + tcp_seq th_seq; /* sequence number */ + tcp_seq th_ack; /* acknowledgement number */ +#if BYTE_ORDER == LITTLE_ENDIAN + u_char th_x2:4, /* (unused) */ + th_off:4; /* data offset */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char th_off:4, /* data offset */ + th_x2:4; /* (unused) */ +#endif + u_char th_flags; +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PUSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 +#define TH_ECE 0x40 +#define TH_CWR 0x80 +#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECE|TH_CWR) +#define PRINT_TH_FLAGS "\20\1FIN\2SYN\3RST\4PUSH\5ACK\6URG\7ECE\10CWR" + + u_short th_win; /* window */ + u_short th_sum; /* checksum */ + u_short th_urp; /* urgent pointer */ +}; + +#define TCPOPT_EOL 0 +#define TCPOLEN_EOL 1 +#define TCPOPT_PAD 0 /* padding after EOL */ +#define TCPOLEN_PAD 1 +#define TCPOPT_NOP 1 +#define TCPOLEN_NOP 1 +#define TCPOPT_MAXSEG 2 +#define TCPOLEN_MAXSEG 4 +#define TCPOPT_WINDOW 3 +#define TCPOLEN_WINDOW 3 +#define TCPOPT_SACK_PERMITTED 4 +#define TCPOLEN_SACK_PERMITTED 2 +#define TCPOPT_SACK 5 +#define TCPOLEN_SACKHDR 2 +#define TCPOLEN_SACK 8 /* 2*sizeof(tcp_seq) */ +#define TCPOPT_TIMESTAMP 8 +#define TCPOLEN_TIMESTAMP 10 +#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ +#define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ +#define TCPOLEN_SIGNATURE 18 + +/* Miscellaneous constants */ +#define MAX_SACK_BLKS 6 /* Max # SACK blocks stored at receiver side */ +#define TCP_MAX_SACK 4 /* MAX # SACKs sent in any segment */ + + +/* + * Default maximum segment size for TCP. + * With an IP MTU of 576, this is 536, + * but 512 is probably more convenient. + * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). + */ +#define TCP_MSS 512 +/* + * TCP_MINMSS is defined to be 216 which is fine for the smallest + * link MTU (256 bytes, AX.25 packet radio) in the Internet. + * However it is very unlikely to come across such low MTU interfaces + * these days (anno dato 2003). + * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments. + * Setting this to "0" disables the minmss check. + */ +#define TCP_MINMSS 216 + +/* + * Default maximum segment size for TCP6. + * With an IP6 MSS of 1280, this is 1220, + * but 1024 is probably more convenient. (xxx kazu in doubt) + * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) + */ +#define TCP6_MSS 1024 + +#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ +#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ + +#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ + +#define TCP_MAXBURST 4 /* maximum segments in a burst */ + +#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ +#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) + /* max space left for options */ +#endif /* __BSD_VISIBLE */ + +/* + * User-settable options (used with setsockopt). + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#if __BSD_VISIBLE +#define TCP_MAXSEG 0x02 /* set maximum segment size */ +#define TCP_NOPUSH 0x04 /* don't push last block of write */ +#define TCP_NOOPT 0x08 /* don't use TCP options */ +#define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */ +#define TCP_INFO 0x20 /* retrieve tcp_info structure */ +#define TCP_CONGESTION 0x40 /* get/set congestion control algorithm */ + +#define TCP_CA_NAME_MAX 16 /* max congestion control name length */ + +#define TCPI_OPT_TIMESTAMPS 0x01 +#define TCPI_OPT_SACK 0x02 +#define TCPI_OPT_WSCALE 0x04 +#define TCPI_OPT_ECN 0x08 +#define TCPI_OPT_TOE 0x10 + +/* + * The TCP_INFO socket option comes from the Linux 2.6 TCP API, and permits + * the caller to query certain information about the state of a TCP + * connection. We provide an overlapping set of fields with the Linux + * implementation, but since this is a fixed size structure, room has been + * left for growth. In order to maximize potential future compatibility with + * the Linux API, the same variable names and order have been adopted, and + * padding left to make room for omitted fields in case they are added later. + * + * XXX: This is currently an unstable ABI/API, in that it is expected to + * change. + */ +struct tcp_info { + u_int8_t tcpi_state; /* TCP FSM state. */ + u_int8_t __tcpi_ca_state; + u_int8_t __tcpi_retransmits; + u_int8_t __tcpi_probes; + u_int8_t __tcpi_backoff; + u_int8_t tcpi_options; /* Options enabled on conn. */ + u_int8_t tcpi_snd_wscale:4, /* RFC1323 send shift value. */ + tcpi_rcv_wscale:4; /* RFC1323 recv shift value. */ + + u_int32_t __tcpi_rto; + u_int32_t __tcpi_ato; + u_int32_t __tcpi_snd_mss; + u_int32_t __tcpi_rcv_mss; + + u_int32_t __tcpi_unacked; + u_int32_t __tcpi_sacked; + u_int32_t __tcpi_lost; + u_int32_t __tcpi_retrans; + u_int32_t __tcpi_fackets; + + /* Times; measurements in usecs. */ + u_int32_t __tcpi_last_data_sent; + u_int32_t __tcpi_last_ack_sent; /* Also unimpl. on Linux? */ + u_int32_t __tcpi_last_data_recv; + u_int32_t __tcpi_last_ack_recv; + + /* Metrics; variable units. */ + u_int32_t __tcpi_pmtu; + u_int32_t __tcpi_rcv_ssthresh; + u_int32_t tcpi_rtt; /* Smoothed RTT in usecs. */ + u_int32_t tcpi_rttvar; /* RTT variance in usecs. */ + u_int32_t tcpi_snd_ssthresh; /* Slow start threshold. */ + u_int32_t tcpi_snd_cwnd; /* Send congestion window. */ + u_int32_t __tcpi_advmss; + u_int32_t __tcpi_reordering; + + u_int32_t __tcpi_rcv_rtt; + u_int32_t tcpi_rcv_space; /* Advertised recv window. */ + + /* FreeBSD extensions to tcp_info. */ + u_int32_t tcpi_snd_wnd; /* Advertised send window. */ + u_int32_t tcpi_snd_bwnd; /* Bandwidth send window. */ + u_int32_t tcpi_snd_nxt; /* Next egress seqno */ + u_int32_t tcpi_rcv_nxt; /* Next ingress seqno */ + u_int32_t tcpi_toe_tid; /* HWTID for TOE endpoints */ + + /* Padding to grow without breaking ABI. */ + u_int32_t __tcpi_pad[29]; /* Padding. */ +}; +#endif + +#endif /* !_NETINET_TCP_H_ */ diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h new file mode 100644 index 0000000..35196a2 --- /dev/null +++ b/sys/netinet/tcp_var.h @@ -0,0 +1,4 @@ +#ifndef _NETINET_TCP_VAR_H_ +#define _NETINET_TCP_VAR_H_ +#include +#endif /* !_NETINET_TCP_VAR_H_ */ diff --git a/sys/netinet/udp.h b/sys/netinet/udp.h new file mode 100644 index 0000000..cd75bd1 --- /dev/null +++ b/sys/netinet/udp.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)udp.h 8.1 (Berkeley) 6/10/93 + * $FreeBSD: src/sys/netinet/udp.h,v 1.10 2007/02/20 10:13:11 rwatson Exp $ + */ + +#ifndef _NETINET_UDP_H_ +#define _NETINET_UDP_H_ + +/* + * UDP protocol header. + * Per RFC 768, September, 1981. + */ +struct udphdr { + u_short uh_sport; /* source port */ + u_short uh_dport; /* destination port */ + u_short uh_ulen; /* udp length */ + u_short uh_sum; /* udp checksum */ +}; + +/* + * User-settable options (used with setsockopt). + */ +#define UDP_ENCAP 0x01 + + +/* + * UDP Encapsulation of IPsec Packets options. + */ +/* Encapsulation types. */ +#define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ +#define UDP_ENCAP_ESPINUDP 2 /* draft-ietf-ipsec-udp-encaps-02+ */ + +/* Default ESP in UDP encapsulation port. */ +#define UDP_ENCAP_ESPINUDP_PORT 500 + +/* Maximum UDP fragment size for ESP over UDP. */ +#define UDP_ENCAP_ESPINUDP_MAXFRAGLEN 552 + +#endif diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h new file mode 100644 index 0000000..82c9851 --- /dev/null +++ b/sys/sys/cdefs.h @@ -0,0 +1,29 @@ +#ifndef _CDEFS_H_ +#define _CDEFS_H_ + +/* + * various compiler macros and common functions + */ + +#ifndef __packed +#define __packed __attribute__ ((__packed__)) +#endif + +#ifndef __aligned +#define __aligned(x) __attribute__((__aligned__(x))) +#endif + +/* defined as assert */ +void panic(const char *fmt, ...); + +#define KASSERT(exp,msg) do { \ + if (__predict_false(!(exp))) \ + panic msg; \ +} while (0) + +/* don't bother to optimize */ +#ifndef __predict_false +#define __predict_false(x) (x) /* __builtin_expect((exp), 0) */ +#endif + +#endif /* !_CDEFS_H_ */ diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h new file mode 100644 index 0000000..fbc9581 --- /dev/null +++ b/sys/sys/kernel.h @@ -0,0 +1,26 @@ +/* + * from freebsd's kernel.h + */ +#ifndef _SYS_KERNEL_H_ +#define _SYS_KERNEL_H_ + +#define SYSINIT(a, b, c, d, e) \ + void *sysinit_ ## d = d +#define VNET_SYSINIT(a, b, c, d, e) \ + void *sysinit_ ## d = d +#define SYSUNINIT(a, b, c, d, e) \ + void *sysuninit_ ## d = d +#define VNET_SYSUNINIT(a, b, c, d, e) \ + void *sysuninit_ ## d = d + +/* + * Some enumerated orders; "ANY" sorts last. + */ +enum sysinit_elem_order { + SI_ORDER_FIRST = 0x0000000, /* first*/ + SI_ORDER_SECOND = 0x0000001, /* second*/ + SI_ORDER_THIRD = 0x0000002, /* third*/ + SI_ORDER_MIDDLE = 0x1000000, /* somewhere in the middle */ + SI_ORDER_ANY = 0xfffffff /* last*/ +}; +#endif diff --git a/sys/sys/malloc.h b/sys/sys/malloc.h new file mode 100644 index 0000000..ac16aed --- /dev/null +++ b/sys/sys/malloc.h @@ -0,0 +1,59 @@ +#ifndef _SYS_MALLOC_H_ +#define _SYS_MALLOC_H_ + +/* + * No matter what, try to get clear memory and be non-blocking. + * XXX check if 2.4 has a native way to zero memory, + * XXX obey to the flags (M_NOWAIT <-> GPF_ATOMIC, M_WAIT <-> GPF_KERNEL) + */ +#ifndef _WIN32 /* this is the linux version */ + +/* + * XXX On zeroshell (2.6.25.17) we get a load error + * __you_cannot_kmalloc_that_much + * which is triggered when kmalloc() is called with a large + * compile-time constant argument (include/linux/slab_def.h) + * + * I think it may be a compiler (or source) bug because there is no + * evidence that such a large request is made. + * Making the _size argument to kmalloc volatile prevents the compiler + * from making the mistake, though it is clearly not ideal. + */ + +#if !defined (LINUX_24) && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) +#define malloc(_size, type, flags) \ + ({ volatile int _v = _size; kmalloc(_v, GFP_ATOMIC | __GFP_ZERO); }) +#else /* LINUX <= 2.6.22 and LINUX_24 */ +/* linux 2.6.22 does not zero allocated memory */ +#define malloc(_size, type, flags) \ + ({ int _s = _size; \ + void *_ret = kmalloc(_s, GFP_ATOMIC); \ + if (_ret) memset(_ret, 0, _s); \ + (_ret); \ + }) +#endif /* LINUX <= 2.6.22 */ + +#define calloc(_n, _s) malloc((_n * _s), NULL, GFP_ATOMIC | __GFP_ZERO) +#define free(_var, type) kfree(_var) + +#else /* _WIN32, the windows version */ + +/* + * ntddk.h uses win_malloc() and MmFreeContiguousMemory(). + * wipfw uses + * ExAllocatePoolWithTag(, pool, len, tag) + * ExFreePoolWithTag(ptr, tag) + */ +#define malloc(_size, _type, _flags) my_alloc(_size) +#define calloc(_size, _type, _flags) my_alloc(_size) + +void *my_alloc(int _size); +/* the 'tag' version does not work without -Gz in the linker */ +#define free(_var, type) ExFreePool(_var) +//#define free(_var, type) ExFreePoolWithTag(_var, 'wfpi') + +#endif /* _WIN32 */ + +#define M_NOWAIT 0x0001 /* do not block */ +#define M_ZERO 0x0100 /* bzero the allocation */ +#endif /* _SYS_MALLOC_H_ */ diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h new file mode 100644 index 0000000..894b221 --- /dev/null +++ b/sys/sys/mbuf.h @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2009 Luigi Rizzo, Universita` di Pisa + * + * BSD copyright. + * + * A simple compatibility interface to map mbufs onto sk_buff + */ + +#ifndef _SYS_MBUF_H_ +#define _SYS_MBUF_H_ + +#include /* we use free() */ +/* hopefully queue.h is already included by someone else */ +#include +#ifdef _KERNEL + +/* bzero not present on linux, but this should go in glue.h */ +// #define bzero(s, n) memset(s, 0, n) + +/* + * We implement a very simplified UMA allocator where the backend + * is simply malloc, and uma_zone only stores the length of the components. + */ +typedef int uma_zone_t; /* the zone size */ + +#define uma_zcreate(name, len, _3, _4, _5, _6, _7, _8) (len) + + +#define uma_zfree(zone, item) free(item, M_IPFW) +#define uma_zalloc(zone, flags) malloc(zone, M_IPFW, flags) +#define uma_zdestroy(zone) do {} while (0) + +/*- + * Macros for type conversion: + * mtod(m, t) -- Convert mbuf pointer to data pointer of correct type. + */ +#define mtod(m, t) ((t)((m)->m_data)) + +#endif /* _KERNEL */ + +/* + * Packet tag structure (see below for details). + */ +struct m_tag { + SLIST_ENTRY(m_tag) m_tag_link; /* List of packet tags */ + u_int16_t m_tag_id; /* Tag ID */ + u_int16_t m_tag_len; /* Length of data */ + u_int32_t m_tag_cookie; /* ABI/Module ID */ + void (*m_tag_free)(struct m_tag *); +}; + +#if defined(__linux__) || defined( _WIN32 ) + +/* + * Auxiliary structure to store values from the sk_buf. + * Note that we should not alter the sk_buff, and if we do + * so make sure to keep the values in sync between the mbuf + * and the sk_buff (especially m_len and m_pkthdr.len). + */ + +struct mbuf { + struct mbuf *m_next; + struct mbuf *m_nextpkt; + char *m_data; // XXX was void * + int m_len; /* length in this mbuf */ + int m_flags; +#ifdef __linux__ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) + struct nf_info *queue_entry; +#else + struct nf_queue_entry *queue_entry; +#endif +#else /* _WIN32 */ + int direction; /* could go in rcvif */ + NDIS_HANDLE context; /* replaces queue_entry or skb ?*/ + PNDIS_PACKET pkt; +#endif + struct sk_buff *m_skb; + struct { +#ifdef __linux__ + struct net_device *rcvif; +#else + struct ifnet *rcvif; +#endif + int len; /* total packet len */ + SLIST_HEAD (packet_tags, m_tag) tags; + } m_pkthdr; +}; + +#define M_SKIP_FIREWALL 0x01 /* skip firewall processing */ +#define M_BCAST 0x02 /* send/received as link-level broadcast */ +#define M_MCAST 0x04 /* send/received as link-level multicast */ + +#define M_DONTWAIT M_NOWAIT /* should not be here... */ + + +/* + * m_dup() is used in the TEE case, currently unsupported so we + * just return. + */ +static __inline struct mbuf *m_dup(struct mbuf *m, int n) +{ + (void)m; (void)n; + return NULL; +}; + +#define MTAG_ABI_COMPAT 0 /* compatibility ABI */ +static __inline struct m_tag * +m_tag_find(struct mbuf *m, int type, struct m_tag *start) +{ + (void)m; (void)type; (void)start; + return NULL; +}; + + +static __inline void +m_tag_prepend(struct mbuf *m, struct m_tag *t) +{ + SLIST_INSERT_HEAD(&m->m_pkthdr.tags, t, m_tag_link); +} + +/* + * Return the next tag in the list of tags associated with an mbuf. + */ +static __inline struct m_tag * +m_tag_next(struct mbuf *m, struct m_tag *t) +{ + + return (SLIST_NEXT(t, m_tag_link)); +} + +/* + * Create an mtag of the given type + */ +static __inline struct m_tag * +m_tag_alloc(uint32_t cookie, int type, int length, int wait) +{ + int l = length + sizeof(struct m_tag); + struct m_tag *m = malloc(l, 0, M_NOWAIT); + if (m) { + memset(m, 0, l); + m->m_tag_id = type; + m->m_tag_len = length; + m->m_tag_cookie = cookie; + } + return m; +}; + +static __inline struct m_tag * +m_tag_get(int type, int length, int wait) +{ + return m_tag_alloc(MTAG_ABI_COMPAT, type, length, wait); +} + +static __inline struct m_tag * +m_tag_first(struct mbuf *m) +{ + return SLIST_FIRST(&m->m_pkthdr.tags); +}; + +static __inline void +m_tag_delete(struct mbuf *m, struct m_tag *t) +{ +}; + +static __inline struct m_tag * +m_tag_locate(struct mbuf *m, u_int32_t n, int x, struct m_tag *t) +{ + struct m_tag *tag; + + tag = m_tag_first(m); + if (tag == NULL) + return NULL; + + if (tag->m_tag_cookie != n || tag->m_tag_id != x) + return NULL; + else + return tag; +}; + +#define M_SETFIB(_m, _fib) /* nothing on linux */ + +static __inline void +m_freem(struct mbuf *m) +{ + struct m_tag *t; + + /* free the m_tag chain */ + while ( (t = SLIST_FIRST(&m->m_pkthdr.tags) ) ) { + SLIST_REMOVE_HEAD(&m->m_pkthdr.tags, m_tag_link); + free(t, 0); + } + + /* free the mbuf */ + free(m, M_IPFW); +}; + +/* m_pullup is not supported, there is a macro in missing.h */ + +#define M_GETFIB(_m) 0 + +/* macro used to create a new mbuf */ +#define MT_DATA 1 /* dynamic (data) allocation */ +#define MSIZE 256 /* size of an mbuf */ +#define MGETHDR(_m, _how, _type) ((_m) = m_gethdr((_how), (_type))) + +/* allocate and init a new mbuf using the same structure of FreeBSD */ +static __inline struct mbuf * +m_gethdr(int how, short type) +{ + struct mbuf *m; + + m = malloc(MSIZE, M_IPFW, M_NOWAIT); + + if (m == NULL) { + return m; + } + + /* here we have MSIZE - sizeof(struct mbuf) available */ + m->m_data = (char *)(m + 1); + + return m; +} + +#endif /* __linux__ || _WIN32 */ + +/* + * Persistent tags stay with an mbuf until the mbuf is reclaimed. Otherwise + * tags are expected to ``vanish'' when they pass through a network + * interface. For most interfaces this happens normally as the tags are + * reclaimed when the mbuf is free'd. However in some special cases + * reclaiming must be done manually. An example is packets that pass through + * the loopback interface. Also, one must be careful to do this when + * ``turning around'' packets (e.g., icmp_reflect). + * + * To mark a tag persistent bit-or this flag in when defining the tag id. + * The tag will then be treated as described above. + */ +#define MTAG_PERSISTENT 0x800 + +#define PACKET_TAG_NONE 0 /* Nadda */ + +/* Packet tags for use with PACKET_ABI_COMPAT. */ +#define PACKET_TAG_IPSEC_IN_DONE 1 /* IPsec applied, in */ +#define PACKET_TAG_IPSEC_OUT_DONE 2 /* IPsec applied, out */ +#define PACKET_TAG_IPSEC_IN_CRYPTO_DONE 3 /* NIC IPsec crypto done */ +#define PACKET_TAG_IPSEC_OUT_CRYPTO_NEEDED 4 /* NIC IPsec crypto req'ed */ +#define PACKET_TAG_IPSEC_IN_COULD_DO_CRYPTO 5 /* NIC notifies IPsec */ +#define PACKET_TAG_IPSEC_PENDING_TDB 6 /* Reminder to do IPsec */ +#define PACKET_TAG_BRIDGE 7 /* Bridge processing done */ +#define PACKET_TAG_GIF 8 /* GIF processing done */ +#define PACKET_TAG_GRE 9 /* GRE processing done */ +#define PACKET_TAG_IN_PACKET_CHECKSUM 10 /* NIC checksumming done */ +#define PACKET_TAG_ENCAP 11 /* Encap. processing */ +#define PACKET_TAG_IPSEC_SOCKET 12 /* IPSEC socket ref */ +#define PACKET_TAG_IPSEC_HISTORY 13 /* IPSEC history */ +#define PACKET_TAG_IPV6_INPUT 14 /* IPV6 input processing */ +#define PACKET_TAG_DUMMYNET 15 /* dummynet info */ +#define PACKET_TAG_DIVERT 17 /* divert info */ +#define PACKET_TAG_IPFORWARD 18 /* ipforward info */ +#define PACKET_TAG_MACLABEL (19 | MTAG_PERSISTENT) /* MAC label */ +#define PACKET_TAG_PF 21 /* PF + ALTQ information */ +#define PACKET_TAG_RTSOCKFAM 25 /* rtsock sa family */ +#define PACKET_TAG_IPOPTIONS 27 /* Saved IP options */ +#define PACKET_TAG_CARP 28 /* CARP info */ + +#endif /* !_SYS_MBUF_H_ */ diff --git a/sys/sys/module.h b/sys/sys/module.h new file mode 100644 index 0000000..85bf220 --- /dev/null +++ b/sys/sys/module.h @@ -0,0 +1,41 @@ +/* + * trivial module support + */ +#ifndef _SYS_MODULE_H_ +#define _SYS_MODULE_H_ +typedef struct module *module_t; +typedef int (*modeventhand_t)(module_t, int /* modeventtype_t */, void *); + +typedef enum modeventtype { + MOD_LOAD, + MOD_UNLOAD, + MOD_SHUTDOWN, + MOD_QUIESCE +} modeventtype_t; + +typedef struct moduledata { + const char *name; /* module name */ + modeventhand_t evhand; /* event handler */ + void *priv; /* extra data */ +} moduledata_t; + +/* + * Hook the module descriptor, md, into our list of things to do. + * We should in principle respect the order of loading. + * + * XXX use the gcc .init functions + */ +#define DECLARE_MODULE(a, md, c,d) \ + moduledata_t *moddesc_##a = &md; + +/* + * XXX MODULE_VERSION is define in linux too + */ +#define MODULE_DEPEND(a,b,c,d,e) +#if defined( __linux__ ) || defined( _WIN32 ) +#undef MODULE_VERSION +#define MODULE_VERSION(a,b) +#endif + +#endif /* _SYS_MODULE_H_ */ + diff --git a/sys/sys/param.h b/sys/sys/param.h new file mode 100644 index 0000000..f068998 --- /dev/null +++ b/sys/sys/param.h @@ -0,0 +1,11 @@ +#ifndef _SYS_PARAM_H_ +#define _SYS_PARAM_H_ + +/* + * number of additional groups + */ +#ifndef LINUX_24 +#define NGROUPS 16 +#endif + +#endif /* _SYS_PARAM_H_ */ diff --git a/sys/sys/queue.h b/sys/sys/queue.h new file mode 100644 index 0000000..3630218 --- /dev/null +++ b/sys/sys/queue.h @@ -0,0 +1,623 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD: src/sys/sys/queue.h,v 1.68 2006/10/24 11:20:29 ru Exp $ + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +//#include + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - - - + + * _LAST - - + + + * _FOREACH + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT - - + + + * _REMOVE_HEAD + - + - + * _REMOVE + + + + + * + */ +#ifdef QUEUE_MACRO_DEBUG +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + char * lastfile; + int lastline; + char * prevfile; + int prevline; +}; + +#define TRACEBUF struct qm_trace trace; +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) + +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else +#define QMD_TRACE_ELEM(elem) +#define QMD_TRACE_HEAD(head) +#define TRACEBUF +#define TRASHIT(x) +#endif /* QUEUE_MACRO_DEBUG */ + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#if defined( _WIN32 ) && defined(SLIST_ENTRY) +#undef SLIST_ENTRY +#endif +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = SLIST_FIRST((head)); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = \ + SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ + } \ + TRASHIT((elm)->field.sle_next); \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = STAILQ_FIRST((head)); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + if ((STAILQ_NEXT(curelm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ + } \ + TRASHIT((elm)->field.stqe_next); \ +} while (0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#ifndef LIST_HEAD +/* + * List declarations. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#if (defined(_KERNEL) && defined(INVARIANTS)) +#define QMD_LIST_CHECK_HEAD(head, field) do { \ + if (LIST_FIRST((head)) != NULL && \ + LIST_FIRST((head))->field.le_prev != \ + &LIST_FIRST((head))) \ + panic("Bad list head %p first->prev != head", (head)); \ +} while (0) + +#define QMD_LIST_CHECK_NEXT(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL && \ + LIST_NEXT((elm), field)->field.le_prev != \ + &((elm)->field.le_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +#define QMD_LIST_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.le_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_LIST_CHECK_HEAD(head, field) +#define QMD_LIST_CHECK_NEXT(elm, field) +#define QMD_LIST_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + QMD_LIST_CHECK_NEXT(listelm, field); \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_LIST_CHECK_PREV(listelm, field); \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + QMD_LIST_CHECK_HEAD((head), field); \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_REMOVE(elm, field) do { \ + QMD_LIST_CHECK_NEXT(elm, field); \ + QMD_LIST_CHECK_PREV(elm, field); \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ + TRASHIT((elm)->field.le_next); \ + TRASHIT((elm)->field.le_prev); \ +} while (0) +#endif /* LIST_HEAD */ + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +/* + * Tail queue functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +#define QMD_TAILQ_CHECK_HEAD(head, field) do { \ + if (!TAILQ_EMPTY(head) && \ + TAILQ_FIRST((head))->field.tqe_prev != \ + &TAILQ_FIRST((head))) \ + panic("Bad tailq head %p first->prev != head", (head)); \ +} while (0) + +#define QMD_TAILQ_CHECK_TAIL(head, field) do { \ + if (*(head)->tqh_last != NULL) \ + panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ +} while (0) + +#define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ + if (TAILQ_NEXT((elm), field) != NULL && \ + TAILQ_NEXT((elm), field)->field.tqe_prev != \ + &((elm)->field.tqe_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +#define QMD_TAILQ_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.tqe_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_TAILQ_CHECK_HEAD(head, field) +#define QMD_TAILQ_CHECK_TAIL(head, headname) +#define QMD_TAILQ_CHECK_NEXT(elm, field) +#define QMD_TAILQ_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head1); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QMD_TAILQ_CHECK_NEXT(listelm, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_TAILQ_CHECK_PREV(listelm, field); \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + QMD_TAILQ_CHECK_HEAD(head, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + QMD_TAILQ_CHECK_TAIL(head, field); \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + QMD_TAILQ_CHECK_NEXT(elm, field); \ + QMD_TAILQ_CHECK_PREV(elm, field); \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT((elm)->field.tqe_next); \ + TRASHIT((elm)->field.tqe_prev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + + +#ifdef _KERNEL + +/* + * XXX insque() and remque() are an old way of handling certain queues. + * They bogusly assumes that all queue heads look alike. + */ + +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +#ifdef __CC_SUPPORTS___INLINE + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !__CC_SUPPORTS___INLINE */ + +void insque(void *a, void *b); +void remque(void *a); + +#endif /* __CC_SUPPORTS___INLINE */ + +#endif /* _KERNEL */ + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/sys/sys/syslog.h b/sys/sys/syslog.h new file mode 100644 index 0000000..143df1f --- /dev/null +++ b/sys/sys/syslog.h @@ -0,0 +1,7 @@ +#ifndef _SYS_SYSLOG_H_ +#define _SYS_SYSLOG_H_ +/* XXX find linux equivalent */ +#define LOG_SECURITY 0 +#define LOG_NOTICE 0 +#define LOG_DEBUG 0 +#endif /* _SYS_SYSLOG_H_ */ diff --git a/sys/sys/systm.h b/sys/sys/systm.h new file mode 100644 index 0000000..e98335e --- /dev/null +++ b/sys/sys/systm.h @@ -0,0 +1,126 @@ +#ifndef _SYS_SYSTM_H_ +#define _SYS_SYSTM_H_ + +#define CALLOUT_ACTIVE 0x0002 /* callout is currently active */ +#define CALLOUT_MPSAFE 0x0008 /* callout handler is mp safe */ + +#ifndef _WIN32 /* this is the linux version */ +/* callout support, in on FreeBSD */ +/* + * callout support on linux module is done using timers + */ +#include +#ifdef LINUX_24 +#include /* jiffies definition is here in 2.4 */ +#endif +#define callout timer_list +static __inline int +callout_reset_on(struct callout *co, int ticks, void (*fn)(void *), void *arg, int cpu) +{ + co->expires = jiffies + ticks; + co->function = (void (*)(unsigned long))fn; + co->data = (unsigned long)arg; + /* + * Linux 2.6.31 and above has add_timer_on(co, cpu), + * otherwise add_timer() always schedules a callout on the same + * CPU used the first time, so we don't need more. + */ + add_timer(co); + return 0; +} + +#define callout_init(co, safe) init_timer(co) +#define callout_drain(co) del_timer(co) +#define callout_stop(co) del_timer(co) + +#else /* _WIN32 */ +#include + +/* This is the windows part for callout support */ +struct callout { + KTIMER thetimer; + KDPC timerdpc; + int dpcinitialized; + LARGE_INTEGER duetime; +}; + +void dummynet (void*); +VOID dummynet_dpc( + __in struct _KDPC *Dpc, + __in_opt PVOID DeferredContext, + __in_opt PVOID SystemArgument1, + __in_opt PVOID SystemArgument2 + ); + +VOID ipfw_dpc( + __in struct _KDPC *Dpc, + __in_opt PVOID DeferredContext, + __in_opt PVOID SystemArgument1, + __in_opt PVOID SystemArgument2 + ); + +/* callout_reset must handle two problems: + * - dummynet() scheduler must be run always on the same processor + * because do_gettimeofday() is based on cpu performance counter, and + * _occasionally_ can leap backward in time if we query another cpu. + * typically this won't happen that much, and the cpu will almost always + * be the same even without the affinity restriction, but better to be sure. + * - ipfw_tick() does not have the granularity requirements of dummynet() + * but we need to pass a pointer as argument. + * + * for these reasons, if we are called for dummynet() timer, + * KeInitializeDpc is called only once as it should be, and the thread + * is forced on cpu0 (which is always present), while if we're called + * for ipfw_tick(), we re-initialize the DPC each time, using + * parameter DeferredContext to pass the needed pointer. since this + * timer is called only once a sec, this won't hurt that much. + */ +static __inline int +callout_reset_on(struct callout *co, int ticks, void (*fn)(void *), void *arg, int cpu) +{ + if(fn == &dummynet) + { + if(co->dpcinitialized == 0) + { + KeInitializeDpc(&co->timerdpc, dummynet_dpc, NULL); + KeSetTargetProcessorDpc(&co->timerdpc, cpu); + co->dpcinitialized = 1; + } + } + else + { + KeInitializeDpc(&co->timerdpc, ipfw_dpc, arg); + } + co->duetime.QuadPart = (-ticks)*10000; + KeSetTimer(&co->thetimer, co->duetime, &co->timerdpc); + return 0; +} + +static __inline void +callout_init(struct callout* co, int safe) +{ + printf("%s: initializing timer at %p\n",__FUNCTION__,co); + KeInitializeTimer(&co->thetimer); +} + +static __inline int +callout_drain(struct callout* co) +{ + BOOLEAN canceled = KeCancelTimer(&co->thetimer); + while (canceled != TRUE) + { + canceled = KeCancelTimer(&co->thetimer); + } + printf("%s: stopping timer at %p\n",__FUNCTION__,co); + return 0; +} + +static __inline int +callout_stop(struct callout* co) +{ + return callout_drain(co); +} + +#endif /* _WIN32 */ + +#endif /* _SYS_SYSTM_H_ */ diff --git a/sys/sys/taskqueue.h b/sys/sys/taskqueue.h new file mode 100644 index 0000000..43efdd5 --- /dev/null +++ b/sys/sys/taskqueue.h @@ -0,0 +1,34 @@ +#ifndef _SYS_TASKQUEUE_H_ +#define _SYS_TASKQUEUE_H_ + +/* + * Remap taskqueue to direct calls + */ + +#ifdef _WIN32 +struct task { + void (*func)(void*, int); +}; +#define taskqueue_enqueue(tq, ta) (ta)->func(NULL,1) +#define TASK_INIT(a,b,c,d) do { \ + (a)->func = (c); } while (0) +#else +struct task { + void (*func)(void); +}; +#define taskqueue_enqueue(tq, ta) (ta)->func() +#define TASK_INIT(a,b,c,d) do { \ + (a)->func = (void (*)(void))c; } while (0) + +#endif +#define taskqueue_create_fast(_a, _b, _c, _d) NULL +#define taskqueue_start_threads(_a, _b, _c, _d) + +#define taskqueue_drain(_a, _b) /* XXX to be completed */ +#define taskqueue_free(_a) /* XXX to be completed */ + +#define PRI_MIN (0) /* Highest priority. */ +#define PRI_MIN_ITHD (PRI_MIN) +#define PI_NET (PRI_MIN_ITHD + 16) + +#endif /* !_SYS_TASKQUEUE_H_ */ diff --git a/tcc-0.9.25-bsd.zip b/tcc-0.9.25-bsd.zip new file mode 100644 index 0000000000000000000000000000000000000000..06d7c371251e1a26fc2b1b0c48408b3aac45ee29 GIT binary patch literal 771635 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 CVWbOK3<@Uld;i{wW>h)xI42se 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

`Z!km$HO93NF!$-% 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 svEJOx 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%0A&5WyMSm%)2%2< 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%0D58vk7dVZx5J}gN%~<_1_>9)qy~~6L$vxyr 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 GDbvwBG?eHVDTv`!>Z!XtTMPMOzS@m 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

+ +

+ + + +PASSTHRU.SYS +- Sample NDIS Intermediate Driver

+ +

SUMMARY

+ +

Passthru Intermediate Miniport Driver

+ +

The Passthru +sample is a do-nothing pass-through NDIS 5 driver that demonstrates the basic +principles underlying an NDIS Intermediate Miniport (IM) driver. This driver +exposes a virtual adapter for each binding to a real or virtual NDIS adapter. +Protocols bind to these virtual adapters as if they are real adapters.

+ +

The Passthru +driver re-packages and sends down all requests and sends submitted to this +virtual adapter. The Passthru driver can be modified +to change the data before passing it along. For example, it could +encrypt/compress outgoing and decrypt/decompress incoming data.

+ +

Passthru also re-packages and indicates up +all received data and status indications that it receives at its lower +(protocol) edge.

+ +

BUILDING THE SAMPLE

+ +

Run the build +command from this directory to build the sample—it creates the binary Passthru.sys.

+ +

To install this driver on +Windows® 2000, use the PASSTHRU sample notification object and INFs, also found in this DDK.

+ +

INSTALLING THE SAMPLE

+ +

Passthru is installed as a service (called +“Passthru Driver” in the supplied INFs/notification +object). To install, follow the steps below.

+ +

Prepare a floppy disk (or +installation directory) that contains these files: netsf.inf, +netsf_m.inf and passthru.sys.

+ +

On the desktop, +right-click the My Network Places icon and choose Properties.

+ +

Right-click on the +relevant Local Area Connection icon and choose Properties.

+ +

Click Install, +then Service, then Add, then Have Disk. +

+ +

Browse to the +drive/directory containing the files listed above. Click OK. This should +show “Passthru Driver” in a list of Network Services. +Highlight this and click OK. This should install the Passthru +driver.

+ +

Click OK or Yes each time the system prompts with a warning +regarding installation of unsigned files. This is necessary because binaries +generated via the DDK build environment are not signed.

+ +

Two .INF files are needed +rather than one because Passthru is installed both as +a protocol and a miniport.

+ +

CODE TOUR

+ +

File Manifest

+ +
File           Description
 
Makefile       Used during compilation to create the object and sys files
Miniport.c     Miniport related functions of the passthru driver
Netsf.inf      Installation INF for the service (protocol side installation)
Netsf_m.inf    Installation INF for the miniport (virtual device installation)
Passthru.c     DriverEntry routine and any routines common to the passthru miniport and protocol 
Passthru.h     Prototypes of all functions and data structures used by the Passthru driver
Passthru.htm   Documentation for the Passthru driver (this file)
Passthru.rc    Resource file for the Passthru driver
Precomp.h      Precompile header file
Protocol.c     Protocol related functions of the Passthru driver
Sources        List of source files that are compiled and linked to create the passthru driver. This can be modified to create binaries that operate on previous Windows versions (e.g. Windows 2000).
+ +

Programming Tour

+ +

Basic steps in initializing and +halting of Passthru driver:

+ +

1) During DriverEntry, +the Passthru driver registers as a protocol and an +Intermediate miniport driver.

+ +

2) Later on, NDIS calls PassthruÂ’s BindAdapterHandler, PtBindAdapter, for each underlying NDIS adapter to which it +is configured to bind.

+ +

3) In the context of BindAdapterHandler and after successfully opening a binding +to the underlying adapter, the Passthru driver +queries the reserved keyword "UpperBindings" +to get a list of device names for the virtual adapters that this particular +binding is to expose. Since this driver implements a 1:1 relationship between +lower bindings and virtual adapters, this list contains a single name. “Mux” IM drivers that expose multiple virtual adapters over +a single underlying adapter will process multiple entries in UpperBindings.

+ +

4) For each device name, the Passthru driver calls NdisIMInitializeDeviceInstanceEx.

+ +

5) In response, NDIS will +eventually call back Passthru miniportÂ’s MiniportInitialize entry point, MPInitialize.

+ +

6) After MPInitialize +successfully returns, NDIS takes care of getting upper-layer protocols to bind +to the newly created virtual adapter(s).

+ +

7) All requests and sends coming +from upper-layer protocols for the Passthru miniport +driver are repackaged and sent down to NDIS, to be passed to the underlying +NDIS adapter.

+ +

8) All indications arriving from +bindings to an underlying NDIS adapter are forwarded up as if they generated +from PassthruÂ’s virtual adapters.

+ +

9) NDIS calls the Passthru driverÂ’s ProtocolUnbind +entry point to request it to close the binding between an underlying adapter +and Passthru protocol. In processing this, the Passthru driver first calls NdisIMDeInitializeDeviceInstance +for the virtual adapter(s) representing that particular binding.

+ +

10) NDIS in turn will close all +the bindings between upper-layer protocols and virtual Passthru +adapter.

+ +

11) After all the bindings are +closed, NDIS calls the Passthru driverÂ’s MiniportHalt entry point (MPHalt) +for the virtual adapter.

+ +

12) The Passthru +protocol then closes the binding to the underlying adapter by calling NdisCloseAdapter, and completes the unbind request issued +in step 9.

+ +

13) Handling Power Management

+ +

13.1 During initialization, the Passthru miniport should set the Attribute 'NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND' +in its call to NdisMSetAttributesEx.

+ +

13.2 When the Passthru +miniport is requested to report its Plug and Play capabilities +(OID_PNP_CAPABILITIES), the Passthru miniport must +pass the request to the underlying miniport. If this request succeeds, then the +Passthru miniport should overwrite the following +fields before successfully completing the original request:

+ +

NDIS_DEVICE_POWER_STATE          MinMagicPacketWakeUp += NdisDeviceStateUnspecified;

+ +

NDIS_DEVICE_POWER_STATE          MinPatternWakeUp= +NdisDeviceStateUnspecified;

+ +

NDIS_DEVICE_POWER_STATE          MinLinkChangeWakeUp=NdisDeviceStateUnspecified

+ +

If the miniport below the Passthru protocol fails this request, then the status that +was returned should be used to respond to the original request that was made to +the Passthru miniport.

+ +

13.3 OID_PNP_SET_POWER and OID_PNP_QUERY_POWER +should not be passed to the miniport below the Passthru +protocol, as those miniports will receive independent +requests from NDIS.

+ +

13.4 NDIS calls the Passthru driverÂ’s ProtocolPnPEvent +entry point (PtPnPHandler) whenever the underlying adapter +is transitioned to a different power state. If the underlying adapter is +transitioning to a low power state, the IM driver should wait for all +outstanding sends and requests to complete.

+ +

14) NDIS 5.1 Features

+ +

14.1 All NDIS 5.1 features in Passthru are identified by #ifdef +NDIS51 compiler directives. The following major features are illustrated (refer +to the DDK documentation for more information on these):

+ +

Packet stacking: this allows an IM driver to +reuse a packet submitted to its protocol or miniport edge to forward data down +(or up) to the adjacent layer.

+ +

Canceling Sends: Passthru +propagates send cancellations from protocols above it to lower miniports.

+ +

PnP Event Propagation: Passthru +propagates PnP events arriving at its protocol (lower) edge to higher layer +protocols that are bound to its virtual adapter.

+ +

NdisQueryPendingIOCount: Passthru +uses this new API to determine if any I/O operations are in progress on its +lower binding.

+ +

15) For Win2K SP2 and WinXP, the Passthru sample no +longer requires a Notify Object. The Notify Object has been removed.

+ +

 

+ +

Top of page

+ + + + + +
+

 

+
+ +

© 1999 Microsoft +Corporation

+ +
1mPbaiOfc;v3i_!~c_?*%ooIMK;HZ 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 z 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�GOdJR60ufve1vL6B4rxaB?e4Oh$X8O zyJ$}=!#3>swwF;VNM%5)Y<~~N-SB%dhm#gEj0oc@L-=hi@Hb7R;MlA?MFZ^DR zWV5e9T@F77>tw_4;|*lZTR~kkYz4#qnzcZtfUpUQ?Q1xfSR)o9v1~~-a8O6f@KU1O zvsBCvT$;dZ_rSvuaPMT#k|e1Htz+4CBB4;d3R0;3Vzc4j+19MxH+P^-f+k9XaTX+iiPhrLbOU`ITC)DRbrX;z$Vx>)5N_w2mrWIDVC@au<5R6Mm zX{~Y9k_IS{z*N}D7VQq0!6xVu7wRvU=98Cj(L32b3gkZyu;E{*oI= zaaa5WPl%J2?)krC(6Rn=A3`?x{%KgSK{sF5%*N2NThSmB>#WPuZDBsz{(D{o(bj&_ zg0VoYQf7S&pl2RwX`ZeFar@!35CO<fHDacLV`-B_D^1&N{l zVlbkyQEwTAHPApKN?{ONgzk(aSBrCS#k8FX#W{Fbp@9$1W9IIwVa~}LTavJIeo`L!cO_+!i~nwuq)f6L zyR}X=YIWBfY&lW4cq5a1>x!^4atXYukjFolY4pl;c!zJd;b%SxeIovUCFD?=Y?s1k zy5L(-DwX(YxhTb3qpnIy$1zC(bW+8zp4qf%SGpvrbi#|BZR^;{c!1J(-n)rCkZa{s zizxj(gR$3u=i!lP5_T#_2#jbi0y(L}+;=a|aH0|$Ft1^Uj)lrs2mkgi!b9j|D@J$n zvlyK#h9Lu(h+B8D^5U|v>`hcef0CFUT>IX%eebF6U#H=RkWse6#Nre`y2jS?i`(5(pYri|C9VJlEt_=g|8pIh5L6xp86Nq{pTP)vDzO+x&tjO;QwR-k_<#}Ew2~-aYDnwp~n1SahF7oEW4EzeRM}77xI@tgG$}+R5 zThDyb_P)tpWWVc#AENW~c5w#~y8y!p1Dnn#3k1-?i+HwJEK5I>*19s)CDHU|ICP51 zjn~qPuNGD?z(uyGZUh(PGF-wmoM0mfaq5-bkzft&2^-GOBpH~5p%fr}xC(9mPZaVc z`};!aftWtPAhmd~4bI9$*uo>JG;?e(T+&!eTgi1*fBe$&@J5mANiZ*GO;FzV*n{B5 z0DVRj3#eSQmZ*eo`@CasZ*M!xhrrD2h9ysTWy4zRd@KlMAnyG-y9&rjSM-&_^iSs> z&)zjEvVM)t2RD%aYLGBhFR`rvaEVgYLaUF)Xqr@PimCco0+2VVo}l#}o`!i)bic#P ztNp`<>0<6|DK&33>KwW$xTIf(cugk%1|Zu?aj6^ivr9=Opj<#CF#~K6?7BpuvQ8`% zZ)PSd>)4fd;WXj;0RO4D@l1|k^$AdlLzSSz!691eL%E8IY|*?p1(A zv9)RVJ$w9enELxc(}D7b|86_ zpJ$s_^!AJFw=7|7cp1j3M!10K60~AE9|mEj|_V?8OTZEOvLbp-hlQo9eKFbr6G-mB9?Gtpnn9YIag+#G4q@nVG{S z5pzbg;{p*5%s1xB4Y(_a-9txPbN`}4fFXEL!^y}7B;}37zJZwa%ZZSSvn`hJw4h+5 z34RW~1R!}oE;SUgQWS>=ghNH|$=26%EFWT(DNwQVVEZNH zO;uwA;5x_ogZxtP#$~>`rD-hlvb3D4D&`ej2bzhNLI8Os&JLKpI$M5d!V*^9EO+}z z{q#<-^XIu^2o|(Hw`#b`s2y=e6qfwa)z!txPam(2dtiU%9_TXf5MZMYNcm|hsIA@N zf3>=S`Y4^ChABLu`Y0#wj(t;R@p&m0zP+tyn9ao+*=`dIG`0P;_Ry>tgeoXqj@rrb z+pClFv))1UQQ!49c(d~-B8#tHUNO}o)LbMf1v8;&z1=tJ`D-W#KOQIw)%BsenT!nX zh#p6Kqq17@8p)>~jEjgR`WZrC7J{-OM4}MeViMJ=vhh&FNW@4&~k7pk*`7Y>* z*9AymhPTfb1TIpk3ifdED^Wm@u`XicuN#!X{-l`eV)ze1`2j9TY{X~h7spp0FW953 zp8d}o_1kyHZ%?@)=k)-IL=ZoX_AC4}5;l?W;HDlmu_Cu`a4WPKNXZ=+KSa{B7zt2N>N!0`McHJ`m zd;}gzv1dZhLVoyFEMK>F5P#NBJll{4)MtOb&hFs~$X*lF0H&@9>4V#36u5R@W=Z<$Yw2>~V`Zhu*JBt%YodmkxHwxERfHLUr5A)}Y!JQ*`zysD#DJ zxQu-LfLav#B3BSZPSpyiqV<8oEp4TEGe z_$SAIpD!h7fTOzPm8ll-44}eyx_n6rCt&dk5@|`_(xlcXjH6jwaBEK@w0S z`%&kGR)L+nUZb)1_$B7J`1$~%DA4|aBGA6`qNqwPz_!%(EHT$STDVx1nDhhdbR6q= zfkYF*O>x%`vS7fKua5nrMr)u#WVud8zAvb1Dir-t%ZN@`EThIC<~T?aciETBy{|L0(-aYKAzsJXHb z03-6rQS52^@Q}6S`iG7?J0F?D;~%0a;E-b6D5tf>ZU=iiUPo&f$G%nzmsVCEIjb%1 zmLTWhVpa+z;|>eq0Ivq4Tz<_W2AA#;5LB-~IlDRnOfYCpX*Imyiwv$hx;l9qUk~nD zi(GGYi!|ay0J04qV~G%%VUdIOG@VhE?c3Wt23)7M>#_Op9vLb4u~p~TRd-$}Brahi zc1kX}jPAII2f>7rf2vlX(rUX0GIK$zWL1g$R) zhp)nn<=vc;AYn2GtrRXNM$DnCqFB3_lK4kZJ$Q%)?@lg`-$H0H{&w_}xCoBkUM282 ziJ!cFO>ksw9pM~=YjC-$Ph&b^UdJBi6a-A~8W4Tu$@iCqdH`)^rza{>hMn^k( z+&fHj&n-g)v^zi->R{<6-p1$pCQG!?XzuavH`(1;^loGi+8Z?T$0w)}JA085q-^Ud zpHF5DB&V-m#;C-`Z)5&J3d`DU`~3X0@ylodX!>$Z-3ROJ8@ws>mXNF}5r!F+(dkW| zSqfiPz>oEtOCQ!j=F9OBTUtyg{RWZ|3nziz~Slnhm*3EW29UH(WDmh#G%@i>$5M-J|{8nhe(FNVI#_Y@mg=?Q;KP56*E?*rk40?_cSi2 z-=TjUz3y?1CQRL8HXkCH0D<+kxLvFsC@cp#4(52}t4c-#B_<(LE^4H6LzoRXp<~Lb zpNDM)YL5gFkW_?`-#ghZ{&raVwO0Q}_3xrtkZ#HSPJ_D*#`c1);B@1SSZ2ytQ8U_6 z)6q5>Z2cxm@m5)J>U+2BJvIA=)ts{Z#0j0wt4VtsNSsLYyHYOO>+i-5^d(LpQGS;i z4bMH5OcqsYzz_x_Mu;2GY^08HBA#s3-L#!#23F^3Y?J2rUzqC}3EZw@eo6aLQ|6bK zrPfXYfPKbZ*QO8hQd%54F>tMb=6p?b^KVap4pJU;(9&XgiXc4NQpwi>w_=;gy! zXG4p)_IF}1KX7o!$}-+F@6JU>mAnEqA62)Y`om%7e*^wG{nYm_y7035h{{EvJgy@g z^BwP}Wzn^<^oMyl9pT&18Yb>R^u)B<3-G9I1G?iGuL+@D6WZ@!0=Y=^GhkQQzmJOv z{dyQ6<6Hi0>Btt6kRa7I*tz#L3WYs}j)i_t&6-=-?cM#m9)Ow7^>3m&;dEaJZ9i7=k#r@&v!X4K-(}o%= z=@*(o=h;DWFy_790fS-XI}rAxe)ejy5VSsjuqWUfPf)8_hxjDU#x{)GbWvulb$|zq zo8L^7iv|2c5LG2x!zY_I=fJp@8A|h>kLRQqU3tMHymVMyy|lvEau~AMnNT`;*J7;|ngS<>S>k8%Zwc?BwlLFY&CO zc=qbx$%9p(7yRz2r-$F_UgcB)FEGgw2rtg~fzh+CASw)R;M?ZHm^Nu!#!>K%%ZE>I zodPg8N}(tH=#$6^rH73N{wv^ z&wu6yLQne9Ck+l6jTwVPC~(RzSHs^P+V>O93vdq?X#BPU7J;P|3hSVld%*+Bz=09J zpo%dlq$Tw5%nJ40u_(8*NpHTM$Z=e!pMO~$#YF=3MIaP>1Bu^-Gxk4v+>-M=*m8uu zw!SyMxE14NF?sIUmZ!@}lv}VWXvkY7LpVi5OlSn;X%434K)vthz9z=@MN6A@A>~ek zYe0ryBP6GFU8+cDED-^PZi>5NMJdX8=|s+_MdSu(5mAv@!e`h(8+DqGWwSN$)|FEv z%@Beq3P^AeIg?#YQ*Bc*9`HU(1VN`RPlZK(e7x&USeg;DEM#|H)gon9T56nl10BXd z_gWCRZS;}KsyhgnAd|_}sv*9`m|z8R`64q@xt~kIbZ>&t3NAWa7?mVjt@3#}S*&g; zGg2?sXtY?3WzFRyL4MiWus2nH)`Iz5Ry=66kF0Cenp{?Pij0%|z9_4~W(K@@H=9uf zxqNj!u(Dk&Q{D3=AZK(bQw6=#Y=TP9w&*PtL~1-83yNy1EwW6R_AThM$C>MIBTqSb z0j$yqGXm+{v4)Bc2RXqIzmw0!#~z{~`$)R^n23w=B7k}U#TUd1=}?G7Z_jke$@92d z3a>UNta({s0C2BU7u7av7&Vm2dfC`3I?K$Q(tb<4e*xffxe`BZ>>Jri_I`H!r+Da` zI6Qk%Pc^EeSsxakAIu+*v1xERa{1F-D}1 z>+$L7$%o66%fpRxjv@noj2H?ZJp|?X!b&2R#SI0ek~Dv2%=~yUC$cwX7Cn4-29RWym6A_PxyB zzIfr(XjS8oVvrn)TLGeDc`J={A*%+B-MqScLSh%A(N(}?ZWlP$MmO30bT&hmRxXP~ z8VQYCZd_6!PG5%U>WWi&xuMYt+fD;Q;<1xT>C7Owj3X{s!gY@p1qS3lcXAsa!-Vd? z`XUcWlbD$}trK^wh8(L~C#gfuy~HJ3!ueYu;WWW{_#xrYQz8V-3pQoDgE$4u!J{Mb zHxJGeMI4+30c-hm(BRbAw9GwElJ3{hFwWavoMJ{Od;T|Nf5*TDZLYHp4s_#vc2Z$IpP}|;2t^S$#|UN} zH}b*Mm<=HTe7%W40-oQ|f2*-u@Se%fw~P3|Cq|=7w7snb_%AJF9J`DH2-+dE|i1*{9M)ZxH8cbJ@oI39TgR7G-X5o{|qahj2+Zb*}>s1Nqdp4)jP@MD8VkKUwU;z2B1Wc&PL9I38`#zhyfHEP;>*?MIO|Cd+MUs`VzvVU|>y9!PO;V}-d&d-kz_T2(t%2tjD0Qh~L7rVwslDvEB@h#n)9Eep2PDN5JC z8A1Qz+bSNy7^2BO1{0LPu@dih@cHv+S#T83Bi7`@CaOIzRFOWU9mK2HFXt|kE*1K; zMiY)yVRx!DQ+t+B*^XN8M7wtp#qtr`?yciMCP9i|mp zbCA+j5!jFcUtXZw9lzwR0&=F-VS%t#mWOz6p%WXxbokv25J=uBRB6>MGX8-h&;UxuT_SN} z(4j=cTG|)ZGiDJ`zBhvcUR$%czKg&@iM9`j-HLl1ilJCLE{K3ohy}|iR>gc&jJ0<| zIY02l5cS4#@QoJ(Y_lBTyB($kkfK~&>%haYhB*J+c26yAw-qe&c%jk_E#d`4Y$^9R zwTe;i$JTH?#%&bW;jdki-1F77%|Gyc!|04auWG)j=U_4rKkvR7nd53bG&UipDqHx5 zvVg&!i?P7pDfiaBtrd2Yn&$!Ki7ALq<>AB143xbJMel9qs+8UH-%!XB4A1%%%H$!~nUu$ZbWERj$3g#cnbpu+G`My-F zXp%$gObz3ph?`TpO%X4u+;cRk6lH1Yso*mdGAe%50*ty=8(tDWTblQ@DwVp*BU_tT z4NFyZ9C{J(I1Y*$an3CVlR?etc*{%jrhaZYH9R*)usLSH&T@Gos_)3eLB*!Y0^`ZK zZ?T>;eq!n(vAtggs;$wKy>U}5H$b6wN*B7(9(tahNKu$T2bUp)k6 zE$3LsQsNVmBX@Pk_HNrNcsfzK()+h>v;N-i|84J;2KzOb@Of6{z+v(kRB*k%0c*50 z>kPF>Gb}3L;Wy$&!LtPUe4q>*Z1Kj5RCa~0L{J!yZ1B+i{Hq9j2t71Mg?W+BnaJfJ=#b!2;0Mi|2|LLq5JLIN<(96$S~009m1@wn|a7=A^CKHE!hQ>o?T-U|#WNpd_D7uEp-A^zdm2|Lrs zJYU=(x-dX3QuztVSP;ViZ1mn3a0pH$^$G+mxTZZpE7*M1;z3O7K=A4N)wC)G)NI*l zn04Ua#5FXQqA!`axKp3GNU^h{8BR)^Hu0vQj@fLXWdLl%2m<{eF2LVqA=DkDOrKb| z_(xwGaH5NNA&Id#)`)-!2e=vxS{P0)&)@$3_h=D9Ep#TfZzWhy0?+%`C@vl-NPwLI z?x`7;bB2OXixH+?4j;7k6bZq3;+bJ6-$p8kv3jN#=@Gi&L&8xo*{}ho zw2+_BE#82NdS!dRN(1{PK%)Ue=SKswJhqD0qB+%`oxP0>h+EBlvUbix60f1i<% zc0F7yW<~DTE22MYX*Ns>)(lO)%GOL5s;Fq-nf~RF<8-dk+p8%0_LmQxXv5~`zuQtf z!!Haw>;*Mvi)sq1`2YO!p_^S-VoJdDJI$ELzc$%AsiHe2D^!KQzqe8p@**uFiPN`O zjmh9lMe;@%_733O<1qpCSw|^FQ&IEk2fq%Q3f7f|c5`b;XhdR4%h}pNNsw!>&n&@< zR*h8C+cQswr$U zTnx5uL=?$bXFtIO0gl_*luXHjD?`}B?Q&LB1shW@_YL6-n-$ddNB`)#dmM!%%zm|V zAoZ>e*VCC0MQ}yS0Sq{=ro&k=SjLP9PE?bZ1Q-j`jntL0OuKBhVI%u4H~FR?$^Du-3yLdjAew35jkR{QPpZ;se1E{2gGEROj*kmVt|nE_Oz?m-+@I?9oQcdGp9y$BzISgcH`ZffFBcVKcFGhAFwBHmsfEU z4B(uyEVuW$Si@00Th$zl#&!peKy4!#5B! z^i~vHi}3fF_AG0jm5Tq?6AIoPzuiC{V3fd7Tj;D+N>bZRNNSAi6ZD~kq1`%R==A99 z-B;V^8Cep`1A$BcM~ULZ)d3SCLpIBY#f*!$izhlMXC-~g$Grh7#phhMJY~xJ=hJ+G zap^nK5JrDO4Erw3yPKUJ{d9af`1$9iiEg5taj{~iMb7fIK)6ujVsE-C#Vnw3nrTWgv!w|ec_f0iKqPdL?mZ`){ z9-8Jro@23t@cIr$9YG$Z%r>#DneGvD&@I|tVI6{Ap`Q&FgENZMCm6BD7-B`gYFj9p zOMwZf)sg9WVyjK`fxlETO$Tp5U-p19Khb7Vfd&mYRI(6Wskq74w!Zy+5?`U&?q!hD7}wP7yk zx*8A>;NC-GqxjW$92q;j^ic@DW##_WF!&XLnyead$5l7;Aa!ZS#j1+aF*XMhk1`r? zkx|1w1hz}Z$OZa_r~-%= zkq$N$=fsrIU?{)NejO`a<`x>w(70xW720gn>LGya!L^)^dDMMaOCdez^ggzbUAv^y zQ;T9P#V7>a2I_cPr9XLL$F5|W2XIS7j5)}@E5)_!UN~Y_JK4Xiq{YZJZJ^#I{)L5* z;;obuWsR^v@w82WzSndOVX$o;&!t(QSF0v8mCdqbP#a=(BNf? zLTcj8BS>UzWgI@{HpNK87LMr4}-Jj!$H2fE<^k}NB+&8!XW*`0Xr94Za(n#tUX^y z5>_sWPK*ltF59Y4D|xwNJ3%6092@0cG#Lmx_qdb|YCiHsl>WQS{9<{cFb~;m9=;_^B6|tRW@W;5dBbd6S8Kw+}v%4bXNjKQvkuG+aNLz>!^rv z?XCLJs2eMljC#-tmdYK##8XR>5NufEXK;t6Ot|gh)hy&HmW$gWE0_6*v;|_Rva_f# z!@I4t;2f>!I9p(q0r<~uMy0UgRd!$BVsbAxRAx-a295 zdgONvqYm~PI29tGY<$wI$8A@G;(y1GgTkCJp(mGlY0c5*^AF8Y5MGy}c zTzv8j^TIvl;-~}EB{~=E7-^Rc(80q(r>4ek5=oa15_|;h`uRPTg&E>FJZ$QD-Exu* ztrY&F!7t|;;_e6aw|6Ih?ATw}wt&H(&o6xA!T|rozkd0L)8O^XBS+MWm<$@4vT1@o z^)P3h52zTg1NU%*Pe_%Z!a`gBKHQ%jD!T;E2AZ6?N#{e?5y-OWZDG~Rs3H`7U#9yH8~9W#}7@rlB4$M z_v!dQy|JG?Vdz#5jR&63-J@*HhCc{9Ni>@9bK4fN(@Kuz^I{c_1qR5ERz@qHa8Q~lDKxkIAg<9Q317M zWrwQ2e%g2!tJrX@slupNK&q7irS7_)<6=IB+MXDS{oy5{NgZ5Gb+KKRS- zRafPsk9kD^K2=f3RXR}0@0AN_J_%cCWP0Z;Bn}&s9Vl&y_z$ReLaSUPv)U((zRjIf;H!ED5`Y067;m{i~k=HXnG}n9>Nd9N{ar{ z&|BX5x%XW!epYW7j)_r?JeClNvHr2OK|%t|WVB(90w*`uctw1Ngvnvt?($^>wL zGNq2p;;4&hHEQu^++&Ox)CQipNs$0nZ+D$Rn#yBv~=-S)xb-} zS8nDIkhZXRr9*!Rmsin3@sUExj~ir)%1)wy^JTd1nnoBDVl~5WIXX^TH zz#M(N4eaZ+aaw2ctA>Y_!0>Fhgm*vz_3t@6J=7VVWaY85@3L7Q^GNS17Ydxxtd!tD zKYz&Z>?pv;$!uNTgnonwdw{Be*Z&YYhd=3S49}{XaT5i?XHVUIp%<%8IHX6t0QgRS z+E<8y;ivehAN^G2mScF#d|VP1m4wwqG()>G3gmoetMx2Qa&p3M--Oif#Rnt{{158oSsPoWUCW3Zx7AaQjQ*AGl z0GnQ47r4_LXLr_-uefT}Arj5$l2KxC5ErTNg(eWbH-{i;sLO=^#GKAZ(VnY0EM>(Z z*?86w6TOI({-h>5sU1sICuH~N!_|emLlLLBMzt+U6G5dikfyU~^$^=EgUnew7|aNE zMw193FvIbE-QRp%I0n1iCX z2;A>kg81Bx1(A+ZCjb*%qNCpk5e`yV5&c{TW+Ui?MjC~<8-GX<+9laPDg&>>fhWq3}+giF_{DEhc^Nkm_%^?MX>SCPIoeEgg3)trQ16^yBfU(Eg|btXf2$egQu)T z?$2CXWBJL`krx~QI@!xuvcM*Kfw@)&)WQU9^Qz4LwEkkI=ba1hC4cNje$kWgwhc$` zBiCD%mi!@)tYOGmSyuf`GUT6GU^M~QEwkn-kcY9_+S@7THc~5L6$_%IRKY@uIgEC+ zUZKfQ{-IPEuib0`U`O{;vVqA46tIf5OhUTA4}wL4N_PWv@T%OL32LXPZs0xP)dk_x zA7#(`8pD0Q(16e-VKsdkWy4~W!$l75Oi@G+aWK_@Y`?S36J3j2$~`B?WM;_9?d!Qr z%xJ3@!zT74K3l>O!{RAJai_>~MkDLTyetOhS15#yzcHc;QY^eKF0`)NGlI{vPN9$< zy4k3kja}g3Egd;4)9f%yZoa-9iiMrdCktm6odkn%Fgd0N6u{nCOFP^3Hluxuqx83rmiM<9uN8M^20KtV_^$GOj5if$areu;}+*GJo(w{Up&W?l_*iifKdcyTqZCu zkC=jqM2R|yFbz#=ax`>je>(C*KhXW6<3>&|kDK^Q#z{HV4-x%};p#R8HBnGC)H}h` zF1oju{4sPIID-lEPhi4-`ooEA%qNcLNArR!~`rP>iJVQ09(GQnOTE=b!xb-`x9 zALupF_&B;S9u6e(qZ!^bOgTUX)?rnEEt_yfolI`>4lEaCP}30s7T|qCQ?NJ$U7G5t zg}C5!DfL0>5??Cqp36kpDTGvLLiF)q>UvxXU%p7;QyAuG04IXkJ9rZsHiC)okCcYB zx4Rp~i;b4|O_|?``VU**x*)9;$^$CcV=!vO-c=b92}k*3E4GRHc4o7#BHr^2*_-O) zut^18aIYzRUM%Vec)dj47DY=+5yRsMg^rL{O_XVupaHz2!ri%!nHVe~*YNcUuKb&PxqR5$+w<40T7jozg~cbK_U_(jw_2>g*!;5iT#VLL@v^@!{_pp_ zf8XuxjeJ7}a;2r`*Q7!TQD3$@1%$UDpTPn9fb1Rov*WXmzwl4M=zqXwVk}>Kd1A}M zg5!ZZMK7akXtgU6fo=eQAVr=V*9K;?+Zdi8J(2%5_GG@kL@6(IptB)6F zsSDLUh=;*JjOLy?C1p^;yyGIQ+Vatc`Drm=F(cuTa0&id?Gx#ewQsaoK7gSOAT?xm z9k)?3!%zBnAn^b>J;4o(+f+x@MDQKlJ#4}S>YOv$<)k@bhYwq7uSS$Z zX}#Fc9U9%!$5^P)+4+@}pR~P5Fuu><{|-3kJyt`)Xd$Wrwv?KJt=?@V#LE>y*`P)W zKa;L#DTw@K_0z@i(SLZ#yh@k;$J$jdG5!%`JQkREl+VF!i=wT4)uIJSjSPQDRLJor z#*g{!`PtRU*~jBehCQkow!++ZMn1AfKKceD|JjXrMmz7}CKi(?NDh1uX@rUbRe$9F zA@`JZ_tz(kFJ=`;jx(M1Tf|H=!E73@THL~*tqetC@Qxkis|_5Z#s-d&OOBi^@7;My zR84PpKrT<58ZMHtMWroGFyUd!^fa(Wp#e=76Fcm&_^J@qmpNLA2Z*PApi(r zXB69c(k$i+Wx?*^m6cCGP9Rm*XXR+9^}yDHb8VT#0|Zs}fXI*V_ToSBtf<`9zddqI z$H3q31Y5i7d!U%=VDK=TH1F-iWpmd<1ji+l@o|Tdzdg4@8N01=KlRDKx@=H&&I<6fwpnfok=R&9C8t-XWj33BDvVoD#g_mPquc~ls&n5E zKIAR{+(hlUvX=}Kj(GZ%?vlHnclq355Z_%tyyA3z-0^?c5w^7hDGIQrJdCKmSW-J3khdIG z!;{qHoDRF*j8jJ^r1L-_75iht`oXzGp|ubX4*^oQ(-Lb1*z%5lCmckR`FO{l7SqPX za#c_$F&d~Q>Y!H&&RSRD)I|-qH(^WvBixJJ00~}LIgGfYkv4850(6>8F?w0n`kJF( zrMgQ&eKGbHH%}f35ldAd<|iQT6H+qX=0Y3eA8$#=f>`1`i2Q?SsN(ZW_=!MuEf;2*1!~7sFlg;h#fyp6l;`@ z3-Ge#m0(X+P;585EF|=QSqN=bXRTm3|A>uzb3HWA^^CjZxP7iC-r#FJV-+<=5pqKA zmQb6B1iPqEMaL*K=m-BZm|<}`={6HO)OdES=X&Z;{hy!~v>*{$4;B>WuMS+)UMqs7&H((HLbyWSOjp8HS3XfL=QS>+ zcTrp^O;Ap82Wr)4dh3U5ADxDPPYtr_KCB%*dh?o~@#7<&&c)%Fj_LjFNaTm5_}8R# zM`LC*MI|TYOpIQav*RF; zY1o7613L^eyTxM%?U?cT*=N*v!V_4rqwIz3G<)tdg&+q}m8zA27G%yTDYprh$S_a_ z!dEd0Ye{!y&oBHkaIj+f6TvciETI|>)!Ps$hTU(D@MnI&C~Hr!7+5HNx$Nf&RR~^U z34%>o(kxM9U}E7fbHxWHF$rfP3k}RVn*_H(cN4BV24rOtUkzN}?I)Zq5;4RW4%r|s z7jtU};sQjvh;9ii8XVO5brC7%Ai*Xk9MXiUEGc%vq5=ToMk-)W_zsgpjE8jMAQ+pa z3y;C0zKQk1L~hL2wfHd6(p`KFG<&~ZZ`T9Z;9$b*IVgTY%+YYlCoxBd*VS@IcIFc` z3QJn4rC-k)C?($cG*F-ZFQCZBEftG8KpUA@)qfT%xyC3zk1%<{NVO)_1LqDwl%Vk5 zE>^0N)67owc&5Jufk9sqZ`?b=6VeBTt!b|XnS4JGa(M|5UC+n%U5i;N7HA4}S&Uc% zFW!H+lbE+|;twARDi=R~nCG`b$B-Ll?>CMKQqRQgr)R-l!RY$Jx8J}D?!Fo4RX)Jl zkD#r)Ba=m(gf@&Xv}wuVYx}~&oM7FS7=g8qV`L@b6&LSqiu@&;3TaCXSN!(kMG%H8 zJ{PnR5hZSm+tKo&JqEP|S6{!!tDL_f^I~@V=MNW<&?f%A@BWdh>h;_|9-aL~yxB*U z72}JtTm~a8R$kKScnUByf|`VKNG6^P*97W$&1FbE=>(q22-`kbuB*Fmp)8`muxrx) z`0Q0_f`T^yO-}qj3}I2y4`#K=ytJ%VDk;+*1pWi>-{$2fTl*VZctJ9j*o;N)G8#wJ zW*h{*vP30Kvsnjz=nmSHX449edZ}y5XabkpLR*Av(Kpcqs{`IC^PA;HabD^9P^(Tx zW%z#3jpINj5m|+i=c~dLY4`ltb$Obx^h}HMSiBXF5Z1CF^bD1}xm~vz;*cDqGQRmz zXJb`(#au39<;tNVBdQekp@NJ9bIw?zWNCndNe;KGv_8TLX$}wE){XDNivi{a>@^?G zoXuCyb)q0H5n_tW70A@8u)~d`k=0{QXc$&nzOGnsE40_PX0z;mHHCVEaBT_d?e)c_ zT@_^*!0-Z|@oe08O0kR_8(^If;sy>(?Pm0 zC)!xQtMOuu9I`_kLG?6l)Z{7OCdv$vhGz|11}bCQCHS^rX#`h&!rC}xk)5!enyR39 zA>chhtX5YEMUCZR@b2j9Xz;3^^zc2W#QATt%a2=LBss4^Q-uH64e|e?1N=u$w38RP zALdWkP9qJ~vaS$+fed|j`D%)Xc$g#H_k3E#B;$W-$+%W5R*nuW^RjY)U?VpYBvQx| zDwLiCGAVM&s03M>QNc#=D+fZWT?E;$fD8t6p|FUyf{-y&d1{m{JFf~)x*CpE$>x=} z+O4XEA?f*aPChXL$V9IzY5m~h+RIv_mhzg(I+~{7@M8E6ka~o;ETxF7C4Ok_WhWE* z3BClsdKWeAA{Sjz&H-*Jdh2FNViH}U4asr1kw(<|wWY;%Sof@bE6&~&z8?$LjzD#G z(KW1e2?V2%wL3A7-j+(}LPfs--HpUI@ruM-A=e&|r1a_Su}(eP3h~XndPuL@;l}vr z(2PKyI2_$zR?M%fn{GB2|62?e=+*{*To=G%X2l&uI8Kc}4;t)A&z<Xyy({b?UTn(bhI4TJ5ItpQ>vb#}i(U{{C!>r;G;PZ0RfQfe zL^tnGmwxCKndcKf~~r4Y+15oiuh%D$XF1D5yU*c0Nap6_|EWlC_+T5o7H!>!+h0anqb zgm}m$Wl0Kf>WoLJnSjL&xkDo>J@zYCUi`^y~GWKbRV#l z1kd5mstj;1MxCqUp2dmmBw{u#=BM2B*0oIeiTv(n*bYy z4QId4Ug7~=Oxp8%EUnCiPpL1J^x?YnWP9)e?*pD|$F6w!4g9|AFqBBXE4J*v%lBZc z!JR~E#K{^9h8`S6f2JwNq)ITR1KT)VBs0m+-q1Ui46{_QZ?O!OQw z{iw6IVHd{s3|Fc)4Yi%y`b9SFWY482Q9B?ttgbfiCeo@O8)i#~e{n}Bj`^?|YD*A> zjMp&KlCM_z6sxqLurKz!m@n4XH(Fe7&lg+#L3i!Rlzl>>mS8{~=c}-mHE}f=(BjPH zhio46nm1rlP4-i6We5FdiA_o`dQj`O#?>obult9wdpV9N;|JBbPQV>0ACn$p`vcQg zi4KdJC*zChHRRO!>bltG6V_3CQ3@{5!_5Nf4uIplAcOUIfs|6wZ}<5FThU}*u2+<& zhtax1o}Xv;i`A!+(v-|1l+p6&u4B`qEedd|p`L%b)WZ=^onE5?(!6_G(_Ry5!xp$o zxF+81joUmsCQtKV-2N(U3@$oxJrcm9xM5KVH5#aL;E8R$75BH;TCTq#iSy_RRC2r+ zu(fk&V89w@;K#UOd3>4Q7HHOtZnGg@l#7(cu~9&c7uCJVr;!@Kj}a^Ov&aCcna7rg ztE4SOv_cp-?mHM<|GhrebT?uc%;o#&OQGY(`-7W36k>fa z@ra5>c+;NK07E8)#0IslNH?}ZV}(NNC!q>Obue12=hfj>=&Zz$>s4_#U93wwKA2{p zBuBazQSx0^i(4?PY`OBOiB3~?K;Pp;PhrhUQ=dS+9K4OUu^NbR-w}8^c;YR|yxek5 z@AY(!cRKRhw#GvKbuT+n7#l;#AQjt*p(RkXYB~~}!mWS`hQ(>6IDi;$dpZUW+(VZL z+5`@u31F3#H_)~_7Fh{#4puZ=M3?L9J>d})U?Nb0M>p^myyk0`XqmD~77@~1#M^?7m5o1pTGlL^`n~6gjAiSO3i1=5i^>AVa zM?ZBLTgp2;=ZuSPBd&w#SJ45K>baQkg<6%`Sp)YtX$kd z{z{8gjiHZ?0FB%F7%4C`6*fXBjLU;02kuPbvY;A;8+Z0~@{@I~SfdFP*sYW<#t2Nw zqhW`7i=J%6GICPeR??>lQ1!x7G$@ziMip6!rJMjsVisPLAnQ8Wg!zP#NglsWtk^)9 zc*3sFF42#_$}=F8~zPK|{H>fAaZmk4qP_Zbj}+#D4uNF<9tM;$z>I z8bn<4-b%1EQ#u^TB9J9Iy9b>HJfK{S1h}fCXVmTvRiM!g2Cl*@R!fzSN+ze*Lb}0>sKdw`c+pqZGpXR%VwVk~V5ZfMu-@mIB^f zPpl)_KF`PGQ(e{CDzuWL2H&;gXmN3!7+TT4PKJbR)GqG&fZXTC_ll>Ke*FMTepw;q zVDKkNw3z=a==<0GM|$rHidbAKdp!h7DQA)GWmd7Z4brm&-HTmW&p*u<_j5UN1%M;H z;b^NQa#8D~{N!>Jnt)`a#Fljk^|O&6RvkKNABJk7?WXNw?|M(|wan2i;V?j{&fouD z2l1-+RV;4@l`kv^Rbm*xWLlJT^w_c31-B)mhLs!$N(K;5T34%R27$K1Rd7}rIGnj5OAa@L->p*jF=-)B%3P!NH3l#AH227QfRQ>}_1VJ!0D zuS|1AjkWkP_pUW!{@(36_wHe+7=1jkw~Yx{(ljL@@sa)@ug)m9!LsNgVp4aNh}4 z0bbczTlskR4Zh+Ax_gg6t;KP>Frf&K{W`N=4D<|mCWN<7Zu9EPATP2l<3MHVg)ZQT zr4#HhsRAsxKoXvr&Z##vguAaCjBW~2nCk%t#1&}s1RkUtM{ikY7+`K)`$OFEI0()J zYpD(7;}n9#cwwxuOChVGbRhw8tCd(td$_HgmMr|bScx~qZ4T2I4r9BLde5VQj@7t>n*$@Y?PqKs%Q&#<|+(6qQ`)9;5*s8Q9!)*F+@4qFt6@Xh~vYp#o`GoFFcHQ7_5RC z)oUwlDjaKBAhQ7dhtjmNd#I|M1~Q{wVTlkG>yAUkdbo|c{-=WKW$|cjc-|2oC_^7A zyfuz&(}0A71?^WTiw1^H$Vd`DE1@#k&{_#xEjc3>pzrw4SI2H;3qRgzBK1m1VxT{N z7Fxg@LyTdafwh>NzDPil(=nx!QPJTxVQ3_=rLk)?CE}#Q zMUhdpjD?Ark2oFR5BveWoyp1yXsTDJD4pg_zjnUf5K78H9xH`Ry29#Jio!}6U5*a! z*pR$1wLM)Z82sv=#Py>h_V1%jP&~#=>?Zp0pvTKUoQV_t%P;3=B$_Oo6CBwvb@!2X zE~AUbr%~(lZzTe)NX8qZF6+1@q2`Hso(RRO?x&+7G1NIVlu>}3*oXVYyoHrL$X6*1 zI_W99if@!`5OQh0AUn(^g{W+~!r0SjNaBp)qLfP^7-N|jW%hXK$x$uWh7 zGY$zAIx26-F8=Jb;AvNbv-6)$2#hN=h7nGMjIno1JLmR^-35z_!F zWE3^Mr1mRt=3P2w?;%Op`~PVJ?SC2#ZN+2l{{OPKES0tIO1!U1~C zRU~>YXokB~xG|A+#Hz!^hgC`x8*zm5Y%cD;6$DOleH63-JMFeL?2h0}r zRzin+YsTgZiqojAQ#&O!Yr@=t4}DN~m9|P`9ZO>JtOoPNy{TkvBn_3@CsiXi$O-*a z=!d&0A^;0Dth%|vzr|$f`r0`L&UYpUATp6zLFB9U|zclsEJ|#lj$ML#MyL$}l`x6@~kvyDGB7dgE^}b0yXu zWLSS5ZxP^Pm~D$y!Q0BNpd5pk-!WWI{`zmd{@)A~6;%5!o&8r_O-Sd!Ju&4k&&KQ9 zTS5y}@0IiAN=R3ewrI4gHedYQ>1NyCl?UIAdV!V>!umr8n8Ss59=9%A|$1chSx zbs2vH1Gdk4v-;>zQU+hQ>Y+=9=T}1CKlGjdiy0(9Kg_JoZM}Uqr4r=Y=82Lc27)hV zNV{TvWd%ChJuN9ioC;`xs006Ik%$+0X&l9OZpC^NhdDI19Yazyl_DSAa25wIc`=EW%($z9fWylwB^x{r&0mVOeGV1i*$;I*8D_#IX*~d_w z(2q6Qn!hTd4TMrv^brqb7@=p;3!j06+7Zg{&}83PdI z-HQtH-y$*)9L!39@e+~l#pad}qOBio$1>L%STk_~2W-wRvIor8fgWY1nDS<=#IZn9 zYk?O55;t3DE4rRST2CyI*Wudd7f0`plV)AjsaTS-v>a)$Fib53GsRF{94+QT>8}QQ z(FP{snkP?k_E7qqf|zJiP5=hK%V>GB>r3mCB49SNrPTFMqh*BU@ujk6dZ=YhVl)Kt zZB(2+nthoD1dbN-a4#bJ_91t{@Igt-E%DzLB6a9^nyI)t5pHXW*5{Ug@3#E=2q4K+ z7lEu|fB?aaH7*7+wfuGF{4Sx{y;t_ty@jBY-Z&V0l@0nVvtW#3fTs3YZZTg@Sq!BN z(Yui^mDnRSCSCOdn4Thc^QIISbjb{<#iCT_Sw=&(1K%=q@6(^v; z%mH~KK)q7uSBZVngwXd2h-;RMB9WRp;lC_bi`nAZatFz$vY@NnF{*$;ig)<0-6$;l z%1nkjDV9^{ME)(g@%Hk{$|q0|ohy7|Z4O^JonDaoLs6-PvkTio*$o-rY*!Q1VUk{~E7g{8m7Klb^;+}eB~Gdq#NJi1qQz*HV~JnEcmWhZ z@re5sBF+GpkW=(G$?brU@$$)CktkF=9xzq84gwL}?5!gr&Qoz%bNJG!a3Fj<(Qf z4K)-3{q|k^3%oDQIT9fXX!j7$zLdERjrnl*4dl@U8m|OU)(4y^hL*?x6omG+!+8s> zZ`wvl{6c6fpnr9+iSRrAWv&Z4LWHHqh?ZnBF>4Ou5hT4GFn3=*A9EM7lv*&gdI5IA z#p+hD2%i^ZZpNWlP8v0oT%x;z3-6-`ME-&W({#P~^@Puvx?m7t?4T|d5GE#;FlXBS zl__s!O9F0jMQ$)ek8q0f=?sstlVHi(U?P!`;j!p7OcwS(?Zoiy9`#X%fnc!hs<_Rk z5|zO{&lLn$m-adSnsb>rlTSL2PdSUx7d^EXY%tQAv<*}GZk&Br{?~k4nrl|wxZuQx zsmLmA?ch|1zOlDqaWB~CGfu_8BI%z0tkHR_p*ek2_e1*iEqoFpZ-!Y4Tvi5V@DdQX zssgM8HD#ppvl9@rac0ZdVhv43!OAa?)V0k8?q$YWifr>vZv#6`7`_DQQmbMtlv;4? zf>p@lk&fpDBL|9EaSbn*i`hEnl8W11k_?Tdh%gCwW(Q^Qm)VnwBt~u}X}{0QTN0eP zYXpiaO6K9zR@`)Y9QFj*DgR^VLLA#gwJ3EOx-Q)?od;1OR66Y(V<{D4_&xX|$df2I zqMeq(Y~aieUsY@MgQ|uLoTW(?rZU(mP`4 zN7>^GwfsU$KOQDpI}KR)!+MA)phz(|VjeZy*w!(!q0||BwiSy#MgDKv{+AW{`^ESp8_c{WY`P|N zIv#V|kYbG!18rb%SbFggVjJ(~0G-=nvou7rGWB+)?>8Fd2~f;)9iXb2R>K(8oBYlQ zt(2b|`EaFZ-9-Pc;t6KRzyu#TZLe_M=y#|J&QC<##pV;MhmPik_;GyQV_#?XNNUD= z{O1qn7gyrFnr`HKUPnEKCpC`9C$~wADlK|Chz{*rNA7PBz0W(~tfVp-up8t($UJhe zsl%veMO9=e>eVY2_4(Arn?qOn9!SSFI|{$y!A{WLUKNJwv9a>W8|9I`&0LnO?^rZ7 zB9z6d7y;bt7$BYV?9-Gtd5O(No6TN!byG}NWFEVREWe>p)o!O%rNQN-X?!cfXJCt_ zGm>-G5IT;jSQOy?V1VixT^@8P*!(?WK2)X)_5*&K?ZkL;X;(2;CA3s3W^U!*NB)n$ zzU*Xi)mMZbcn6{BJq*RGk0r1tQpJbwfzm?kMjA~vl@z_5NC^(Ip=;Izzv0TAZjy(L zvr9;~k@e=1tUWejT7KN5x-LuwQeD9yMm~e7qMmdh1Kt|1Q2I8ynU)bq_Q&#y>WyKpd?zJ@L#WAm)lq zOJv-EGY&5@ae)^SpRP{SL^D+o?ozsCz|!&Y(uA?!NuQhS=YK>3hSd$K)8 zX`PZ2`cW=30)MXTxT#z#LC5$7yxd79^hwE-XkUMG7*VxpHW)==Eq7=0a|%k#j1&o7 zu_d8V>?e+6J4}0wPZ?_;QOBk($X*qp7K5bXlqHT2#yuxmJN*(DpxbReYqK3j+ICXO znVC+ngRgzVcIKsdc2c*LO}DYMZ0~)F#u4)6`?qhQUX7i4C=J9UrlxK$nXE6whxvLY z11msU1OO)?SFcclO*J5G6^WrnD0uZ$)PKWC+?|&jhEAi40_r7Y+q3}Nd#Uk-!Ft$E z^3GpLMwYlDlCfv*(MXF=^(mZ91hEM2mTiD;2(ZN+)-L$SW}T-4&L}BZ!t_P9-;2d- zD1|)@-UgkE|1VHW0|XQR0ssgAV}r6fR7eb$L@odTy0`!U762RobYo*JFfKVRGBqt? zb7U`cV`Fe-E@M?x2>=5+a1lx;SA0u#cnbgl1QP)O00aO4006W+{dd~9vcKoA&}QGZ zKuHQDO}k~=_Xv=deI#&zY}=cg!!fo9zBRUwZSrw@`~LPfqYqn>Z9=-c>>h%pnbBx8 zGaAjveOcQhH9}_H?zn&0B?n~OCrj6(B-kY3CLzlpBFT!9nd?80F6jpA5PBm(VtCyk ze2CneRYEFum9!d-R|oL*n%qQgY_Gmr0&cc)W8%4s$ci2a{9Hzqk~mlNw8!OA1*G*kj63eeV{&# zERT#g3(vI?d+6HKk14TY5@KV#q7GR+FvK%tWhz)9X93W+5;ySMgu2krM!%&|3{9jZ zM-v3=1f)~35}ZIpf)Mel!1V+1EZ|P!9hOKTo2)}zpAlXKAxvxqBw?y|uIG^jC7YNo zH(nh{05JJ9n0*{w&PeCt3;EQUOga~{FKqx$RfQp27O_E(p0<=;;NP%G15PH^HgT84 z50W~$i(F8mB*-r^lF8P&P6obxSSPQ3B{K>lqh#z^HZ1LQg9MI_8g+6S#0f&4cL-^; zn$6}x^9YojTuwVc?B(9x&+gKpOSGc-tTXx0pUua8XoWV{hkBt;De+Iov*DM*KQN}0r+!lA^v8)$N}36FU(*O`1B#6 z;75IMT5$pl-cYnewh0)hDk4K218|JKs|Y&sY<-{!2;H{$0+^JoXyruh40h`No3SA# z3_}2jbrV_P%0ynfzU2Ysb~b%j=k;by=zS7dDxyz8+D=Y<_a?q|{{;LvHpMbPH3PR* zi70FY;Nq$T-0Q97ZA>A>VHxgpT!>)Do3$?0?uy!9q16C%ODPY^DDN?$QP772L8ooWBgJ1?bS+HqfCdTFY30k3r&)+Cb9I^V_;=Hm=)` z@Y~De>C?My@`P?sPpUYC@5FQ-by6FfZSBmv=lv|~ZubrN9KU+i;P%~bG?;6ao7UhT z{rTujM>;NZV`qb5KlNjoIN)<`*(;#e)*3I^N{^OPYBL|vRzw03s=KB=h^nTEwGQ>J zap3w8Zq0(}!+H^TGt@5~A|=fLVtrh6HKXN-MQ@h(kqK0X=)w+Q*)RkIY%bVIDr;qi znXr{ckhURilpqLD6-}#Ax(~p%JMRr9u*r@lUxWdZ#VZs5?OcHyz$w*$Ij6@gs(?lvGH&e5{(C(#4bEFIt!BC8?>csnO3<#RDZ zlXbabnL?6?1K7SPVjJ9YE9iI-ORTBM1-b*HD-$|Mcoah1oVfnY^dU~@S`%doh@##J z5GgV?%js=$%fwC z^SqoF$d3aCVSg2_y|f?B&}%m-VKdxg(A_Ab$y`b*) zTsV{^LG*CdJh=u%mM+9_0htdmI`R%Lr9baq%<%j3cr=-1TYZC@O8-8@NID%~-F1oy z4bF8!O%b%LpGs)bpN=jk-M%E$N_S{D)!Xzbr23z`eI^h=>PSw`rfhq83N1KVT~6?X zE2VWbommT*KG=Pv!HQ6S9fHlBK?VKk?h4#}GioVs{?8Sh|@otZl4W=k_i zv90c|V#AJN;msqdVt6885|F&o*pA!~xZQ!p?&usSPrH-B7+OhFSQIpq$p(%BYs^?l zdMp>f?Trap1lm02Kg?r0z|w@ZS1V_li^E{*ZgH_w@K?y!yH+Y^O<3X}iZ#^hW& z?->jx{EYk+O(Q_AbADs9+V5Zp4(N0zy|EtLmy)R>E%kiT$H&Sqv!hJ=3Hcy_?X`XHT zd>Te}A`z`4JvJAjrM=~N*fWY8Oy$O=Ojz!)NF;g5#ys(%qsNhfU7n`W6lv>j9rL)L zK&RMvjOU%0O?NEZA2_YQ#U*3~C*3xcU+;k7G`Uk^tTKJkxPR3-?$rUZxC&8Jg23$J zuMGvqC`LS9iD3E3Bb9=l<}NHq@T8`Sq?aa)xs9{14$gK zB#hd|u7!;pD@KW|FGalTiONCZtwF zw#}*0c*80YGUm;dMs}!+)Kiz14>9Cu&VoJAqP;%CUL^IJeYFq-2ReD3J|gakBjHYt(l(lYEhW*{$0;1c zeU*~O$JehU1_$|7dpt(mV;uaI;7W4pq+A`RM41en^b6(EI+k+T_619+s0J3P>MSdu z1c`eN-{M?$2t!Vwv{jQq&m1wQ)XcGtwiX?fw9qrR(FzXkfy^(0Re3yg?s1ma({N2+)K zFD{2lH4hqk!=X~MgN6^61En$t4R}ZWXm9T}a2-OUD2V2MU@c%06?MJq(~dz}Uvbw#|v{O z8ZX19gZ|eGshi>E(&#t$r{@f(-nDoQJk1=$$Oa74$yfegh1l9Uk8Xy>Sb^P(yo!;aqfKce+3d@atO@U@#<*_3o z7Wbh7cys0NgV#@&R8Rh34C-hLPb}vW!a|{soQ1RhPk}}^4C32uAo-0Sy!*GG2a|E2 zDd=|*0vN@=1IQnLaK3a}(P~LN1v4<_Ff-?D(1!q4GK}S|H2AEgjGAlbvP z+tu;Q3OxgO8ZU9p&}ebf2(EseQT;)*C`YHa56F>mn_v;N0Ih#OFloHSfl5NM=pP|} zKxZIjHjwel658ESI9jPQ43evtDB0dzd|E3}`ISH@6w+ezw<&(DFS_|Ysog7OV~M0T z1pKChJfw$ehNc5wX95xViQv*ux=((gZ>6i@D(Kd+xx|=>aKCXEq&wit1&79NU!+xC`(Ue8~MZqIR%0UkO%5Ia=4n`t`D*xw?Y0ixEa)MDPzYO;RDmwzuiv&|LRxyR5 ztU{kb<-s&lhPZKS!5C_4sAzb-IHIhqxVSj-EQCy>KeZL>AtQ9PjBZWnf;`x#qtEZY z!lMmSRG3{S2kIBbb!$zk#oR?)Rw$GJzck-dD2kd^#)6+_2_WI)2|++|TNxtLTYDu( zD^u7F*#{;mkhY)HT4otEGgw?MYRM&5k);WybETXTcmNNgN$zRov6wDJv{bD8W5LL} zKYtu7^ttDqHD%k_xsYY+^eF%|ET7HQG^}>606BdbrSyO*&gs_M;04K=#ge&RGXE{N z$h97>ucPwJO{wX}<|J3DLdbyz7lAO(QhqIF)%jQ!kvs&z% z5rjmJs4PsQJuA8czv_!kwO5(JH&dr@)hqV@<=JP@>8UC?SfmMm%Cc5-d6M`i)qRM1PMdr?%bD&n=4hZ8)67lljKnzq*Krs&k z;#f5n;;n6f3oZ}uh6@7k?(LprEH+C)I@>_!EMZBy{Qye?eWJv~!A%>M@iGKKC&*F` zJ`NiLHW#XTjQYxb&=z@0*$vnVr!T2u9WWR6Z^9Hj7os_5VmpB`F~10oN%YjPe}niy zzsxJ=q~b_Seu7)i)&_ipk*Z*J^Xwysu-aJ0$I_a~&Nw3-g-8 zqSYWicNPvrH@S+La%k_2(;1quHFzX*)F+16zF7&3=~4T zjc7FVQ4~Sm8m9mUTz3xp^zWbqRiv)Q)_$^oy29Qe0R5(d=lr7Z`@-52i3D@or-2Gr z_q7rzC$}k@St!|r8c^xwsy5;<$4OjME>hi;H){sl646=RGK0(12X z#KfxNF`0#wX%djpx3FB%4#kiBFaHN3-qD)6ZYas!xY762{LwY{VT8ODE`16j``BS# z%=&jPFWZ_VqN$CqU@Q`c#D@VbLMG<7PT{Sy@R)WYs%yl6+X5?cVj%Jed$Mw+VowZl z=ii+y@9l(ot^K{Ce2^jE6e8JcR(^vUrxj(@)(FC-}uk53rH3y#51K;Zk_lZzFFOH4d0c2RYr z@EJ=z7~EumFotTL@v^6=E#`y5sp3K%4$#8`P6pK4_Um^Fogh%42cBfKNYxq09Yc(_ znAA)WiagXBBe7Ce8h^IW-Ogp{{SAYt%D@YVNxw*DyN;Wc9&$O*IiK*@KC*N(a4}Sh zb6Zf86BAbh{Wjv^fDEO28=BK!K7V2B=d0wfg(`$5bBcp5f@m`E)oD6fggM(y&+b^* zoVpxp5p`ZPlW^wG*GnpZ_seT zhqy}bUvY6>kN8Vfl^aG_x)Y7{97o4Ha(?JIb^f4DNy9Ykw`{o68Ub=fk{5pCm2EO4 z<;GKu61Z5Ss!f;t(Bs{b^g-pQV2RUQXxi;X%@H!pGB=2*WpqR+o%tMtIRsJs(5<~v ztW;V0r>=|LXMHD!Ol3C&p#l_&OlhUqiALia%T;pEAKgu4!Zeg8rZz{5K?6=*2`_?v zQ<55*$0J9yBcfmur*dem&}DT~k|#<^8K0*1B>q&mSE6Ow7mKLo|Ma$5+FFos9sE90 zy(k+Oi3-KHHO?BRKdy6SDHsRB+Bskl6fYS1!y6QDCilt3c)iHHc6FTACvg4E*A}Zf zX=dT&{eE+vU1dEt>s)b5o_*4-T3K@eT5M2&+|gg&&sg&__*WC?q{2{P(XJP`TjVk{c4}o9F=QrbhlO!7DFLar3LI3yzJzyz#`?@{FHxL__XOx|?`HamHni z-y%(Qt6_<~j80nzeKB?ipnP^@@N~*PQ69L2Z|Z}`QN!8R1RtuzJ7&~-9rRG^(6E^0Gu%o&n+XR!>`Ql4wE6dpmeGjBHxN(C6)Z&N%A>^^m9nGFS}d&vr_QYFf`u>HA3{-fHrvCu^hf1#1yFp7f`%ss464u z;0Aea#F@$i<}*7<^@W0ma9Tq=y_lu05w5=o&_$_s8uE)f*&7t1BYg$2EL(-lp5_53PbrSdp= zg%kmEvssZGBT@wv3spLziOV1Ko!5M4JB!oto0NksE&LldOR$!}I4a7XLHh^1Q;1nC z0u@89*ZoJnf2L&$#+zLAM!&He?`~}_@nfs1oF+>2$wt<9Gl&!2pu%n@5wb~-$>FQX zyfxAv1efX3^Bc|LGCOP36ua}{3B|&UVJl9^wUdr1PhDVoIB{Ib={@Cr(WjxbWyqFM z*g(c2XN>h)Lm=?$MfkR>aJ{ZMb+vNl;z@N0wgh8s;En<`RDo=>E%8Fda{N`9=pf($ z3~c0SDUP%eEH==pSeD$Bf-;U!3tYXas=Wtvh~Q9+|z ztS#L8!31PW8+% z1$RY^z>XgXF~NTueAf?GRUnE>S>i8JZJLf5BAB45zGHMJzu$O9(t226L)|pvpGhS% zdbCo|Qo!N#eq~}RMK59FXLB6=snU_Bi;&Ljiza3COOe@Fr$h0WpvOZmMCe8#exWm( zDOwN-I>XytR$MD5gMubXaj;Lr=|OY4ikm-=vb`|5QOWW^SXzWZ&{j6|4(;r}KR?yuO-Ac@WdgNBJ ze{r)5-L9JRE%vV+vYBs-&)Dp~tK7#*EU9kL!;)6O6Eke-GZd z+#eQ#u+tTyhMDvIa05hr{iATO#YtR=T}-V9KoyfZ8Q!#}g|kkcCT5IsdTLxd(I%&2C`)9;R9D4&l?GzXF$UUk(fJ`2n} zo&EH@tW#i~GIIULmPl?ur{!H%PV##qTB6&d85Lypu-$ypp@E)(NP3&yDJo)TSetGp zoWB}j1qAu(NjqKh>ytnn=GW}g|DF`)9evbvjERd3xD}$;HmEJiB!bp^;)E;Q=DQ^} zke3aW4^Y8sn40WfC!Qj#mXfpxRM2k@)(B3i0nV&2a?*s&dNiE{rh+I1JG9^b;JrJ} zGgeJlkbsj3lU$UiREn|-1L-t@u0}1jtu^7D84j z3e@FyDzBc3dWddycwS)y*cjvLH$~raTo4xWW(IfSQMmyskDlmb7Hc8AESef3Dlv@} zMX9ehuh;v@^nLF3BEY4I0VWH6Hyii&czJ)_d<;h%CqS7!RJ_!b!dy>D`fp`GF`~t0 zKPg+Y^;_0phHMd)8hH7b5w*Fsp@LE4$b*biS4s000nYoMYLP&s)Dl!5r>=3Q+T0SR z?xsDys#Z}7gvL?MTPf3M0-&b!fR?~?3-0klw04}IaBVdH@Bw;X5*>kXfx2!OVk1wP zD_TbFbxe3^qGS7jfIIc3ElsaA*7Bbzs42Y$zTG5XD7oFb>Oti@NL; zA{-^H&T~D?yK%GGU;r$Q!3auif?^^^TK(K>PG04`= z1@Ca^-psK926$k;5(S$$FM?PhgR5U*-Mxd{pwbJL`>>y^y(BJ;v<;;Q91~dlm^uAn z%cNkRV~1H15-Vr|vjh*0`~X3*@QA?W^K=`!Z}J7c6cNg_a2Ui$WNZ@rg?(!O7+OCG zXo;bm;|d0F`C9bLnY?&aZg0&Ylbi}DRQ5OOxYv2uT74BVpk(?%9n3`tU^$vr1vVrS zusT32=Dp0|Z?YxGfMG}h*5T5H6`UvTs%V2UKyTijzvCOt5mztRR2{x-2O!hqJM4oK zx7BQbzrqAV#+Yhg+eoa7{zq>aI-dT(tFWfndB}a`ao=3QDHUtrjCW>~u!*`%%5>~oi7lGri ziL367f!UneE%oqf+VoZI|K+{s@9}{AbqC~q&>r4p`l01?NnpnTyt5c8#U5xibr&#` z=ua*ua(*6Ou8wIaX{INejc4VY){WasuEzUuC@Ej!D3e)ryWIAB+4AW}gRUEKioSttTMMY^r;HcgWR~=g#9)OS zUhqqNfKYJcn@hSjMD`Uw*_IjFB*sVDpLLtkC}45;Mgi}wTV&>2MYR|ksjEP2)LIpk zwRr5hfZ#h~V3E@kvl;B5GJM2fZ3OlKc-0bjlV-VnzcR#{-rtXLTJpFx&0r93$su$v zHIoT#v=Cmu-~sNnoRZ&vUGo^gxPYRFfpw5jKI|U;kMljYOY#6DA0XB6Vtu_GwEBfM zOXu!Blf`zfW39jD{Y@`dVWam74P6dE?IXJRA9vT3m`*BFslrjt4iKdUNs?K(Bg5q_ zUNLvFy4ANtS8xHr+^ByKzvpv>uYyk78AH~(K(IczFUAF3OEzwP5g-C13nk%@uI5Sl z_%Ffi8^5>%C1)r&U|Emgo(Z@qKE&Ei?QGihm>%Vv{?*tko3q(-i^BRm<{Ef~GR*RM z@z@fB{4pCE_ZW9CGK#Os-#&(8270}}T#e7KB#KI?v}yqwtH~JZ^kN5nx-w`&^Rltf z1L_w8iIBJ2q6V&%oLxb>-4dk~*DF;wAkRl;KY zTsdE-an`a6HHxY%-?>!pS(cQES=*~x2BCP<6#Hb!+3Jq5pKy80TAr%h4jAD&!034m zhg@iq6JQc`=V%{is7)DPK4VAy1jI#b#ZFJ`NeIamK;mNL+Y?3~&}XE+lL^#1O^n-> z(%z9=NVpjAy{*IqdvmH!ejo9B!)2!t<1FW`_SG5CFKNb9N&q|(jfKGPQVji8C7>|X z!m_YU^AWD^2cXDiEVkRD?Zcuq{5vZxNypyc-WN#HSsWegzi0bXt6{RkRl2eECI{do zBaFZ6FtliNilzLpJtD8ICv|l3@V|$SVOe{iTtHhNdZ5?PL>W3eoRe*uL7o1Y4Fp_G zfp1k&qE)5)t8}W0ixu|XDuEt$-%e370e`C@l~gmmY>yLd9g#VbWpQ5+<70|FBm)DF zg9A`d3&|p=K2D{=f(>%`rq!mI)2k-DdYD=KFhs9ugCZzJ^6&jVG>1eYlx{P$ZRW(f#j{vvlvkehqE1?mCs?#v_k1F>Xb!d{OCu@Z5iA=bn z)^Dp-C4RdlO(ey%yp|$(FdT$vFBuyY={{;xB{GxGxnL59^EXOy-q;CA*zr!J95yg0 z3jt||-LVDX+QQSK&7<<{X`m8aTR-BvTu{ncZ`neFj#{gnPA!=N_i}I2WsN3mdACNx5G5M#WNI&TpTog}^~jo^1jjvOeuWIs|Mmg5ow@J7oOI#8T0WKXh1FryrrgyG{xYRK zP#?A}7SDYDn6;GpInbA5fi*NjFEM@8*}EwX@d{ty_iOgKyN>A7-3CvL4ig4VOwPGG zK0ueAvCxL5Mx7(E7*|#?Tz9t?aRMMpGQNAbU&?kv75OBBByOwwlEFbP@()JS81$&N^z^cI0D0PH}w!|79Pe|K%y+?>q18Np0^UIRSZc&x5y@8qsJHC;bgPF0j=3iqDMd z%B9OsCv)p`p|_P#Fb6If&qjJXaa93X^{twaRP|rZ<3i4COdpFJt-mRgqHhGbu|#(s z$xR?%LUr!2dwjjI2SMMfDKl|}rR%)i=_TGtHzt1zql_l9xUlipO2&*SQm44vu4sZf z3(O6FK8#*v0qT>Bzm}Eso&Ui#6KA zGZIjCRWdvR)76%pd`6BpfbFCrHP?tJ)W-Z6(1eSzxZo5J6G%aXo%-j?bX~>@g=uJ5 z_2uNkri|i`{i)sw{%kbDkiLArqr)|3XQUQ$tGI6eeSihk*n?cf&Kzz`36j>b?Qib{9bNZTUV+6dDQC{Xb+thyQc-rz%tw(4CwzdQC+#L| z-wag>?>JavO&n(L1f{s4sg9N`&JLxaFiFq%*Ulu=3AZcZ`bgv9tne$ejqJY4@AID>Ed9L;r8T5N`f4tRGyjFWqUytz_0ZvRNhG-dK4j$;b7@P-48vN*fVNU?Va{o(F0fS16cJk|_APYmCNQ-Pbi8M^T?w%e>sf9OMJkfF)nKZl~F@3R+GcN&2N{c`((fn_?P7q{vcs18swR+zKl9b%XIeqiyzx z5k$)_pyk$~1IzU<`*N6?sy4a6urGsPq$G<4>8HNv^k%wvR%1(QOJWGR(mYLMo0tW&#qY#vFo-ly!B(`?usyOrytm>t_5GGM9jDR}FmiJET}5! z4<42ay#o85W1Mm54D{1{O1b@`39pUxZguFW>P|SH9Pz&WBMw>Pxtglp<)9)^@U8zc zuRmlTh2MD%X&aKS77cOxcCJwZKhOmh`wSI&jFG@y05E)e?Q;7&5lQeVf5z7$JC61q z!vej5e#^?^+oh~b{%w@!K@s(5(azj>JW59C%KrgyGYVbYBD>M1x)sD94X-JZk* z8EAg$^?^43_0Jl08<)NW|H~_Oms4Kg-ziabdSqL=+GHD~W%a+=43qPi_Y~>|%}7VA z(?;x#8hn2iH&z!zTeO);t`a6O>#exXh(m>!9Fq$T8O=Vtf(4S+{JOMP`Zi9M9jJGL zQ2yXTFrK9M`21m&cT-ur{9$WpUMA0_AC{TSnBqmD^;X)Jn=lSMC67$$nVBHY^zK}> zJ3`6j3EJ8R_*(+tUFs_u5?qn!Jh-Oa$2~b3v9;h9IuQ^JyP#~*!0lyH2w))S7>bT* zCceaPPPP%RMDvO6Xw=d3K{NY0eTHe-h_rqz(pksZljcP8w}pDSF?jI(z9r`bCjw|g7Q!#emfs;rJ+Seh}Q!PLU}ITFcE6>jz0Fhwh+E>x*L z6>JD_G2X9`g{fu1A~n6{D@(7ib@5XS#K>Bd$j|4r%msh-mRC#7HU zS~_lWChUIGFy=@JO*GK0<5QT9t}EiYAMm~dQg{-z=_d(Gw!Bx9`7RE=K~v z1mY4{a<)4v9j|3YK+IS_g2h||TesCo;DtK6QJJBIq)L2P5dzObWDbJhVq)u)pE+Yr zUnT8Wro&hq#^oxPcY=Pe;!%Cmz(}Na78surnVyDk0?p$R7%|Cx9OU;-N%ND6?nyhJ zQ9UGX4#BbBktNSKB^pUF>6xVhqWX?D?E`>J?m5%84m(9zOQ6R~l8ji>i%E0pLUU(p zC1Xpdn!aU7GTw;Vwc!T!f(kwT07;4mrA9Ffi&S`t`@A@A0cB6%)JLQcZ$5v9=85uw zn;O@9=ShRrjKpWif!LuHhVNOl1%wW`VjO`lJyAaVvT<8g1cMFg4N*kk?pSjM2TFiY zQao^ih_DnJB+iYH*^$AV$a`}TcK&H2N}PU?yf-^KFLM!i@dVARvxcaCL^~+-Tj4_h zVXY*;0bCH$~t6%5sGMNn=l7Zy={?}&YM+A`g|ZV=Ls-N(F^;6Rb4Y6 z_1)N1O74u9hw#pF2Q|5DT)&ujwmv7sUHU-!S=Uy7W6F#;1;8A@bF1;YLhgjBeeV41 zY{cGihf$t~B>wBB!EPWx_`2Kfs{Zxa({c7BIEt0q0YTL5_2l8~=6sc#fiUu>@sFQf zcy7LiX!mUHZSRE?`Raf|$w-*o@dNzm)TR$aZJVa?4YY%Z-VvFN$XutSMk6DJ;+JJN%x~`8>t;=f_2nC#M1zgf@2?(|yo= zq~+2!oShShff5KJKtLeJDVpwls9)=NhZq`reS_VBLaGZk-0x33jUAPnFmZ5C#mbI8 zc|~YqgBDQDM9H8_2$S$bjEbmZz2b-xp38EYfO{ZDncPYVQWr6|L-prl+7@uoGYwrN zv^|=P`oc#p&1Rn*>=eKXk|QMW z4w@>oR@7^!akLFyln|C+oiNaF7@kOSBxRRriv-*KcTA{S`H@NX;K~mOt?~ph47f^d z25QoI8+W60#S};#jtYCD05}vQ(H1uz?`LSuStP9l#u`K!F9s^Crf`40W(Y{|LWhj( z#*}g$W>Q;lcmT|=+`)lf@b*Q&pY?%Tyw|P0KEDDXg5OO8$ak-sm)G}{xNe%m93q>d zUfPF~_`6@L*42LNy!^0e<9LHENH1{gURyFZnUdxgJ1dd%ZSkpbhg_GqkZeOV6f)p% zh<~JC3FV9M4{V0AB@p59p>R!`OgsQG*gf)3V}6NKhI4POId!Ri!Phy&btVD5*`ixG z$b1!ctRpc_hF75gN8GPW>HM4Au8Oko1S>%fZ+k1I@==OE3z?c#rv4ZPmn=HV)bK(> zeG;qY7$*$YsC}!x&m+>6F!Le z%Lv|C-_LTUokpA9o4BpOjsWOSAqS(XAnfNVP)L=q*_-W7QYFKJ%VNdDzzLL61hyiQ zYla24PTFIB?t-uiGHq1mpDd*-l%IVwRsp!YzspF-%BDZ40z@48JYa}exTRVbzQ`6y zj{Ps%sGxy35$3r`5S`Hz zf1CL$OT=l<|IFf+8?SPx2BASdhU1;3t=pqwn)a+m`kjJgMr&tED&KTa-he{+t^CV9 z+^l%uJooLOh$A_&&CskkbMh0$p++-{nNZ~* zcv1%r$lAIbWSArHG-leUJ@>&r0)&Y=ZKq(L^X%sxv5qOq#IXglhp9{L zSS1dTPtqXLE>GXfJZX6PYMZ(4f zh_gI*u3?DJ9 z6+8UREE&zOTJUnI6FC2t9$k<{8+1KRNu`hb!MVJ?&&!n%#R*>4G{vUGpFu^c%I6TCUmUg6& zk{x~V?B1bq>k?!hwT=(hb?(Dl(Iq1@Wv2nX;`@^dAKdPh(gj7~ISjpGv!Z2yM(HH& z4zei|)+qj%9+My6j^ZJ%va7azz9PA7Z-A;pphf6J0za$#LA!6DX6(-#tr)N{lk^v% zkSii5DqJArm=qrY+zq17Jy80Lv+Z8f*6N#^JNShY&smS7%X{Q&>Ftj5Y&PDHlLz0K zZnmoj0{(dGq;%OIunMj>n{^DD5rXotbsk2du>oHr;%axDt%)=L)1Bc>xmX_G8fs$OkLJzy*$6g?!Y6q4Aw3x-lgvH=X=<#;%9CJcPHlAF zq5cTm(M}Lv6Doh&tR=%BS}Ib;T8g*=jxDITT^|y$z$VCN?Hq_hrf7%CYk3ic76XSt z8yIu$9?rj=oZ`$-RG!niuky??hzP!*KyU=bPZHqAZ{~e z8P?Ideeqdy)tPh-yxJn`0av!o8|=V5vCwy$r^FFxa_P^;4qO4&e-SXID*H5g{z2L8 zpQRIJpuJ>#O1P5Htjm4Pht06upc%I^N$-Toz(p?V^N5#4XT$yuIbl-Odgu6QG25@q z$K~PT^L84F1v5$U`MK@QV#bU$ApXpJ?t$Ju?#_D@a}>Yv4S1u}q4$rUd;_N zpA;VFVJPMoB$9!sK^TP`P`l!iJ(YkFEEzjOp7&jNmB;JqrQ8*!pUPZtPzt3el~dte z7UwzCQ>AGT2mlY|(?yB*#3vb=lDE^Y2y<~TCR-(31O`EouI@$F@V%Y|FCs=z%|cA2 z63~<9y7+ATS`7gfiZ~A&hHOFO5_h}@2EpKTo(WSi`Pd`B$}VT*dr8)4+>k>rOvDEu zfaKh-P<=oRqqH4ROF3A>XDJ-O(;oFY*)uahQuB#~K7;YC2rWfmmXuKpibDwoR4Wfc zEKN?r82ZPnO%oZNjIq0@N+8Q~Jrd`70f#Q;1G5@QS!#$fgmHJ)?QO2 zDFa=9DiVqLN1fW*^h@`QQYz=M<^22h)f@c2=Or{6841Z5ZxGma{nt^=qU>=!Jlr+Y z$VkBspOtKfs)8Uwv;Q52*YBqf1}$pAWrClF(FJivIsprL$e&r|YAl?1@MX+MAR9|^-o#vV*`5tvnGa)Ere7Fo0m_J zWr)ZGjz@g-P`?kQ!@@_6UU(XwdYA3Rr1GHqQY#h?mk5Z<@*+{MtA)X2=E&2P94k54 z5S(;Je$PZjUBI>EWuzQrF9=vmxhpL9HDAZ7?R3uM9bVs1-ZQi&jKntv<-JKKo(2$N z_EZ;33}+pFa1k&8CX;Q(%!BL~y1bOufJ{Eu5G3vX!aWWySph2spW-~B`l+>YlDMFn z^1u}|B#59=n* z8~xI`nZRrM^$kjQ`^cixo4es^1!Q7?E5G~Ks0L~@7`eFRX=^?YSr$|iF#uTMwPgj? zRoR0hYoOvDT1X6zj@ddX5fA!kFBfP!{vND`q#2=J>gFcO219N@i-&)%?_~gsz~gAK z0_1#)RBo}FCDElD_U`nO!eRPXzSo0F?4fWf(!V9+tq<1{uLUQ*=D}1W5v;q$7?1j- z#R422%qkVRXz58GS02l$n}aozMkE#@!wLZb1|{Ft9}uA@BIA?43`$JtFN?-AYcnaO z5Te;s452M_ONxi2{WNe*$7bM0hT}9#3dbIZa6&K^R*u6-JS*EL^(Q3&>ipwdx=&Pt z*g0#rO{eV0h-!*Sn);7!hfiVSjB+|9X%#LWg&|LM%(8?z9S@A6^sp6rMHZp1E<%#r z`3!RatjJq@ZvZ2@3KrK>$3ql1$RhUU4_*{sz9SK-7)xMJSX93rezMvV-PVG2>Gw%^wg()I@lv+f|rs`y-MBXOA zwh3yCb2N3;Nal1dSu9=ank)kBph4Zxo4O?o(Eup^*yOSXIfXd*m`8=Amr>2YO^Fji zy^RPywP3Tfv-YLlXLOqcFH?d>>2<0f?(6Ur~r)3ftu7!q$vX zep`=?75wsFu&Jj?L5yiOS6ephQ|C>gI(N2)LPZmwoK2DXry83M#lSJ$8jrmJY)~e9 zo)r@SZ5Edi)(hV-zocJ}43H*0nqd-Yu#;8K-%p0T?b^-`d^kZI3C#U?2ut%R-#UR- zxc0!j$;i^sxU$EnU*Y(&AYXx(TFX-HShD=qL{%%0(vwUW;H?5P+%cO#Jcn+x{nOht zajy}gDs2$>j~z2B0QHeG>jKxHJv5@Tt3AI~J(8F#byS|5f^b5exD?};r<##hj#CxA zeH0c=@fuq60+2{%6WS^}TN;OwOR!m8mS}5diY>IK21J_QyAg z_|6Z;@^frh8;)L1PBkx%YnFtZk*hC}S^p~5J%KCb-#(+tNRKkn_;S3f|5Pk%lPz|3 zW#d8)@U1|N>kEPv{AjlB?8e>dW#eQ7)1PsgOB(vynktm5hO7p+SFRkwyV@795E&Q<)} z$X<6@_D2pExZ&&ic!KUR82M}ho9`%|PA%I8yEOPw4%-I?i8J^Bm&&;JR+2<(M4B>C zRM@p&mrZ#xjHqM=irBblwQ7qR{CqpsJG2h#(mCp@?@Y(n6WLACcywAX2mBOwfN&@z z4hFaF=VWW}AiBm!%i=9_&yR)+HpRY+M{)O+Cv9`ufTxz`Nbi{XX4TE`@n~R2kKV?& zXxh0qc|i;3^a!E;^mF1OqUkp15BT4Br_<1MQ&*X(fxi#u>noL=vzRGCr4yfES7y;q zRu(FzU>I9NX5)wK`G?=B#j|p1$Y>R*#jMgPfTK62t0vkQ>=0kytDB z!L2{MlRdNFgp!hoP_2?XkQ|H0d1NuPn1W#zKgX4)L+{)Blq4ez`b2uD>o9_<>~_QS zkR{bu#ltn&XaLj1T51!=rS-nA+s@}k-YW8eTX|XJpI#$ix404`us6%MT~s`o)SQXo zAU4RyT9a#^KyP&c2;X#bYORur$2|8T8h_383Fs-6MDv!X+#9!9A+s-<#CusrVwPXs zA^-as0zbF-2B}pX?DZkY%Dy@im-qmH0^?Ec#Sk%X?$xb7FWDnzQH59M{j6b0!=M*G zPOoVu%31?sl;G1Z;?NSL0op?QbDdSxPpXJ*np`aC8g<1ieANv|XBQuF=HKh?RL@$M z*H_&JR?r?F;fPdc53Kio4ylDJ>h^>%B|aDnQmZ0A|}8a`F~ zH1WgdCNgsO2~WWu{bi*>nZeS$c!v#x5VC;v^+*2-GE{!3bGPkpVPx*1QPs@OEifMY zJUPGWsO4}MxIG?~E;+eyqRs`Ti`XztA`{UI)i5jtkwu4AiIy=Dx#ZN=pel6kf0N#& z2XURGu-e|rLHC|Fhi3e3Uyldr!?eFWapXQ#>8rE>h!fLzZTXL+`2FEDa#LN~fj*A{ zTUjbgy1l%S!w-9uy9zJC9M_7`>S2niGdA4;g}c7K2hJYdk%p@tm23LWuR1`~UZMK7p3nqBo4v#O71ky^in$W!#s+zA<>`OeAKeEdQ7RvVH zA}f34YKRMIzK6hEvpwCp3r9HU9IXLCMUK8A(}?xtPB#=wsCTM{(sVdYlOeJ~(HC#z z|6;~)AB&HZnSD_#;Zl+`?%RfbFQA_&#=Lw_(;bHcmEZF$-sK<+6V7F%SYF1+?pd#0 z>7@|p_20ftfd+s7(fDeYd0aQ=!xqL`blJ;6tiHVju?{|Makzf>50v=B4Gj^(D*vt{4Qd@8{G~=f!hgHnHdN^0PQSto_2i{xy=awFt&$f{a zqfy6vjhLhWi9xZ=xFx>>)bMT8xS(oml6Q?RsrpLx-_UhY)kjWe6GuPx+1<;WhZYeL z$CV^>2!R^_QsQ||Tio!qJ{kZcVzC?6J|)CM9{6abSQ$JG+&uzGbjX({^M^KaU+Z7$ z=k1GA;ji{?rNS}^?s8_YdUf1WFV8SQj?5rfBv-E4Q!fUwST%R#AjnW*167Wi5nM{^ zsCca|ZdT3`ohYhKXs<6fAEz~PSJ}yfHR~Va&JsZ$ce?;F-u3cE1tE6LjJLCM^Ut&4 zT}{u@W`QdZK&B5CuLpI7jn)_ig#i{>Qk&xBbR{89IR)adyN9PoRGJ}{+3*(_lY_YY zO(|rUz zy9!wPTK)3b;poGCuFTb&)}{8*VdT@heOq(&_1L5M{^=$>uf(5`5<~90U~uf9GH~`6 zT1WB?w1L>QJj*+xwwM(^Chf&~vw3gzkiEewDT5LZ;X70y6@6Qfl9I-CqaZIJN&(RN zQoj^~+AZmJ!YVW=SZZx6!X&zI4XwF24A~(@P+?W*4|s6ci5= zSisspiJ3iWUJ@L6hBS1bnupQrcGO(~TMPRyQzXW4d2vFrlu0}T(L=`rL;)KwqMykl zNjyUQGN=Kw&GGFfPrP~KWR`h1k$#u5$2d{sBX8K}T@O^o-%^AVbl8&;B$jF;9@`mx zqywTy5fi`*9sp!8U3+Tq-vSfcn=C!`l7II@a@CT!1PEJ%QqM}(2=@lzFv zF2h_~SIu5Sg%ZSo?N$6Dw3BJYgB%bm?ONikto%dAUE58|Fxw=}q%3i+z{aa(?V!_! z`d_CS;vp7J(^&k>VCf$(Z|`gG1=cTb-nw=6gwV|}zV!#by5g?kh2FGy|JB5{Rnx~e zHNV*PyBhq!4OVhVT`9An8#Fv$nW>VV+O7zU;$5OKr?_=v-%4kUMKa^mXOYE4>{ z%4z+hS!(dxtt1gpPY!V44`Tmc4}+gtvK}clzjY#p(KuXIJZPbm7d0CH@B3RB)n$7> z-wV5-p3R%m=n*-(SfP9YqKKbkT5Bt|he*DWg6Po#Gm>e#2!~*^=FA*6>{#3At8?HB z`q!`da^}mw9km5A42mc97NwA9_Y&#V*Iq3TS_vs+VIv%Qe-Nyc@W}7sZY}Lh3qQU{_VqlHH{i@aib=WN1QKy4U@LK+YQ&CNoaY=RNAc9k4sdFG*6UF@n zvE_9$PG#XMvq!N&;NehND)fhn>w{AYR7)-=vPY!8J#71X@`E$g zQ!CZW$M`GI7er`y%m}Z13F2@2X}Fx+IZ1G`&9wyA!eQ@sy2IMPlXkS;)TPa}?jl|B z8#1>~e#fLK!YxN5?z>#in5n5GJ`wf96$Ip_7vB@zgOzYaphafRRc6j3p`~XIPBkax zn|T8rbcVthHM!v5yF+ykA!!0Nh}7Q?)JZziU$N4brU7!8Lza4~! zhvMj`n0;+)HLMih2pF%{M?(KJHC^Xy!gN>Wp#O0 zP5j+P4~X0#Zr%_6F>pnaFrdG(C^eKU3Bn8IbRBu_ih_iI&6@q zrfG%O;H?m()>EiuVfWa%ggC79z@b(nTm6*aiuMa$W`WpI=avZH>>sO5`wp0U59jM7 zCO|CxDDl-XC53YC#j5h$R`f7)V+t=%^ z8s2y?rk7CLM}Q>VDy`SwW6`>w-}ByDp;J9eHvXTWC2MRji&tEiX1!E5EV6I2yF=m& z{{r0vX^%3bkxP6M38xPe*mIcj$g!YNfc?G%n0-l*SFUUqA@Kzrpk}D24PwHMb9CRV zXl%H7M2z@smA|wA%`gxbx!mGCF1)8`$qoj2m4?hJ-KILEb7&2^j&KZzGE2SLnZw7C zqegNX-&UnDg81N1hZT*Ut(}W-f4K)UEffl~B>>G54Gx{gOMPPng}=_))`m|quB063 zw!qpBUa=|X&SRoo?1r(MMue;*xV2M<#eQiZytsBHpWFqWDD|jcJZ-lt_A4u>jTxvKjfo1Dx{M8aq&1H&Mij5wI z-Ff`N*KD#HWtcxtNO6bBY%*|1pQ`A5@9)QN=jW_dyhyb}zki8iF3s6DwyT#pp`0gO zNPo~2+Sqx_5D@Zcn5BBL*LOY_DU92)BLcEWi6d+Gx9gjUn$G60s>KPA*oih#(jUomd4y%N_+gWbG-Z?&SmlS@$1%O%gM zSUU)DoyLp)#P=~Py(?~lV-d@mcGz%v4Tpu; zDBi3YkryFh1Qr>@6tunL2t2V+Xf|}%OLjo+(9{0Pe+DTfz_`lJkTAh;z6zbJ1Ksp- z+%?)I|Dt>^_(EnSOo(#6@n&$0_Ax3=Wav3WxL6by_v~O|-rl zhywpYj`^3M%uM+ml0^aEVdW-FVw;nR8wfaws)n*;+Z6BkbIB}WQhZ*w_5Hio9ZH?B zCJcNPucPmk_d%rpz&*@6zRVnj$0lR!Yj-!mLu-SegBCx0z}fWHq%!KI**P40K9ayq za4$T#HXOcv0n_N#s2iQ;+pj6A6&HJKgpHGPAACInx0iOx+&SnN)&on)fUMV<{BHIR z+7UxhQQfjxux7rjSXifpfvkG1lf~#bG<3ryL%(jWJ-wsq7mdC_svtcSrxFz##1YtjZzQseeQ9Sz!{)o4E8ZMCv%{|7@p(|-n7 zfHpTOrKWY(w&6Zl$|H3D-L>xjHu`;=OZQs!4)E@Quko2ggJG#dAu*u#V;_Et56batGY4F;>A`Nw`W z48~`>>vbo{g=-_pWJx{ZGpp2SoA%I)lltPCP-Zm)*#aVhF*7EK%Gl+FY1cQ(v!GiJ zC^*DdO&e5X+G3u@Pv^B3M%#P6-J?iA+T05=%nV3t1@T(CS-&oct=Uz#8flv{uoMT7 zV=Rrl7!&j&A!V2hP*wO%H%BXHrb^C>iybP$#pkf>v$2`&leI%68ZhCX3(7>3Xmh)- z)`t{;f^=1JG>HUAc9a0?mjr*vofzDyxx}bMYbx-sro3B5hl|;Yb-(#Xp8>m7UHbyO zl{|!v)f5~Bv)(v*uo5{O?q|QNeA)0DR*%6|DBS7ZXkaVSf_2aQP^qR^_)%{1^`o(>&| zS7O>=um)nArUz(a(g%}k`lMcC9>wK*9wl{%H=1qjt&3eFz;3Hqa6_EMR0`IoCPHr; ztz+T^GF7s<;l$9mR@wHHh^5QHVb7$TgW&4zBbiV<1{%iQ8NyMXA@JX}qwf3?gCBCE zqMXm-qxW6I4x}xH`+88GtAz!HCINe$q&3ha>?8XYXTd=P0d?y7x9tk?g4z8cse1hx zF$Sm#i`88G0Wq-p`E0!3TXCkT5kJ^R9VbeF+IR#ezr2i(2yiHsr zIV?Y2{rY-7JmNBQJu7penbACIm7#IMOo1*JqZojRh+A^&t`S!_iVv~l%Cvmt74L3z z1|l()g{NXdM*3|4DWCVAq(udXAek@B?4SZyh@DX2;K>#vAnl}1H^YDZ?=BD@CH zj+i#X;CY>}g@jty^#P|`bC8v=B$Y>NZ=k^iZ!~I%NS+dPOcn9Y-8&w_o@z6=vB#h` z1&n?-`_g;Fr@;Fq@ne#XV=y;wWIv`PdqMy5*qiO|h1tf^NNQ!~ITsT#DcOGh|{WXXVHz zM1yJ=2Om1sJp3@}dd*y^ZHJ~O*Fy~F7upQS1f_UCtYPi*zWLQI1t(hWGb3v0vkP-M z`|8)_+I+6rCGCq_(Qe4jzi0>oMf06W)xf^WC@eCWk2&X^$k6V6uy}aK(2TX^XihMH z-k6u|<9&N%*}rl)IF9Q0H|3bL_E`8zpw7}Rj1X`!I9tws{UeOsW1rZ2Qm18<{q zl}pz~!ldPUt9rGJr^tIS=V;LQzNEBvZ)le-M@?)%(txXCEcM!?-|zMgp{8*3*Esuw zH}`yUJEWUR=EFa3OseLqAB!&8%rJlmw%(iOuHhSEGR&yYZs4|$&y7^pl%$^6vzfgw zkV{(o-z9y;IihATQBh8vpE}2`C9a1`u~_F3lc&5acH#Y9v~|AcI(g_xwLc!J2b0rh z9jM^O4|^ii-+l&=FX4p4d$I`yZbJzSseUK>vu_`C(wJF<^G7f`zaPxVH`5x3#`XV3)Z^1 zA?O(GchY_@)+Hza{6ZgMsb_Fr7C-4j57_yt(ea~ov{9jd7n&(bOtH)N5H^FsA|`lw zrM{Pvxw&+ZhDz>2IUEblYyc6W7qRl`P*>qt6b$TW`ekNKb(9Xa3S#dqAZqwgt;E{V@ z_FSKTZtg^JQeM4!<#nqJ<#+TxiYa(LpjkI?3!dkx>N?U6>2qF$*~C*+5jz+m1*cn) zApSzj2RUks5$%c7{3wcYV2#a{BT1_=8O6=Tz3sOIqkv{bk9VKW;SLj6w`!9kK-#3T za)VouIEs|XngcKei8}CNM|5d$VWb_4$6ZN{khXj)F}Xzd&4`gD-Jd|xfRR1J8`}Dp zn8l1lB`3p-CnK(!%NjN;mcoi_FbLgOBuIjOu&*E8P#Z2(Fno(6#DH^PhzZ40B^x9>Zq1$@%0tYqMsoXgj}<>{L@a}p5#AmG7r-)}GmT!{=kIj%2l zY4N6)si1+6*f(Iq`d;&{f`R_vXQq2FY9oAV=F2fJqIgwMapVf{Q?NtwcWO4!eNmy9 za(YE^DU0Whhe1%fXkZfOg>#-OyVhd$y=8}*yF%BYyN)Ijhm85N616k=ZU&GbMU>*s zp6iEdqrTS9U*pBOVnP`!88RQIlLnK0O46Uwj7?O2R2i6$L~pW5a>QS~C-xlO3)MMV zZC!_f&W2&)n&Jw&6OWkJOv|%q$%0%xpGw4;7ux8CWhI?A+7Fftg_{FS%Z|aCU2ab_ z=6$y-ou5=CB%f?bAyOq7*tzXNL)BPwJrhkYJ2>DU zDl-N2l>L?zSsH>Co!q%(%(hdh)w^I%=U=vVH0ZEN2m$$XgFEPZ-qtaXdg53%w%-K* z0wv$!1p?w~h5L1i0kQ?}`zlL{vzRqhTQ@D6Pk%e;w8#hP%lo`&Czdd!4E@)Rr`V*A zJCwzYfG8@u$1ARP{H9bJ^PtKGm&C;73?WyoP{Or2pYwSS7{Ly^{Wl#`>huV#T7n1t znzBH@R^)MRQY|SEu63LwK5Z;JQZztGY|4eNh8?r6$fof8UYH))T4TvI+XGvmF?OFJ zQrS4CVNp9zn0w@{gA$anAC#_E?CuE-UYYQ1c?+x+Qrau7*Ce_>f6{-kl&mH;9~O~U z4B8S>1oj1PWo&CTcM7tD5UdmZ=A>W}3E-&A1qU~sKQw4PcR-`yl72Bdu9p7sr}`C zk2uXW;l#LL#$KaNo^-u&h8Gx1ZzZ9>G7Z$IoztsfibQ1KeJ^w1@tW6DFNR(?E`wch z8CIh59Q@<&SP&foy1QW*H7;8F5I!1=fNaX#ildj~1hwT^S_Y?SEGUoWBqQL;c%l^h z-z}>>=NolWQM49d+BTRMW`WFgKdr=|OUB4}3?gUihhqFdAc} z3k`@EyU?6?@;qmjhjJeoOEE=_XG11RyzEER^Cj}((8;zA%wjUD_dY$)3zlK&3Z5@2 z1VPnf&rGc#_9_lFcwY61M~1Jpd(aE50T|Z4L(<$5UdUEFX8?xBg&fQ1aP+=6@eDy{ zcdRE4sJyFcvyXv>K%@n+{ZWEm!yC!S`8=LNp&rR`PmZybqGBQqK}qs(|NIiG*086z zS-i*5o@jz~uYXwSx$$kP0 zC6~&v^tcL%;&%;?4r33F`dskFzEB7xx*e3xPv>s+f*e>?Sz+2z`7c-BhmfjA;(iT$FoNg zwX!&&gQO%5qMQcml{|-gU(gN9k`rKtmv2<*bofkb&5(0E)A;yI5a<|Pag}2iI;L_a}hAWyz*VQDM z!mN6G#Ld!4@byWm&;J_sXZ2SeCbY-TU-h%-GZe=23czgj+V<|%;jkV#WBC$QmZOgAO zi13UPNZxY~QBdN4;d{^{xQj<0_7kLgt>@E$4%8E?9a4LSh~R)1aL4cJj<+mjv<&(9 zBw060b43j#XbZJDJ&nZB0$We+^@8Y43#aB`etQO@R3eV4S)b zC-wvDgdrw{&-ur+8Ph&lDVB;49GGtC1oLru>uPaLJ=3t6iF~7S^gY8_dIm{~jQ^lA zfn~_JuB@j+BMA1gVbX^XB&9N7!6^C2a2k42B#xlWR|!v~ZZe@9GswfsCvM z%p{Y5DUhScQbY#4pa+RD(do^XkbO5v32kg|Cj{zX8mJ1D9YjhounP zfkR#rJ0s^BoKUL8BB6@!%`rnym~uetZdmwjZ1rj8*4T%UO^4zCaOJsCU?U^6<}5D3 zUq_1aV;D}q#_RX#E|UZQyA!;r)>hD!>qwfzvjCkkp>yznfU4=G(}jFYd}VK9aU_nZ z+HsPU-p%_(3gNgxq7YlbI6i~LGF^7UdKnE$j87=ua&R|b%RV5{X`4_looJ(L!l!ze z$MC|UY62BAR2FOGBL?J&PWe@2Z|?E!?D+dVkSJdvV|@Df-0s{r?pMaeO1Pkc)3hOM zN>Fq&AS_$l-M&m8smm-k%67D~cqHu2R{%_u4miG|)-ZDOjxUx>eIjH4qrK>a2~n_2 z^{RhaTIWYoUBw`)M^R>W#~w0HxT7I*wtwFpi!kspHw|MB>1XWj!xf$-@3Mva!Z#f@ z-Di8lP><l#MbrTYs)^{+Qrv2k&?iE$X6X@FcRFW2 zP-IezyxO9EeU^*VxkWuAYVPQq`ZTf5G?K<*>>^GiG)cp0o#UI)@xT@v~$Sc3` zi`7IC8~34eq`elsiTJ2$fbRrVcA3@fBgHE@i=p=p;Ca&`h+A|~hz+$>7N*&G~|9hY_GJBaw;oO{NtJ}VAbkxThJmuOYQ!lDXC9e z+J}?)m5YTu!}TZ5(1Sj#u->`2SIXk-0vHL6VYck-O`-(6Vr>|12R*CbmQf+Fr}+3n zy=aQ*q@~)rMJ5S=J`xG`WVLA@wZJ(SX|tj2yfP`sW73-61x@69J=u}Lelg*SDhYQ$ zcRd)#p&~bP0qFxW)Hr_!0Te(W#57-7_@E@VHME8;_fcVNN7V`&`WMAwccfVm#-Vxa zvN`Hg(VsCDszLO)EqI5<-5TXDuB7wrj>Y6FqZqa`tH{jz82}XRuj<`jZaGu)WcchK z$$!Q!KSmvZzb9S<%qt1E9q*IPI42~ zN@0p;Qgv`lWo^Y}ZBkX&mQ@j@%fp@u2cqSPF|V{}JfX27dnC#OboP$7*WF|}<-G^k z`-rC*!j#XrY}6TQ5@#q_sp&}?S&4t@nXU#?GEbd2e`w#z`SD5A{!#y{l_Te1=dh_D zgyIUPP46vVuLVvThVCXTLF3mUBa@>Ry;L;*hZI)w{UCyAC5i}jQHlF76)PPBNtpSk z?#&1FADzQKf`eAY3@J1%1y9hK{>L%t!2-UK>bRU26%AK{soBRwxL!F|QSEH#T!KSh z>*K(6Q@mzzZV|GbGHfVNk{c`?rPO zS^6I0fveSymQEG*bJpoXT2HN+eDBk6*I#SgHsM~Ket9PXo`Im>*-XvB;O z=V@R%`AXr!P{MDt$mD^gRF|q8`=X8q?B<+4S%ji#5~?_!)GT@QNjfZ`Vsf;tyly_F z^yxkU4T$ies+K|2fEeGQb~5f+ZA`7vHq~t{25nGgLiK{XR0&NeOT4!1x>k$rGb-7Z zzX;;eUqf-rgeUP|Sd7X6v_)9oSc){*3dZ#Ga(Sk583xTw8KcpaBe+Ek{bTwhuN_nT8(f$i!{*M6vzG+pM#dmg1EOS3x0fKk8}6W*BeOgE4;+nYB` z$($A*P;;VIAz(gQ4|7GT9D0;t$&Zks78-|zRm}Rr9g$R!&2?|NplJ9nhLYbKWN0i{ z5|*{~=mhYQ!?#7JQPnteh6RE82=o!~iE+r-8S?$uId7S(BJ4$TzATN^0R7<)j3L{ddB&^?WGB&PVw=xm z_^G&Hav4E`_S~&4cIM#E;Cz<%WNA>umG$w9mhu?UI11!jZbbWpti4A!j41zc9^Awa z@r21~CY;tV7L*qY?AEvKU6Fmo>qRxoB_!zg_z{iFRgK7IC1ZA+WWpbMadMVpr*A)U zxD`Gtz91oSK``Ii{UiiiX^IAWEl7+0b5`93wSRp!*|$-x(z=Vh*!IW;bh!~e?pAmX zHG$+lWUtW7oy745E}z_w1XE}DdtE_;21LX9L>s-KztWupas}1z-+!x+UL!~y9j*es zj6vSkEz>7=w}lKK-`>QU9m23&X@;lM=;g^=akEf%Xrq)a;_M8CaF5GvB_1x`1XCQB zc^GD6&i{I%q{o)2{gFqfCz=jZ36PeCV$r18K%eZ0%ri=&q_zsZt&q;+LH&|Wg{k_~ zMpiZ0 zn`c%N94Ok?*&dMDZBp-f$h-qYgocZWh-&=XdV=1Ip;SwuQrsiGFMUT)1I(Xa;|6z9 zvXr=Yr(;Yg%jW7wV4G$|uf&_LglQ|Fj!#VLOW?H~KtK%@!9nJVTu^Q(dSK)?4$u`5 z*E%ZU)u8zoYXq+)u8Gc1ZsTdG!S9EIx5|#8nZHVoD0Se4f#UJJ3O;;gNqJ&x0I2dr za5+@{_udC*r}b@Cmeq0DMHQH9Zld4}SNv5Zd27OE!dZeT4n`*H@=pXWw6O5slYKk7 zcYe|N7?Xc9ws(Ae^{U2)306b0y`Ol(%;IkDA~7iZFOvO?J>~}wrc1Qb1hEq%!7zo9 zp-vsk@*yw=v4Nr$ll_nNKHz4ri#AIl9fEghMa!iwi6hbv{3Z*UdjF{@yE4vaYAW4U ziM24rt`?A4WM2{VZ}_E=rL9!tX*t||WsI%5i_QK_PtpQAU}2YdxPU}Si)I~Ic-c59 zF4y_KhCC6!JHRqr%s2-4t$RP&q+ovrItePK7)DD_ow&QoB^L49+C64RT4T*dl%#5O z;JpZR5GLzfSkvNQGUP1ANG2A^hffxTVvTHZ{|LEMtQ$t1(KsQpU|4Rgn?8IRMqA1Z`Vl+ zmOvY>tT6JmPIm=rypvYB1MfUMQH{V28R)#(Tqb>Nys3TsS$34MrUll=#ezn)yU2Q& zS!t@BRgx>+Mq00NS-5aBcZq*m6r_jmF6NXK!s#wV$NWn5vF%hw3Vofc3k!1 z3lY?NuA@@RQo_*{Q$ii$=sGV4)?X+qnsSthF_DezC9Q3MSMX1*EY*- zW!aCirI=RtC3)D(6+b<&J$nkUe4OZ7Y*H*VpePdjN4NCoUrSrxiPX0l`QNGxqj1R_ zVnrTno*T6o7ND~Sqz4w*@ckrzesiq}UPPmK8|g3st{QGg)iXC(iDYGj6p#MPU*`Ut zs9z2OgOa1t^^2u0n%iY(QndPdkKt7wjitB>vf>565~`>v35jl-(otWA>T1c6dP_MJA9-BbU=_EtS3zBr5e;D)_Y3e- zt;C3zm~Nh8kA+RR1|mrHlk(mLOgDO{zic}8b`gxhNuA_hW?N!iMV)^!229h{EpsQ@ zdy!GCUB*qjTmEj;U0ARnbdd(13eq~d$q?6CZh?Y|cX2%AKZkf?%tIyyvGRwxj;G-8 zJ-9WTR1wB5BY1`{qkV8p94fei;{@rT%w{s10au)lMNUuA=yN#WE)Z3g@*8fH>inj; z+wa=(2Cl8nA`4;3slP3>v1sCOx7!5M#;~Vj>F))nVa1;*#Ruxr7mT%M$?4_`^%EiT zR2wASwLDi@=<)-_z?y^YHG|@_81te{BMZt_55IUBm4^m$=0&H4M@a&le#h=!uZKrm zryP0}izGzovA2CUSZ9-hPz#L7ESBb!EdEP+0Ecx<*!x5;QdI`9er#hJluA-1K2AGh z_aFR(e2DG@B0nnW5KJU&1vA&%;UilXEtU6;l(FnWRQ!Qgp-i9sV`4^nIM$NZuH@8qw-NyjW-$*a;qW8?uK>(NueiRju=Bkq{hm-mZQ*A`tlQZ%=~StUdIk?1{7^^HTSg^2MrlYo27U5A|&$Jcs=D>oqSf@l^jK61&NZF6j3`_>64z%um zymE2}%>?n-s!vfkxSvbhT|rfve-P+^(aWHOP5P|zkJP&V6b@%qG*aG`P7;%iJZF~M z0O?#Kjo|O=?b=P_35G^fzt$5;^TLCUIj4F{IKneNKz|3cJ5vU#RcQQ4A=tK8; zdl4GyM*tMIIp_RS)H!K7`FqNSh#aGl3oH7s|wI1UyQ4B@4QZ z?QPjre*+)mnc{z8Sv>EB(}YiNA^ZV}50DmLgIocO`-tIRgAzacr~!_Hgt2cSOaY7s zh~-~{4qt<@0uyf`Tmg=ggubVUb#EayKl`u&cirBG>8>1YrQJRMV1En~1lG?GwZ8^s ze)iD=?mz<^2ME971m2PaJZA}e4iFLELr8!2=>qNyz6O~B9ES*VA0ThvLi!&e1@0kl z-$M%CLjpKW>#tD;4RQ-|=IRA_`hTP*3S?wy^E?l+2z5Ub57?>&sR{%{tetKN<~u6> z8U~2Dj&wcI(|sotFT!hoFf=X>yug{SOohzGy?ita2)v(UdBT0Q?+Er07{LD}Q&r+cTzwRY zZ|ZA~Pp;+|k**69ALQrl-jca_QPRGO`bBmWL$p_5MiPK&G%YBg8csaCjRe=br{%*z zm2sjR@GPePG0vO?{kV`{O@C-NS4gB-=t@G=iMz%(4$q^JYdRhf{HMx`w22sNtuxsu zJ}eBuBaxz=mbtumS%s8ZomRbCO21tfaD1GRzhFk+kf$GSCIF@apSU}jg?UMC{?(8U z_&U^{H3{JikhS^KB~!2`#djzA+N$~+41>#4m9~RQ-uSLgG1=#{1*L9QbE*=GJyITx z6>E;LEHF|Tm4k`m$|r>&z7&I|IWpo(r^MC8o&pM;g&*9*GJJk;N-yFzdXjrntSA+n0i$v<%Y~RuMu|Ra!4z+(1xe zb87}b6RnUCyyZ%RaPL?t=CJ&GXBh#)8GRnHPl_%e|a&C0SLfvHoQ2D~w z#S+F8hO9goyGATnDNd0{z?UAjUqO%98Y&E zeWtbST}9R+f<=%FG&bTxYz9|n_Ad~~%ijzigUP~1|AN~y2cEMpi#;qk$T<7O?j5Byz&)1h5zBgY)rP*KJr6#kD@B;ER=K;rg_DB7Xr}=_IP(o=Jhw6E@w{ zH7Qd%2jc4;@(JtY?p^Ee`Rz^MX(?~Gm~Wr!{8+p`$D}&F286(-FT;>d_bBzRB)PuZABI*5uR`x0{QcmiYW_mE6@l1 z)PFfRE5-Sa13!L1IJm{C;=rSNXUE(FF=>+DR9^X8#sRL>6dzM==~+@sm$MVHU<(97 zPv#Ka7l0k#a%GhVBjL%0|I`=ksC4&MM3sv$^zI6`7+ljdk$spGMR3gQF~<3Zj1Wt( zM|JaWc1WM|DnzqdvrI~bm+)_R`%zH5T-Ky(niBp!#0k&jGWilk;9%Kz! z6-QjNMXdO1A+p%GTc4ab((1zg@)Z?ulAA{N>G~j^W_{}pxpzJGiY0R&IC+u_WNs4+SbN$tO;oow_fREw%60C`S@sA_fh!Kf}`zFzB$Qk zhk-q$7E63*^M4Kq$wM|fa$n`-X*yO#vntsy(~ZZUVb#cJdc)mFMI3Qs7Io-qt3hTaww~% z-W;Eq@DwqJRI!E~^xr_vLo|BtI*;Ya!WHzsOX@%x>B5YE8S?fobu!U#-1z^z8akV_ zeKO?pl=~3VPOb2==FmkOgV!`sqC1@ADdl(j_af(pPs*7o3^?6+w&t?TIMH2nXo_&t z*P+w2i|ZS^A`d?^|I>q?$(A6|cRa|NzmiWNPRC6s%?{RBtu-4v%}KcZCH&f(!IV6Llo*b{aem6i=xCl2a*PfN5C@3PG7p(=-vjthv79;HWNei zccj_n=K!@Se8+27beV9r9ulC0tw0xQ2{-;R5Y5cFW{+)*DAe_Y7j!V&k#0_KZ)h5g zMbB$C^R_v~oc3;?mxrVv1)hm%$=9*9fldE)98CEH!kv6>Kz?J>qe+fimPeh z-(T=zf9p-Ojd5>{$}yU>5J%G7Z@W~sJuuu_yk0KTc@xGq%C0BP*;7N+cHzWI_$ngl z(Av!BTD9k`K2YDV-dE--X*~T$pNA6FW9`@!YS?vc>7;SgYB|W{h1I_wLEx%s%xewU4yu zWHsEZgZ*PI>mrWy4< zh)I4D$_-==o$8SyftXIoI=wxMX&shRISvHEj$QOL$?hGcIUJ0rlxq~&@?O@NDALQP z5|ouGlDGgpLvf5t{|-DDw?d@Q)(St;9PUqNO2w=CcN;Zs+9}T?m@_@?Ywtx~ZJoxQ z$#{pPiKA%~tF~sQ zC+oQ$Jg(ANj_Ic@Dscj))ye^F`~{zf=b8UunMltQ61heyB>s)doHV!$AqSVpS9OJ4 zkt^F&$P~{vpqw0~7P;Zb4wquxylPgw?Lv9LL#|OSLz#rdEGG{IoBB1qI& zVhQC>VPmnto_DAjIj!H28M*F9=pU4>h{Ao`Bb9)U|ENmcSS=%e46esUOD9u?4ViV) zxuKUt>#n!M*!SZq%RNvjlY8*izRTCaiYLcLnjL(g(<{7r8Y*z|E;yI&17w@kH}cz9 zGuS%*d?T?XYiuO<&NNz)H8k;sBw22}Oc$Zpk)cp*@e`1RCP+XZ>`AI>8?74|GesQJkd`n6dKYDBVAE4oE#8ye@k89_Ki3s=fzceOoJYGo!2ManR-K2-g@o*Gt#ji&EwtH-F4&pL0D%c3g%HP-D>S6 zZTrYPhOtq;QA*YtRob@CV^i2WN!Zz1q9ezmj2>+9f(v2kIr2hnh%49VgrBn}(~893=--Y=Eh=#!{BMM*A!Mqt4A0P zM3u<(JRCu%=;L%6i{g;qb~o?6Hf+y$10`jk}&8{8lu_C92_TSba z2blWD&LkwgGcgN@pN>y_VPz4LJ|1!Ikzpksk4S0{8H%~8R!og)>`74E8O|#PAlmmg zLM^Kh9P8+hXg!M*Wy7?}o&`P>hloK7J2wtA!PQKnOuLUrH*Kh!P&IdWhAYhjmtwyR zaf)lzF&@%{vX==`mLb{uX<8ED7&eWiqqQ$A8PL=&l@%X_=x9Ka^0t!@H-SwT-cdwO z92SQVvNDFhzeEWO5y#txb0~D~g}NjDXzv@H z$5YtCa33F5Z7i5tru8Zf9?1vV!f=WK2geFa9V8E>k+r$*g!%q%?^DEEN`|4|@(c~q z^1erv+i;Ufh(%sVRhMYZS`cU8gTa8I*~`E|(F`sm6+2xy+)R3PcS@Y$2Xe7e_L9Aq zix|0D`^%@CXbpH&y{iM}9j*e>l`jln|CmtP8&|rhmqo@1UaUP%>|8`Kb$V3xqj7f# zl)}SCgL2~;!ooQFTP+5|nJBdI4V9<6F2W^}@dr(Y-g?5bPB^B61age_@eW~@;c!l!gD zUZCs70V32#$v|VmSWJe0j71JN;V#OA_SKgm)s20M#3sF)!R%-Q8RNkjfo%H>5Hp*B z?A&beDFq`BuD~s8oY;Z6Z1T>>o`f#j+UA68u&ypAPv{4!S|ql+LTft^XraXVt#P5? zq+8dRZ_aiyq~(}cLdGbm@}{uD8<=Y2=AUAnbyvkHf4myaE=MCsdZKK|vOwE<30KC* zS>uvfYwQ4qJR|<_qONs}G_w?9SrU_7l}!`ZNB^oB1*24CZmGx8_}kLOas&=X7Db^>DQ@k2EGD#qRMBe^c~;LcTZn`$g2v&sU)u;Eqp= z?#L}a$!Y#Q46bG#LtjO$&~5vm7YM``bTgfx2$EJ2b`8Q7z+!=c#%lnUk8P^e#}XyS zI^`D~`#IS_=Ki}?WH@p@v2{44(4|v6ZfCeOYy6+^2-yJC_8Fw0lw*<#V{rnWG(69?u1QI7xD#ZgCswD2PfMF z8MdSn8P``Ox#NE*wfR2bwNS==vw5=MQU`7^b$x>9g9L!1p&MEaF`G`l7N4S|C(9OH zzoc8`RGO)6dO&!W>0(1oJlhw7!XJXLz zKv0Z$bdeYCM26Lk)haj`cn+eDoU5cC3OF!0E=3fZecYir&-r|%HEK04x_l^|pF>&w zBu3q3K3O{&ISme<*Noy)vk_-Ii^3RNilKj4Bn5kbLiGlAYT_x7pxmf;(%=rLVE~e) zWuZem$xweB-CwI8!rXW;ObTkLT+34xKGa@rlFvvcTxxiChg3fK!0* z%YSGOw2n+m01G5c!K*GWQH*&5%>pF0`33&;-5p>xEz=0p*VhMNb%Wq~tV|}}JCw=j z?3LNm(RZE^c~r!Qvs4(~Lx7bTsg?^!&zASQq<8iD1#ja&pkUf^c|T6`Zd#)LGY^nD z_fd3KhK~+KnYAEuYpKqiiMKr^odQIgY2R&hR8oV6c7`I4LXS#Ar}u>-C?vBRwT^p` z586l_$tE`Mj3!&~>&q{nc4F6#*F}vCUT!cq=rnnha>19>@cY`X_WoSFaoU$noM0E< z9bpf-o7G`%PpqE(JXH$Wu`Pp|*0h73Rj-do(muU+j=Fq!7s?^fRj|LueT-Z>VYTxG z`b6&PI)`T#;On|@_57!+tMW8U6Zt=*`EC3cxcaFkM>;GwpI9!cV5&KeWD6vn7a z+Q;(&iD7rk1jX|S{+$3f&tR5q3RRi-_hSa0dpWy4o#8(2sC@XbBX|D%Ji{ZFwPJFo z^KDO~>mGNg90_X5Z{MWgHw#2q>;yETw(c8P$us)TkWO|K?s6nfq0K~T*(v*>-Md3( zO?YVFHA(Pv9w*j^FsjDrg=pP?lb6wBPAiwV-5sUEpK1?H!^batI8wAoXvj4O8&^Qc zDfQ3bG>=<~H{ml<&8V#9lNG=WbFfD}>#p;AeY59Q3s@!qN&m}E7*m-H6`>XtV3?#) z%d+d+;^-IbeF1S{lhJMd zbe-`OmMt33oCj`o^l%vpfN*XP)aW|^W1aa#i-Bzb;@t8Gb?z3>4(-rdIS-JadaSkC z4$LmBDJ(z`7P}72U}u5&5X>B?iI<&{I|Tjv3gm{-@ZEqMn(wS?%_8}Kuc+(rMorT& zow`H~x_BiRZWXw+Lq$sh8R3KiJQxGQK=?br|K#5Vcp>^FNf-q4&>@ueD#VW8%Vl5< zQ~bb}pd%D1T`ajE-_!l&g@G2ZwhCpOVc_WGuOTkrR24^q5S<)sdu|s?Db2V*HvG21N^(lC-;m%WshMD0fE=cwTAFrVMPU_Y>}x`6G9n%((uIZbw7 zL^0RXk0=hmOx_$)9H!!(QXKA+T;v#{_@F#|D7bJ7pz$nyE!cC|4}^V|p8Ev#at5JI zx!ras2qK|)@f+JH7!ILfIT$MLQWE{xOV)8K%U&}1AN4zAO?btVL5?owzA{Md9@^}{ zya*-i#`<^h4K zOyD)Q52f&~c8|s1crzJ0FyC>1SSgYozM4b4Bu$4&)9X5AU6$Cx@!9S0e%`{%7nknd zdBm=a8d=~ML;M>1LmQcZCwi~D+U_;F&07+Aetx#{=dan9fsT(TB#;93sFSYnbyO6g zlyZ8NI^=;aB(FHVfSUZiH&+bbg0*81L78qj(?qQ`40E`_svTjW>)1$iphAp85mb(N zPbTu9QXKdSC4ZAuaq)0Ea}z>=DpPh;wJ59%7RLcq{)Z$dLWa0N1@d=js5M=t{J=nK zSE?N0awb=zm1YDwSEd|6;>w&Obq%w`)n4-$pfR?jV(b1OR^2-xb7+YsYm5|z<*^w^ zS&U~SyYZwY0)0=Yzl(Lfbwv??LF-kC)F5)*Aocz$n_VF#LbxBTocLw5D~p3G*$e;= z;*xxyZ{$^(xOyI~M5I2yoZf6+%_|kL-cmYR%xgSGd4LSdshrYmc8x*WC7|NG+dSNi z+&4%zRUtxD_pTga!ph!Z-I}Q2Lu2BG-?0#xf_MT0jJeMzukv;^3U=ap7G3)?t@85nva+o5 zyR)L zdJR&PhL>N`*pEYAkQi0&d_$3@G~p}`PXIu6pUOBvu2{m9M>ZU|2jN1VDY*eTeCmVY zUiV?c-85a|Kmg53l57!Km`E5|PfJ!>0{^F>J;^c9y+Iurq2RKZ#FVBGGp12s1QK6l zzxZQ5h4obWAsC-&Ns=XK8+m?E3e6WGya44%B=%Gg)|pZ5d-dke>7j%^cCIgSFSf2W zcJ51G8zW1O=y{U6g5qOIb3cfoI4+05#~)8%e{FW*S5iol_8VFY=YdZ^HCG0gU&5n7zrh|71e%A@ z@s{LuF69?@*eMv=`19j59xI3f=Lx9gR*Ogxh*FuWr~P}A_YZ`#ix^SNQkKRD|1?32 ze`6x^J?^cLzJP*~4tOl3kj~RN^YeCxuHuVCO3CKFZp_HNZo_6Z>(1@3iLCcI*4g-# zCh%JGDflh) z=!aN}_;RpSi-ZmDnY^K2m7d?1LzA&;+$+BdHg~G4iLoqpF8r$oTAZ}m;)}QoiDlF! zKKMbZ5idM&28k9B+PX|hDu`EvGZGlQi8zO50fY%uS>p1(z^HHJ-^7qj;7}kKI3EpR zUHP`b;h_N8oU>6!UCt-|*o)uY>YiWS-nEL2L+yMm&tp3IB5GaRh^JYKr71P*9I^)H zjsEHk)(G0-@*QjS86T^+;5vMR?=wZ~`(3gR=zKWipJguyB7A_6MwFj$Tm=d%FLR?R+Tbki)o`otyXi($DCq z^}_Dym=A7hvLzLtL$O2dKASs`j83SMCpJ%5?yA|ek&}a-ArQu39!w(cl?9IY6Q=A5 z_<{w56Kmk!YeOu`EiUu;6eZfT$~gqFy!-qT)*aZFa3nsp_Yb0w1l65p*v<9KJv*#S zygbRaWn+gSZ0IX5J`a-_2lZkBcYxgUll22^YOe*0;qyopt) zAWeH3*ml$m^FGxEi*=@|Ar!JUb{-f8zc9^`7tEN&N~BXSnlAhlK(JDQFtn(}k=kU2 z5|-#9#H}UaMxw>lzBY>6#EIJgF3Nq@6c9Kta$sCQR6}`*p~w@_Q59l7QZUYqccwgO z9xhhgOx;z~MpJU%Y|BG)?UNxwM;qjz36Ao&c|Q3jU7Z`nSbezOS@T{G$CwAtWsZ%*f+g2R<@hrpXlvDIW>UbeR3X!=$8jGyTrU|DMnx2`RuwW9^=QFBlquM$fLT$ne{M@I9D_3g`tc1E0u1TH+D7Su%Vwc9_)PzLmOGKytqF>GE4PfD%_1K z{JWNmP~B{pyfrhLap1JWMZH^wBd}j2BIJR#NI!-p@)=VmRJ7U`Zjj28Z~>3IYDh)m zJQ}pWhI1_^84kRF5W)(f-wV(t-KKIp0TD0mzgYmdmyo(Hu~DSVNoIu)dz@ z?LBk{#L_Bc2pqsfI$Qw|r{21c$Sc zISzMI1jgXgUhgyt<S)Os}E z!F2y9RG0kbs}Lki8~`G~qyq;|!NLjx%7}x=ps;V4CZF$Nz}eG@Vgt*T>2lRDwj?b( zftqcJwsb(RpTK{t>cUg-K2?cNb?ujZl$1>xX|A*me*&|YpNP!6A9qpXy)`6TQw`J@dKJ07kib~Ig!G;I2JYxdVh zLk@6nNrUVNs8{2=bZ)OFe$0;F=vn5$GN@YvS4LyY@Mn^8ReI;x%h#DX)~`HT)#dS1 zc9p&=D#Yr<*#Z*hc4RXX)l~KdP;nPLrTc=rk@vpCk!2fC4qWh*^li;J_SftVEj5Mn zLE>Ms48wd=PESccWWJ>xuuzs&^~rYW?|6l@sPbVDbIKtH)}ui!fK$^<(bR@})jVE$ zAB2w>+#VuoEFPU3tptODCI2ke`7vWv{EIyC1c~JA5l)mBI5~#5ni{JaMZKrf@eDq! z1U)#L_oA0<20HA|4D-H14D&u~SO+{gcmh;@cR2iFO3SA+Im_l@PjiK)gO5f*jCufu3|A0GlaMm0CrB`TCKlSVS8%?o>gOL)RN$_Ge;XmG}D# zN;w3R%KHP&SaHOus$9E|S7TpU!}Vu{LAD6{v(-IB&K6UeUDZlMW?=OqAbXH6JiPX^ zP`xnb=E5>><4Sv&m!4a*8LD-6;(xsPQD_Jf?-5|+(}HeHfBulDSqSoJo&Sw(PXl5v z5DA_AsaQ=Fg&+2`)DFQE#|u-AG+@)|{Pvkrr*vgW5azKquX@At?bkP-un_VdFfC8fLYQ9GF zur0*!badl-ruua5Uc?NNZm%lInJ1M*{pftA?&#u+n-Wd&HR&@%u+k>r#2Grx*Zk_rq3LFy()0alg<3LzaN6jZ7X z*q*Vu5jp8mzi4)BjZSwO8?} zEgvpbBaD-GlasBv&S6ttD)AeDKjte>jd5KnFWnyqQpkw73~T@cpuysdu*xu&Bjj&x z_JWWJtP@~M8K#1lXvuEu2ku|Sc7(;w_rAdrNXN6Yn;rpNpj;kdVI8Iy z5NN%fe7oAoqG@dTSUht?5tR?T%H?#>0Z?(`J*V~Ddt_~8Ll;MEle{-o@g-YBoRF}GV;diU89bN_PQf@bpV`1IOEnNP-2FOnGr_(B-<2bURo+2AOz{2}Mg4b$+bkS2dUy9PBh8k-Nw& zYmNd6A&(GL`|I_)999KUkMNmma@p=kvUxX0cV6qsVzDQzQGR2=uZ+Xb z4rg~Bc(wnzHE=NVT3~7mj|B|S6L^}G0|<9zlhfZ%1!KL?ekPW}q+g^q{H)ZqXi@=b zP1OV6%4mr|wGbV7mOdWhzua*$+)B16I=r`Sutd6IJoc?9tfY(|;qe=UtjJ=R*$MJO zip&(s2hhc}-k^P7XfQpAk;?hYR&G zb@3Bn$E1788}sa)En_jSqj(Yt%3_%W&K%*Cl?|KhEkizZeAQ5KQpGq#aUZ?Q0m?Uy zKBnn#ij~P#OmZ)w+RBab*qDX+-0JG;PkOY$r6O1L*#73?RL|8n39?L6RaJVOPI=$t z6~;2Am9;!WmUEo6PMq!N*qgr z7waf%q_8;{`}rPL%b+A8NSE_)ay%^Qk~3y(jH~EF+oitTBpt4S>itATS8%Ekd-5Zr z>c1^HOfKh_B0^Z-9b!u?LV2%DGJnH0P98#bv<3;XzV^K_2P>*O_SBojsM^a@OxN31 z6qb{tBukR2k_BWnF&_h_mUa3RMjfK*V)82T$Ph9@Iw@*U;!AT5ho+c!H|QH2hNL=i zfdgV`IQ9?4;}jMysV)3ACpV>MmsS>Vzn zrb_kE)mdYjB1m58G*TCL`5U8*qwu@Tc{Z7pDXQee{?GMO;w%9i34&#<^6TqgmLi|n znZ~!@{{>MVz$5~mumAu;Z2y1p|m)flpE?2#+m3gw^Mz&6MEM`vEw zamT#?@@e#TP=gLU?078l2IDJ7JgbQ#m&8qe$m@nrmwp98bBIhYM`YhE!SRH23X)`Q z7z|)`Fr2k(yhW4_z%@Z@4jE_02wnDk|N0HgedKR9y!+@c9y>>eZoKFGaK+qD5$?!k z6C3kDn^*t9>+=q#h$*46o`tZ_9f1zUJId=JUqt^8MHqQYxk%EV7EHyG15%E_=m4kB z8ff)x+8u!VWycN@wQ)i&9UWnR%K;9#3pAc#g?sL8BfUv&4~$_HZcv zWzNsM@3pS>^K59(Yo4SwQI-Cz3+*B zln>?;;99c=jT~SqL=+@9#=HnSH~M?t^*iA%x`Q7o8`IwZ873dwe9N&7)CR|k9gx<0 zFwpGAj}`21Tbn$PHP_es;k#3ucIciN9_)>|HD|a7i*;mxC$O#*_I%x_;f);r!o6vP zZPv}59UYt2pMp=`$PGf|oyW;rK*Bdcgb)54dV~6Kf(WQKVoQ9!P2EevycwnkQZ~Xb zLwpoPF8>03Ouzpq8@PD0$@Z0+#xoq+Uq-r^-|U@|h8${sJHkQJP}NSbHDLAO#|8%| ztp08GC!J3q*k-SNn0@^$mOC%N0RSX4a!A())agAI4X}P#s+x2sqTfG?0Gv*e1DvQ8 zqbAS7b%;Q27|M2TMF{}7vkjI&D`^7N#b9?RDo;Eu?F@exUjh3!E6UZuU6;V`3&LaW zqJ$pU19ApZrUCGXZJ1zdhSuYprOCH{E5_E}W&HAp>+3URBFs`3w(fU8DH`{Ux&8}; z6o(|ychMzY&r^TFLu0l>qE$dR$P5mJ8znEcRFA=OUcN{fP9Iqmc?LMtA>7;>oDx^8 zALxl8-Gkr)8P5LS1kAEV`0^^+;VNIG!@6A4JiTykCtwz>`0z8EzkER)E=XJjDyht7pimi)oX3;yM=n?*b)55fEl_0MDO;o0@+{7@_7MbZRWT z7KO(2Xnxz_7lC81jYaYV8S*{7q_7urtU${P6R*-<1%9#{TQd$6WyOJ#fi0vA&reAJ zT#4JI&y#_Ku4MHoRiXbs`_-E&h{H>o?_&aS8i80` zT%_GH{+w)hTI_&$-@z*aW$1M`a4^TpdadaU85^to{7c6!YAVmg6f_@|8eV{0U3Y-T zGxVV(;O3Q+Ye`qhCP3EB82nh=t55|6E>Y1Zg{Er)rz?zZZu}R0cqup9^Q-8id2w-3 z0$?pX7<@XIBuKLNX$N?;iDK<-s*OFyTc|mjAwT0h!__^mWS1rJ+-~lvP9@<#s=9BM%<78V zw)b3J{-T%uH@Cmq($rFWjqus_-E zlkj-{@)Qlr`61#`5Z*`fxWO2+y2WmfR<_P8)N{1@PRIp!MU6L_Ap2VG_G3Kk9{nCI zUXbAnjj3)nVw&dR@S(y`1zEAppyOHQkcN3a{s(*0SH|N{SzhZWi^AwFq z&1vpXaxt^k@*y|=<4V5Eymg`KGQ=lW79N93r&N^2oTM- z5XEdqxE`&D8l47l_5VD^iY^An=B@he`makos*(`YGuNX#t_KA8M7KzDH#TAjJ4$@jFBYQ#JOIwm z>+!bOTy9dd$NSP&xs;<3yP4gGbw!wRLU~iu+@gS@aIdD;KuLE|>RH*< zk#mY#4;k$p6_2wYPOR}KA%rbC67j(D{M=Jk{`vu~Jv$f9!r?y;~@3|@gui1E?PDvt0dcxYRsChq`g z6?YsdSzTx-P>HpnEQ8l12sdjCV+_g+A`Hx;-O^?~XkzR%al;H1#16b&UI~ExAlt+^ zhRAk;eamso=>~O5P+&$4<>}D`cF@RJ?FVf&gxi6 z>kvf=0}SBcyA4kGQ0=gVRF)bqp(chj1(!rljJhJTwHJ{-&-bWEifz{7A@;^_#2hBP z2P>C?hDR`-653$+=gW#Fd`hgf3hlb!EZQ?I{FbKQWIAq!X>D>2VgND9(_53cLP@2* zyLL&!n95R>c+`!Jc6QE-0Q4#Jpbjy+BgP>08|L!H@<$cW5A$hdX>jikU0Z z&q=3B%(j@M*uIfJd*K9IGEH!H5r_<+Ex*#>`#Kv-NVxT zBepwT=W4UMPzUSt_f^j}y)?+7UhK9Dz-9#GfGS%`FDeI+f33z%XpQV(;C5@rTBhQG zWqENSyEUdvLr>SDVXXW@K`{k+AYLFAhxHCqZkxm)brwgaAKaC;+Zm@M-Ze53qisdu zw1YxUgW3h+^W>E3FP9+dPzRhd=@R5BG{W6kLPBPN+^U+qe+9o2H=y4E0UvRTKHkb) zP#aHXnJuS!LK>g8vHAii@HB(Uk8;WxnkWSTdX02txCH2H-Iwp$vVl74a^V(LU`C*= z*YejMO{WRQohFt_R2CJ*b`J^Hn%sar-o#B8%?jwNgA6UmKMuIh zzeJ?L%9si0abTZ8Xu*KHr>*caXNo8%o+qrYgh5=s+&{U5z@kxh9=<;lB1gTvQh&`n@DVthqm|ka63ho#9FCk#h6K zF_zr;xoO*j!+oT_^18x0O6=29EBQV)DwIJp zz&PNvma0y4AA9SZqh%Fi4-$w9aLQ%WzWwTA$i(oP*xwmhsRwYj=S??9KeLDRC_59i zm}92L3gA)ugt~2K{plI`V@p~<4`$leK@$_A8x#zPgA!H?b)_K;3KU5TMo=T%q6K#c zKBAQt(3rXJZg$a6_Wrx4SeU3f^^@@IA6nSf8Y&O?;X8D`C7Be{DZD#tSufKwq!xHm zaKSSSIhne$iXrc;+YUj+HCa=Cl_*tt*DS-^8i`=6XBrHbx4AYd*bSO_J;xFYIzmtS zt+I`4ys!?cCKHHl(oX?*CdE`~V+~gjg7Cs%6+H;=p`rXnZu(~_?#CLUrbtQb&03(Q z+Nx@wjs@;sYsiDqqP|){&As3I(b&9}yIS>C*u2%dYJ2z3vh8e5^ma+_ul@5SYNhVa z^j}O@ocPQ%a4AyH!P{)CEn>qP`N9|SGa2j{-^Le|Xf^EL#V6vFX3fUnd8tf8$;yGs z37(2I)d)vrwU(zeRX}`j!Gy$smKCfnDNK3_SGeS$`4fonP8UO7^EvBo{W}wG)fM`B zH(#TEvi(!~4bauVH?UV1Fnun@1`Tn4Pvq#I4(@i5^u{xME8K>@CB@pTq&!|EX|&~d z;35KABv-@LKhhh&RK`|^o<IvBV#bu_DBBw4-kO#z-m2Cmm!f&Ma!hHLo$n%ZWk=Jl-Mua5 z7M6wvGE)E5MqoTOCg#yM8k(#R_J3ovu~AS#+qW1&c^iZ|st-IR*4$T|>yx>+iYwt_ z=}k*dN$lk0{DiK#JPp=&s>y-XxJtw2mo^R%jPn3iw8-j258eVd1eBi?vo5gdkOv)icEBvqee{U$7i3M7Az zw`jVP&)UIPOOo39Dqs%Z@@JMVx>$H zX3aR{rn4FGo=|_36c?%ZCkBCHxkCOJ`)f9cAxy9y{(P6&=@>5|bh_S;;&Ngi$S~rL zrBT%<4*f5xzF*0Z0XPs!TuQ(O&q@*5vbit#z{W>;+1wYMM&S5Rd6@_CyB6*rUS?xQ z@OiGEyVW(zcB$+UK7Bn?W=h%yv5OPg{GoIg+QFU_cp% ztjxjRYQEP`y8+(;uT(pWFaw$;wIM`W1Zc8yISG)88iqv<6BE5mD?}{qZES9VJ+pGs z^nW4P!qZaKe#$$E*Kq9Q{HN~knuYzkp55bqZ-?|jRGTn{`t2~)S+!HyUS(LR6fMyR z5UX5kwGYMBf7X@xU+b181MnG)m}QaYOv?9VK~=gE&_WLcO%2Z#gm%tuiXMz2FqFOMHD58q7)0?x5z7p9nK@{*$1sjYLS!c<4q=*^!DD{9I&dR({Xq#i`Q zk?=H}tNGXAME61!MIeo<0o{f&Xic-*K%HCNOK1%_Si{Hc0O7R>Mfh5@{gpDUSe!CS z0kY0CtGZWI$rrlfW|*k5s(lsqC`PO9=No*zH#I`MeK2mbP|ubC2h3V@Nn$ndma|el zkRO#Uh*WSINm?4?&FoC_64#s7V2#gtTolaokP)Y1htVY|80x_@CTSd?Eu}bq=5G;D zHylm7y1N;ix)JT>*w`X_m#oA=Fao;vR=n zrDF>lg1oXm?UPj&x&i+e{xI?CCXvIWp)^}#vWOISwu!} z-U?_B?{MzZSbosUvn;P)k)6_e@qMg%B%LLUT#|J{6%eP{AqgQ`s7knIFEZ;PK|N zrO1^*d*T>6i@`nKV%(WTt>}^)y!(%{*y*I*Fjv2U!CNR5d86oo&2Ot(mF}dxxj?qL zrs+nwA$;C^;QSF+IF&}UU)7Y-=rUUQf)`94U(<5ApnC*DhH#?rAF82EE5KIG4yTVS zd^lMOD8g^_-+xElwAMCi32*=PU|6goq^xn0Lj{~1Q7+`TUx;Jp<|8o#9#$(zFc+w zGuzB=bZp9aw}Vq=C91O=Cnl{Peox^e-LQcF2^VfHJQBZj?}7G)drD+4Wwnlr_~5A~ z(MOx2tVXZI&{(k(m2HGAJeiMoy;1rVK~wKhAc2Pr+V0?(coR$E$5q0CEYgg>_JSzJ zi`5}{5=CmO?8J`(c40Us!d!UGZuJ0UJ7>CX9d^;0)Ci9}%(4sl_!uXKEL>&OquPS; zEDBqUFJfPcNrY)iIPgO+qQo#9BXs2)2yv9mWvdD6X@l&3X~Ef!PBm*OM4m5Tm{F~+ zlrXNNmj-tqS#h~!>>nGj4k$hoiyuCWPurlb^A z^c5g-H$i(RoXHsPv3729U;;9=oKheciv}91?bp01GF1|R+9LK1;@Z%%K&N*nhT2kM z_Y$ii^j}i6sU*M1>$!vXwIiB2c(}ekY^Sd)w#5JUAc3P!OUc*&&>MLNFgv;3RDq3E zVPiKkCG)Db!%>XET8AgOts~=Ail93c*m?0|uX>WYS#g@}iTt{fd1)^CZ5t>Nw04S*qg#>#$_WBZ6!@#2BBr2LQ~UJ z(thmP(_uE?YRTk1Bf?=+p}EZ2wpgyrL|i@yIt5%_sX+lh!Uk2K5&5~%>_~-?IwH$q zftD9L#)jvp^A+2~O)k+`^r`e>Xw?haT#QYAp3D~lZT6y-(ME7i5%+u7_{1UNONZM=gW5##~QSV0|)>yZf$2S71YZoko4mn}1)I06YXWL^Q zxe#}Oh$fWr#UZ>8PFRkC!ic_@M(J!_>HXuzzfO*;__?_`E(?oo&37rycV{q}gPW)S z{G^S0x*wJ%us~ItTB9?yvLK2tU6zF_J-w8>AVzXKm{CRT`t5Fa!2@ud3$t{3vPXWW zF^s6k@H}^E*tY`lD&*MJQmWXdkdlXoLo~gIY`9QC$H8Av)g>lWjrgt`P1A%i#VM9k zanfG&UD3+BL4F!sWA+sG%E{?YhGAc8YUy;%6R*!58z`z=-ZS2dfLbx2GC`h|%B2gv?78%!f3$XoeW{EgB z(HV?@%Yw_-dkfJ8W)#pvaM@E5#H_Y6BgF;C1+C4XMe~r*#cSe#HISJDRy&5MzML+l z`_A{>9va55yoUzlVj%5Yyngo$NRj)E0=$DC5IEq?xnI}zIt%Ii^2rAAry=0FGiEX; zjpLk=o~^XiOH0##JH0(U{>{3aWcDoi^itKzR{@pS>4-3wg}aQsj=mWEVuo=byntMm zDv3`M5$R9#O|JX<^q-#-?|eh)#$dtZpJQ5RjKcG^hZ^a? z?TSh{8rdS627I=44Ov`Y@lia%89_#8HOk`YMJ?`R1@snzvj^W12TZ$tZKysJN++ z`US^F?;)jx`r*BXf$YL_>6d09b+iNk8}J3BeIcItLE!|=PS@pR?=Sgw_@2tgsBToU zsV+P}sIu`hT-PewHQN7oh>WPE$P?j#B;y1D0N{x8A03*kp|z=*rH$$Tc4$C@|M8Ng z2h-ZQX#C;nk-F1HKc^lv8^3HvNeBsZN^i%KHig8Cy`rWB0S1k+4xrIhz2fWU0uu}a zA#ts?>O5#!=Iy!5%X7ZK1p=D>8y1G4kl@ujv7h`Zp&ddpEU`IV=HQO2JQ02KcazXz zd4N>2sc8NMZ@J$yndHcmr#&O@d=i)NPJt`C>o7kun1lMeL?lfA_ zm0#x5#LhH^5^nmdxJQ_p4y%%=B(bf|)nzZgi5ZI#| zQ!f@X$>S4lU&S+8p7wO~S3w8Hv|T8)Zb#uoB7gc4p=mI5S?3)s^A?|K4G)g3WPR8I z1f-URE*5^+Xx*uZ{wB2%f2AU}Gd1MvBi=OM$^y9tLT(i4^YurpEh(G@h0+u5$lKtH zm@M&&&h06WLlY;CPV6x*%_8c9kB5W=Oe8$`UTs854RT`T*nP{>@u>da6)*Sz*%#Fi zpoJsSMka1u&wPvsRL4CxFesL4vv$&h9Un^q%v7sNou*|oshg^1VrkRFjE?w99M=&2(8msI?E(sO z%!UacIIe{d6)Vrw3)k-k^xWK~ioPd0=}hQHWo+31&3$?rN=18vDpGiqhWE;+I^?~w z0i$DU+kT-?b&0wpv*(?(rQ4m4F6u=3bm-}e1y8YsNCn&Rg9t$15yzhofgv2i-V7i$ zEW$Wz;W738*mR{qec_enb9t>(8=BI6K4r*c2eR`k%=Aa+BmKA8|s3s1p$;#MHV#XWGf1$=Q3h3x;F_9+gHD$3ew#i3XNx{ zPBUCoYTTj7x=3Tc`Oiu6(R6fih5|*{J)>09sSZtqZfqnfFRAq1yaF)z4n*uPptxVn z{YSzO&On%9>3KFJQzC_IR-%&SReJv8aIwAA7M9iK@C}E~=RCzx&ve-k+bXR&lBxFG zW{Cb$MRy zO%f^IMjbi{Odvf(MI3;Ann>8@tJZiF;(ax7glL_tK?vOZX0ivYIDK*skqlPXl|0qD z=1(9`p*I*aCK9(PnKyO#WlzD}vLq{@x-7fe5bT}+W`%93lIQk@y)C~GcG7Nz7BwVY zWfp<1TpKw$zl=2Zm~tI9 zn4E@`+p?gMF=VL)HXhtSY|;?%&U+aGjiZJJIYI^q%nkzMpQrww% z2ma8iLnJF5pJ1^nhR(xl;o5NA!OKW(Hs;L?fpLn$f!t9;o6=d&D6%j;#}WTZpnA_s4n zsI?T7hJPmKWe{7zzwr6S9s9yU-bN+Cybm$=>^$BTq!}pyW5QvxLi~#zu*u?)ABg3y z{cyJyIfytf$U-KbOw?~f8{RA(CH6`whq`UHru}Pk*z9vUJ5fTG}koG_L) zwC1LE|8oY^qvPegDS`BtC(n4L0_4O1cDOUMk)~pZjdN>q|2R&THlrv6ldnryQ5>+| z_Tck+m5V7^gg)N2;jD^e&GM6Vo9jCx%*k6DZ!A>%$;G$>N=kjHuxC&!pL%cZP3qT_jI?=Xnh$dph`mNRgC1nOdDjlR2xi>k0X+C(b=*5N&52;a|5 zwCyIYe&=88ys`F`6h|Rg$B*eUX1s_UD-pKsDwg!SqH-5KzT@J;j^mCU98C$kGL4#9 zb|EoiL57Xq+>t+Be@&45M=awEAhQYG$mWJpx>dXir@_)c-yK#aTXMriO~*1nY}G@s zn#e&{l|Wro!Huw)zD2PQRf-V}z|E^YUvi?r)SeyF z$!=Wu+kJ>2Ceq(yDAy59AOw&UX~kd*yo|)spJ?$ez_#TtxChk_QXALW{JayB?w_)Z zZ*Xr8uVNSQY6W<1++w}Pa&V}>n%Y4IodyO0+`a|NZstG_PNQgD4isH$b`-JS^>5FH zO*@$2$>0T$d3q1R6=U5!GanPVnG?{NcR4j*^386fXRdIUym+Lg=J^^PggjfqXJIKU zM{+mnx12kIA`_x#n~MwzdedBcj}u(q#04}7VMZ*G`-eeDKz2=eHT)|SW624y>ykAc>c10OoiUx!69 z-*7ykSsOhD?BVS87o&qV0!8`{z(wMjltJ2;CGiBfxd9KRY#mu(oTfQXS5|azLS%wL zhDLuPpJyffSFUzPMM2jJSv;EvI;2$9Sm!dXp9Q$Tzoe1SfES(>MMfBag; zYwT_xrhu2IE8UWRHx%;RIj=Co>%L-sk|zN>@3{x5K6ID(lF%b&qF!(=m4AHZaxqnH z9arb9GZmk{u6vz}9cLV*iru^4`56kRBQIWaM|mp5l9k5wRnx)FwcYZ~3%>xwjVm<~ z&hyK`4k`i|fy%nOhx!nOlK93INF=(TOfK)y0w~U2g?g@Ltfjr-F!2;0Vi0)Di{c69 zs*!a6eyvR{EQ9h??gSpQ|2K({_<=&MkD5?4J_>V zGSy&athJDO<_V2nF9>Kldde70fvkQ@QZQn6g>Es{_*UDotDW^#*!JmbMk*%i3}te0 zDD6Q%f}+*lh?3PJ?R!;u${fi%eOI_19WOqJ#_FM*s}f;FUJ;mB*$mDg>^oS zT3F;Q`WeO6*W30g7>M*Dmwj&AoYuX(UEY{Jjz!w0$Fy?CRZIJ*u6zoPR2(|PM~#_s zlmM}5peNaccS+w|7qAeoDi-hdFFzSf(Cvu3E$cd(976b6m_i1_h8fW%eF zNo?J_CbtCoH=S5za?Jll$UDXA0yWE`-_)A6ZQHhO+qP}n#+tTm+s2xSyT5mut&|Ed0R&$L%pmF}241)1O%r2XwP)PwTJ)(W*AL3b zMGnvDX3s>8o*Rx_7{b8UdShX?0}Q1DRyr>lH$^qb0;OSEgf8^}nJt~Q6Pg&bQlOSU z2EF(%b#uf#CfH*9LbUiJiN?o+StA-WW~Ur_d@M7=|nKokYsJA z3B><}2Aqb=z;jzNvODKv^_7^#q?a=yJo~QI;Zlk+b^c&o$YR611vVCaduaR{u>d0L z4WEID3KgwE`v@Fmm=X&PUU~9H24h22P+|fjwIh_|b5Hu2@|pkq`Nd?jpqi9UQ?p2Pxm}lW8H47BEtKo#n$XXNP~^36VaOqOzY)bz+_aftXb=#WA(dQ$HoN<;<=sjNW;EUZPCek$2rc@rV=3X)8>>P_qTq*X z*F8s+&XM%Lc7?qbXnIvYUn|_D<%4DGBzAiV|1^#49l@}li>s!nYNGMx9*dEhM<3#=ch|9%UX958LG3Kc3~xy%yVDK z7+FCpzlmqR5pN>i@0c@x66eb=UqdKS}Vqq`HLnFAJ1R9~rt;=};!0 zL9YFQl3d`^64>F0pG0s+poD`*dfkI`Z5f_Rn^QbGctesp&a6&4V*~Y$v&;5g~^Yt1;3bMmXSb87dFE1~zYpn>{9#a>`XR*;!e~qM*PB9MDum>rq@kl~XT214L3ue8Br`W-O%Xxb2Vayo`nn8snq$96gKc+8-ZMQ&fj2H|=C-edwkcj8=&JU+#v768=Q zYFtbHg7i*bx=L{PmIfCGg1eCg9B}FBvLL}YZMXze6>hu_;rTe|KBn?IY1cik7~+1BbCM(TZtAMrT5fL1pzwhmy*y54|uq%I2FW!<1&{ z@Lv~1J#^#JiVHe>X~vzxb zZ~n}3o-1Rz8eDb>%-EyumhQcDj0bV?WTmD00dCT##an=z8u?b|#r{3y-q49ryl6T2 zOO_1`IhHQ9S-k$Kfn89#LJ#=LIH+?(!)<>H5Rk>S5$yP@aDMRZI_L$7u_!ua?#bdW z9{!woN&3ElM8JiM9Htoi*f&yRE`MZftRuZq;J?e1w)K}h6n2MCOeEjf{QCQVuN430 zjQh7BO-j!Up&h&D;_T`v}=Z38kH5mx~8bLQ{*G2xOb zHwCj7P{^lTan{GNGZp}iZUUGUT5#27_Xgt|iWINI*@Hf_C1yZ}FhG&z#~M~0(cmhj zjhnH_9$r1!8oB>=O5_7g-WTe}`y5$DP)2N_nFRyLvy%7u&A0PskxL^alnA%;lcLFv zo4J7)&(MTmI-AZ5aH9AqMHa|O38OF^1+WWE=v0nxuha)&_SGZT#x^%Ex@BP1XfgAm zxiSDn79@H57fo}Cf30H2`Q60SMx*mOJ-qR9g1A5pqGt(OS->>st4;%T-T8Gc&XXRtJYb5XDpz15AQ1{Aw zr%{eDg{qdyOrr2^AdzXunm|W?VHxHZ7lO|A4voVQE={Qp7`L{cT24Bt8L3u+_EUwK zt_GnEZh91usL@6;9f-+|6qaq^-A{kXDX(aFKX?=PVL)Pa?(*BB(sSPy19IA9ximf$0 zWd7}*(oC>=($r3sm!6lnv%FcKHo9TzNRqZMi_$*mFvo-x4$t}G;~SN*={|k(&P8-T zk6gisCLujwrf{7=ha{P%p`A(USoO0sQJT_G8-tfYUPGFFb>QdS^0()3CFh2o_typ9 zgZx72r#)L--?X782P@<$H3w&p*CpS5b0ocOe-l*QiQ(DkP06x~4>i501Ey9k`MZa5 z!*tunvse0J?k7i``hQ2(DC|$6d_e*L-M9b%_WzEov9zJJcQCd$F?IgW@tL8Siq2ac zZ~?oY)EuA7ZcG)VTa7%qU6>;c$hNp!OtdPo$QxKMX0`$hsC}dNq@uJ(-4wggLJXluF}Te5_Ae{H2O(e zvtf;C2JUt;L8lv~qFlonsTy&`dS){CWT zVgnDRg(`YAn$~Lot)zK+3)at+D7o86U2)~X|KuXPU<6xDZE{k4r+HSLNuuU}{QRDK z%G21@{#P5~N=`Wqb@HQvXG%7=Shi!Pjb?5`uU?uKF8xbvBVqB%8-u^roe^4%{>mFc zbb!k5ovI{TnX;lCsy?+R?@=ZzO}oltp?eCK0$Kji;)TLBsLKI!l-`Nh2643N-E9i( zG6Kv7S;UcJi#9mI)@{M8CwG^r6}84#Nb?OpkgwcC)wY3!XUe+i9X)eTiz}n-YPe2_ zj0X(# zJ7xp9&Kga}RLT5HRn6Wj#h(w%W{+#=9Cph#*bQ5subLfS{c;BOvxZ`>Z@Ye=ZeUNj z%L9ET*xt!gAMyt|ps4?WF9OdGhGbG%57!k#3FI z$4rmxBNHz$F7Ry{GO#xAO(wtpZ{XW>MbMT8f0NxfGv|Lpy#EDFhx|8`0%~X-qyU0~ z_9x9L7T!YRay53v^^ZxJc9U{QTxej)X8j>jeA}pT2v=Fvwo?U5v~(WGB4+M4ggAd5 z0rP|{Tc>X*2d6O=Lp_esl?Mv4>vEpLl@^Snn@?0Yns9M02Zn?iUXXh%?ZklD=*a#B$#_fulaSs8uEK>C z3lfAO7;F&1>k^68v5LV3p+L-zl@Q&v@-=1$R*le>E_C?UQSgv>g!nLG0CvFmFm9A{ zkMcESm@F7fnh%y0wncz4k{PmzfKE6DFif;}5BoYA4VjmCJ*I}tGoJx;Jw@~D z9tRDc1cxjGDi*8+g)9LOCrJ!hM1T&G5VC-PFcKd!k3d3t4bS#8-qs(gzK03Ogqy(q ziyv_aSvu;)Etsr-Jxij+M6eVE1`epK91z zV-$bal>#UO6Io+%ElDU^OB<+T;ZWw#)1rfsFyQZ^O~EcoiT4l!=NWN|_}nPnXv5lL z!%^aC{@jicNBKq%eBNhpnYTFJ8pj(|#d_llj|P8wOL}At5*>MVby<(lduxPT@m+7C zeR>7LafjvXgwNUT&eqnquSF|#IO(e2a14xo7GvE~)0BE49vyckhEIc0AL|9)2==bp zo>KgE_DJ~4zr0D`6QSv8!&@uA*AU*}5wlDr1@}zkL9o^Wjwj;J>TdzxbN~^J@VLUI zMy_K4hbQ9Is>dq~OJeG{Lb@jl;Q|{1eCGo!{znM7hcd7?Fo7>#8v|2Trl*a3-oogh zXLvAoVc2~^8j>XoeHrDX>H|lN(NCjJGt@BPYMSk`YggNi?$w`)VWA8X;As`WCv9`D zqHtJYaA0)R7c51%6ElmDyFS`vTE9(2e?c~J{0$09V873%W2=qd#6@j&=fFhf7#JdK z;xbE)r?!1D=8G_dn1()5(+zhnd?T~M+D+AlgW((OV*A~pbUZMZHp2!PiQN)O|}@-+h3*q^z8LqPHra1y}{UUNTifgS)?{Y#eOfH_=( zz|*J-JZKF3i?EOSTZ3>17?(vvhe*IE<26J~1mH%<1=NQqpo>ExFhZlB<4#aKK%<|- zp^P|StV#~Yqpyx*`===6W$34C*Y{qqd{_FPoj34bKXk_~U!ag~Kafi|dV~+@)3a7s zgon@Xnyr5V7Mu1o+qJ+#IPyx-2G0*TG%JP|{n4+~;Y;#CfnTi<>W2Sz+>`RHlwi~I zK!x6(U}>7cd-4qc_1|;{s$JhyS(k21gcx>Y{m;iF_t);Oc>gZzD);Wdq)Pwr*9vRG zYaOVVH4-R9yoQ$3Q%L%3V&9uOge!4|6Wb;s_@j;DmUob_Du@l`0GV*yK_oyB*L%Vs z=F8t%k#$OrUfQqgWIvF%uDJ-rsh76a*D5`9w2;OeXD6W(vX~1Be8XFnMFe2mBbsOa-5=LMW$SXq|$gL7hyHTCdPU{T<@FZqs zCQ*=>*6@3M%*-`8Ht1LJgsP+$<5n)UUrPNN47%t0u)n|Ur*XZn74#e+kF?Zqwmdtd zyr1e}Rt(eB$9RU8s)LiCGqe0iIKCYms`-?Yg3$u!wu2 zus9dycjrZ6Nc}8W7Vzg@!U`m)6VmrP?aLOuNMcQ-PFBpcVq>-pTkuqg zH?|C$^F)Xx$1^rzDiTZF#A?WwCGISm?YiJHXtwN(-v-e3nDWFse;&kCIB?zXE)Zyj z!c(oB&^2>68v4;r_d>ordteR}WJ_vIXR~3%mEqtf4hd{N^*#>~YY%h9TirN@+j4dB z4{>qgtJE+m7u9?q`qb>aTIyyl1iAnqNC_c2p#KWBn}eVZo&?7%5|4bA0???{<#( z%LDje0Du-00D$_x4@xCbK@nNe|MYpkMorfK9~(l?qk7E3&}O-M?coz~bYVbKEC@&( zZok}84pdZ@Zi93ru%xH^=jCTu5}RAXlM4Pp0+IPnx98&-_|}c3r1Y-Ks$&5s+AG;Q z-G-a2Js#&(8!Px|czD)%@4~F3jEkqYe{7LiciGABT)dKcwK6^j-STM<=XPILcL!&o zd@p&?7A5U@E74BFIkGteDl$Gn{^BIK&#G*AQLm~`hx+iWbpK9!@1ag=z>!(@LrF_6DrXblz zFJQbh=_bU$kSLbw4~A93qE$PboxOe9y#Oa(z+N4oT0T{{tp7X=lDHHJe^^nQ^m$uotE0~Ja&ui8b2#r8Q_vR+bSr9KxhGit6YG_bw zgPa20oHr5KaP@Nc!Dbt%b_$XI-2=(HCo4H(qQ*+ev!claM4^P z$XBd+S9+9qr^|us4xeLdG|}>wRVv6c&HLyzT}BwuW|V$6gjG{wiarZXN)M>_B=VN< zH8!J#D7@gq$RR~pE`3~E@Plo8^ksf9%5vS#LI-P(ldrVm@e6}r7Gz7v-EedvPL3>z zX%^(Se^E~kEu%i$&xOsNyez74pWeFovb%BaI~alM)_ zlYsv{t@xxjEF#Vi%{8SZipv?sg)^cvb+ow{RWI(_JtpyorBpz{uyy7I7UtY;BNNX1 z(iA5|NOEB6#sy~|(4Llmz-FEm&4Vf#;+hkgMs;UUNnstT%`|m**d5D^$v?7S>8(v* znv#;i99yA4E1{D+n;}RlS4o=)DxA4=NtkOecx-+iP%Ss-bOlqwsPsG-uqr1z)Ss{B zm=YXW_Iwp89HR7WHYge~8l{0wfO*Q=?4?{7`j<7$JFe1uXedBbb4@%|zzrQy?!*EA zBmE~uEPO_C){St3B+`$ zlc}414o0WqHI9`4-=_Vcv|RZR)V>Cv5xPA&o9}0a*cBLsNKY*lH(z@T*qZr`)JL7) z>av+28R_W7TZUW0wr0sH-~p#S*+AMQYya=kHq=V1SY@ZZ)Jyh|`R@>E-< zsQB$C5>^2t0@)2{uWmJ3c>7qTMVQ8#p3o9D%~19n6|Ue{XuWO~!2NBc9`37~lQzfcEY2p%M8LZ$a6 zGHqA_)bvV>tPVpv*{Esn zMeIB~R$>gx*(NdOBw93X3qDO+VqMQj4hCkWnJKEGkg`Mq4^g zs(foVuFaj+GWbmn0FE5NXmpynf_`Jqw{$cO5rD&y#tx)1^N%a__zO) zE|3Dyg)>wDfL8DSDV_Wm_eRDRrpDI)*`;#LW9_`fk+l0wjZlUZ-FhJL@NXvv)qKh^ zC&n6?+mxC+IlEY;8DhhQLP=D~Z@T)mP2U}a01x!p!Kq@q%6VppEI`b?sB2-{V(Z*uFQD6plS_rN2w9=_p;6z}lF-A_Tw z0S(PI5jzCDWSJYg9BaW2NplsBZ-9Zo;yMcqWKYarQq6;)Z;6gTsU=>hv|l_;ih;G?pX^k8WANHt)w$e&cP62jajrmY4Dm@sJE`j;sqln zt9!>G#Oj>0aZ8G>**@ccjX>aN4zGlf;tVY3%peTR%a+XQ8ViT>ZeKAkpE|d1nr`Gy z`7u8|TH*Wi>UiUp6q%wqycJUr4H|vl7k|*qTjUM>_Wh;~Rs67<#1ZkwDC4z;2#J0# zuAUt*>dWM3!qz-J5=-opy1bSqQp${C7>7t?l59kn?@*pBZLi-S$BbaST_5h>p6{Ob ztK#kVAIXyQqh%zBF#%yoB1zgQ{auLGu|vQ|-LgiIN|R)RCIE}kBaB8&0gPIxmq_5F z4DS041N@LUGct}4N(n?%*&g0Sl*3!S8O*CVe7K7JWhqYjbM;D8*}kr-*GM7 zmxEAVw(>ds+s#M!?R%H)dpBMbkH&nfjAs;0ws-Bv{e1@btV(7{ZrWXzXyt$Oduz~* z9__8{=?3GlxPxj6$1pC2Dp^Q=E?@2%!)rtE6K@>AA7;;-$9_%I+_xgKh z0FFr)L(QPf_v960G_(iM^T1+gxHQswFTSt=0dIQX&6y9{w*~DOQZ}D3nYnZ0auR;Q zj||k&90yS-PXH8Gfz=*H@q9Jt(tS@TY@}HHA-=%xi0vW58q{g@^k#tIuARjDjKVbW zn)&8S0z?tOjg{g6lD>l(?n8yfzsaAC1MnP%Xh_);xnI8$gt)|z-|PmA02DZ03QSdP z4PAzv#$t_KZKahW^MozPJ%{?^g%KVYP|K_EBS`z$PeF0^K`AupQxWM*hrlLAJF07^ zctDML#I+&Eeqnle`V?VE6hI^hYuTh2ZTm9C$pORp`Z9!Tmgn1wK;JJPCBxvW&wcRk zAJxX%KSA2+D@9K5?EXZQFW(0Fku%zbRjOt{wNgeCp$l3kP{{N(1zHmZ6s)*w@$P)N zM2<;{;-Xue9597WUJ*0oj)4adwJ&RMsMsqKc`%;QF{B?UEsF^UB^{{NI}Pn2WO{OP6Fsah&jLqpboARpNOq+a&BB)tGj!fuA+vwoK9{cPI#%9@ZA}Pru$`;VOC|s%;cdCS+LAa0PBDiXk4nWjG@@ zFl~r~EmEPVuNfapdH9Wj;|NISrYP-rdxtv8@_y6_)_P7lvjX9W@mEKkUozl%mL@9z zcdx`*tAdek(+(_bSg9E!iG)u=kFXEXu%`~(8jcN55p^+Oa%H|vDWS!?5pxOWbx*-d zKMj@%CFE$So|Cq&CSg&#Nvl-0O{mZxmAqi2eTiJpJhuSy{Y3!R;1kJ>H zdkY-EePGScX(~@7f9aV`SQ7$(92vS3pQ?uG4Q2TFa9r4aB;AK)qq$MAg0zU`fMI;z zdcS1Vv2?W#lpB#96u@g60wi!XevNtghl@f90XVRHcTa8frDSe3D~Hh?bv>h0&_A&O z+~;cIhLuR$+ldxy!QnazIWbXeij3G#X^_S?`>KFd&~o316v)Xq21@ZkyBu!Me>MpT z)e9I8nbeqLRQ4XCiDGZWXr7p>lQBml0X}$Xf8qYJXi1F(qvvVvw4+ljqj4-AGtgA8 zXDQ*wWcT#+5h|)1hD3X=53KA~d|Q|{7=ICm`QCQ9#z+S3&Qdek=uoAJ7XGAt4Ubm? z>SU`}rt@rt45b!%t|Vp6%^l zyNn=ZZn%snPREjQ>R3blO%b9projqFb)T@B_LW<2p-IZdQaqZQz;t{Kvum83jk>tx z#?a}NT@wVh?;h)b9HY9tpRHtTl?ek`jRKyWPplziJiWDd+N1<{;|`22oVDMQx9wpq zZenYvwWF$eFz!dqWI?0Rp1R~2){VJ|C_2Q>H{D75hbKPodX0gKPqF+PY}wj+rNQO) zW%uCCGQIC5`Dc0lHGWrK;x2#46SF}DQ^t5Rusbtxn-oNdde$^ax=FAbM)rZ+SXg*E zfc-zGRAAf*9wC4h=fyjy@aaL19KWBT;Ki7>b}7-MP5SKdFj1L?CF=Bx_m`=5NhQ~} zS2Bakhd|{HShAE1$-_k~7klykuC|kKj0+PERUn}!hD{T*VnqOcE-DmOV{s=oX$_Wo z(xrpXPp9Ng6{zNJ{`cRjzKn$|QQ4Y!Ru6-qh^3I}0LGJ`^dJ$W29|@iM^Z(pd_?#8 z0(z}pk@z01O4#_mZMNJ-XAvvV6D)RuKi#NBclG)445Ver!FVB0Nh`3Pp)__lsG_k+ zOpuRtTzx2L2#SYt6(TjElod2!f=FQ8h|y*pX9($m*{mW4QUB8Hsh@CQYFY8pTQPA5 zr`a(~-6^<-?C0^TowIcZ^m{J6HR(P$Y4K$*VQ_~)fg)xOVjdQ8)CZ8)ES4(`HSt7&pN2)a=3Gg7)r zigTt&bJK(=sG4}=9t%aJoiIxk2P<@h^Q#a_b!V!h9JQyB$E_N@|7;jtGhot7)V?Cw zpz?ygl}#g4Ks%^oE#~O0NLgOJl8}`aN^Mu!NQ4GN7ypepngr^kUq}6#+mYtU4$?H3 ze|2lF_P;hb$U7R%0I7%~%(;3a(@Vw3Ch*RGLTp0{oIsl=p7qQ^};efP5pN=x_u*6>Zp+pjhtWx_+HqlIkBQhP+@9i=*Xrz^0zo*mr$&y~s%XahyPgF;^Vc zJn-uRLkcT>foD}MXO3>&&<07xhlD)M*(TD?fE8b@r@*@b{Th8&)n|w9l6Qr*_3;6P zqw|uMzX_!}iVAj0u7JzbbY7!>YYrECkEz7NmD_^JJ71VydF+O>TEs}rg|+a8OaVnQ zmk8)cfv9BSLW&BlWU^h;q`L5FUL0dXf`+38MF!Wp$TJ8lrOI(5#-N}fxs+ks27upW z0*09kY8uv+zYJ#mokou6yiW@B{;L#cVEtXkpR3x3dt%A%)_i_;*0wE}AKKF@4-eQ| z)#a?CKmnO{O|dknN&?rYl}mGEE<~fi5|}*b{Vs+3=73xKuMzlvkLiOwrr{q_(VLfPIdjHTshac7T0!@oy)YRB!1Ca4XENv+*7Kgz5u52K#`y|xw>lZ<7G$0dUciYX-4ag6) z1K_OWyTtG>;t~NPStKFfL%MyT_gBIxhLBW!t`+DLEt}3Ok@<@FM~)L$MfEG)OmCL! zo}x#q-M<$x#g~;ewAClN3K}PM2PMHCMj)uwi{GkJPne9#$5tykgo=$(Y%4X~tFy$q zX(-NDQo1VU6mp66gn-=Aku?|=k$zTXs;0PCx{3S6(B$3&6XTsyC{telw!d-hPIo$Z z=gWbPX#-u-nA+8;g#PwOX+_fiGMcBgPMY+U$+YOfrFW4wg#=#jM2?+O_VrmRhUm4P ztro01_j35_lrq|d&N~hgsG9Oj*8bI&xj_$Pf4!fGLVZjjoXXY%S@qrIZJS~* z!BVLfdte4zl4Nwp$lwrR(|xygV-vw!DrqG1d*l&{S2CTCxR;~7z1UVE4Xajwzkk(A zuhqgio_>D8zh3+2Z1tE~6{(;wfx875m|UW$Mq4Li<8F2zj5m#x3|65)9jXe(B_6Fi zZ!E|_Bn&XmRo-hfl@7)~g&{MveO+m`Wg$af-XDV~0YH6+OiLF8iyZFmbi?O~E@hdu zPR-TyU-!1re?JEme0vW6AdcZ+^F9WcezdM=a-Mt%2I4-q)qp{TR{V$ofBj0;FK3>T zefmUtwKt>8{iqt3u6&h)i^Zr60S$mPaxUv)-%y5@RqxNpQ#&QM<&DSaw+ailphGVcm2_}VnP3>R%$b7;n+ zs4%Y}G~z3kFLuaD>OW2aP1OWQ7o7qHa%HxtgLbEU=po-BbKhzLh3|}(VHVR?>KQ3K zTpPx#;GKawV;7_-u`Wwwg!)134otsdiKwb?$AHBm(2GxJ>rjxrgYMB_n@|1aBIxai znQ){t>+nOOq3h=&zgL%wCk%CIsq3CN%7CTehM7{}sZ-5WDiS;p4O}$^S=cHFmm@O_ zsmqO+3Ot5AH5&4mS0?-!Q9>Mm%`G%1eoA047dx+g| zdF1{Fgp43-QQd@eb zr`MbFX^}_EMQp7u1JvRy?Sb_oeCQBo8)aB}dY~((Rru4`2}=O22Q|ssE3@JV6D4*+EpWJ$L?LC7PROO{#yT@dFj0!)cnOo|mCV zE?8@I%6af4#`jW40&jFVIwfs)@|u|X?)#CF`B!^PyMw0VvH0=v`o`;#(2|;so{2?d zdZ63mt@3B{?`ioTjk_}R5TO*H(ur%jZ}dA=(2HFFIO^F;Pr_UGWAW$5kj%GOsU>5U zd$oxUDP3cv7mqrhE)Hh{J=u1}OJaB8DvJKqU+>W7UX)*Q3eblU7@iWOAls8Sndb@` zP$An)?eS%6!YkjwE@3%XSp|2#Dk~}Jv57@uk}{PxLy%_-?R@qqHFckusKp($XrH5! z$rE5$=J{rAYK)I7Q5s0q8!6@_-A5kCvXchz7-RZZ41oB|P@mpBzV`HNrv`~MhqAAX z%t%Voq`@{@+Cx+SuE5e5DUbGdqRk@3;Ywff~F8@Drdy=B`5Cg*4 z?yYi2O%Sy%)q3g%JLZu3LT@;WWLF#wq;%CmS(~j@tDLACJmmX*-&B5Av~Y7bl>&w^ z4iQy}nM*F(TMIcu9cnTyx<#1dbTic@)U6qyJ*hJxB0;Dv3OW4`gRgl&C&T6wdMD!7 zA+Q2C+{a9CId|qz$|Df?Yht<*Yon=C(C1trVe(6uG@Vq6JsXL?kLTvektZ~nquTnw zHx7wA{JCZ?3Y|YIkFBB^t1J6u7Q_p39Up2Hwy3LDyl9x4Gpcg+qI+V1OK4|09!ORUf^6o8nLVh;qF}f3 zQvDwKe===wH&Q|b2LQA%0suJwZ>DW5ja-b48UM3RzpeG@yd;72v++TVMWGStiZcNR zq}Hz*f$N~_pyY{DFPbZrb|li`#o;wP3;f!q|2i#!HQ|KA;a1W4RiIIn=jWp@KPSBD z2V?&EnQ)|d5{?J@!_ttPjYk1+up!rkx`%0$<_9Bphw%pUG*pBC6&>-YG%vP`d?JNxLKtL47>0EI)E3tsX_qm{T8%n`56eRo_A zbv$}PIgXj0{ptt#kRPl-VB05~9cUny;8~Mz8qPn#j50M4zj4bE!07t9`h$(4azTm_ z2%ec9LWBdqBQv`ni|!eT+waH+>jMtQm_{*zp`4*C?RDP4&_n2Gnp;KY!N(`Rw<)dE z4IYCqQ{^UxM}{ybDJ9%ym(o8=B?x1W6L{Up2PuHYTz7I-n7{al@?{ZRw5`n>4E?() zjVb4e^7c31kR{cx5#wzEUnU$m+&N@}wupk`bWfZjnn;=7C`(zxU>c#R{Z!H?aouoJ z6~R-9Y9Uc~6yj8Bj)OeQE`ck_C8LSrNF05VCQ=y9H4fL5+zW7l`FBAsvzSWtAI8-? zPdg!KNAjD;4X38nAk4&lni~f^hY!02X7I`T0XI&EM`;4QNt-mJ>WGLudb%E{Vh-aQ z0`s4E+QBCj`*TiDGx-Jcn#4g=7Q2BPQy%gh23-bsbU%dt6fpj&V7h|h2S1;em$NUJ z7c%_)@12Q>oujKF&A~HWZ=Lvf#P@QvWP*mGt1u%EcCHQo=m+n*vGBvD_>^?;!={O| zClt6iIRp5(SGn2I&(m;kat9wjCm$Csp$vK6x^Zq(*iB}(euga_`lfG!5uKk1%d|r2 zKT9341YQhGruO!WlA>$ade(0j7y>h8HrF~n33?da)Vx-P`2_LDJ z48_*oLLN^zbG!w(vA|eXYiK#=3l5Ak-DB4rGm8^hh_3>}_nN+Oq(4y$N?ZZ*FRQj@_i{b5* zBS?e4qxgb}e>@r#xGgn=VN>>BnAUC3s`wJ5Z#O0+w`FN#alPQ*W?QlhEZl2tJ zkE=%CFY#jF;02YH5O8G}uzKC)DF+2xe$&Wga13nuIQI;@8dkC5MTo`gXdc?mGD`WW zT@>(T8t;HiI+{4Xt3!cvmzW>B4L2@7W74-0MR1NMNX`w`aCH47u3;1DsA;7854|~4-D=pV9 z!CcXxb22^lyf8Iz2Mr?) zNq2)t163~Uq>%Gi+rwbsh0D_9rNDnZ;D>?9!JNwKEN3FBhlEx1;Fx1WUyFC|fJ#W> zL7HpTzT04Aoq(|~x*KLm-IFMZ9@Go(N1#EW>VkV;Oo=^F3*WG{)o_+eRaIs(|PS(<4SZjHkMczox4EPSH*jV@B|!8gL+ ze6Y80aZWJr?Crly9r0j_GWA$;qUl+ysUiSTJXTX+*(&RWOW>Evr0C9J7u7+FGYGZ| zfk>zVo@o$kK6qhQ!#yX7TcMrMOEM}75e^3g6O60Qo6ugU;4K8kED9c*{)D11j3=J|;x9i%$3rE_el)0!);JZl%xB^_G(!pp{KgUi5E}}m~ zQVE7#-M)E%e$8L-+anFR`}*^ZV$WW2{G$6R`1USP(eLFNazyJW3?0T!KDZUCL4eY4 zN95Z+-Z?U@Z4jx`%Ih^U7Ii~TdxszHzRr${BVPr?t1f;bB@h-iXXvhj;OhOAl0Ek+MG@3`qAta66~t%iZ|J~E z=E!h?1P&5elS%3z>T^*>w36$df7!5vo`p}0(2?w`>{|H@knMi^tz_G?6xi$-W-TrdP-t zu(jX~HCYeD%w2tNUw64mkwr{A^{})eXV-PRGZVkkVSV~F3Fqd$D9h9PXrej3t5??J zW70FiDwtE*GV0O~>w`VXy7#kip3Lu`fp&#jOmv zAF32-;$nb1yZi8`L~KEfx?ku5by4c}jeIBcI-=dE=p9=vrd+>a^|IEFP)BqVTZNXH z-z6C%HIfUT8?j`ytwz_%gcfa8#J_krhMsa&^H5wfUmOD=*|~Rb*(i~V6;zMgo?R2- zoC}sqENg)x+g@{4TDLVbE+a)%7t=TN($z$f-be6-twQ;|F`A$%pjH=X(**Jt5?sLs zTPg2M&vsPc{G;0{PXTQkw7#h&8z-Gc;&ANAr)K9^L+wbn-A}*85xP56T~@IYnPp07QrBN0w|B8a%GG)1HTA1|c3)u0 zwjpu)9Ob0b!nnw2;C7vK?!A`b)OKy{>qQHR@J&%B z02w^AM2N+OJv3B2RcKX7x!qvyc$ag3Pv@DW9EX;rnIdxof)JQ_41FfD z+39a~GB*>!tpClQpP~`>qFtxf*%~BxT6n~RwACcczg_zrTs>K|*0IqfZ*GUDw8d?n z59O$l2Nd2X^n}hi`ooB;VBYz%+*%(WgeT$Jeko?{FNH=_U3O*ZlDz)cbkeJo9dG^l z_lJ*7_eY1lrYp|r-XuzswP!htK}PfG$c*&SMwyk(hIvLc;(|?N%5v4xhJk1fhE3^VkUyBhei$hVtskE1FwYoHFw-^OioX;G|O!WAy1w-=t7?9LGm^qv=! zukCx8qu--7r;L6fi(FQKb8iRzu%L|M{66lmS$MfqS`i6#1Cw{LIOUK5%%=H zXb~Wknf^Sm!y_R~GhqFj;j>YleKnucNGW|~e@qcm; zK~Ws)yE9@!m0ZR>-(V!!u5z%@CaQGeL;Nm=9ii>{Ka{&ukS;*8CHl3k-L`Gpwr$%s zcH6ei-L`Gpw(ahTnTY!^XJ-Br_r0Q`GAnbf%#4*FRA;2%vbfq$yxPLj0!dS9HPXr= z?Cc7sOcx@hwa0QlB%|Ma4<_J>qO-P45;6U_6gW)tk^O`}UQ8AWV|=?rjN<_U3unI+ zXzUDPyG7q%(X^PxPJvp|+IQ%8XidoEJ*&hoXNWPa_w-9_OkQinPw^bvDPbihMdKE- z@9cN&&D?W)olqb2|FiG>zf1Gb|IfbD($3h%)x`AwhddABk2dQMFaRJ84FKT(zb|xl zF)?&9|Ih1s(`vTXn+%9Qx%!R@6sbuqms(7Vt%@5p)X}~glV@Rp3O4IV&ZNfUmW{2u zJxMsdCiRP;FNQ&gpDtccTh6CRZXz_qcp%-Ky**z(!u+sqcd8OQ4X|z^S3YOX45f$0 zQu9QEP2n8bmdGVW4gB30u<$-@?Hxf1yk=A3k`w)cP{hfgsDsh-Di)0hKm7t(U661> zbkQz`Z;Sw(kR_r79$-Q^5=>Rc>UK`uoT%U2M(q>~>K?0+M-EkaY3eJ;G8%~9Tr;)(J=#KISrJls`KVi+VZAt-;Akt7JKW^m(@SJ~VL3Yw zHdVhUh3rQ0DGiik9qU`vKwb`<&hJ%%dYfCL5+a*EJx!>~yD;i(uF(ZFQ`wg~D@UzL zfyq--E{vP3dYF#sh^9**5SL|xs1O@Xh#qrw!$d6TeUB4 z!KO=Msqn!`tmlwo+74$@;sRsf?GB)csfpcKJ;f#qYD^gYy^2hhl$eNb2q`4e_+I4= z?dXoSV)>8pHqQl}uEpC=>~_zpMYV)=>xVDWOKs5#B*52lBkipFV8LaX?B=%XkE!r# zq>G$8JP+B#AsWX7u|bZz73z3i$3SYVbGoydwy!Uh;n}7hB5wZpuFaDT+8cin7d2`e zN1Uc1Cw9WmRxE3Q>^Kvip{zt&YjM3a9Zg7#%7kcg1N)055;=FenX>novWqxwjL1m# zRAtM*D^N@SI1>_I~v_Dz;m8!?7#83z6h$c)F1h9Xj6?zHpF|noK_b#T?M&pejTV008ixQNqR8 z*v8W6KchsBnyx%HBcji2twux|VhQ0>O64B~3u;kOtAxrIQl``HY}Gv92H(J^Rrhbl zQBEjAl!&7)Zsr}_&#P?Ny|8lZ2!df@AXKJUa4FlppARfC2B_b(Y!GE^3T;)60#q9p zm^c|uikN@>su6Ms;N}kcP%tF~iXSh8wFN0#poRxn6ir%1f6Adjt0Km95Rb8v-SQDR zIpAb3gFcK)OcgXkJcFrBCK;y;30H(wrMFqI_Xd9MRr6xxL@GE^>x%Wz^lMY~#mHGu zpdpZeN$U|-9HnL}<2<7?QsQD}$OMQp{nb40o6&H{z><{Ejj4YQ5-0xE`=twEz1J>A zfmSo`F{ok1Gbk(!Ua|tiGstn&x)CTn_Y8^* zD;VWtxOCMv9hOS?ZI}3DOHp9sgJLfwh)MDl5`Wz)73^gp*+zp;o!qRA!oI^t|0der z+8%h@em{rI!@)vrV7Mo`Fd{G2Zp9WcrW12ixd2yP5ggQE4KXZU*-FcWZyh1@?U{RFp5{`ra9(mX?iNqGBxJJku7CGnUGXtN|Og z%Qq-il(AKZG-K{#4J!{?c;qEIV(r*{whi*W2g+`t$BkkhMWM7W)~AmEZR?igpu+0& zz6|Tx7E@oGe0gI4Crvb}j?Hb>-COj$)TqhbUV@+LypzXAp3mzWa@dC3$E(xf?d4-4)7jI< zrZHqXcRIY^D$#l@TTV9zyj zN0BJhlJD>4=<6@Sf0-*sCC3c|0RX~a007?qn~u$F>>AP(RDpuqI7 zKslM2zue9bJ5jG~5IXj=?;ogAE0~5a-tMMYYif8aA<<~vL7ka)5osTvzeM;-aZGd;EJs^WRuh~fGaV|zpIR>b z-G6^Ma$ph8nU?`zkraFnQm{pXyoB-dQ|+EMzFl$gB@%Tfv_%)Eg3TZbLV^tx zf*uU{4ya~t5CR>!3*Vv;3MM6x;XvwuvKfeB;$qMJO-6%%qIDvoIWr)mHSE`$}5 zz$8El1Sfk5evT_IS_;wRDoiLrh|o$H{y3+Sn6L0IqA@^ih+fx^Kiq6FNX6KY$%kDv zNJK4pA)rnTb%y`X_5y?5PT-`fh`*li#?QNjd#AFrb6M8CB>RSc<9w&8?9+mO`xDHS z9s7b$OVPciNLl}OvXED^&*Pn)?d}Koe-Dmqa~vuy000pFpGn2p#l*)hrOs3w?5uuG2VDkQ_kAqQjOa8)#ZL!jNL#Qp^(|b= zVbX_uxR4d2`TgHwy@bDkuO>W3qdj6#RTIsM)8{c4<$oZ)JJKmV9o0j`g|i~Ynec?{ z;w)1uoVCE}JBg8xtatwRZ|>(LS2q_00LYnv04V<_2AJCXH-4JZ@wGo>OZxTa2b%}p z_Q*52eC3c(%r@e-Zua|2N}hFkV=%^sTSYC+CnERpJ)U--?J_>6_mS!!J>n|7tA{7lK{iP|Pn!ly>n<8$iHkc+ z-n*XqiC=YCukfm? zxtsHVIUV>JGmP-rJ#fs9rw{!?Y1e7&sm|pJl}AsJJ%0!q(J~IY5cg4#TBNFpmmOXtngxYyA}Ye{7B2r zGXRTdxRmD#AyBw|CcN#_C%JWT(q@lw#5dYEg-37FgiQsV;P<*=@6$)l+Gh+dQL%@I*6TrO5oLgs12p7J$FPGWh> z28HXEZf%c03F7;|^DNmLkbQ)<>5T=yUv1`F7pPZ4`*da}t)Mbeh9@Uh7zZBcBOV4E z#fYT@ZhHuZcZ*|HtXMa1h}I~Ez;Uv(U_33>;`4pk*bDfwn*ee9GQQn0w*uz#ipgBs zR!3vFzRv$;4`vSRI0>6!^4a_U-Z8rZXS(SMXqzL^ajbEPPO}pLlt5pIza-VPC&{}e zT{l{u`@s8@ziL;|vI@guI^N=Gfj-Ht?AYty%`XN*zvErF+Ya*2X9@ZJ78p%Q&eKiF z&oiDRz0Evjyv#C8c^j{OJ|Zv@8Dm%AH)P(DC|g9WuA@k8W`8;RS{eq4ZU>BIKe*{Grw1W8%$7s7)7STFCcBk8xTJRtV!QyM4!xJn-9NHUi>-tr_PK z-5$362i{@HGR_mIrSslFhRDXMI3EV*D)Y!6VA=2mV=_S=krO%I-?%w|^N-YNIxIAv ziC%$Z7;Zw6`1PQ}-aT+kC{i0qv7jhe4;ns7~>& zJOxH|A~h$K@s~En?FbZyYuRDSS*1?z3GDs{cmKI{%H!8xJL1g6zba)c-ajuTJoesQ zBjPOl6G$y6&x(Ia%4BcHo|Gxkt21S+dU>-(1pH)MjVSCzk2)dHyESF3pnFy7Xm7`s z6hPnbN5IWm*&KK1-qQpXa%5?AmggS?%su7AJi{uDQ~Dg{^Femt8vn&a5+=$^OF$pM zA)kDb69E1bX*KXbu#x~a)9}l@(4&%6p=K(%(}07(6nil_pcM-3o0LKBFt|yxHF-=1 zkyh`I6g#CzOIYCxA=QT|@7H*__f7X8>!8=}`Jx zl)hzrYC-7OS)tNGAw)-rH!H3~&m?qiS(>`nWU`fus%1c=zJsMMMu{FAF|0(E<_a!1 zQjQRVo#JzW55lmR&afGXm4iGAFKpJk+H#C$7(-P3VOd@BT@D^enuffs>u+|J#At6t z{Y3c^+>l6I`vsKD&9Z6Y4k;wF^>T~0{caOlZ)tZc4|^>ZcTNX`BmCDOYzu8lF4d4G z8sbnczor!9vHm9oW0atn+i7$!@(g0}T|KZTbpfFieNIKhnfvn9K3Y%4nN$L)v3yNM zq;y*BfTfmBSsYCZnjB(seKEAYaz(r5h{e2uYxM7qIf~4Nm+UI43;{<_ok#?TP9-p| z<^ctMKN6Z`nU?&X7FoAsGnmXNUiO~HD_DI9?t-{OT#;~2h5{N&JTpBykjg_@XS;-3 zrBQ2aw+(OGazf4 z8i2C#XE@+!>W>khq^6jr>9{qFdMbw0ky{f6>xD=KbsPVbzKqjum~*XK&51=!1)DMz z^uH$`8IL>~-6CSF1F?Qi6s0hi$~AiF^_wqB7h9=hV)`ea+4`}6+wWp*D>H7foZ)id zg{r{wih?Z6U#%%$?4&>3wvLu`DamW}t#Thr5}j@)E%m-D2-p?x<-QoM? zIS;56v8~jlY}*o>47p@qaVsXHn4WVh_^(e$y;hN;HHFb;F|PP7krj4lG)Itdeg`Dr zn)5Y!vw>kjnHS@SO=fPOE|Z8ap~Y$(OLnT(7^O2ExiTAqAO1ne$bUBW&V?=lb!^CL zN_xK(;RgAxWPh(rRP_t6NH>t;07y0Tfxn@jPU$i=mDxhJeE4*S3xrcQvd_;A*OR9U z42w>25Eon3bLB~qprn>;P>V6~c~`lDgKY=@!7`lDU_}VAZcb<-aP_hk=L|*=x3kjA zBO;Jk^<%MdlP-nw*mZ1Yshb{7Z0fF}U5iZBR2q%OmiGeR7WT!C(78*i(LdR+r>73Z zqU$>^ZI9QvSBXn+S5~o79A6`k_2eG4d}2GdEUjeXQBLI0$)* z?_&^bSc&4w(0lmJ__>w=>q%F%tsQS1cP#A;Q8?^ya7c}s+_Ucf-8Nvp{$a(f}BHQHJE zSyhDCPkvaY6KBKIOi(@XqU*@Z6$~&x-w)zL=>@vC`3*SLv0{3qn+CmK^CK_1#rYS! z@&A2I9{$|0EW<9Rt*U3cNJx|W1pd%ymxfpL_7bb)yB4d5H^{3n(rVS;tSH~KE%~VT zlL1oGfIQ{QpGq96ecPYSr<0fF2@qHRCCJe?#B`^Ik`=H(Z$mzj6YB(ZN1O$Rim^TR zaJx=CbY6<-NS#e_jZE2V@cL8x0^McBGd{UN$#eDr-L;mkvm$@cELU@#6HnAmGsnCc z=)6p-?_=F-YVG(+WIv{IlQz9t0TEB3_9TbQX+`Oaa+Ss{&<9|9On&@_LP6}^on1~ ztWQ#DdH$tLhj*g9jVLG(AEBXYrUb!`d2-?9dI&uW{5`53&$}Vq62cHzg`m^YCSUYL3mN6;>FtYN!W&>nj)*rI_kL7X2p@vOfg)#@ z*@k!X9KE+A3od-~)%r)X2|f)cYc(#)GT_Xu3mt#~P?jRdFZeN;bN=uN+?R`~a_N z@2~DaDGLahE)cH)9Gjq1>m>JjFFhBtADJQ;ilDdU!0=B<{SbC90AMh#fY2B}{ z3!}OMvQ_oDYP=4!RrISTWxuoM9G=^QK(1_7clMjTT_CzQ3Zq6UPt@yvZBj4HP?yHf z2y|DS>FYAJ_97aIPq7X$IHer)R4=cmB#A$A=DMuZRoACE?)}idiAdRQ<;?mIxv8rg z5g*=wg?vzpq(a>hdg59d(zzPzT=nR(D=5M>=qP9=(2Bt}L#(eYG>1W2k{a8D4A1W- zL!=ZvvGY;Y(4j2eAA|#&>dr(7QYQ8fItcQIwelJahcgMP&x)@a2-IUR(jEbL^fT>h zk4k!{5RjrN>_kBgT=IPmHm}-9BZ#?;x|a_|wQVe|7+})zP8|G`CUI zefxR4f{W`gi&ll|7qRP^nG@TM9Mlu-X6~p5x$7CZ%g<(R>0iI=5#ZQwF`M(e9s`51!1<`{P0anFK$MjOUo2tAF}F-4;W`w|gB5zY*P+1D6vd*-x4E zu;%(+`VkTbA*4jhY@8AQ^uvm_F$UUuf%2;}0gPi9yIxWHjF92Yusjg@-;;)}xopOf4w0a&W(ru zvVJ%fWrZH(veBKJG;?z*9U7Wgv0qqg(e<0Sn@CJ+N@>LdAyrX27dQSWP`6jcSRpEa zbJ$KnGL)gff`HZv;@Rdyxzo@t!fKcq zlAHA&LAzgtu*6#?mQZ(e#h}x#9a4wN!2TOed$7R-O#z-y-9DTsX#U)0eQH z8hxew4*jMHsoF|jy3ZZ|qmP!dE`Zpi&pVA`c*IA5{Bk3(V4iXgGLHc+apnfaaanvs z1Fen`GOY__r)-i+M3EMBr$mt%Ht@1X0$oST)HGfcE=~Iv_KAql9y+9}8NZc^65;8} z=+t4ZI!Zc+KJnl(hjOW%W+_cQ+lNe#js8Rbd1n*N(U|M< zRb1J*SXMciYgFSDc4?;!-DOnKeWeFdmU%kEkD2{bEOI4YAEX~zngLCEv!A9AHMGaZ zr;$`P4Q#+KB|9{U6K5DoPMp-SAXh$ub*@okn5QCM#hg11E^#pDn=}XHyhZT z^O|u5xn+M9>J71<=*L8H7ZZa-RX z?;_=Zs~cxug83&p4JDh%5qCm*iKz$JSzRyZ7jhYi2*OwNgE(So08G2pniRvDE;?G+ zRbp6j(Os>fHWa9Y3N&&!NDX`!R=W^;+`0@#L8H!9S7RO%-;vv@9pEsdUr(_9>bZ{7 zvM@=9*{kFQ1h3(vO7Pob`k^gJ<2(4?NkUcv)}y>WB=EdE@pAi=bAEZ`d%h+tQK-aV zA)k6(w;hH~m3j?+wmN*@de)-l;1rq;IH^?}g@EMGmA}?{F;X?4UpvP}`)4rwat|AU z2H&ecXg(ytP!;c=g}fKJ+j7W8{`@BiG$y}OCQj<53pe+ zW+-R+G;%PPJ}WgO-9U}M#0vZyl!TzYpLNlPLltMzrq%Lk<=MBTFLLhX5 zA3qfNM-2$%9Oa*wizQ4iEu~|%Kd$~a8T1!NZu3b$mblpqanA;#y~_iv8TDA8V1@Vz z5tuM5rg5(4BFL>Y$~f!C!*@lqqY>onx^}W+rfieB2Qz#EW_WB*U*W&C*J1-6g&788 zoYo~tz8;hur9HU8!7sR_JGAS#_O|)aZsvG>(#e(ebBm>8LhgAvI6&h7$8ZMGO1=jFh=+41=uczMjims_*F}IdN3kAxt@riS*7|) z|93&Iy3f=~HJyb`(+){em5Y>Xnyp6)k1=U-259c+B<|>|nlf;$eRv^yJ|juEJtwY{ zv?G=GdqpMC2ta;MoeoDDnNs@XiPv@q43@DF_MO-|$gwpVFiLr!2EUHaN#Mxew9|#( z;5n*w4fomabL+?8zvjoV+lpU|BIuJ7w9CH6073q9KxlT67Pice1%9Ovw1}J)5B-fh zwLRn}Gj>rnF8Oj?PVhkEaWyi?z(#V0^!Y^m=^>m9eIT4Ynm|-K#14_C@6!-S!dAmz zq_|N@o|EEdHW&Ug{R7pTOY5p|<05>z>&Ej)b%yP+g;37+cJB^T8j({7%RG$*G2Ti( z2c?kx!g&`Y2*naU`D+5@}mMMgnQDf<)>qgGbmgPz%`pH>v&udo$Bvl?pJy7 zj(l7nbW)s1>;Z(Sb7}b3y?(`S`jh$X--vf9NAn|3+y;zg1 zXbRWY*+NtWJ?h0mJ5BpKh*r4Sppt|s!7rLLYs{xd_~-hgI3I9uDxb&O&_Xz7I$vFW zFkeR7b_mlH9&8yEW%#K$uI>lyg73#AnYdQ>QXU zti^O@^*Lm;kIl0-@@%LmWPZpQ`#QCtVxV0&MbBeS&Z+k{&;=Jhq<(aMk=+e8#1AsH z!%nS>La6?X8%0!H;Wt$1z^Rv~G@x#g|MIHVKSj=piIbW$N%VU zhGtuM$)4-*QvvV^WrYPJH2%XW+_qgIArdLTjBICb!h~iV3De50)HZ!^ zebqnS-a_q^dIFmVJR9RBT4*SPj>wp)UnsNp>-u^;ZA&8FR`A)x`6j}8!>v9sxu%@;HR1J=MHI!6E8Zf&?Bt^!hMU_YS5X(2WF?uf0fuCC_U zi`!Ij+qz`j+3>3v(6&1^_ncok zgrQ=awt5=A?Hxsge$b*yUgk?)K3tu)i5@J^$X7)7r^kqO*hX%r(Frg68W-&&c>7DZ zgPokB_@ zi!pc#+fIOU=8_7(-c9XcvkqS;+3Ak=My^rVyAIi>R2z1I zT~&={k*>w|)o(#LZh)Dzt)8{9?zJgNtzCPkj$yN`uU#V)%W7H!vFx2EqkZA$8n8%0 z`#kNM32#@*WyoZ3ZPBxKF)ye1M;^WQew3J0bVC7pxH1gMi!mE+3@3Qj37G(4nDf|e zO>~CGINCnM;Vgc0+@1`XmzCd zv+CI_%hny+Z{lK*$f2fbw+o9Uj1TFkPd4JoBS0A;MEdhQpr_8`2yvlvIkcT&&%wRe zTQs8wr!8&ZhV;H}`7lEt5omZjrRb6MpO=?ZEjrtjPj*K)Z`&sZ~K9B=@x7kKX_d6Q*q=#Fn$z9uu65rM0|R)istabu^{e<}VqXTNJ_rm+*(SOBT{e z;w`IDh0>ug9Zr3luFqsR6gW2HNVZFSe^vxDfi}CvmHH(2`p2Uf&#VlM+2RY90BaT; zsTyK;92bL31q`>!_kKvROgszbOV;?_ZWp*WadK>a0yxm~*?OCVdbeQ#-wghrU@WRK zZDB?uEvlaqB~i`0x71M7GG*G(hoLK$YJq}AVXoi;j6nX=5Q?RT*cpa^yA+|v7WlOI z(_lTR*8_>N5}4UcWY95+Duu1}6kkDIJPwKbC8}M@s}zmP(GkanmcEVc7X}Is`V}*b zT!El-yFlAYw0=c~ViDbIc0NJw}&X&4#tOGttwLF?mdVe3dGiNLSB`+ ziI%t<9{ra;e&=HFo^BNf%u|MVkE{cOS~3gocz7=jxg)I2-!xYt^Bku}_z*>~QzUu( z`o-nnLmPjPAQNYUEm-L7O%`6pO!v@G-CjGxAR55<-h7lH=juGmxR6EPq($#Us&pT) z;>$L_hRsrX-IQ!4LZ&WJ5BGjpFJ9KZnJeFhIIOeB%S4i04dr9=X^7t<#5CAM+t9+v z8PuX=Y!x8jUrK|xxiR2(c#t@jxd#&G-+zi`aT03n0czZkGT3ph4cJg@bUtXfn^LQ9 zZrE~%+O`}qw`PNuK1FciyBDCMGnDV#)7+FlfnH+#WvC8_Ej&x&s$N%X1eOoio?!;`$S~0RY@JY5%Cd2XrjhsEV zTNvO?L)+%hthf4pFH9kv7}qD^n;dMsrQVsdzE15LQBOL{Y>2E|g#tj+hSyPKc0>~Y zz-2tq>ep4aH*(Tawv9JqI4^i&K~8>MVtVm8u1LZO%SzcXVYqvE712ot@0)yTq5I{ME@6`9)ksDHoa`mPOv+W%qPkS z3YHXRQb~uugM2TJ!PZ*hQLODkNt9*t{uIt?!Iu2G?YGl$qB4XnN*NIe=$<9mxXhrw zb+@QoD+#ul!sK+x?GEpuhNUb3b0ZjJnS-qir;9xq^Xl6Bp54madlHS{?Yi}D)*pVi z2Vs}XLQ9m;S$@DlqAb{&XzF@*DdO8X{;?}lN2&@=-Wa+<=3ts;F^2WL?mQ%x7C2AE zgU35(9sJvHK*iAvh%_;G8WXrwR9>QP4D8SZV(;0Ty<)i?I!Ju{Wzf|d&dC^?&9x1S zO-;^>c*ElkV_V81y0s4`C5TgJ77wrd^U6nBgr<(VW~Lc#Wv}KfncE|OrFG-GUtwRA zwADXy>LQ<8PvXWxM!zIDCM~hx@m1K6FKSw_zmfon++$xF&Ns(DW4*+&`J`vbu&|xn zIx93_2m>3^b~8r7np@9izD3H!TJX>MjVMA(ldd}?4h9TAic3gOvO-iLyGCw){OumA zOonrG*NLrV`aWm}seT_Khk`C24!C$TPAbrGy0aqIRPg%`a>yDs&zBT9Q&w+ipiJ-~ z#+c3LG;A@ahA#+62F31_0NECQR^ZqwDM$f5QKY2_p7J=U{q$pCxgg>k168@~nyyiV zgs3o5khcz&^1J3gXaaeB^+tM;d30OPW{F*pl09cuy__0Xd8BR#L?B;Ggtb0>A$(=a zhrG;21$lx%@*qNKdL%4J%Fj`liweQOUgZ&-+;~Bpi<=MA#Da6CrhA1(3T5+A{qxlO zu}fIfYu;>Gw@LO%v9){%4r{+d4clV>2aR_&Gh^0gxOGEee_nxYjVoT-RAtj80fg`2 zSKcS|CDbMXo(Eb{(pH7x*bEihmb+Vg@@w?ri-7~y1-yUFyB*|!LxPa~6dD5|pH<^e z|G!{UxBkp9=?=dxXa>oBTSsn#+>uXE&s#1`8~7$Y(i~Upe*rx z)y$Y^s8wQ9WXKY3#ppjrm%RrjVO1L}sLG=@56pFUU1AFjGs?^nbsi4G!F!y)aMpk= z+`hc7Y$IG>M7o~Af?kfNx!;vxW|D1o`rHt=wFAw;_tN3U`k(QrQPHFYBgFY+!}gRO zMME~z0rWz0+SLgc;k=tQ{skxWI-AG$RfBedU(#HxeuXxtL6o&9@ToC7kbS1i5BXAh z?K$A-tnEm2AP5dD(@8Wa96NFCkOFt3NkmEXA!;ZYiIGOOQOx!MD-nyS3=|TJ8TLFhR+3LHh zn%>Th24{^P+ri7z^LBOq9q;pKEJO@5Kc3pzPXUrN6NXB zd)7!MUpNQ`K!>t{*;e*f%d9o$^_*E*iL$a8-XfsO;yDSWM$xytx$tZO+n(v~=&2cP z;K4uWTHhzVTK;5sr#?dXQz3`&UF4HHvQAZmX>7(6DP+N7&t$7mGL01eqcqU-acj4p*)?5m%RM24J>6Vs;F8AJ0JvsDqpM>(Jz( zZ^gsl5i4v8T_^TC<<`850Xd_LSj5o;&dA`mrM3h`p3mo}4Qcr<;9EujVtvAHcXw~=S8Wb79eKqBqeW!Sd3 z1kY_w*RuE`F-V`U=CjXP93$-4_A9^SIn=1E$Y8*{rx!=~g(UtRW;xa;#4SvN%|gP6 zdm&$Xt7k{db-?!1=`Vrv5q-3Q(-{L74Ot%$2!_YJig>e-`q(i@Zt7$w8fXtzI(Rv5Ewkf3;!+-0}e{JW?-n z3BcL=FJnIt5@@mBHp7D`n$7SE3f=b;Sh3#z?klj?w&-&Isla*Wp<>6!XHhp}HBsP= z8<~b^F7vH9RqnR-&MJ%0z!UitONAhkZknQj$IvGbAs0upz}J|@MpNa+lBQY6a8H)p zr-=~ddWElU>((gFw5I`^R;6U*YMJ=IkeoPJE&hZxTWN1Fx!ox<{tjcj|v# zTqFogm@h$rVh?Y8#}ZaPWQfglA+GU+*H%2(Ex2WKyWcV00O>dNh`Q*ycb9D*jL13o zwoV`mh4lCXTD8Peo-)zg$U8a%E5S1g|9;Lo3eV#GTn`eH@)Q@F_5;Wdw&$eyBR5t! ze=EJO02SE+*KrFFV6)#)$KTA_`R`;Tnlpbmqx7NGj2!q63scum}Be=k_rji@$&ZJvV3$J?M z(+q2}ZGy10?Jd-%wnFgr56P_p7y!&iC$+#Gq>-f3vl#(WCL?VSks_|P`br<4G7p7k#i(8 zdMP>FVKNn&(rU4^Xq_^pKdY5|@*#8Jp?=tVn`X-Lc~N4&J7oRH4#f(8UEh_$6Q1_m zR0o89a%i<7lULT)i15SknVF!$iL2iG@DOkbLV|$w-tx~zcrBuZaMHSs*6FcBIOsly zozASiN7_qp-Z%b0%WvYPotvh${yv~5SN&U8qf(EDC8Fj#U8>|>f4#nh&#G?-6U;M9 z8rOkTfcEtAigdCJdmTSsFnOnOX!_^rpv2ep@ZM8jGm^~yWi0)EH_;3-qP9iK)$tHw zZh?RR0e78hZIH4+2))Ml9F`54QipM7gdd-N7^z;F`$?vLCp}C}R<+Yjl&RM3T_OP% zQlm!6cMIb|gt<_o#kt!kkC1fZo_tQ-EOZXvKRTrjryo-6F3xUvTqw~O24SfC_+0LF zjE_1g;!WbCbuXtZ-sd4oxX#1SBa|$X?-4?TB8wnBO!0l9>J1=VUT!$7o0=%Bc??@O zlU5!Gc!jRyV*t{vxzcnK_H|H9&(*BCX@AG05MM)mOG(v6tE8deyI~1R+gSH5Xfw&= z6=dzM%8A)4NYx3Gmy;sjxuh@SuFB31CZD-e)T(R9$rd4h+3nRs-OIn+?!Q@N36Vuyg3P^ zS(nw>GN*~JeXcZUwy6c2Kf5oFfTAJBQ6zn}&gH5Ky%oMg+NxgmGY^q z&C)|mON@NxXYE(fBbC^e@-iG`{tbuw87QJSOo z*QPeUL9G*LAST8A&vQoq{&>x3Iq{Pgtw4TsDbFb8#B7#9I&6@4LnD9DwdrH#dbT&o zwRH~cKP(gANX$6q>?3}O-p8(FZix;PmPl|ZzLa=*(URNyisE{IxpBO3A!nsX^1nX8 zY&;Q##-HWEP*4B1X|f^b+aG|aL&v_d;4_9JtItPj+i!z7b1PFAil@#mN-dhD zTq52CQR^!k^1uG&Upxl6>2ch46aR8}PpmX@WmpxbVYy0a&G3gsltb%CKoy(b#F#>s`NO zw+PLgYZw77+tZU>e7?&fzI$;PAA+`{qPwBaiw zV*ahw?ZGJGaHo3x*CKMT+BjkA&C$_q_li8mV)Bcl-(tEuiS+VVzG{m8*%uYDn>gEDbzbmVP2!_*yg_x2@Au21Z7alenM$6t!}iBkxXiYx z)>gAACcEX>*Ot1_cHL5YeYJ&ZLoK^SwWdZ{Hx7JR`RIFpS>yR59T>b}^kJHvHiTn}Z8sdH*R5R-NZ1af zJ~+YwLkpuF!z>@6(x$Cj7;=jc1Zz&H;o7dTUx5lOSohrT5S1cJ{G`tw7XjqeBS0wX z=}_{M$r2&d?njB+6_X!jOcG%@aw^cFI(CAh+&F~Jw0qT-)K)Q9OG)gDprF82%62DT zzf(%J)CsPr8WZ~LBZ1L`hY#Uzd&Mi3EPAO?GIL?%lh(h+wYNXi?2@ySRdOxuCn%!Zhn=wFwpCi<@zYpYdsrasPLin#@iF^ai| z`uH!n6If*a9kM1TNI&P;%Jh`XHhf8jG~QH{x4g;MHwG3;vAoI8BzUl}6Hr2)*st0* z;Z9a;#k~dIyMq}|oiS#-jPs?C2#Z~>#CrL%3Sy85?EDGataaWPAuLK)FtpEM$BxO@ zgk?tr5uTi!>v;QDO}?vcoZLbjpK=G7$*2e=D2<7K_HEoi92k&h?DUj5H!m}jPkU-# z+vbvzS#4@xB4EqeE5enM(RYflyEh8V-KDbwXnwmZ43*Z!;o{n5puP<9!bTdL+T=6xWGzQF=LhDP zCd(ATb*|!x(t*63W7ktPA`RHs{kzMlpG#El&BvC#O*3FblD0sYfBGa#Aga zhK)>x_}k>dHU*Bc0t38-CWR>Z-;Crfqd&BGpe>pE1YY2!@ndrx4JLN7*VZgP>^KFO zOlI3G{Qj_`0>$|I23=j!1dca`kGq3QL+s;HcZ*-$WH6dnK|os>qamdsP&Z)mOOU;L zK}I=zzs>20Tw=aMb2_o-<&<urJdzzTqxObPsSKj7or(9>dSUO^5YCwl{Ow| zL746e-d+cgEJre@ZL0=nZiHOd+An&HO}C-)=AlkH0OpJG8d-ay=Ei7JG8{jTZtc)5(hM;+X-y<{ zei!geH*D3Qcno9Oz8)raeq<*6%=)FLqc{`ZwfGjO5)iekt&1M{9^HJN|yI3}^vE5O7(Nf=ubHU>kz z=t2TdZj=nLR{+7rs=3u$@_z~Zg3(OC408v(ZNM|uRx!>$C_=m7p7+mX$0WZnO!1*C ze2#FsfikC)(OAnG8z^2-&wKISqTRd}Eqetr`&c9~FZqjRX@&)7%)RN;i#8zQAp4)| zA{|aLjoUt*?=U@n*EeMvTgKV=*w^x;|3p`_@x5skb4pYk{kjzS#m3mP+`q)pW)=y{ z-ueDbp@qK9RTW5mU2ZD&KGd%#J%b8Sk{Jr-uN{9LKk*(%tF|=5V9&oa$5~d5gCbI2r@~wZ3p7Rjc zh+xH?dbYgv7Vu(=D1opyZ@AAqhklFQ1b&Hsa|!z!gTu}H%TRx9Qlj7U<7c*~<#xr* zcC~qyUjnAnuDM{E%4xb}Rn|s0^2AqX@gqGZ(L7{~29Z;eTk-nEDWtQf#hx$CzKJ`# zD<-hOEh!|E%(j~K5Q$xvAK%6wrJL-^m|4NM9;4YBL0Day3kbX-Tbg~VTzv}&yrj}g zrcaIs|E5s{T>I8uLJ{qi^*N^PZr1Fp(}pSD&L!n8KTJIdzOWUO5q8(OJ?NJVE9!6I zaofDOHi}F`UF9O%g4{@kgDGla_OcH1+Co}bx zg9MV(8?o*VyBF6)EU7|SX+&KEA9ER*_Ta=bWMwxqcZJ)`NsU;tJ1xFt9+FN1j|@9mW@HOckAq@7*m=&{6iqyrBW3P)-8!1p}bb*Rgqk+ zxH1XdnZX@7(z*EM6P36P={v%`mgRgVw z5eCqfZQHhO+qP}nwr$&Xe{I{gZQJ(C8J>5N`vdl5O)9CKtim~Jum3?;wQe(maRo6s zlEErc$!65B&AI-ZjNw;qPbQie1KqCQv5W&7%3#X+nC2(Z$hLiL9^7oHRANS0d4Ded z`84MH?cU%moH1F;E%!-`$tQR9BZhL_o6BrDqYX1Jsb$H3%&kr>f+d+PnIoAQ==Z8+ zcQPZAh5ds(_UsMxl&=``tZFVOS%j%!OFH-|#Ji&<5mW^MxrQ+6+gb`>Vm72~UzvuL z*8`Ds!46=d2Sk>Ps{x33>)c|_f0iX+YzD$Y*1BP#*W_I&hDN+R zz3?wQ(zr2Vk$-$F$_w}w%&~2kd?S@it;eOg~Oq-C@zsyu%A-c zo0Y|`2N}o!#@zc?4ETqPBLBOd@+_Ve$snWcSBC8dKkgE8PZp1cZs-CvhwD$DXU(ykF}n3DjTW*9JHDOBZ)3DTO>nDWO8X zhM7C4D-7G4OP((xye=D_Yer!zyQ6<5*y(k!#}vjH6NEPh_hu~jwEigP5Ns#&@iTxs zNcjAUatVEqu(q=WtUTWdjd3nv`FV1j%3puEkO!tz%=BnNR#o`ecmwA(^BhE|)7{@D z#9}MeWWz5PWE=jAplRuIPSO6B%<*DDx{r}mNl@AA@m3-Y{Hn%}>`_d}hpp!)nfkDpWU6O;XmI4t0x2!_>!#x(@ z)iWRKLvQLHR&y|Q1e%nexFt2&&5G=HeB^QhkY0IBR`d5gX6eLCz;C*o_vuh+712EA zO^2klmx-2d#fEReug!e=ySrAXR&fu5<(F&417ajx~d>0<$VMTd4MR4dLhW>PDpUWTp)dG)J9 zI+h~zB=|{7DYh!jCnI~#`JH+v;|P)aKdi^=!nm0+tFz^|#aPloU&_p#yP4|0O-!X5 z_-sN^|9Ke7$0IX|mMwnakhB>Ds@pS*%W;y16EDfX8c*;s6Y=&QjKQo-;mB$|VNog$ zviyBX4fJS`K-4?H7I2!7vXWI3>q6ax{`sE0@PsD1_hbl2+gH|`m(<`+Vs}VLsw675 z2?jVFO7G(`v@$Ylb!NV>rJO%~#MWW;8!p)+e+w6TD9V$o{pfr*u6F2E3O^%+Lc1 zQTX>|ldJEw9xM`9fIj#j7C(4=_(5ffr{{Y<^0zu0M+IjObCsDPjOq}@^S7Jc$_^B5)RKmlCD!-Dc0RT@+1&OYa1C2iS{%Txf7R z+~e9$QOxf1oR5Yu_Vn9e=oTQ7>kZ4MogMUvdEz4rhgIko0*&AE0W8~~iOJg@5lo%8 zl*g)2J8KFBJ4m4U36!UBf&;6_I5P$uSbzC!1uoIJ@G(6E(ulD-0@qJ4VQ2aX4E02? z)pdwPsD!G2R#ssbf~OBKhxzp{aBIxtey=C6*f+fg+JWzH-DeXU^}*6(k%J)I?MXhJ zp*&?os``Anc~O~f!J%iq(~cGV-X7aRgX_c#RKC;E5yh%;g2j?W%L-MU%1hn{F+h<9 z%N5ZHDs!_u64pJ*p$ccNYey01B21W7fKyQ1c*ba1f=*L2R&prPTB0v=Cb+L}l_y+` zo?jq%ony}yT*aRDP+bcWu`i1_g;*DkSE7l_UY2}{V2gxTBZXSE?kRvHJZT>UpafCr zFfWQ$cuL3V#Nv{L#|*5Frb4(ZGI1+RRYY7GE;-81Ie0upa21AXiab{L;2R^O-Y~*9 zxmb^$tgPl=eDY`K8FzQNa-Y78xo2O!^rtTsy1nbvHc9VFPvgjvZ9n2*>xBcX;#J9P z`n+a)M|NaZoE+{=9FlcMikzLx)jppWXme*m^T-~ESOT>J>gltlQHCo=bR_8A&hqWO zuW1~mg62=xpfSWBQ#MVst0_6&z?g|;6b&U@**Rne!R;91*Qra>dPk(0o2)vE6=K0B z%?_zNY$)hZ(;ms_Nmrk=Kq-6GM|`Zt=flUKV`d*Du#-(MwWZ zJ5@qAGcWV0wtp{T(1%fQQu#GC8D(r~!Mu1KYymfiI+QMne!rl*IQbri>hQa(7CHj6L?>2XS_Rr3n2UX+M%8}H8b zK_sCb+KpAFFV4Dcini(0X@xL(#=f}oxaF*+VnGRAhi2?5Hi#f;k5KSn%+$_1S1u5-+#J^?ah!L?K|F$tYBy zrvM`&?AoI_>#~hAuRtR(BSpNih@Pc@u>PXk2L)Nz^*B85!kKw|UK6&2yHoODlk!>* zWG|<`gn`mQf)nksGakd8V)f_Ih{<)wH05lp#iEKcn11VE7Jm2ns*fPR7{%A@OwEcf zqL!eefog|Phl|vUN-&NC)*wyeDOb?|DS#(}Acl{`5k*L&MIsNQhM>lXoK+Ll5S3)n zW0Z%EC3ywm2b7$=hDMdYM^0EDT;rlW52snM%0&|}ik81>-d8q{khp3FK)Mt|S6$@7 z`vxIlkE@QP!ia1DQCzu+MkT_`?NByP-fyZ>7G+Hz*19+cB3)4L)ESg)PNmyw;z%V|S_DMQ8};i= zeG#~5e5`iRceU|-(6PzF-B#Dhy5pe9sN}X*k(%py8wd_e8z3^H#GJKb+tz^m=APY_ zpuNWsdfE4u6!zjhK2xtHDSk7PO*?t-_~v4tB^U1EFtjS$MwdWl^s#4r0aJRg?zIYz z(J4>>tzpU5!v51x;gf(Ve~zKmvxaC_NyS|j33d(V8RYhKW5fDKW!E;=Q>37mORL6h zMLMl9Y1b&PzDQFoAByUBJuN!P#orEtAlz~O1FY-AiLSzVNc5M{8*Ps0nY$<8*3rPi z9${Op-OLIt+!ws_{D#$R$h>?5RbZ&#;@qWg9{o@pjjRu6le%S&;f~!!^@Hdsy-sm0 z)rZ>V|65H0N~tNbHJ+X>(){vl;~~3coyjn(>rz#(HzQbgupcb#eM*-w7oF56G$$-+ zHM+8OOVmN=7eoSwJ_%yue$r~I4KO(#4xu^Y+yR!vy{O)FnNyetnZj)>QAU{-h5e<4 zlN#3~g@kZ?h=XU9N-|@L%X%~FQ=yu41MxMe%hyk330ufsf|{;yMYAUbO1c6N6!wB` zADU&Wwp{B>CE|HNAUIhXSGHvpZGE<28@GLxyZcUcp*S0XO#M>tc!dsap2>70E2@7O zlaz?+&8_2VFP0ysG*kFh8?xBkwKl`&&%l0HVdZ>@x;&JmGT5d9xlTKpWgjok$6NqC zB&5z32p4$4&CT*}eQC*kSV?6hL~d_=L~#Yrdyf;X=pXN#FA*4|4t}j*%n#x{S!TV$zUdY~4ZO^`W zhY%_QmtsFPCCFi+D{!rfMGn2-{r(;BnU&irk8E#ud;p3L9aliO#3>g9CAxe0;S zENbJkjwhbZfgO;bSI!aJ#9ldpVOpf)j-8MXa=LYekZDS)SD1%4edf-rvV) zN7GxMPY>MVZ9a20^~zj{rzk5vbsl^hRh6 zE|>@Z=T4KSiyQ1qV3@zR^88sU{vVdl3-Wh#(d1?l*~LbS#}6|4-z+_nnNKaw%|F&) zuprDb{`78wZ2c5KJfC3GP6w-ft>-(;*>rA+q-iCam zXM07lYhYUD?fH4l7h5n4O zYQuHaj_nQW{f-a2kNS4c9M~GGlg&JQ`>A?9(2&E4$DR1JV`(1h4&$2>n$uj7A=YaUVbuQ&MT20N`8g8q6=;5&hHh z)f!K1et6T0EwX+fz>t-C6f}fJgGdLrqSrVNbeXa}7m1D}+BM?}`OvdIBy}!tB;o#zv=d#_^Za-Z520;-_5{*2fiR(-#KtnmxdReVW?AR zD*i6OZP;Ov|EdQx;r3wRVd0&)*1&-U?^T?bjf2-%_qErXjqfrS-+gZV>#6Cjy!aQ+ zn0OX7JF-wTXVpfGRSTqFHhe7YO4RBHUvL@`;exZkX$@!C*7*%fqB#RL>zPB*3y^|_ z4$A&pi$Hlh4cP6uCcS&&*!6kvacGPU5+`;XNiV4Q_L@82gA!;asO zA);HdDF7@}^djM?;S}+GX?tat8G{St$mkHxToHHZ1T)rNZKni&;PjS8<5z!G6>_G* z_0DUOKBBk$?e|Ei&KTk1k+U|&eH2>As+<)g$F)j7!<{Gi@%t9#ux}?rQFWlP$@pz) z{Ot${71O#CNI_b8dbPLh2#;DMQs}*ARD=H!3C(3L#1A! za4!}nIC4fSmtb4EC0a-@8+_olljR|RRID(onxQ}eG9-Z}OLcQEw)^99d<-WXtaH zhgjU}^$O_`At5Mn!*D!M6EwIWHyq($k|6^eA3#Cmi|saj!hetnSPvODNseGmT6@_y zE#&*a$2eq5Cpwzs4G)6;T3%YD$+?*C+0qdJa1{S?3V^vTdO0s$71WBR^l8iLi=`_u z5*oSyh$7cGu>71}Q#dQi6m4kJKnV~m2k_gq8t^*sS0Mv!kpE+RVrbM0Fb?CxH1Dx( zd3}RWVhQBeG1_K<4hHQSP?&}@ux<+;Vd~EqhV)Pgaj*$Z=i&2`<u0PCez=9BCT=L|<5^vMH(Gl#fDxW(Xv6S* zho@8yMX4c-cQ#2sm?fA!B-!g9iKW?|NM!UmllCx6d>m{89BvruIJjxS2RIrU;%p_T z5lzU@h%V$8-W(pJJ-Hawu$aWEHn2%l-Tcm~5vp~2%fx+b;e}R$hruZ=J}8ocf$2ui z%l`>|KVQ7Jp*D+yyqEd-2++8rL$V!T>2Gkp zBy)Z#WTU3oh1Lk@KmoF>StFpPFa>G{RU(H>z}i7;U=3YpnG65}Npm$@DSwdWc=W1L|t;c=sn2}7)o@u7EHRXfKg3%rlBxc1Oksv z0Yiu@nQY`(5)hhytY!O;zi0@Ei&0^PC2dQXO3OdR(nK_!b-nt&7yAgg1^xTaaifkh z7KV`^4(Q8oBnw2J(uMPCB;}Pa)io)x>B2+fv|>5xl?>$dOk&o-)xYOlNk$-?X0cr= zGe2!nOh%5u@!iE$v%3&ms4W=vIL3K@CFoyI^R57tetcs$1wb4iFs`BE+3{{H(799Cg#mbBpvz^Le1!=|h zn$l!CFX?)&tyF4*Es|fUkqXCXL2YdgSFN^?+K8V3NBH#`56+Wx10)ZIj1vn&K+UgD ztyOW0e_5bqvCz6>McR?OSYCu95*=<9b3<615$1h7Rmgx9qVj1<_6RPNPn5K)VVj)E zSsuWSkRHe(aGWH_tHPNuWYpol04jhWXd{KA(anZ)RXlVkv}S4hRgldN0b(En9&VE3 zAOJPyVIDa&U@P`y z?DoZwEsITE1kft$K)1AnJ@}J)A`E8PAG%49lgm;Klz653Jfmtt=1Y1*Yq`05o3f9Y z%V!WjISg5pCE=}xqvdxTN#J-Ad|{E9ZFl7DIR=$m%mJ8}MtnwS8h>Uab)tQU@LOSd zmfBuQ1~xt)*Bf9H#|s!<|5aUU)(Jz9r*ueT%FhNMTaw0wOGydb-`+x)vuv87mJ@K! zB*4}Rj-|W;>Uf;U>{bbt+KPU77zv3sMF@= zZEULV@7MMcmfyyc5OF_F zd@zvSHH!>$XCgK^bYf6N$FsQ{QY4sHp6%jJJI_Pq@NdWIiJz784{+()_2Y?m!-}+F zwK<}RO*;HiDClq%y$NZDJTvW*disL9Ez%;o79f+-ERu`e^tMOM|F7};%bRqOj6bq7 zVa{XRH@gZE-U%=)ctQeBl)R-UqN?&zVAlZuTHS<3nGtx}3IB<h=#(|Mh(M`*qNbTxSNR{fI#9qQx-jq`q7H1Nv-XiOl0Z+z+c|{P(9zz z@mrLU$meP+4dqK!#_h}HAw%p_XyRP{MAF$^##%}W!;+pL5#n0w5)ts&>DS8Y_1AVJ zK50mPJJcF1_GOT}}4W53e4bi7th`Wbq!h?6p2dlc0>|uCiWf|r`Vj)7Pn+AstaP}qi&lNy4KM9RXq2XFkZ(92E zc<24-%g>gF6Dtn;`o)9k92UFU@>iW+E$lbkF_Er$^)g6<9?imX1|YC|$gG3#dU&;T zkz$3Ujs?rSf4{F)`I|v(YRnXXz<1co)i5q8e!iaqzxt7rk)=1PE{5<~Ktip{)O?^Q z1i`(m=@P521Mml%O!!abAT86;{ymqJJ@;n(ED~lzu-HS1e5WjrU{HH*bfO0hKIlR` zsYmgZ}fuKn$Vf8ez7|-Y<%>i7BKdLxHp)PSppAp$~25eFO<&-p0(&x zwp`y@u6GhYI1RpRa*UaueO*=fWOUu`bj70={Oer~y5=hFIk z<35O0o$y$IbHf`dnL z3DnEgRAVyC&VZJN2Wz3NF(!IEb7?RsrB^9!3^TL0R*Hw|q&&0}u@}l1SN^zIQ^_RX zM=@D?b|LL1Jc^K##RrZ0*QWNpX>!nF;wA}%UY?^~zqGzFUqu#`34b`-Es7IWS=T9( zqa_bdt{C^8+Y%hJ=by@>R_Z^N!@nuF&Q^^=T*ANQ5HBO8bk=2G zKih=UF8Q)|hyb6(^=2Q#6(rPPfp<8lTO``bAcxO?4<0tw4(*~_5Y(`u)p-NSRHLExp8}FdpG>XSmHhrtSpvK( z87oVVy8(@;UE!60&UFg>x2)J_JoUydQ}?DZJAQagyOu}TU7sB?MZG&>b;`l2FDUDk z>K|-!x3Hbyj>(FVwRp-Brp86DRKxMi9A;25DiV0y={0z{A`e-M>}fK4b}!Yznh`;m zw4}~riGk&G@ZMrEE8R;csI==B<)PeRoqUNn@rf_$fVrds4xI@NX=nykz3z!3n{GQa z#?#>4>|&TxzDcnJC)v>i`Ud{ty}GWW+RrX;pJy`&{;amInN#EQwTxB3g=|hHhVbGA zt^^7&d^M1i^7fuQBW!)ogrQ|_-# zVHTtdz`l$j{o7q8K{S`(I+4GZmM)v|!Li>uE1)cth-d08n#KFIUuqM%4}469%XfX* zF`q}D?2iJK*=B$g%j~qh@2--f;A>WwJgS<$>cktZwShj-1`g}DOfWXpZdd5J8SIXX z(O?}4CY1S<68cND=v(YjWY}e-q-8RTCs`+v+ku!?Ox(sz*O)7skz3GSdGnt56J=h47atEsGoBptv5 z<$Pkp9e~*8_D=0tGal^=1vdx#01-x)_q5Pee2++{fqu)~YRu5B@`g`4)=>axZiX_= zOe30?6;1rV2G#^`w}CP%5e>e7iAVa?*z#{c7EhXji(0AZ(Tx;ZZ-)%|M~df@^*=uN zOynAYQfW$0-6*|ss@m%Z#sG4Q7|;9CVRvVR(ASFz=b_Dsv3J}xl`yz2Dk^^uH;ObM z%FezJ5lmjO=+5x#O%u$Xs8pPfdj)H9w#%Wr(!R1*OXngFW+@KR&wLz!;;u_Gotj^3@J$>P#IZQlb3@7v3_)@Qfd=vsSj)zmMJ_ zb629_Q=LCLR`~xL3#56gMI{&jfGjKk0P_E0QIQvs z|G$8wsu|jEu_652>N^StYUvqw$wJ$}&V$-^vVmriS#;eL3reO;ha#~iIbBzO-FdsG zjeu@dIVklBB7?eFDKHI<5??kb)?A;?}AJJRlCw3n%c zS4dO2nraQj1Doov{;QeO)!utd$F%csf58sT;LS~hG;u|(w1=)zmEL%Xg{0bD)Jol~ zGUC;q4{vplEiam=L8C_|S`%H$&~E=1ZL|>*1f^~jR~s;Q{zb%v|6UH2_}E)^EhT<) z5l;vbsgRu5MXRT{?fR|@YcB=m6%0W$kO&8U8hu>G6t11VoFS29dqq(vY=>8kS(#P)1(jv%}sQdrfMwZQr(KD|Il4VqHp` zTa(J}$c`N^Qnxuz2~SNhF>>zo+IQ`%K_t4B?uF@Qh^gaPb7TbDHG4G(67p}&%2?-a zLNy5RSCTUI%?kZIrE%ro)zLrras5j^VZcW|C5^6Kpo-pqGKG~+9(M^O3~PbPVm;E! zHeOO&#G4C{J93=Wy|7B1u#E~jDhE-Gr)rSNjTeZspdJTCSO|dO9ZGnN;$6h332cw5 z6ioUNI`_~Ikh3sgMwS&oRY>5)TYm+!nP{ajHXd&X>8v`2uURczbh2%pf$^zV#EtT# zCa3(}pzu9_ZKr(^wsuCQECj%?DSLq<1{osl>@ZwAa4eT; zmi>l#u)VTf15ZqeSaYTH-H;sopw3OOJzk=igP)$L=Ghx6(^|-@FsvS^Xx1RhuCwBk z8G&=?V@PIEiy`w@jB^NxnvU>8O6Y2(QVy~dZ3Igc;61TmwkhlAB?Z&6DI2Qdl$gIv z_f-PrUjXy-g$>#T zqM~;lYmSDHEry&n54lg$;>uT1JUE@iEF`L{mF>-O3&Uef6QtX2+z&kxV%vUiGlR7g zxuF6b|AdN)L7?N3CqT!C$f;|HR2XHUTtLNn)C&`-NB2CXQtTzR^=lq?1B7m*?73Y8 zMrl}J9kvAcPW$A-n{pDVqee1|y(<}{aLZ|lFF9^bPbXpUbG`dG60#U18AC}7J^7y#@7}Eh6JG#To zgW@4UC%#auZA>W6*cx}Y4;goM8M#sfX(X|CJI~;V8>T@U!7xwi7BB^ zzwx^q0haFc)$!@)^!z~>O`e&~Tuh?Fn{kazeOE}KhC*D=C7MZxCB>&>CdgUj0uRg# zs0ko$!Lgq7IW+A==0uYbKEmnK>w$x{rvZmy&@O5YI~RCZqu12zHE``##~aXZSLr(M zfumiQgbfsJ@LXmm%o@pI%p{i+=pb%~B+kK-B{l0*JAyC#sxO?_nBFFLEc{)?Bz|7b zqL;6NAr2AQCnUW6RGEK0em{oNn?SH@V{hXyy`MLbkh4%u5adhLu_>{KxrlHc=%1ue zfy9U6(jP0#08evaiPWw6DUjw=?w~jV{{n3l{(g+y)y*lng(2k>Uf&-OeZSm9%E_Au zP0<7e>GooU{s@fYpnu;RdC3zfUPF39sPwA=od^#HCvtc_ot)HDSaOoeum`RqutYWs zD3rUQ47n~DvG+1wKOP`Wz-!yKLJ7jXb9YKu$skd-*(w++4(YoED1wN5PtDs zqpi;g(xzWy_{}gtp4oqZ*^CQGY*xX;?SHjy=Jqu4a6Ue-((52DekWumxIi<9G6{sa z!;Lf1y5A?Mki$?>7J^tQWG(+eX))AmplN!lc&^QBuM9@)KE2c^*z$+nT7>jA_h6Oc zf+S&4WI|TA!k-Ql8xH8Ucy-}-Dvg-pfBXHkBv3~TQ!afSP_;K-D@BLo7|G5MDF39@ zvVujD?t(RVUz%33Tf*a<4>i=N5vI*kd9yei^~9mqUf1x+m!1hoSr2UZ1O9jFVYL{0 zfRO?K5aj~^VE=FGd2q1lv$4>co7(-~&*xM zogp|!&-zw2_jyb_WC|D$B&b3yK0lBaN%?w%>h9ovK-wJK>bcSD>`cf+g%{M^hZ zN)+EcuFShc60!q88Cd1p4wFxTUG60o7vIO#cp~x_kGlumj6{l@GPzHI{W*dc-y~8& zzq=B@cpehyLoP;1U;61smK-{#{18q@qdU>0Ly)Fn=wNW4wg_H+(vMtuC;nVh63FwR zixF7NPfak}a+ID39ojO*^TTsO0TgpSM<%AR^bOnqxc+ra~VHQ>^~1rX0o5?_~Z277uP?d?*{PPr!Ek!pVGN9DDx+Z zkW9e3<;W-S09~&Um%1@?a`vHL){f4O z-cB6YR|w3HUIJ#)irB@ZX$sXQkcx|s4rH;+{y*Y+PGAD!_-#&U{Pmm910(?#0lG7I zd1KR*;WiXY4CRCt@xg#$$z75+O9-J9a#OM+7SR0cV;Z-&tm6|z%r60^d>zp^=xSVA zhoInKwd8KuMjY?FH%QBywym3;SHUY(LiS=lnb#tK%`j~p=$fUI|59ON9{TI!F6(Ud-Ap5B}7Gky+ukK&H%f_N_j-^Zl-;f z#nD)Y85{WFDRg*~)^VqE?O@AB5>Y_tMU&BXr>RIN=lL_vdqR+;Rc3<48>hZq1FOSd zI5xfqB>o{wgWZuBDGxDs-`#a(#CE>S9Nieo?Hbjp6)WU`+**(z#L*6aXb1_J=fJ!0 z^q&Td_BuG2B9K<0k@~COaHF2MRi~n6mzFelQR%MIRv!+2`^Yrk8dDa#3C3Ksp!DGd z;8dqcXnIWoeOMzMcnVgI90m%FVY(#v`3ZE(?;m3oOe*H?rn!U8$Thf`eoE6nG{uz_NC{WHn_^=OFvd%WU^|GksrXu3+|X zEqtFRDc>d1`?9KD&OvtZ%WOC3wZ%01wg=Q|{qABF4l-~l_TvY}i;A9E@Uw_XsPeDH zDpV9)pN#ICcraH2k>KU4>$hz7;{w4}iLOEyp4{(k{N3@q=QT9Xm5P-BQ;BiNy}G`~ zpFiyC@e0W0w_MZ&jqB<;os_J`4O;emiW$9*58Z|CtQoEDT-&}mAwH9I8g$+Ot{AZU zG|3nuPzrRVJe3LH=L@=opg`xa2ioh@FOpIt>shlne6*ttw0$J`v25cjC-FmnSm)X| zC%O*k_W5)H0iF#B_?yUKyW5g_REkxdfuIi8qR=5)k0>fk7D|EgBPX|qr+qITPk(1e zCcv*ve*A`?)csZ2K&n5WU|?h!d?)=TX!WD3iSz3|uo7wTicc``!f=o>hVEE%znrad zjNYzpPi~xgONp=g<$3(PT)loEhQDdeQ0DaoCn+(N&j>dz^jXc;jJbhY3lY9M|9$5J zc+mGMKRp7H-~;d3pcqY!-tm1OAh;`&?LIzGx51_G+k@l!AyH;29jj%@Uj}o(@d3Wf zAZpOoUBxZcjg0QA_%Gyh2&yFcaAvd{{#<=ov7xDk#or}Z|8f`Zj_%KKnzrk(I+XSB zJ45O~Z`O-GZ}-^OlC4XZ0TD~y+RySJ%?h7_mn%rkDX0E5&~i>=oD!grN1h3^B}uk? z62XKIPkEPNUde1jbp!O)Gk%} z7NCQR_gt}^S@(o)odXpZ;PVm-V54(cg>YqXIhPH?B`%ZngnArnYokNEG0fhvc zgbc-M9?23;7K7`y{&UO&0_1 z1@HKrlXYMkf&F&Qmt`gfHH;^+IPqRZRXk9j-PL7Vd@~Bk0(MuKcF*cHX9rzBJo()? zemz*M<97`FexAg+d~2&^qnq$B`{KBvgOd?T;xw>LknR%5mNgtMrSWkV^Y08I`(;UQ zDxh_#bOSZ`0!lqacnJpy(-G&z12EK%2JzYr9SI#1I*>{ti_&c%Bx(iVz>PF>r`%Lj z5?`6)xD^-Ev%AGq?sz-A6#W2d;~!=)Bh7HC;aQkm06A;~ve`@}T~MNlC{E~q+l#KW!~07fvMayPtmG^;Tkr4( zEbbka3=N-eMlP;O6>f$J+dFZQE4E3}3v7r@1OPi{bS|DCfr)cN!7){jf+*igeXqpe zJQ5hQ2VOv2<>^ON$yWmj#VLiIbkGdB3KC`^VM4m?igQYo$A|K_h=Hr(;M|ZYh_PWg zP-SALA1dGO++ey3W>TY;e832wd1TKC;}w{BHEPtC6<&sHW5dWVov6ww%i2|P=m0c_ zvtdTl^&MMmdhN8E`eFH(0YM+IBQcpixukkr*#=OFPHdUMbRDKLw9XxrDJ&Af`yAMS z!<797by&wQ)=ml(?1by{XWjgtFC7`f}9;kX1_F&_$a~_^HncMgPOfMft;$P zFcPMEg2~(+B-eYi(%G85s6Q@!`5y|l8jABHP@F~m4T~pA`KabmCYW`G*5I?@1?ZE z`+=oePLwiw>!mwX4=XsL8yhBCu-L3b3}e|E|GednIS1T=vBlkW2J(3uXUI0h8s>2C zr9!p>|IxY;IVlu>#hh9Zj?UP8X3lmFpr!d$^}dY|Q0~YsCZQeO0p?}o4TsQK;<4E>}dEA+aq|744z?i?p$oY*l}zwzbyzd2%cqk0xZ`OD!5`C3ZQr zPvR2R6A*J0(jG0fk=|g});`YWnm2lb^?LN)#>R{NI%+~5`K&W%R8LBoqqzbB9CquR znMKg3Z_cG{GsQuNR7dZ4V1_PhES-!nMIPz`_!|HMd;{{>D|HA3Za&;VilMfKclw=9 zIH1@4UEI+Y@i8z|8<2)jX80R+)O|KgD-`y{s=cMq4rV0-r=;L6XewpYVuA4&n`JTr zCQ$`pci|cwV>;g;Qfj;@n8!`}YVr&kW3nPrq7sbpOyHm#ui1B-Xl!_=7{^9?fj@T4 z7i=PEGP%gy9&OPg4c6>I zh_14w?g>f_0`6GE_jfHdd{Np>p+y$av(r93`7~Wt-SxxKPR{^htA{vPH(8RCjz90LLgepr5ukp)n(Et8}VVrFBQ#S;btAGEAz>L-i$Q zS)LGZV-S^tjlWA+`S(i$dln1jr6Jt+g7iUQ=~DSk4M9Mk9}s}{zz64lBZ=YLGH!{O zjf#bvM93TTz`>1id3CtHgv)q;{)^ui0kpQ~@srsL7W3@D~|9;pi7%ldvCm1k4cqx-o7 z^p7PQnY`Yk@VUM;CZ-qV!+udumr@i@|Pzw?+R6v+k*WD@v{lG;hN% zbVLB-`ctINuZ&T}=28w@hT~;Ye zc|eOIkyAivpB~iohevfJel$CLlM=MwC`YUNF%*?~NRd=Pg(bnU=C;kWylSXy63V#BCt&P% zWZ} zBV5cX>?iZ5@4$VGVg=zFIA3x<6d8;N0I6FUXaH#fbu!q0{idAXjrkKK<6{{y52^~m zWWDZ^;gTqm{m?LPgPADg$ksFp16vwzhGOu5AB6C5tTkm0Ay5$_Lb&Mc*Y@G!k>_Dp zw`vF&`!^+K=yTOg0#^eHqR5Mu8d5Z91j{>+4D>xC&MDVxLq+HMI=&W@)`+s2Kf5Vw zl*9VE4`Ya{r@$rUhXQJ7)x_7=MhQNoQQkt`(BkxipoUq2LvY8j7ozwClw5664c_Bs zMy@yB*Lc|(2xXF|nHZtS6u=E2EN#`j>L~$>R>nEGw|^d7fP)sLPSqTFX$8t(;Wx;7 zjC&+b9Q=yIO$KUv-waD|nC?j|-MIx2D2|ZTVd)GGqk~6Buo?~;cKvP7?I^L(--;p- z0Kr}T*8V65hll8WIZr{HvkXT-)ILmvQb^fGxdf6|guWz%p0pA`@N@auv*4;aeYatK zHrMGk6fb$B zQl!jv_m>|}dX&+{jYw66t^l3!7Fwc0RAlKu&tW*VncEQ6^@q`^nP@}{D#bFLduG4W zx%??^i5aP{nL+fA-fF{l&g4VVY*8fx)o@*>;M~Yrufy+(Lg_i>kg*o2h|RkiI{YJ; z8@`$fhPQVz`qz+vX1TuO6@?AZk0G&!c`ItVrJmjH%R-{`V@vuF-(%81%H`~l$mG27!GJB zdt73BSHCmTx$MGR;=Ph*t`sD59@o4JawKdUrrsL%9lbyx6yxrFNy~n`3zbmKv!%6+ z_J%9-KWBrCxD{~bo@3&wgh&?@3zOE!8mww-*@jO$^lSduQ_QoG?tj%R)ks+?;1qBgE{#w8?at0vY6JyZA^ za(C6|gx*xmMXbfI&*xfw&Aa+-QeTh(Sj*+KB&Bq^h<_HuOe+%7T})Kt)63x`EiVer z!c5D{x?NpWWFze%s@WQbj0^T>ZaA>reWR%HseeQhALe9{oeVTyW7@6fw)-Wv39)fV z8lIP3aA>iBoF;I#r#uX%;RGg)Dp6==PlJuTOwUiYURx3SCpKK}UAjp$p?a}nck|=t zcUReAeqEgOXIZ(`U%$?g2QOe=g1(gm5k6C}eqBrs1nEbY0DihEmO(#sW^+~YC6|G! zR&+0a+pB&*uH5=CyY|(Te&=|u$=`aS6+upsZNl>%37!G+eH&KzPyvH4+;P=@&*z^W zi@x1|ypmh}_wr-l@9N&h2K=f)?|1%H!1FGM)oJ%*3#SSV+l!|m#He0rmN@2;CmdDI zL6P+DFEfpUMeZw{-|wuXs#gUXa8{`$}KztgFD)_6H5H&s52}aykyTw;N(9C^>ko2y@+~k ziovD+ODAy*3yQil-C&MO@HSHHLKQ_kmuXmJ-m|poT^yN%{|p^I z0>vKyqgf&nwXNzDpX|=I#E9Zt%k!cuj7sb3%iPF|B%A!1O2(8t#qi>C?~L&rkw$aj z?fAS6fE5c{#84nkLK2~pH3i@hftHkm)BR2bDu@k?XbH!-gRMujk}QJZwNBKz-Nt?8 zA4Mcdyw1Thv(?lV_+|-ix6n#Ju^hVW&u8elwhTCUy0CI$Si-=UQu&&Sk~{)dvfhJP zlye!N85WALToLp-6vQq-w=j$iC)IuDKwhx>AZZq7BB>bBnir+^OJpHH1ie&m?TJj~Y)qR!Q2~WOY>c3#HFb`_+$0snjZF#j9x@R@r1i%q{Jz z`@#kyG1cWp$}<#{?+dYhyH+p3f0vR$?Uy`@TtrqcyIu4*=+Lc;*9ont8mti8jACXt zS%-Z$0Y&bsAhW8MYcwjld`Tspj|P!kAr@$=CkCq0Qtz`8r1CduL&{ON6|Yj0qqzN4 z&`J7$#5t-PA6j`3&?behoS{RC-{4rNN_)OanJj?oH`z zR17`WR}fb_4;X{RSb!B<7!#2TBga&XrbE$W)h|hT{p_o$JZRqn8zlnl2@D&w^ZI5f4>(iVO`%B+BOi81o+3bC&r8xndJLl5Ys z12M2~LUs8m=K5vJTl2@7@0*WmhtEA+SjrplNW@9x-RrpjwmG7&M&k8(J%^fIK;RnAD0CF)L?-_z7JY5TgpH@Uhuy$ry=$&rjCqd#* zmdFpSHrVCPD8K0{dzWyA=~~!W&ID>6u#&S6PrvQ3YSYfLi&CZGW;zDeDE)|gj#2Bv z`mYD#tDp`rH0~5GIU_mP#!(y@@Q}6`unpTXs`1`Wy z>DT!Yte$^w-p9#+Z!ZP?$^~q4UKq!Xa8izX z2gz!8wgqf#Pr|wyK}V*DyVaNPKq}Sw+dKZHoF*Whimoie%oGb2TddXP)Ol7g{AlmT zZV(W_^-kf4j%O{&k~@e8>2v?#$6-DZKriQP4*+kp)JB^bsvac|*=v}rE+-`k$gS0! z?IvTx>kuL$^m7z!J4{QPwNN73Os|K#D*Jopk*B*^GGB%W&G(I?IpnlWAH)!31r}+Y zX80E_a(N8&1qul!>)$~@{K2c>c7EP^%=-^b8vcM;!T!A1#3r_QLh3n zup1w0V5c|+zMb#iQ>rQ99zpo_Rt|P{=R)GX8=1!&33Ozy)U+`CO!>P!4h9J=4ztA@BH{)ee?=V7A<17nlNb#NsOMOE(M zH|H_R*(=m$sfg>cT3P31q0;^l|9b}f?|0eTRtA! z9}}J7!!bl*{<>fHJwPojBza5H(nfqp8(ws@%T&hYziTGW8q3APdD#W;hmL~^heyk4 z1&ea&G_kBTpcQ9hhO0RJDQ5n!d$wFPXMQLAl1}r?&N$~M=C?r6Vp-=Ly=q?1xxl+h zVO__fN^N`!RwuiE1k`5Wp&r)A=uC%3J*Fe^Yq$z?3L5MQqMYs2F? z=(qfDo9gNFCgSCMNHeC&-v>-+?EN8t;_O4cx-ItoKiFX7W#_8$2vT9kB|miorAleEgpM;m!y;ky z@_BbItKDqJ!H)Z+S+!2X(I123u_MVU@U&9m9Ge%1{IIJW4?S{aLrYMtP;nd4A)utl z7)jHO)HMCYs~kNoblXVNZtlkAZ{#uG1WnHFv~(Dlz*T~mR!PaEyaG4_xG=2Pr#71n z%U^&w9GCv`HIGldP70wydGzNC4g&@sylPrrTH=<&)5FOO3R2ahhpvo8W#TQy%{T*S zOihDO{z;!V{$NV1p`{e0^ing>JXl5cT%v7AET9bHCeK+f;vCm#^>c4Z1RcDpSihFV zSK`)3iCC~@_B0Mm2v~z|!}_fOZtCoSOQn@V%h_g_b@x37~=k;h`9$dNaWw z8Z%%p9nu>Xv)%6KmPkcG_*E0Bx7@%cPbiDg%sGe6wWe!dc!%@Gq6t2#G#=h)tB9I~ zCBG+&*D&7H=za|~aTthtL)Z@xjFr6Ka+Qzs zWffcfi^+pi5}TPEirA*^zYqdT!V5EwEE4611K4=dvX^2JoFL`VjL5m3v(|nV@iUdV zv8IIph=%~pUuYg9CJ(QZ;1rm}v__GCImQwGG!3N?Kc~-HqQm402=uNyEAw{RY znOE1-8+QgcaY_e~VD5wSF$UY)F-!Q|=~dz)#6@8&MpvstMP>DBT(gzX+9phziYS=- z;+Y-ADMm^>{#yv%yYKz&If?wKd}jK(ma{sqzw9VHJ+TEvv52_(7stdJv5#5qt=%UU zoYx9tu|=^x^y}U}F{LGV_U1ZOWiQ?|5$=^6$YzO8yE`ZSUTwVJ>~Msk?owiRnOP&w zC%dZmjZEhS#P{YQ;4f#G>I3~t5s;_RGB*UR*5HNjN=^ym2j{eEC)I>Sp*|2~5XH8K6LLQW9N1v`6z?;nZ> zmqO92|7@`4|03z0L|YPPDRa51m~59Z$(KCZ`3_ek@v6O8%JFMd<6EsH#8rzmaV^y( zb*vy~EU<@-c^ea=kjq#YODeD}hEwv&NQ)9f+p?g^klJ04CAq*Xm!TJTIc`UuxnA!u z`ks~6z!r=bkvS=w+!muiAQS1wAUuwW+}2+{PyWIMbeqAYmTVl0k=ZF8fdtwo3V--# z5PyL)B<@%phN>=z3@Zild{*{uU+mFD-8u}ak$=Su4n!BPiWUL-J}IIuCHjdVWxym2 zo*@9EudT^RU9_uWIV3*Jc-HBG1I_=rqGPVZI;fX8?{K!j@(r1y<{Drdb6jkrxTNu{8dq+U&M zIV(VB-v=V;BShqUOGa5lt5PU?DZ#6vz==zJd6k5o|s7Xh)N;_~9k!sQ6YNec%-XL+z9B@S4MTh2O{o!0wQcCt8)SVWOz2AmuZe@T<@IuIP! zp{|OctPRU*q9`T^5-|NH^y4!%1Sugm8x(Yc$~xaCP2F(y0p@YI>?CnySd|PY!=eZa z-@w>n$lWJt5(qu-4D34C591mKOYb?2^jzXSH9cLs|BqTVD6GiSj`VY>iwgk2tqlNx z@}Fvzi?K1C#eW;cUzy(0|BGVX&AsJz#FjXBRM$^pZancI+SrB5y*Y!UnYxoXo+w`U z*_eZa7a43*N~t8R)N9juwpB(40I87NWsbiJzk{TpN`Z12N_B2wFMbVq@a%Ocz+w1J z<5ieOqi#r|oL#V?*XSiT)b*vq@?FYd*RlzIKS%9&GP5+Fb|@s4kOl@2wLj~V9zl^^ zruRv+e?*j`WHLeI_pG#mI5(m7u1BMU8LXKb`s7L{nhs457mK9joB?uhh&i_ENT8gs zC!H|mk`ZAds9!72%$TeR=Dfy~T7e$1^}++?GmHl$?noAr7J&+9_Qr(pWG>V#q*fY< z>X-uHLl2+SPHY14)chGF!;FD6=EW-Npifd^;lXJ~fI0#7klFvz6wb3RcZ6$~Ak?uT z5X^|!E3a1H;7tIj?E_OJFmehoP{^~vV?v^w`_zju{Cm*r;X{W5NtATR z_V|xu^8yPpJG=RHL^SaP!gC3=&~@9c4StinCNDT$woBmJ!u;$@fNoF&3f;rK>}aES zZSR9G`o{uS;vpw*IO_iP{+Am71|5LP>u6zRe-jkB3nMNE7ntqs$20L5qBrw-2G=(vv)DhJ6;^Yl=_@3^S$lK;%%+r)2 z=>vZ%g*P=!I)YdW@3w2;{CFL}1LlapbDAnSw~2VT`Z|e?GWN9}fD|VYpEMtz=?(tD zLaLqs#Agci9Cw-@3?#o8XB06fe+obPAtn4o8SaQW-W$d@d_C6sLvPGrNsxCdtH^pj z8ppzZmL^S4rpQb16QA?1s)oDTH!^4I*42;e{myrw8xNsQ>#PjyO>4`fnLw5rtZ_Tb zT9h==_|1snQjQOWC<*Z#E))P7 zO?L4@uJ$XIn}d@Z6$qYUSl$V4zjx-pJx^=qYsfOvDv+>etB2?LRJdByZ^GLSM~P9Igl z-WK4K+t){HT0UpOz~yGwWiO54X7z!Zc$TnJ_PF|Z1@rH+_d;$jojSW^E^YxW?TTiM zWDB|K7*PfwX?|=N1<}YoY{+pggjXKp%k@j+A9w2r$9KZpOp?5VhV-4J$-$pduHYFw zq{!?T1f}^TI`Hg#v$0wCwI`=Mkw9DzcSkbgMztD=fJV>_2Lz{&UL^knUR9Czo1WX9 zk=+vGnI+VCS9bv1<75Z&HKNAwmU4u0mwXw!YRRmoF~zP7iZfUF=kWnw>SNWD1WQp-St08k`2m7jVV&}v4&Vi)zGHk zDR_>xcf^Z!0#~^s*(dh1^%j-cW_DB4_ojWgmaz3TD;B?5)6x$=2_XsRgUTaBm_5r8 zx*HRFbl$;QJ>)*@E-|NCbkPWS_lgWi76_5)J`jN$_bO3IDj z!Vh!wFmGd7s22M=yEVahrzY0Q%t=r@FhM5G@k+ut&~tElE$JjG4Ro3%Z|NhMl-mTs z#!-Kq3fs!M%Pk@)0w7v0P-H?sn%I=WGCbYFsnT`fUvzNG_bYKNV*zWo3tdED#HZ zb*1ns4f+e8&B0P9xZ8;WuznyLUhW%g(MPeP<0RRZ3Iw;tk|gXQB zU@CY7-#!G=p7Yw%h+@j(PX*6Ick3W9Gn?Web%mxz&__1(v<3ER7#bE1Y6SI2()cH5Xkd&fXzNeC&#u5%Ahh43fY1h-vHF& zAT{eX0b$$+zyn9%u;^Hwnqm7^>aqHRCOMWODyWsnsDU3u>&{JX311Doh%()Nf4}A` zsHlXS(G0;V2Z>j-q!5hAe##abQh^LaN_MkNK?u5}=&$v7CF&}0fUHQ_LMWqo z3W1Qfumea=tCBP|$+n-TP>;<6TeZLyr%Reqe{Pl3cff?y$QiHRvj#j)UFgaS7WL{D zty$QFW|iq*O`~V=SMq4k^*D)5eR9gn@=hN-y@oS5)*K*^Lxq~B;Tj_pX^llPhA$Px z5n{-LGB_es+*Cy9Caex*Ih8My7K+tT0EGz#w=yb0tQ|8ZId!X^O;WZ!+s~kAEiu`E z^)PE1ai*D(gM@zTo`7Rc=}?r>=o3-UgaV-8#);?w?cCZ97D``uz=&cTN9A;2$QR7y zge_-~?N|#Oeu00NoHhzVuT%boz|~)Vwu|GI3VYt!&CpZ0?Mv zsR7V>q||BTqXV-6;M=e(4}fy>HC30D&#Y)Mx^-cB3I6C!BjzW%ZEz{AOACmQFbvv) zE+P%6T0(3>S*1wqAb8hOHU(kRXa%eLI2HAO)2#)mZQzYg%~UcpHmc1wvAXneE^Pni zP8>KApdtB2*q3@G_{PVl&Bm`yXC?)wkYG_B$Dc=8){St#=;&r{k+#v&ybi&;Blb7O$!R)Fz7Fs2<4cSi`>{FR+x}E2 zI;H*4;wsv-4F3&2J@?R%%X;eJeJ3s=Ty0zB)Fws~%Zie?5hz%q*}}XL`=XhDo#v+n zhE>8n(iyhLh^t6|+H;w{n6O=T@U~mAFOrFrhXS^&eFK7Jf%lWW%Ph_4e z#GX?*lMp_h5k*BHl_0%N@FQJOE1*~3MOVF{77NG0(sBrFPHU&TOD9g_%r zVAp>R9qhYtr9(MBE*dRss-S5$rMYbBd8PgA#*fS>fr+1##DgT<*!#=pNUM1CyriT7 zuCwh|-7X8Bv)QMU%72hQzThu&zcd;sPn5uew-P_mWeg#vjq1s?${=Kv%d64Vb zlOAAS-60@Ir5n0DXkseWelVBPn1A0=i)^NCEmkbI| z@;tXYnL09F>ph2^gZJa=P|>ybhTQnnQrHjb$B^H3CP|No0K!M{6js`d2(Mhq85A5% za`_$?I2|7OV-T56Vn)=W2Xb{m0BZjYX1IF{TdDIL~h9_pjhKD_tT(%Jdi$N-lh7&v%QJj?vLS@c^`f=~LTUUAi>B zPV^Xx0UP|LR8&Ct5{;uon{)RM`?J(vD}U>VM|2GwYrxT`k|K^qvy4yA9PgYGrk7+q zlT~w*mPkHABct`U;a78{Z;-7Ts9p0T@Q$z4l2lSocq$4`ha0H2#6%k#ensd-&&-i9 zhNh$av}@G?WTH~L@oR)+8b`AZ@ZVft+81crGRF|4Lk(U^N4@Q-sAgaj6I7ZZjP>oj zkw9p!M~ICqn(lo=I);Fa;m#T#z!I?OA8U%W2^j_jm)~kvvQe|mNIns6v#Q`ut9+|j z`rc10^;_Tdq1^3YSfXK5sX~KfE2b57YAHpcxqvvJ)qTJ(i+4Wbe_MGj;%Ul`i<|Aevi746 z8v{vfCbPY7oohiX;dvJ$22x_|Dv$}rA*QdDO5w8d(c>BWY>)l_xgCC$S0!hU)vSUijPH?wxa&canmvNkwdsVHswcG0CxK*!;xa~0WHZ>BtEV49u`wn7siUj1*1c8 zUEfrytjK*Bm1`T6o9>&$uU@Ka(`7@1USU%ZYDmp(W!H-m;H~6P+}x4uQ_iYYMb$%~ zhR>jyW7YO6(-hg)oLjMK{FYt)J-m-|0eVBF^^E4VHF)l;G&&gzLjB}*&$%ddii(E^ zTM%9!^ZTF*B=LJ@jmyrD*D#gXlHrQU1T~W=^&;_ff$K0CN8E0J)$`wlI>lF_sFs(4 zR%sM@Dk^48K8kjMcgh1^9sk&>LQ_=x$?&%~ORh1!d9#I6SUc9ZJEb3CPpDRdCSrLT zBOg2A$b>2vt7cY5Ip`t`;c$&LAD{1O&@6>Whx2ADRov7N%20=CZo8MWPt2F zkM_D{oVUFiHq$U~ODpg@G`y$oKm%EFG75o5ZN$!=qD0f5nPPo z!GHAA+^D*BFtGFgS&E!oHw!`7CS-h)ZeyyJtfC3P-!zoZ#-EEZpS_tL&>E3lbIi-l zm7!C;Hp)(vrb!rfx4x6Bq?u~u_A&(uP+_*-1szY-`Lq=Wd!@BS!|!1!)m}DE7f!D) zKg^bn`_Y|khLIO?uFsY`p<-r|O=@Nem2@`^zb*HL*itOfzGDC=fDi=7QLL0J2PR+g`5F7Y;SL_3jqFm~q1E5!O=0lZAR|#aZ$70EZ?3j!?bV|=@uf0bS)(|j2 z^e#$=G~r`vWkQHIAIljT^_}19;yEbmGDxnRa!U)Q#h#W!#t!RLk|_=Z!!7<)$`rg) zitm2^znbBzN_#brLQLY`vv*?3BUD;bug$EZ958wa9bT5Cz{6FwQ%9_+SrFR#xGZ{l zzdD5$XW=d?RT-b^-kEBJ3KNr5(k)Svd3K#Td2(u|)#;kHE-`INBiK5R^TNK^9e zO}~&zW6j_6{`vf>fqHnWhFNq&lXZ5I`$b*1-#~K+C~pVls)}bIJzh$JgJT;$aCSJo zA$YrA!?U%|b_Lt`=YZJ>RsMqRKt`NZ9t61GK4a)gqiYOwcov+U`PRS%uF=hSX~nKr zNh1DUx@@W+flIgZ_znFy+}cS^?gbV?KWD&6S|;wR3~ktCyYegVd33rp4vZ{S&iFf% z_olv%?~Ur}9@p)*oda3-Piod0t(uX+>?3w{p}CgoFii|w{C^KAWd^W6Hfc-d|2i!6 zQL|8e?_ccQHL5pGYk321ufl*%yEu_mjhU$Uv3)U1+?}aKBAf>Kz(mG~f=DW^#ZvmR z4$=r=kpxoy`nFK?5k~^C%w-(O2F#7bV4)!N;_OFYzj+N|I|2l6U)U3l+U{dWAlQn( z)FdG$TC{0J=|qk4@f01s*&Xg-bpxEM9e8l5p!FhARt0)845gu5Ar$mcrwBt=p|2C2 zAB<{mu^qzf&$Wito1^= zF+Wyq3&@o`$`>n;%V?ouYh3bX_~Z@;!oW><&4@hzURfj4>8iL^#c*XklVDpmb=Xw~ zc|QzXR2|t`#}+7hlli44GgDv*!51D^g59rXB=g(mbJXQ-ZyEe7$Y9@CuP|uRQ`b4d+!v}-4_DN0wzzgt(9iMo(F`5YGrNvjyYb-o?oE-YCGG-LM(EYG(QANiuB)>x)RSop-_4!etbJ=0O z@B`T^41xQ_^hb6MT=Xy4o5c51pSTTW>jR{d?ph%&l2Wr~vzo_fE9}OG>6!~z8NN4% zfz$=(BWc$|d1~O*5W)WlfYR@xCVAgIlM}l_+`F$TrBKw*qE83-#l?)7Rh??Xf!Iwc zK@)uY0|R2cHl675X|d~A=OiQw!L6RVxB2=pKM+B+QC0k&L@4Ne7j7Sh*@SxQouI9 z)jU0fx#vtsyrU9R#+O&`C}R$yaAwv^WsTq9=R=-d>`@CTP(_^L#6&w0%zYhA;W*8O zt2!ISxEOAKTy?@By@=)9=QqZF7b$EEam3NB1O9A82cRnt;Y7r=?m1=`TIY^C^h1AIsTOa`w+b_Yt>;O{Cq}y{27uS`9pf z(!R?SgHf+viX|3zcks0B)qSoiMN9x582A(ilSMr)gL&pWjoQK25Px4nIFn4(ff|P_ zoFO-z3@qF1F^hnTS#(MOqbAoAEVn}pzAhcr-wRm7U8t03ppZhhN)>KawV=IdlO2rw z!sl;w$LoG=1pQIpu*`ZB)+6m3PYA%sbWMgaO|QOKsK#ot$>eM78eUzDwT zo~!|MAy8dIg0_Aes8P~rsHr=0TIkc_$Xu}bz?5xM9Gf5du&7MiHoasYe!-#ar?U|7;@h z97~mhPx~bO^J4`}dt#Xu#Lr5-2UPd;q>~irF@3%Ig7ti*F3G7$Z`0)%300im{@ZGP zHUj0f>s$3@l~b7!HK7F_G$EObmFG<#GEd{M1)tyY#PwYO{@X$(WoZEf7D#rPAfCxV zDT-`wO3-nD=IL`3p6utM#g8>0v&!yTM~5S9EbPAV;%{iEpv>rv-iN>;1Jw!j5Qm2) zf6!0ihw5+jBNpeEBe*nl%XBxpOhqeGZ|H}_L*qetw&gc8xGR{+v@u2~C|>Kn95jfY z#ivxB)NGCkR1IUmX+)>jwF5mVulZ(>kfh!Pfr6+|H84$YEd{Vg98`Fi1S%Hnt=_5) zF9fIuLu$V89KYL^uMSKo3B(Z2w1C-ge@Pzj*ecl&t>34Mj6h}C)wBeC0I|rX93am6 zxSKg_C-CKnmPOH15N^e(8bvi8-aG6`wzi^O01`Euf`&m-unpoMX%>~) zEi#*Zu$Z&pS}N|G&_GRrfQ=Y)qUQ&n;Jof1u9L;LVwevQ+3rqWTtveujy^@`S&aPq}} zZ$Ci+009617zZ_Sy?cAjfdK#j{MVuVXH}~vs-!F_FZX}VKQYj8(lN3APXYX2RPi^t zU42*pfGT1D0QCQ)I=dJe(V3W<{a@G-O>O5*2{hkUYu{l_ds|XRh5-!YY@Xs^1U6+1 z4HEL#UXzezj2PE~*j|cDB3p+yYeatnR8?!36W!XGyzq8d}2Z&t$C{PpUb60zT z+9XXh;rI}tL7u4s4TyFO-6Qx$1W6x!fNPtM*`h8{K>Hhahkv^l%lChCbNPADfOc&3 zct1J<{Msc2`XZWIL4sHe6>Z`1w!x40ebW5&619kiLkyWGzP+_~RZVlP5oU5k#b^(Z zs~b>2{2@BQ2{exutyJ-@fWBD1<4%W(CWb8fOL$hq$-E)s$eJlOAUfeH$G$L0D>Sh{ z+i)UOpznzsw3fNHN+3>MU=Jk;dte8j_6qBdmu(VFy?JT{!yQ1~GOARjfH$ z#CNaAcywr(zf^d^MyRAy973}eTDN5*ShNIi>a)weB1l!-7;xR%OojaSVzF03emtPi zWUI^A>ubW+P)S!8Cf8i90O}A&RwsezJ+kG}OwSe+Q2dc4j{~&3%_6u*2xz}S{n+p# z&;D4S5UVGjarRAz|L%`ydW?(w!1l=FwRA@-cyqVm#L!<3@}p8=PUFo$xt|#05UfRC ziBM1;tsT7Jas|?$(uaKs_93=W6Y{cI(lyzWKy!K<^A~vd`1rW^EVEbkH(M0W55j(a z;KQig0%=6ciZ6re@&MT8nn12!bUPErJvyczg%*BgxPuCJw*y)`=XaL1UX)i z;Y2ZaN)~tq6{u9Q%`AMd9x?f0oC!@~4{5sC6`&h&*wZwz#Lguja2c}-VN&>#ukH7Q z0%V5SHQ$*%xIf(vcJ)^BA9^;*2LNf|b{h3ptnL9kePgx2?QtyBS23%Q(8m%qeJIO1jrId47;v7@fuWV8!x?zZ7)AU z{+b|h2o)=LLb!Im+z&~U;I@Gr@%_8x;M~UDd4Yr2too^Igx6gE3Zb@0;cST!p;rLw znuihf_i>P5D90HAi8k_pa6*iVabiDGkn4MdKT}v0;NBEDXq#;>zapy6v24cgw^RenG|ltU+rP7Vze6c zBC)tImwY_{>QK3Q8_8&r8D^-BOFcmNMj#hwj6_fiO#BN(0$lRU;_l0#&4|8LDh-qe zN@f)-60o?QF1;erL)A#KkKNyWwtrGmh~^L8{JHES#*|Ko3X@RJHtu2RS zgBzq7x`JkRKZI9p+s%RtXgo{!hDrD5g0wL2BMpgRZ;Jp_6O0eJ#G-v9?;FXn#t(gTMbzL zw&0pdkLqqmskAa&qInGXo5E;>1>(nHEJmY!J&Mul*aGH=M5tHC?1AMQImGnaWsHD>(>E3rRToxyD5y zt&x83N~D^33!=Sel(1;2&WVD4V>lqu>I)>mIfO3Ef-N<|iPjq6>==ji!LDe)BrDfg{V(Gg?FQI#qtWj34}pU@SV=H{7GO)G59U$T%P~_UV=*ijZTVVg=Xy=blzfjZZ@rR_EVpDizCsdl@6cI`UyP-rg&dNhZg#>{}fzwUe#im?$u=mbOi2D-2ZG5~4@l zu{;gX%rZb?91Ti2N3z%DA`J)a13p1U&{*PC?o2a7F!#;`GTQA1=S{K-h`K{n+j7Dq zGeM1<(%{ft%+R5Pb%$k?aJO8i?HRm7d=Twl3sWN#e@C~D8+k3Aykao-c|rLE_Eu;t zO1gZ4IYThGNcM_36uX-YSXu5qI6d7ao`D6hbTE z&0eH1Az_bIHfV=EH05suPdZV4>r~=Iu$Ko4BBIKxY=V|zgD(3Acqtz?U%QwJ*pJGS zkM%JrcD#BF8VmPx#;DC94Kp8K>X8@pN|aIg+}V>1eaIiEP@HlrbQ-U->?85ms`ZZq zjA~LBljIuc8)EdlvoseSuOCs%WdusY)lkuSwxGy81RHk4{1D8}F4Y?U-nk7FsDwCA zF{?Hs*(*YJ<01Xr9*thDnDcqL6}Hh!_N)PkcMI`{D|$Z!+Kd*STWo+ujnF{x~g-+X+=gjLl~A<>_PPM-tT+X*$wL9o9h%{Wzi{AITqj`3xNv z``&zGDCt?Xh$SMArL1D+^Y?dm7cZ_#J(V4I`})qu`=;-w2Y=q89}(vbGe7vp;Z;{& z11iAVoBw=WfL$N3P-QjQ6N7-6^=Jv{PKVd*XgAJh=F=;9i4DM)ec-aQc>^dA{N4;3 z0#Him2&3&C{hLp5uh~aygO7PD(l2axRj{GafZ zt<3T(^S}}KdDRh_B5Ga_T4$_j*)FS>cjW$kJ)5^+#ZuDCtljn8Mc!8Hd8b4-tGBmY zH|$r96DyhyWz2af5dKvv)~8v5(dPt|c`G-)21Twy;fWeX7yB~{%T7*)lAOa-y$SGH zoF;YK2Iwy&yj6R?505e=^BnvWIE?HZ;O`;8ufhKpO`xlFwfCajm>f1ey(fw6o|wzF z%|EZzv#Tb~&0zaS6~Dz|DD+`?2|H823Q)Poyb4mC0)hX&^*kq<9Z}b+U=~@+!ZUmi zZJrw8W;6fqpzZYECcsN!Ah~>2^8!%r+{L_Q7s-B84(v~b>PPK8@5;X|ScjNV+rup} z+p$g3n^rKZF5}xC+0wR{xy{TeO=0_N#HglJP0PI;*J&`tJj_dG*&WON`SW>8ptjg% z*-V&~h1k<&#%!+P3S$memNMs}G0qD|yJwEI<+ISw?D9F-myXg_1XwZnD#+N?AuGT* zu>D`;w+4f(1aSymuM_rr6Tj?bIZ%zf?Gt_IfXZtmLLN*D-I7@t`ClLxX)wTnTd=0 z-T1fg4C8dpOwGOWMRL_ov6No3dG^ZZh)(VV4lZ;}OW5^pR6NpBG{t=Ae{X#k!WGs^@V%Z2rIKW&6)6jr!q63# zy0puMw3+`jEmUQF2hf|pMc84Fp=FcMK~L!(#mtKWWIHwA%F5hfXD#)5yq;q``$uIO zVKRr&lO~U6v`{}4(Zyo$+wR4Gy@uzaOPdlqk-6HxVH#W;6%N`YKUgJK zE_Bjds=28ZKMy1#z{aUmnZurEaFWa|KW!G*RZJV_tC6FtQj1|w^+;VS}p?xaI2;;XO%d$Wy!N{8g*z^DxFh1UkZgKLM|yE~XaY@B+B z33IPY>&nTHxg?8in1Kf~|9Uv`@{jMAZE((1r7k{84Lo09+z2&=OpShTNb2HkH|%|p ziriJ>M4Qg(J9v<{!sZ{)_=oJH%^sRpMc?Tc0MeBg>vxXw#W6a!xHfn@$0$DaF*y#+ zs#!e?Ksc%n9W}$q<6r73iC8(yXcFXI{lGb-h>EIKk7{dV?2<_Es*;5Qn)%a6g-7{o zz!?OAZ0M$ORZd1njn_G?kYExoDH$L*9%I{NZa{`Az0sP?X- zl3X%Cc0Zf|V2E~p6>s(S_y|udU)6$^j2!XMhiWL>BPF%uFZXyV3n#g5|>wFJbXl$HpL+W2Dpl_f%JVo?E z%wKXS5xQqZoaehRJ66;cvYf%!bj)Fy#g*R@8+XhQQ)KbHgyrx@Ut=M1Rs+;wU{$tE z)Fzkczv>FJU$Jza48M)qH&xGIeqiU{Q>Y?2$B^aOj?z*&f-IOYD3i zO>BLDP;L@y3hZ+B5*Q4?q9A%_mdjtl0tO1Hz3_>^vt7i)K>K`^O_{h}2iDNDKevuMsm}f# zt}|Enw~sfaR8EO=E}ux!;G@xuP2$U|;0%8=0_?A1D+Vz9f~$}dqp9@OOJfF^2R05d zU#4-*iu-C03s496-QILvtDTku>>5q9v;}1$D)WuusAy6;2&($Q0HjLnifSYw{Hq87 zLF)qYk%vzhTwtzx^?kN|UuGJymW9D#u&(CuBa)6S6zQDvcdTtF$DP=vBTlww;^|j5 zv-Q4qr?YoT}&O(5Gqj}i7FMKEb z-_22ex$NSbVLUT$b#jb^yCh$N3t1NlMXCsr*A7^0!CU3nfp?pmqWG+5!?j-4X~Z z1vHk_uXj_p0%30tP^SS^+ey6vM^Uj0t2BIzXlyM)J*$i}-;f0TAwY&RA=dJ|#`QvB zwbwX%;aUk&TW6)m6({4E$0d; z$OnK;7s?>Penm=K4WnQad~PIapvO-GtG04HlvSMDd0wU5sl@lvv74AY5j>HP5Ei5` z0YTVb&BO>^#B7m>Jp7|&IQZL`xpt(>(csib_Gs4^#!1 zW9%l76USc8)QV2(w!(@kDix#-1kT&r*ZFl0?wRC4F z=Sta920?&0K-*Z>+&OBS;0R-AKiHk`3y>S;a{bK&O}~jA8ae6%5Kx z#DMp&azw2J(P2=2@@#~CZyNb%V4D``O(PAPvy4HTG_Ho)SVq<;YF^!cqmT2c)ubtD z-%f%!+jViPbQy!Z@V^!X-?}kWc2F)MR99O-6C9KSR>Z4TH4D13i~uNo&yLE{ryr!U z)bhkS+aNtu0LY*(p(!xpmci9xi9)coOB~MJ1iukKXdE>6>9|(5>8@j;JhvflV7`^c zrC~5*%IOkgA^X}dknh~nkPk6p{7Jk|Ecaq^bBwDJ0|1|$7cS?G5h3{bYF5J#G(RP0 ziaE&_1>C?pWJOU)LrHm>06Qp3j20$6m$b@T7@hoG+xy#{KY#BpFE=&s`r9P|Hv)Id zKWa?dL1u=(&|e>l+7tm*Qy8Hf4QtsSt>k=3LXRp)^&$bcqkYW@*%d>Y5OAb31| z_Mv;uctlYY3JVGPLVzBBg#kM(7##CZzJfn$!E!NrWxL~>rV`14z68jyZ#fxp7-=(& zZ2_%dN}p7M$g{P@srWBR%7ySayi~=+v+>xDU+aP$uQGc;6lrdXwSXUB%=!9#RGMS1 zDdi3;@MoPGUcD1tDi}U$1R{fuAO+vb+)KmBF&B|x2RBHBfOdV0t00Ud45UDi$^a|k zRRTO*iTNZ~DA$-Tap~LTxxYose{oSFkxYp7-;SWF^ow|5yC$3l;vphBF-3WM_~o&& zF)ECnbgoY)9Oz{6l~vKtB16GT&wO1T<7+}|zXLYXB)f?9*IA`#8E;`8Ujk1cyFMLd z;PTTOk7Z>j`y>l1KO_y6JcoD0!T5%vLSTQIT@$#3aYdTE(V`-z)8E&-f_#f82KYCX zNP4te7{Msl(?v}X@kV$~6WJxom~}n<)l`FzYo;zOdFC&0zHwL^k49QPmbKDR8~0iH zPY`HNIx3PT*Oy5=-$<$eypdHjvrgHeFbJ=;9*W~{#Gg%M0WngMNFmR9-!8VsqUne# zO7{XG68%$%+=+!wSU|c@F@E=i1uuI1fb4g;MEyqYV>!i!GV!^@418{c#Ed}hlUo3} z0nk1Xq$kV)=|f-wM}29|;5cdC(c9xjUSLO%t8)jCuM|jyvX3OLl1>1DLqas1)J0kY zJdG|vIOt!+MDa(eMCNiX;v1H_xBGEj(eHMkQVEq^ndALdm4o^zsdF)EGMVl24Q!&j zI5Rquz;ZvNuK#{Z?_TpPgy#iI{EW3SIGRe!T<` zCI?=8Uo^as9{Fe_;IjIxY#m$2G$oQeiTbKHCx1J4v}ru~J&N)>6t+!B-+j}Qx@;^F z*l0yL^Ib|H%$JwvWrr1?Z;}!}!llPn7%-+f>^ieMOK#5+ARo2FqEwNyudB1G)1{AH zSZ(M ze{N~v_C4AN?2QT`s~CwrE-x?7KYG7A*s@Nk$kee(?4Xl(pl&B`bKFT4WN5;OxFzpJ zf`?u(PXhV(k1`R1U+{LVH*>qgXDd*sMvjx z@2g1RkGJWpT4G8C0>yT~C$!*cTED&jd&0u* zVvV>YP=zPxXehFrW0MHb#Z=*;2iKOU!yowHEf2Aw%7O0KeVy_tmXfcoc=?r*%RIT< z-Q`Yiw4j8nC*+kus-z{^`#2SGbdohfij|dPfM?MVoAas!17E(~2pg7j zA1hJWY~*8Ur|+O#=1#Zu(Oj4y%5yPLmz2!VVp>*6F+WJ~d+|%}3mD<5>AwT~KNzA{ z8OeU$@;3?PeMmE)X<5p8ZX0p2Hnq~QNK5B0lOkd-7|EfvkGUmQyGfTe6Xn-9v+Y)| z-Z>F_{%FM8LePBkW%F0tj>*C>xRyf%8@oA)Vb;mjo0Z!=;dJI}RubG1Vzx z#7Z^+ISSDL{s0H0(QDeX#C-|etfKnz|^^OjzIPSE98d-_-wdxA- z)d$!Iw{J}bhuCsDa(6RtLUfNkE3izmxJ~$KN`$SaIzIqG^j)03XIxMzY0bo2iP zB%Ps*8-Myb=EFYfbz>9P_$j93+u%eq6;?Ua9>LU1d0=e~C6r}jOfbKNP|#9nEh>*- z!Hm-^J0>HCUOE%pW2q~qE?4g?y7V8VQi#s{8<^wDadB{cn3!*>W-V-&R=)x~ZRo*lXI;UK#^9+?eP(W5dJ|*W5Mc$RFuR^xo?N0-XA4Ue7U!f8go=5^h_QusU?`!07DGhMdHWEm^WtkJ1o1E-RJ zDq{TS4^)u;S>o?D*#wCng(xN4hqZo|ORX=dm|Il1U(7Eg>7Cs>KyZHkpH%ObTdJ9V zpGUQuV6PL>=-V?F^#Gr9&+kH!G4~4PV7XDA+TSl35u7S)Y;>`Fc-RtxRG_p}n5makiR`#6I+pzTs>oPFO*(^HZK%9H$#_=hZalDG(;iBw z2YK0WXpU^(5?y1v{%8cZWrTC{Ffu18EW5*aZr{>|O z&T31$#p(q<3>}`NlN^!+<_;6K%3VrP04nfq1F)EBXONyMCk56ylQM*c9qSMFn#Ro2DN;nV}*OwmPJe<4= z?dg!1?TXgzH$cX&#ih)p{@~*jMAgWZ&GsuobdA_=0xbWei@}h*e8t|Z?FI|g2WzV@ zya&vrX8DQ3baR3r2Wy70ZQryiq)WMuId&jrxdC}Cb(FoJNUJdD?y8WA5}8S8lHjU( zJIdj2hfUAElt<4q9&!G9eE$2meDfI=O)o^+d38KiK|FX+*3~ZqPMqYWMo^I3&f3dH zvo*t#$G%Z__@H>+wlzD%~0K90+J+BTWQayFw;jdR%XDLUN7H` zB8c)&^yA;r?b-8%L@)nA^j3lMO2Ie*yNX^*MSv-MTNkI2x#acFMQ?lD*O2~X;un67 zQm=eB`gk^aU7}HV(fP%iiHzh{=}`|LJcylRd0qCUVjgI}_bJ=F4t>v0LXBKFe68+y zhx|*g`ewWV**E$|>`f?eI~f=}O-=ZuSl!nqZ|Rwxy7dk>W?=#IEs1KiBEMoq3(PfNkM{m5*Sp;9V?%v6a6aDQUe7<0MT6_(>SI#;2Kl=I3{*|!9XXCD~mI>&JbNC%LFJ=s?U3SX}cXrODPq=YUe-#+s&c1Gi@?U7kvua=W z6!$Rglv`9h(Y>~i)i!jaU#x{iTfX2k`QExaonLpbPUUu4 z<83}h>~-EKXJLH@5ul6AwzsEO(xjAvDb_@?M=pDZFyqfH-N()OV)Z}x|G!!-30{oR z(E*0*2LbJ&c)Qj@_*I)7Hw^3f$ZLRv>FTYIJOFLbRxkwGXhOTNVX6n04)gMwRbX7{}-k2pz zGI?On_xlC@qxOMnd^|oHsnm3)?5R$*!nsk)!f8vCYZX$hG(iUpGr|0|dkM_c#x(pQ z7gBMj6jJD!nNx4x)lNBJ+WF=JDHp9OrYWUp!E!_3K91NWf;u7EV47U9X1+ub`|@`} zIm|(!*%l7f<(esUt3eUk6XpP5lLF@CGEJ>Le{xdmuzQUhBwAP$5#^LQC`_|ek~Om( z1t1#%002O);n1E{ z&p<;@uj(VI{lAB+pZB9HC)sc6bM2VBV3wNdkzq95;liEwb(~aFF{gh|McX%G_VVu0 zcFh5mrq6-|+=6KVCkkVVRo+b63kHj%3dI_w&AtgIo2TzUF3U>2Aj+2UptQ=OP40+k zsG)LXBV$IOW3-l_3i}s6`$g4NB(>zAY0SA-I}7p=(N>KUk4nOTDtybN$NrhBmKry~ zZfdETKoEgB_dUY~b-~yaFpMT3pm3~!p4hSjxxNB?0(Ok^1^k^;>Mdj|?Oc1^FYKxy zq1k4gJmsF4HUKA0ZcRP8Qf#MCp}Ezdo8s5C1i6^8CgQskABHSfQWv>NqD4mW(75vO&bajhS%o^Ls4QA# znv}}0Zq+IY3r{Fnbv+`D?8H(45Gtw`L~z$GfU@eO_IL>eN6&jj^d^AnWyz!8c@TQp zl?IAaPvna-bdNXkxC1G2l00wy)!4FI4P?gJkVH@*G?q4FS^M)}*Ms`gHmc0X?J8~)Rh?d}qR%8eEETohBh|eh7%Yv#@5>C#@Q=2f))~7ZK z!n#Q``i#jNX(ZW7gk0s(rgi0SV+iZIp6uk?qenM!8e&>pNzpV!^YOCuHInGQmkVK- zul0ojU?qy+3fV^S(5gqa7PRz0+bVV)FkSqjr#n@Vj0z4J84?1yLQKr$R2_ud#JJGv z5i$1=Eix=RG20Q2VApl0(nUpSdWoMR@&2Axxd<(Ax5Tw+Gnw*=SZ3}mtQfgwN~%2> z)P`$FURwUIzwQObU8;FFOk8^Nghy`=$H~Ww%jVOi&Mrf8aCv;p$zP9eFb$Md=aDZ7 z2~wAZ$b7HJ?ND1xgn=nXEmOx|o|<%F;^K}f1A%i(Rr#mQ#Hrv<7i##k(*#ET*t~J!5)RK!O<@25-B;#EW9l6b}L4`1#M%rknM< zxTDoui?LXT5Z#W4QVLZ@M!Wv1iVnn_=g;4p3U08q;ITlb=Fh=OVW~1z26UT-^8$Uj170Io6vGx*j|mf88Ujdr zRGX0#bv`i-PZu+2{ zEE?=L?Jina=FJosM&mcaF^ELqG_FMQ&^2A;lsHZ7*WlKM$atPoJiX=WZ0QUt!C2xQ z8_=LGvtXp5UAY{soapelzV+3m(3|U!5)^uPD08AA{>X5;09^8 zLg0%mONR1Zv-~QN-n*X&C3K*6p(HFudF)Q5c;> z5;MD#>?tPf@|wxI4n!-iBF)q=@2-E_9f+-8n_3J8;T+b)W5&`!e@t5k*<%NTX2?9|ro z6tvZm7j^;EuXox$@JBfyl?3_zilML2uHevQX%KV*k~=~%oU27CopOa_WO2I$riR4~ zlm@u~znYmQH5t|chMrU~wTt}k+ls0u;*3VdJ}i+-#OKJ3tjPDi z-~q@2>B?}}4^H$j4+E%Ae|jl~DKF=Lgdj?+mO8NClf4CAW{JnAEzbAY6>}%$H1Wgq zmx6Dg@Mm2$k1BZm2<6wY0T&xd#d2>cj#sNj@zR5xr;TDzkmdhym$SZ!&sQUYjS#5? z2F!LlVwZhCrU-0rwZWfceobDTyx=!P&jT>>1D}^)PKw&araRJ|ZC$Qu_D~IhJb$O_3~#wRgBTtbtYP4>!G3B0?6_ zDFEs3NxK-~po`d+hSMQNjcQ{3h{E%eWt@$5Mx5%vD)MTcysUYZ>FBr$^Qc7VBKEq1 z-0$>z``)=9*CrFC=V|L8n~FLcVuK45@ljW*C>17AUQCc$SBK_PR$jh->i4WOXcha+ z%P`Ibr7IkW@}-{Hy(wH_P+api#Pguz2=$vzS)=j!IiIAM&VV878uM)RF#H89pJ}Pp zm^E9z88KrUu~|XUE5pM2+K@D!1RP{G#Ad^g%mAk;-L@bjPX;muwO>*E@nQD(NzJB* zG5X;PVB|js!yJv%rMQv?35jM=B$j7V{mU%hb^9#fZ`-1WtREHkL>J-j87>MvR62d$ z5#ZZ(&)W!gZSz-L4qazL!pvJS?^-sX)vV-lD-g)=aThzHN{JIya!2&}H$$YABTaQM zBB!m!b?Uc1Fi>23s35dkK!r!$tyEVEG(O8j9M+WXwHjO9EMQv)J-NXND;ZDpqPQ&D z{>{x_46m|`)yCIVm=jn9SUcflS7f(&>(wO9_wQA`S97c@GgXKx6Jg|8n$E-wW3@AfcXMVy8IRF`AqlHpFqA*K=2W zReOc#>?3|5qC~`7zVn8>YFn+{Y{?k2661EyNKJ@RulTa%*VmrOol?3}*8ZFCj8445 z6xeanXJljyGfyYw8ga0B0+Tn9aeID=2v)9NUZ{-WW)UvR*nZ#(as@MS6YIb z@ESN3XDuJFFngak+LpNBYu)TyN8C}oVADkf5v8s%0^ayb_u=7lhS0?(OV((CQP+$g&EhSzz^_)X$uX7luF506x-< z!w(nDL|zAB^(gf$Kqj36H5@^nd(g5}=>jlE$F97Q=+~Q_W+}5nvHn-}*4) zd{}c?{*(IHyNwshxqnxNN_OweD<&s$y95k}I}{RkPBffRn;1xO>nK2v{fx@D78{#B zO=35_LRx1%;F)4I#8vwqz2VDY^BK$6-iub3 zzD1fpvJvVs#%-|WSOp>~73rb1MP;isQqHHOFR%&Z4Hat`!xH9tI8sAhZH7?+-3hn2 zSunCuXlt(t{2@|y8HYSG*l}rowbj4b{w?ote=l5_ZUP?;?5Fa{Jes!fDp0mPQQpe$ z$a>zR(QF^YH7kSN&n7E<*VsS;g14@E*6kcoj)7axYi6}jYSpDx#g)g;$60C&_IP=9 z^-f(+smq0tOH|Q&#P9IDT6BMRi185=1^|oEMl)Hi#L(^C1M2su?BC_9zi8XhdV1^3 zQ)%9G=jha|g;K#($j3T_jMg^CbD2AUo4cS1+fMZhG}xy>wlbe{VQlH5l-5o8F?fGY zC**{~|M4q&<9F}khYh4`FaK5GG+CaYC|<}lYz=~MA3`-kmKhDezt;4X3^-j{NRt#E z#W&Huk16%J%TAQxi`^^RC&g@BNBlc8vQ6VU?7G;M^gR(p5su zQZW%qMA!)1AUTp`sE?)SrgH&ySlaXa6D2Jv7cKWhMAsCIt$9|~b|Q@kD?Uh9D2Pqe z=(?UcX8b4@9efh4G=Xk+**p`BaFp-(!&zDd|-=VO49y!liJg zvi-a&F|qZ$KS}+#nBQ4;_-WZYw#b?kM^yj=8$@-e$B=~=fuPHhuX7HL>T5)zU)CO58X^PoiT zb7YobB;5yH-0rKV?o$R@wiXRVgaE4SI8%{~IS{@NF?SU2-o;`uS3U=EE8}|d#z34x zPf+XDWeY!Y1+-QWgeW_0!6XzgdtZ6e&aCpkM8ly`QU^4 z2Q{n@-|v?G(Rsl*zxump5GOqdaDk~q(~FA?_ux$a<%9XRha7+2@;BPLW$i9SrxtO!d4cbw41bmF|0}$MV-I=taAm*)JwLh49V22PcQ;w+SPMU!%G;@iHc< z6eV?uRKmh9=mGhB9;~0I)6PEFjsx(S+LG4Z1*!*v6VL&Wp*0Z(kQ&J8Z6z6tXZhLp zYxZ=!(=%=RtU4&0`9FsQn)%@kw& zXO4q^LUBxDvMxQ5&h?X+SZTsUhM|A$3hSGP{Gf}P^x3xt`(ZIS{T8q9=EsYppzR_m z0&Px@Gt=2k?3u*z0gy1e@nqeHAvVV#%c;3h^9FO2TErBsC{$yF$u=YT!=0mN z9UTon1o+PgxxP7X*EgX>UGSRmHlN)0o7we0wwDbyw*kHiy2d#Oo|(;6R0* z)CGvRx3V%Z(f!PZojubO1#OEMnSh`;UInm3d=$lUGx|rs4TESB)c@d4c}05e1ij@J z8Oy0q!!5kWmoFm@ssh*BnrdT7rY%v9H)>F7ub{atqXmjx3T7gg)$L|~oTxVyWm?s& z>V?|^8;gL@bb%hhZ;0u3X?EKU$oG9*U_)%vdU7f*A=wAc?YemAP<_T!wCdC{*%;$AQu<8~xMc$`Tqe|^(W>LQy-L5GQwqY_HR%{L*KqdOpcT6>E0lL4ccH?lQ zCetpb<;F7)=y&s!JLUxWH8=OcckSH$iHu~{s8d+2xHOadF^EmY7`CPA?rWv8Gg+~e z`|J_2YwA=nvWz$J`ZHbHFYK3O1h8GCkB{$q@7mL)Q+!CszkmYvx7$Rwqn%||z0U2h zKvr_Gq|Bq7P_?J6S48*gY|A7!i=Qrr#H92$?+1dxdDd7ZJGGq?%$~d8JpBgr5EA$m zcy1;I-?SwMUtX@`(}}wrjfR2A7ohLsk2C~DpVT%fxJ1R2%AUx%Qh^QpJyV!f-vvyD z6&3DtNsk|l2ui0RU1aq(h$?M9M7WE$s~mh$h<~QbLiRvA%#4b10?`_hU|w)j!I-y; zb|ZjvXp}(;=6G@e(Pz*6VpGmcm*<+g+pbKU9GiD?2?h^J9r!)DWh=-Q7NFqssfwa9 zxTmMO41OQP=g6&PTxpNtT4>U?X`n7?sF};rK}JuC>cR&cK3^ll@sR}U;LvZigZZmX z4huMRUUn6n=c5eot>phizl_1O+0h}zYj^x2Pn=U@K$?I@eU$i-skvoW$i!!U$GJA+(rh}$)^GYSF6CAZtpuL&Ner^nH+8GfA?|H= z0ok_DVpdO9X=IZW0izRr*VKJU$mp4kd6II)Y-E2$Pxl4yp7T8ztH`EUh6eRhOAg2K zxK-=3RT4EtS=&wNDyJh{0iCQvbJbKK2Y8iTLu6ncX&>OzII&8jq+|cVLNaT zYwTTW@4jlo_hp^Fo%PyM{5(8*#3$Yd2^nrm*OVDKYNpQPJlJMN&_~Jeu6sQh@uO_+ z%T24t#$8+?Rv1&yzSRS zF~V7VL%U6$JN|w8J+PdgC5FvSq+9E{Q|+`TU!BtR7bux5?hm~f*AB)4|J=&J>s`k|g*Lf^- z;Us(u@D+Dh`Rd=Q>uGnqj`*9G9|W=``8TCCxmjkp1>kDqS-pmCv4nr{mqnp$L*xvK8`_H@j<2w4!yEFf9_IGIRWUHxF zW#XO@(6S7|pCeOs6f4)!#g{;3+ki*&UedcdO}eU9u!cvA9(S=A#c)|0tio}sQ81T1 zcZ))9@La&}zz_FDh!8f=w=83+ZD8xL1P9R;Fek1omO{ zGf-MLQtuYtE5bPD%UTJv4lpL9ThNWqec4k|peY9uTvbGpjQ@<%T+sO!gdr9$ZL1`vSH`>~o`&+BB zWSM=5)AMt&NB%ZR?QIBCtvgBiEhZP;Y)+6rOR{9w22;qYDpJ=-zKz+FBAaX^hm-M| zjkZ=|EmvmZ%Ck**?cLVs0q(}U( z5vaeaNfC)zm7-!XrbI;2SihTO?JyGr!d6oT%GOf?#@13~&Q?`JiXYs`iJ9)IXLTYBgo34#-^O^X`np6+kfk_FMaeOj8J8jc??L9$ zo9W4*9JjM4UJEyISu&$h(-I~c6`P4NGzmzW4jkEXs#h;4rF9S?2}QCBfz*Tv(wdD% znFZnlf4u}wfzCFs`6?5<)f4#;vtn8yIKmAlo~HzaNH}D zAxY{oWaZlZRK6am_xOyW+Km8wAb{AS}Rv$cIb=;GSY4! z;H570Av36-}ll9L3>BAJOby~MH>z2^xpCw;VSSR-^)33J0H z@RC`4g-8HVcK~lf%-*ty{enH$!H0qrtq1!l*Yl7yhbUS=V+<0ZVmekXVUBOEv@Rl&L?6dL@5d{6O;qlY(RUbBuJ&`+O& z_ItKt&77QE$6tR$q+wAFi1&Qms9FGWxFO$ZE1kTeO|p;Sm(zc#Xlml3$=+O?*mtu% zJ-K?ja(8m{_4Dy%-qN!1b^I~en`B!6MfHd~BZP_@xUvXDznEn|bqp7xN}_$zfWPeE zN(e+EF?2ZQh4yayX`bV{2>?J-0Rq2UdVsaj5F=>yPjr1tAp4KRA?1z33bPu)D8{A zS~k9aM~Ka58OE}W=bXQ&GnrDJHegva_mv#O6j&A63sEDx8@PK1)f?Ckx^TRU3I`GG z0B-@oP96ngs-AYmP`>A4s7yhw+C>D#q^ZD-kPOSrpPX()(VT3KejI49m{^D&Gt2Ae z$Vv1Ip$XqMhK%YEc830VbeH;qh_0t`Yinj3<*lrD9y%KqQ5fJ|vtSSU80u~o13I;ol%=Y0(lDorL@67h${L_E@ zSUz=MUv1}oLBng~_Wh($oBFrR@Bb`J;7_C$5Ywk#5qksiIy~P=f7PyB;KLuXGw@9w zEc@4?!+qYj685`|%e+jpjb1>a=UFiS~2BULqt|t6Q*-MQne`%4G$}4 z@*?fU>OgKeXkX=4&{IWlA>fWhR;s>Ji=rj(gybNjvkOu6Ll8%dF!x*=&7k-!D@&Ix zQczxG?Xn^BG$|KObV{7IE&IfE2*e<7IN^d_X`#xu7>C5L%}bf=M>9PIkQCxQY)x{y z88#Z+W8SfgPqrLgQPxRL?yb>%__UWIm_{o@Wt%a2HZ7%s%uh_Vq&5GGq^T1ik{n?a zuj!9EZXBqOvnf;0gr*eog?S+VlIK@sj(ZOqJ-aTFYQ*^odJPB!lv^&Yi-w$Blrko0 zy=|Ena3vTgsEHiyuxe^R{g{=2T^!p7BE}eP!;_GHX6kP5vpP|MVtJ5FqHYK!SM}Kf zt)_w=ed(@niU9HYIPX3`Ki8#ans^QTg94Q%l{d#S1sV~QWvtfq$+{z2E=7Mg(o~5{ zAs{wz7ff?T4z4m^)($Deoz0HM5wAL@_LtO5^pec$edjjTn+AomM0D3jf+10s%u$Ne z8ao4K;!0SF&f=`Pv_Kndk3`e?q|}WM)E6uj+A7DJ_UMjZ?w%Y~xw|xsfv5Szkiwu| z(8+1q|6#zD-b7421wj3FSycKxi%(x)`Xo#zS9X@3j89KSw)~K$lB_6A3sPUU#=Z5X zstD@SxAAfGrW^H>9ld8vu7_mH`WQugBp>ZBIy%d;%wB!|e9b6-!Oly)Zffa|Z=NRB zjH$2OGU35%K9*5F+Fv zZk~>Y*9m1;Lb@!W2)qqif&ryCxDwU+3MsBzb* zzblaFC&&P)>GTQ7=}S`)BZ6`GcaOz+6kYl8X;(y@y=Q>zzV;o+D@GPSVHmC(ZoK0ATR$FA&uo($ zAm!^eP2yKqVr2W5y2omAG|(C=loa>_o4g04zJky)7Qd-s-7z}RvZ3@-{i-HTOsoq@ zzrn~k*gN$_y8!klaoik{zJLy_t(b)AaS76-kdWMKgc^(knf_7sQ-tl$kE^c_ksRQ! z|MYN-p7mq%W#+|_i<50te5f#okNF4lyI&tdb7|sJl?qpi6o&)_nhPpb5vr@G1MdgF z(m>Sb09XTd+!kRcLI}dZfIBATv|KYn*@(&jl)>9)HcjArj}bAl1n2!Pg&?X>2W`@@ zw73d8so`GIO##@DJ^OBSxD+$sY6W`(5%ww<`9qHJ)D6OJaVa`^jL~P4cC-(oF-@fi zUOJJUC)`f>$S&L2hB=8%*AUxe#3(P3f>KadW}#XcW}4T3V#Ps_$b^yrIVw#TiFeYI?kXse0Eka$<`oXC2d!{ShV~2G7rFO(V0VT zJU1lOsC1dNDUfud+VB$%L@z7#71j^pvsE+-P*Js62f-f-EOkVW&|SV{?tP@N{(Y7z zWhHG~R@f?KJ~BJ$^d-xE_^DFegP&xE7#wX~2fuNIN0%}?4NGhaC9gYFsio%An)P=8 z(fMg$iqFv|nDPa2gbN!KhgWWEfv&{3$yY>^$@TS zlX>tD!)~_OkVJ@wT>H(CqvEf}>5QRw+fT={n!LGzlAAk?8`yXr7pbi(&^?ifC)F(GRH$2(<=p z%3S2vF*}Y9GRE!=TvdQf!4>D~vAedx43R^!Zg&5cP(CjeyQ$b1Mog&sIu1N+Fng5w zaNgu0gK8ImZ4!aT06%_H{>-_t1^Glo%1WY5Hdl{gMp_v?+|d{1M%70{iZVDzqC5p@ zbi+*+87Rp=>HcqlsRNs%f_DNBNjZ@TBk3LqWs%+kJq>uhCrAuGmQrzPdUhk;2Kh67 zY9m930h`{kUr5K;nK?Iu+!|-^I~bp)tU8bqiuRadC4p`xEUrlISP6UbgvqBWq7hzss|q z$$4-56WN>|eeWONlv@V)6)yS9ufv@-&x`Zi{XLoZc!#Kjx4ukqIJJzo)_n0xBm1Bl zLk=`+U0lBSt;bka*LR%?L zA37bjS;&<72|_gjRJV{4mF;IQx~`}pvKrGwG9h(JNe?sy>o2DvX>Wap;MPJh3x%rF zu)`vzk%=^|H8WBDU>AJ3n!9aMrv+2!!wPvJwq}q5`>=wbv>W6ZKoTdTuYRE_f{4Ws zBcXI@B<^aDhy3nHLx7M4nFVx2z)vC!=06qRa*Q?-!chBqBI4}g>Sx9&96ID)pi&Vu z&0kH;n2~#Nhl=tZU`7H5gNr?^35Yp(D(N(+)5Puf?YCSXm!Vq7+;H;nM!o-2HAD?Ezn9WT0o=N7}|Fqx_`cWfP z(|kg{tZ%M=ELV1aRp+WI~^alDbH`w{c;7v0L-nANHBE%Y5^-ji!gqT8s5#+c^X zvE5wn?@==U!`D6Shynlx5MA50ZQHhO+qP}nwr$(CZTs#vX&;&db5Lr5^aF`lpx56WH!S=$%5x`|JPOh9C9MfFT#x{xi zkG6{!j_cmHHzv#wQ0*i=F~W&rous-S_Anf7Vct?Xk8k%py6b^EG9y|0n;R6D=swv_ zo)ei|>7$MT(KtjfD`BJ;Hrw6;P5PtOehR20tDzJ{giy-2l(z0OE_#cx{8P7avTL-= zR(3?JB)$Bzg;tp_51rMS-w-1%b}7N#P9&uCfJ|E>yhjZ(F4ppHwWbdWXQ%vjhD8Q_ zjwOvHHsH!MXaXwW2H5Y&x8{9+*7zPKNK8})JNMrmJW1;@sW zN#AsBKTZOwPW>8bHYyW^c@k%E3e(JGhlwlLqu3o5IVte+Ij7$_i?i{mSoAGJbqzXf z8yzexAz7-=q;XJAipBm3yv@@q5&3bjn$NqiUD-E5VnZ69gd#_+>RlYAW{}_)2w2UB z?D8C)zj?A^*bw-l8wyvInGWi+#@l$;A+lz0Hli#sHA*m1z)dlzEi1M1^fYWTnL(IL z)k|Dpz1kFLdNibW7V{9oIEIHKjm*f>-%oo6lR~(h9U?n|V!zzcqFY*`kzZ2|6K}DX(ooWPJ6aWA_ z>Hl+gX#Ah;HD3Dvx;q@@v3B0(NXjqP2eh^#noPr)&dly^UCVqDmg~7z-+bbvl#dcs zOc;R`Wg;QfW`FeWx8sor03h8?-EvhW0<>ZI3cV8pUg@62+9WY?a1r4$IS7|_5{WC) zya8t!B)_>-M4?CaXPT8*wocs5&9wvn{f^D)7#?}2;4Be5AR`VCeHdJkmpp(+X4gde z;F6;twPcyY+X;D_V9G+Chm{l(_sb&vb;wgZG9Q5zzb9flr@{I>CViV7MwFFcDNn*|_d$=KnwLAhlvEqaAffvsQ6g8BJ%ud4KUZ%uNJWPV+5md4Rp*$f0 z`ms9`H;h-n&uiX9XOS$7zM0wt8Dfh>T5@4FAs|$YIo1+*O#-1)ARo6?mnbxF6ZuIX z%oAf|U;|AVxC+JxF_D<$DLwXF5JLfwxswCWr?Uq?IXHsu>%j221ax4FJ)qQ8 zh?~kE4TR4KtRI1GCS8cbnEPHA&o`JDJiOezJb-p`aN_E?*xyM=p0;)psDrBmFBfk& z2VXzAdi%P1D(jb>fGt&;kttx4JU7Avp3?+b!daYo4OV&j16|1hN*s)k*#!l4^w{^nu+O~bt_a_F1A}T(i za^O|Coy9@y@$X+I3s=k{JoyA9>7y z={{V-GyP$H_x9FyBzZ=7QFzBB$;cj4x07}@x_-xHKBuplBCA2?ct97)K97WDrsQpl zp*mdwJqF1uO!3NG8k(ry!b_)`1S*)+!fmJmKpPky1NKj}H--Qm4X1MrLeerU)?+SE z(JKwGLUVBh&;r!JmjyD=@-o7RJzFb`$@oB)5uQAo7Hh~QF^EfPT45#RW4JzO7m?$~ z^JsGdCmz^cDFO11xbUNNa?PDMh6`4M-Q|YAO#;{uyCiccDlc%vsNp^hl)PD#KZggp zJir%h3w#!DhfoXK!!mFnVN6x%nB-|7TXd3&`5Jwe1Aho+1jt9rVini$;-C*4RTAr= z#t@S@a4h6xE=p6$cqagZS7uzc_zgUfs&FrN)b z!8?L1%;Bg3^o{4@40<>TR*`#~temEUw4g)VA@CfQTq;rcf`!4u`~YJBq=C;>j(xg# z-sd5Emy)!3*TE{P3Z;jOM-k=#h>l7zDUC)%h5*F76=xloPh;WXuM&Esv`9UM4fa@W zwT@;@;LSBKqs$Wzu#sa}G~09SuL#2Qf@IgQy#WIoJwYZ(2;Z1uQe!9+WDy|;zQPX! zlv0jH5U9)#n+Te<1sO{O5Bo6ahSn)-{G|h5W{ukQ2vcAJUBg|7v8f|1s@nm5L+znSbdS5FzLqm|FpS<}*KmSX0I<{he)^IE;zN;PD* zi$KQYSy>hTt>j#Ua|sR?4Rh>%N9}iMf@aTz&xBXbGmErJPD)o~`zrv%FJ(NGTpLVf zTtk+kIhkvtwyOugPhfbFY{(^1m36RKqVVto-=^hY808L`m7mj9fG3gj<-u5IhkuDT zJa+C;y;IMhV;|yJdGw1>I(r?^(cz6Z-P0voT3HB-2)itSy`yBr}JvfO^t# zBFLMlfGgJUu5*EJclU8O`U8^vXM^#=tXR-e%;<*#jx z5fgErR?-0cYk)ac0p+&Y;*|sNuMftp2kc!RwpkC%xjr_r9)xj!9AG^Pg2B}u@XPpV z85r;jjSuaFkuMpj15H#zYGvpVlpzx{#3K&@SQZ1x=*_2>89lhTcgS234rg6B&ZeXs zc6u)zX4+E^I{LM1`z7#^YXQN*i{J&~pNuvo{#1lWd(*}=m4KG=gN)bm_j`wc?xiU7 z;trL@9X_34m~n?~V)4efK0Z#7r#gy>r-~EFOfjQq8ZZi2G|+Onc(_~{xGsZd4o1b0 zIeiL)>GkF|g5wSgMeszLkVG-IC*%N^*7M(6!_U8lpVODa2kUws#OcL}j|$@?#b#E= zh>1)rDnX&DfVNb{|g`QxY?FTb%Gw}z`EZ3&Gy$^bWQ>vH` z8bEInn?c7RP7Kvq@H(Y4Aa0;M7t5#7wl{%nmXRZ#DK+_RZhG@zkmafVILKR)YAVZ~ z7dF?Pya~kbH)5Ja)LK@5J7n4Vou`Z>WB?HDeZs*A4r9Y9?INQk0BWHrnpz}XK&Ov9oWE{$O>i-S+k%MzB!Vlrr44olrOOLgV4 zFeb+j!SBZ)3jlv<3p(tLR4FW;VT&wi3qschxed(MZ(da{p%%X@hdHd6v|Jd4 zY*7iAxt@Tf z1EBd?h=o1O%xkI+$S6KV4{QM z#=gv8dhE%vd`X8wIJSl&LWV@%_c3KH1Uns&29J2bH@Cj3u%(^)pHnNlmI?U%5>EQQ zS=(_(ksjgKaMu)dk(R*qnozMzT%!jo5 z;iloRY)!P(gbdMdu&FDucj6Vtie7@q2X1%@Ih~p9r{u#Q9-Lq*!PYIb@-SBE)&e%* zuTV1J2=F7RQN!K&P)4(x01zX-lhYn?{w$IPKoC*}TfaGpbKxw1ve>T5lrlaKMj-2y zpEX%KMNKZYa1+1SBL}>ljdB>()V)_f0&rkh9ow;TMVmuWRK-i1Exn&it^hA+gwYhJ zkiElvonIS^usp3L{cM6%GR*og)GS!>(mGnJUIu%it(J?Vsz<9uAi$pu^Sv{qE}^l3 z3qE1wbp=~3bUply&dMo84xxmXC2E{B+(uQ9^po;(t(fH*Cn$wnT1_tq9|ytn30Ov@ zs!eM>JOFg5Zf{nrEVVg5T;`{^zAzs~m=4_@4yqyN(w|p@EE=1a6ipOE!mFikCzxur zQ_MA;O|jx-v2NGMnyN`}XxTO~OLx^Ce4O$ldTK{Cn}nZ&<UVOr%rh^y%o)WOa>0a?J5|=n8>d<<*qQdI#^o+nWu~OOzjM5>X$w< zebHJZ9aA*hCe>w~JItlQPhg`w!@vzZM8@I#2z9MksGnvbK(80jrBi5@jPLF zFIK;dv~zr()@O1xa4Vb~O|g*xvt%Bs6rFd4BBJ$gFX8^`cHGpTLMjgpm4+01{Rr?2b#DFwAPgdU@QH{YYHQm#_gnPPA!DiEYcU)S!P+I-v`VJiYBXR$ z+8lw(O{gt<#;C7eOw7?%(@-cBT|H4*-K!~6+ofzlw%Hr}BJ1#I^r9CN#|V9S#S_V? z)LuMSht`k!q4Rh@SK!&He5d|kh+b9gVVb-!4ioRSJ6fl<1NtE#IlqS3Q#D)Qu^9W! z0BimAu4=P-T$RN|6%5%%Wr=|{=0dd5Grx1bSYZTAalww=yK}ob(zIGt6liep@D<-Z z$I5*}s1fp4r@6@pYmV#44L@Pj@5iN2W(AHe)3B0e!UI3kIek4Q%TeQG%! zBXOWI;*9~qmc#sNj%(zXEBa4|)JP!G!z~~Zs4(7#qFRL6lV`C1{32K%ZDYC+F?;@w z7TI&Vt|gSAJ(2j@;Z{t4^}u<0FKYLjl>cq=k6^!OBvw3zd-M~1?ftB?-g_S2|V+_O#i-=FH1mt#Tqq*}1E$T~<$qkmgQTkE!NN#QI1yEjWOoDwd&>WaNdQ(y|p zzVTY6x=Yl)vVzFVHZ;&jplpJupU1#1Q!+e4x7mq2I9Dqzu^KH}kTB*fnUcCZ|MT!C zQD6ezvY<|^^YDd`JshANd~<>u&10e1LyyjLRP9x`^C&9e1i)jcc|pkT+bdQe@Dy9D zkzUVTG_v>4dTBA$MPgS%8dUR)#YL*Vb|oYv0L>ED5sCH(vG0^t?=S8l*VWUpR~D}V z2EdNOvLJpX`?(rSs4Rvv5V2!9W?3nb!b8t?EJ;uA?e4+*h7aU?K|6`pZx9gP0r-*X zXa!ar5Z5+&KA->oQSqn`G+ThYEof+Z*uUXhw8}6YX6BU#%lzk7$|pQd`5>H0rYbEg zxpHeWfVI3@r=;>|G>fGS?^hvEr_#u>DZQU7&ufX20o~fkxZlUiN?bRF!thi~*E=jB z%0h+h5!Mjwlw#+MsnSii)X0SbS z#*g4~P}Zw=^xq18$=w>HcjZ2&kWvtZ(?F7e@dz?~wp0l)`{f^g?3k5)_3Q;bEZC4} zgD{81B0{wH)sSu&xhPEARr z#C`Y%cWX)np+6y^VK@Gjm-3-xp?F^l%^H>-*0ZLZkk5wU$s#hzToUT9iM2GTo^Al> z-{-Lpd*i%$@4K`+&U1<4jTqOBl69h#AMH2n>sw3#{%C@Hi>TY@E2i|@oK8Nn*c}4W z6Aw;9b@0qTO6f(X-SHZTy3VwS61UeQ|7tbWr+c4-)L$qnl`%w-)2^eT1i==wcn@nN z|5;Fdvh_Kr%Be?;V$1E>-;ghO{Rs+vkvojBDPJQ4j z7t!83(ZY4CuQ3LFscb2en^fWLsmqy*vC`=%;b#TOHBYB(^P8T^Su;Vx>m;E@&xN00 z7eYQmEExUc`~SjWcF$i>+B|JTNr|I)_&f7A?; zsxnhe#+;cmHY|^+H4~9mwvwci$tKN|Xre-B>?o57DK@h?_wD-bzyyF%NzC!Gsy0X# zEM3_DKm_>haT>skm+jJVn=KJ+HPT&=O_4%)M)9t0$0o^O?a(=!d9rhJ^V;GL$EDpa z=avSJZ-T-Lv%dhM50*s}8W}Q5?YayfIOI9aHF@UmcT(Cn$@CcKV>PD!5lk-|v`ukB zJDrLBK4+ZijQKI_8*EcOc}_innsdshV@999JlQ!6*LkD~?sMZkuE1_uutEdFi|Yf5 zDvo7lH-ca{gT8Ot2m{k6rbLp2>W&5M&jxc?G2;pF&-R^Jg2~><%#tCpY349Z&n5<@ zj6%jW2VTKK>lVnxa&HobCTZq_A`IEb%f@EzeH~ zp8j=N$d=hSb(rC@S;3V5-p#I_%ZRlbD?Ti7AKD0UCN)E{$Sr|poCiE-0<-+$aSvut z{_zhooeP*)Fo$-ZHSFZYs|gfI_bia}x1k*7=prpMl%ZT>gFd5)dM4|Z239EI+0!!- zQLb}NekHyyne_Vs&vrt(Tq!2#~qWK*Q#A}ydJ%jkJ**s z3b^?k99$-N8cLntOx}5xLz9Pt%VYmN=|5*k*$sPy+0g5@JeU*8TO?V4!%7ah14|)# zLX&3y2j#^aU&$Tebin2=Ob$bo*V-DkNj459lF&gpg?iA8v+<5$aWFN#IcmjsZs3=0 za8knt-dmYrI>k%HP`cE=F7k8@i>iZ=~)24s|N_xwVaf-{w}iv z3o_op8;c$6*l=AJq0^;KJ-nJgzqAq_Nn>~&peY&Tv@k$OoE;rz<9|wd^-B?=)u%8# zj0#DoJEV+69~L3NSBtu@;Jwp&_q9Ue)KXW>=NGlik=VKD6<2`YbN(fB%05mjB2nn{=@#X$8)U_BG_cA|wz))g z5&P$9w3m|_X#vY9H>NW}Bjdc-kBp_@$ajT?&0=uGxiUS0LqXVXt?Qa;mF!N04Ie>7 z4){f!%R7RBC_J&n#B4k9HpcD<^MZHP5E+K<%;la~<6uRxv zMSDbKF3mpKSP`Po6BYx0@&T2u2=xZH&7>T!D1~c7wF%1t{T#&khqN8N4)|;?)ZYn!Hf@@7M-KG807>1*?^g~(OZphWuA>_i?zX6#YK z;av}w%_FHPIMIb>Jwi0IMheJ=SrW3?mdEb}Fqoz3O3M$4PrCrQX^~KC04mpTPn-`8 zB`TC7h7n9FfU`0$s$rsxPpa&6QJ~XXJ4nD=3?ERje8}Ysl;GdnGbE;&30ffu0)lU8 zji*%8i&oKhxY4LQcfd$Jb^({LfF!CZ<3syHMcj_P%H0~Nl zt0dfk@G&UQGK-UPY|?8MCl!<2-RO302)QWz`|f1-lmY33+u9wK4qF(#{PJbTzX!W< z0`d*8C&W(ard|@vlDYw8_tY4Knpqyqhau$k*NGTH?qk&+Ep2UQ+9gb*m3XaW`E|LA z4j!j4bQ!PC*Z2uw4KOZbdD;xIw%E=2k;VOc!XtV+FUSBVLl9*B+3v(sN`|Jo>03kBstg@ zOsF!u45~Oq_M?hPlw;Kl$~nDOVhTHz<$Cw;9-5GIP;A0qIXXYRJCDu@vA`Tcxg<)Ct` z4xob)n<(T;nz!gK56mRvJdcAl1^EgY`Ij;pGP6`1(JSb&+m zr9y=6$b`^)ytIg;OHk<>-i~ey=CX&nian(4Lp=}>+u00HM7S+Mk#^F~eYAJgY2Q@e zM+|%?8LLTWtPXzeKu4}OlnpN$CD1jLrNuhbLmJHnX|p(N6+c*!Dk4I85)dM~sLSDm zW{XoGyyi-Zlc!@#**8|X_y#ii#snq7L140kV|1jUcrsdob|$e#lD{74O1SxwX=^#L z-OIev9<$Q6l2#I!R3TqW-^^67SFuGiR=MVmL~7A5ChT^mqWP<`Ae0)If#S{EfaE6M z&L*7%3n?4W*~B4-VmlGWb6fNs+zki^!kvR8tzTfeX1$R}h8c`fYpH_~Nx+40S6s@d zZ5BPCeg#X11Yr6S*Bl+q`qn6cVm-z0XcE+Pf+X>XZ>%VG8kEPw~dvQ!|K2EKyqw z6eE`L4D8%6ntYD|u_jnnvK%1Nl5QJ}XOA4knkzxus4so%mq?{Za!*#Rf?rV8mDu82O0Cee_XPiD&RePw(bZ(;zNOS0 zQ##KovtbO|Hsn_C6wB!@b6M)QUc&7%#cE0k6xP<@wuq_`haiY=4X5uYg*4j9 z)3C^fhA`XVzKQ(~w!5c&e!H6Lw}3E4muDn2a6lQ)v(pMC%qD+KYWGbTy`nH!p6iuj z(wmaK_cT(>@lc5f?Z(+64`6r<4=tgRiKh`s!HjCwh$O1Qj#mW;FMhzcyhecxQ;nurSx(oZ&G5(&r~(p8js~x(Y@3q``+elYij!ev zL86gjt0|oJNNUo(_Ez=PsH~N&dq=7|DvaIh%1Prkl`<3XX^-*(I# z>}o29x)yDEwi7%2JePpzz?jJ_O;03#(3IGkpSczOkDo%`%o56NFnDM7LAV}<`4l%P z1hg)f5P!)9am$p*Ylv4K0^17?h1jgTO&TWhgQ(v^nK~zCA0LGTEs@c5x%G7G=KW3O zw#od#pYXH5-e|!$lT$SAz3HJPLb0>5qt=OifNukA!iqXq`sBa}5w8g4mc=?M9-qIV zeSpFO@LTZCSDTb=2L@a@TO#dcQ34Np)|snq2a6eWt zAWn-1DY``ChD68+@_|AlwbmUPMtkka2Toe(zlSi1hEp%aJ5KX8_=R&?WXM$&%nIKI z-=lc|GDT<^Wjx%-^l+_P?(5b^ejYu31Fs zHWG>3!#~UVNGvaLb##o~_U`D7!i^ga8d=WxOll$LoM#Aj>BXkO;UT9(S4I*JAPyed z*WDDmQ<{e_4YK&U%Midw*J21{hWy~7&nLH$IaxGH$Sr*#TLkR0H|G9Y>4_#4JUeZ* zr_R^VfAk(T`SSATAM<0t?AvDN=QpC!A!6lslVD2Hj;>L05QD%X9#K<4KOmM!(8&dK zq}jXOL}OG`UZdCTWIyf!({6(y;AurGDu)K=H!A9f_5T)MDNfgGK)m)FhyC*Kx3w>ZX-@CeoJEhf7Z3`brq{!Qo8us5SkOda zAs328c6JjzR1WNa!9eA*3V4x`hky`(JP!d%ZQG$Ujo0ZwnYv~&R=J@ufHjrSS$oXg zy}`tO@Sa#9@Gp6L!g)qLzOR>jLMt*~$3ftkoaqQU39>HpSvL{GC`kVp-I9KY;4WN z#UpG%z*1q;@QY-77_cZDyj786)up0ULo(9#KS~ z2N6YdZfu*$=gkCOza^7?D=mm$dky%YM0jR8M#vc~4adfS!qHAtdDTnpO=U*sg%H6` z&TQZj+HvLuJKBr3aMcrgRo|Kh+wDU6GPpIH&Tziq@D-iu&`ExCq2l$*?N{%CVz z?$QJl6QM|q#bCb@OBMl#^~7cco1q?*mF*=mw@GRNN%X~!4pKJ46lLZ{`n?4@QALXF zLYE5ZKA7d$6NE$>V@FV>8hO`ytS5r#?DrJb021Kzltq5+(P^dL^x9Bw=`D))HB4RG z!sC__e!|td(8S~0)TKifRf==6K?`SMqji}?g~|xDu4F4ks-37$!$vi#&5v}sQEI*k zkpn_in6#br$|wCLsPiWdq*{vbyop7*^+OMkNpBR!;@%j_%viv4v7{7`3)+cp#-}WZ zl>5@5Yi%)p-^D^pBh`>lW#h$+O`FSP%U*7C^>E&9T}fI>TDSf3-Uzr3B@l#2B&V&; z0hF*|%X`)mS!yo&i1EhCJ?PT-&;&?@=(1lRVPDGtRkG|Vfal*Xg|GYSVQQq#fgZu? z$W+>&sXYemWDz$A;tHMxJv5|&LUo~G>L@~}KSL?DG&wm#)&gyXU#l{tB8y4`DAbXc zrhw)xRkZQ4A^JGB7ZnP7rNF-rHDOjo7G!-Y3EDJvcUPT`AO-+}7O%T8VnoZ}UxN_daJsD8xtOf!7gL5rfdZiqpJjqH>095u2Qxsk+u+Crth>YE-93!DfmHG+Asl}$US zpc?PNkk&6jG>i{#-FOE>31FhGBT+H?Mih3u6i%*)b{mbfm6u6IGii6%5a_+%uBUph zYz{5VccC9y)d+cSNi--K-eGqC%_?0@ow|Myx4H_hwqj-)usnz-Teq^eN(m*DhxUxu zyd&xsDf=;q^|}k*2~v`ZQJju+m)Jb{Nx5(9XUiV%t-48hW}*T)L5dPQq<(o5g2x0OhZEIS5zphv0ELPZSSQO&%=`#O^K(-CMW0q51} zezimxs01o84+?kgs@DuM6J){7``^lVckwgys30ESnrmKv@JI%?E=j*=Z-hCH*o2W+ zBEc8+{rW~XTZod;gjFZr-WM5qe{E&L!w`#&`ZLUfP6DLHrjixKltBn=K60KiQcX-S z=;_Q4`JzOm(o8UaMMW*UBiXD;- zxV7I^k%X3xSRIgRpKcW|E~;rxJVNIS-|(8eAhP+L)u$XG;K5zSO#}vN=xB3QQjOvF zhpJbjUU3zD>?ZZ;^lQ7i1Wz@Cy#oo-ZZP0Dm{Xh-Z@2GDx}XA zKR)b^{&guT3i~S3n&wr2GSY%^v=T@*5XJnOJl6V!|ScwKJWLGI$^7w9&wkZh~Fs5({bu` z3*DJ7vFLC)rVm>son#bN%2Ru8R&{e5`W(N)&j41Bq+d06WscXZ+VlE(GrqphV%&R* zus1P$rF5^7fX9>H!4AycJ3STF(e|WdJ@+jfxZIg>(PeG`K=<^+79mn*)bBL&;%Nul zNYkbkZ;U#N^{8YC#vL?<}$rqoqI&YeV3ekr%H z(-GhkhK1Nq2Mklfc-kHh(&q>DYbTcu{EnhCNSKpxfiHQDnt74% z^KC1U3V#&x08V5Wa|l}?7pN6X5mP3M^EugR`jL1I3%-{`#SJuJ7Usyaa`ehk;Hq)Z zbhiPW69ht-4~h-9ELEf|Sy&tqabxaw*HRKgoYAH8veXo(ruRESCDlE?^gZMq+74+x<2 zl2f#PkhNj@NboJUyU=4{`zz5|4z#%R8}pR}$;G>|M_fiJAEG=A{t-s|eBn@R5hFEX z+Ke04KPd5%SG{9$Yn)Vt|sF78f!}BHiI;0x=XwjLz%(oVP)TVa-Ed zs$%6oj^6p?yUE4N9fNef zk`>3e+MwVz1n|oage)ZHLU-h7;{_WKYpVBN5|W5*TNVs;L~Yv%L3iL+aK=K)K1rvL zjwbY#^nvd(NHD#j5~xbQ1n>u_3+}kTg>>}dc7MUdaU{^^P1zep9=2OqRhv-3e+2hlR)dEf7fj{7mVHU5H3ng1=nNdyHjHvhVo=<;&9ls$2Y(M0?pbz z+aS>J!ARcO@R063J?b|Rc<#vNvb%z_Fv9UbRBBL}ILb1U1CL@hFh#nK1>deEfQ!(N z@BXXD7w!8m6DEOL9rQNGT^4DM?%&WaL7G?7HwOB z5@C*MJ8$U9A`8_FG{0SZZV0=MXp+7LT;AFhy9(TOW!66*|* zvq-TeRKs2|Xj>L9x9x2cM)crwiJj`kgN!caCrK34*h&nm%QoMa4&V68T9k)&HL*vp zy2q9B{isy&#(behXQkIiTBY@*yp@XK#Ebe?<1SNn>~5U7C}&*qx4pY z5A>qWjOz4*G}*n_^(uS7PteNx7Z#fN8Ox(|ERCd)(qJOAeH}Y$L>z7oZzwoNLDBq7 zPX&VZSq#}7-!Pg_@aJzHIALhWT~$Ja6EQS(HYw=w}?|!fc$kDrw2y4LVgtbrZ8eC4{pBE zn}MWO9`t}kh}0PG!cNMRG1Kf&6d&ePRb{{efjLq7U`D2sU_m%nGfDm-ze?NvMzhQ# zN^3UQAe2U#!*<9lNDo9#C}=O@!z_8u9Y9-tJN9EXPZ}csK3ml(2z)vM?jxu*yXUh@S0uSpB(^R*=cg#E=9etB%dlJC?57| za(hzspIudA4kPpB$||RmSNBZaQgzdR^T0iXecmvKkizmLYyG<{m@5~~l!km*Hm+fS zN;lA@@rNm~f*s(~-q%eadi>bkV_f#1Dy>``XQf4=BruFKG-ic-7}^Rek*bGv@#(Qf zS4AA$$&Zoo+5v#thekx+nZh>(^z9Q~inl;x*fqmCRhV%7l$mfSU?mP9M;#?@zg=g_ zQkvH#K2P707jD<UZd$MCz>+^dAq^Z3xjqydBd8Q+ETvsvl^A;|oP!(dJ)R=AdrJ zzG=;bvzAs&w)vIWNFxDg#5DR59OVFf=J`08Lu7~d&gNiP0%BLhOfJ=U$iZkmS>}rpgwq^@cZ$KX11G;&Vs*e5x}*ztW!&iWwk9Cfh0pi@MRbbp}K$r>kL~1_Eia* zwSrGuC^UZo;O3i9VF_@8N=vTs!fQUOK*g2!05@jRJCZ7<3{O5;h#aWW4Z~HXo^NY0EA4#^b|r$A zOC3K*VL6NO(R!~@ziVIqV&Yu-E&+|o2ZJ$Z{{kek^mAE#EY0Wfo*@TrzX=xA0-&y` z#PkQKZw0)eVd1fy)z3CZQ!(62DTr>Q}(%J6?^lkkmwaq_@Ta5=JOJZ5J z%RW(~VaHw=WfVh&=c}Gg31rvt3XZ$Xj6xok+vubDatLm1sn<<;^e~2ez`i!$v|%7a zaTo#U&?~{NfI$0UC=iqvS`JiqRoM^k`r#0ZyAq2i1X2Nc$RZ*X?9tAju`^94Rn5!JQkFrBb1 z=8NGitK&FV-iS#zo**Z7 zU$)V*v{x0bZh^Bvj%RXR2GBUiOwPclV1XV8>20$*l=X(Pp&BNvvUL(T0fCr=&BOtL zWI*9&p2HPDdT9O7?gv3n2qgm^-fYPeHp<>KqHq)8!ZbrXs@P_D)bdbUR|(tn5_{LF zKwCoYIOy}w#c|~x54Z3f75{^spPTcxho3XP?DSu`&CMnECNHngl~!;Y{ZLXALWS}- zOxJ^J9&``eN7^=xd(XTor@6#XFnoKS;bRI_WO8%tqh)m^oC3ll%4zaic_oxEUTq_L z$vx0K^*AXDXstd~Z8jm^#&y}G8>>yF&fAd9HIvpO zKO!esG2Q}s7F71UdvtBSE}2oiSOt%v)KO~BAF0cpKXaavJtzyJV5|a$)X+!9X-&Wa%U`0Y()SQkiz>*Z-V;tqQ(J?!M>ip5k(Cr+mjV`S zv~K2fF0(s`(b2%O*&CHY2j}bAY>emS=%(R+6MZ?qUM$!b)u}?rI29q2u&6@BZc7yU zz8`#YE7l0uFbt`|ji`o+Bea5cW0xD=etyzVtu z;;|C2Um67kkc&uDOhH<`F`6iC32b|OXa?cNbtuzap>yn*KVbDY;=1QnrUru_P>~T#e_EHg z6@OJTy5X=-Rnm+F1~k$5sG^iN+Y8oDn!DsH)d*?{Y=%CsQhYKVaTrvHrzMGT4J9I- z@?IUFG2g|0e&-f?s0^Vng ze9)uIg}dJ|?2TE=9baRhb;`_k1g6i1@1?J)JtO}55GYquPiwF5QCz#Rm5-4ZC$0>z zHlkw>RvNNr&;;g-RHC`>M}?Up>-Tg}66~PopS61VvPmvV2p?+$O=@`9=^{y8Eb}H5 zv40MnltuBABNvMe?8B(^z(a#fd~#f|8BfAd7_v50Qr6K7Kd}n{Cbr3O{m|Wq_-Zl| zoZ!o#CvD0#$p%zW(VBI zTdBLBeIY}CjDJ*>`q-&T2){MGTaq^o-Yz^pPbfhRbpg60Gj8oR*BfP<9xZzpG80(Q zcq8fLrp0CWR-u8R&fL`e+jvT8vGAJyxo@K#E-3i1Xi~C@ODt6uct{lBTl17L2wOOm z{=%ohm_q=C!nA0#h98*Edxq`&gOA^cE&Y!7QfqKL*^v!^s=?B<{b!RBJq_Dk zrHn0E$F!)m=)Mr`EK0UxqFOca`~4gjGyYQp#iG`GR7I>7My(1Sdht;&iCWAmtHot0 zR$W!TH2!nY;Os#2$A@|Zt+*gjXhfvqbnm*fxqV+`aop$O{t~9qyJ)i3etvNA;UZsk z386INlO9qwoV zL7uDMxv@r<0iig&o!op^oeWnHx+vJNQ_vcpW=;4&fWNioY&9to!?LOsX@>QDF$x_u z40OoO`CaPmf@d5Vyqw(ZyxawOk&pnGwFwK6nsin(Z0s|^jFA2qYxDLPiZ?j`aINd%qxTS12Y1Z9BT#?UAuwTSzUV?gIPC76W0Y$de$NrrcqRYyKyhB z&5#XGO%11zkWkvi5f9v~yTnF8M>w@O}2HuTNCQwGm@G;jDs^) zi@kAgPxJAZ5HK~v@hEM&Z;%*R+*cYC=oBUblL{lSqGJnXwG8PsQ9d;zwd@MM?E-J9 zpdy1q+_mTk+zpSmZe4GI>UJ#yZXCVaQBJ?;hdP|}To5usN}2*XD|!f`WumjXGJUT; z`J3#WML2K+a#kOM0>pFdOJ)W*9GpiVdod3tZ#*D3(!e~hQFq2}?7%jD@Rb04U4M;u zW}Bd~sfDIK4sERshG9pp6Liy%%GSi*Q^J2armKANcbj;op^9LPcCf6%Lbf}JdEY(@ z%+8~j4y&lrXv^wWYcxy+3I|v3abo$+G)o|OVx+}x>2ct9jF;Iex|@(7wXMDEx6h6h zg`$X^b#J+4^+auy92%HVX99fyG*`yFVp$2DRrgy(nb@U|1ZuS9Mn}V22er0kx|O-X z{OXX8!UPHtCw2wSIHsT^8w`w&83x-6Dj-tG$KsPT%tR4RjK{w&yx1^ykik32oP+f*Lf}f1a5*Bc>CCIE?c{&@w5nWEeVed_5qRFZ;!#xjXdaFa0u?SF+ zXX%Gc7BYc}Xo)Z@`6;Wqwn3yZ@IN{`^KdA;_ko|WFWHm51=)9!eHT%-${xndV8URG zElPGGl#uKq+Z#z#wkV`*DKC;rN}+5OLik;i-ufCbGr#A$x~}=7?$2{C=RWs2=RQx7 z=P$pVd2^L~L6bAb@ASuWqepIhnkac;>NxlzOhKsiWEYueH1($+HM9%y7HzNN3XJlf z9pF|xt9kfK#C@I)_;P1O9MgNAnv)3+E5E>ZTkr4MIWdcjJgFX|D1$DL<~ZyW|9vK; zYGho|cSV3n{;o-1ikaEiHBUpc)wf}{3vxzAQ*N31H|;UF1K!-z9oR=c%$rEVM1MX< zi7hn2+lT#2P!^A$vC=&CndXa&s*eiBir5X5_K>}nG7wp&x+mfn+Nksb?z`Mf`XTq# zsid#htt6ZkAIg@pQ`U`=Jg;G3do%xJTBTq(kwJWM=jD?olDun|=y*=}il&!SI}Iw^ z6{H)|SG;5B8GnHq16LPB?DYa#5IVh{NOom@4AL@CL? zN3RT5N!f%YJ{%T|R8eiRmD|sjG-#Y)`8i4|T<)Pr#!;w-RiuLXxnwOTIrl)t_Zm$lvH}kT)1hb)N3pm?Ozz43*UD>{Km>nqi3ZhbWO#ZE;j zP*|qS~BnZ4Ja0oa_yrG9y)4fCl}k&z3<1n57ADmitlLOmvZg{|6!ri@98g+ zOA5Y=)x2HRlM)lIq0Ta=RNnmWLTmnkf;Sfz-0W3e20uiLPh4TxH-BFdn2hw0T-HkZ zCXlJ)^TU4N@#80+NVg=wPc?H_vOXQx)O z(pWTuX>gm4vmdURj9XFGr*tPl3wYAg>Nm#Jba0UvJmJ0 ze(a(9jC7*!{LBZ^wT@j5&;09*7)FYZm(zvzU$A)^SuX65){%vZQ5CZNz+cXBTR;Jvz>V`G7xN%bE zo0j>jIuE496Fs=8bKwsX)BY){nk^XOBCGX^Nui$&Rv5T>bj&z{S^j>X6HlOIE?<=q z1OI_}%k<2I!sUrEy64krm-3jvWBtbI4lToT-OUGwjr|7B+?l+upj2(&CVX7ku4CFW zNVc`N(J}AsQfcz1-nww5vlqrrQ6CQ@;drimuIbWl+vMA9b~HItr7L%wU-pGnc8SW1 z-3z8>xEfSkcFWMD=AXrccOwl^2B~i5&H~4hl}MY~3&gEXn|^7cZ0%Qdnoz7AtWZcu zWjw63e}U3jfHZk>a-l2s6kpLDg$FP-v7$B`cx}Aq+R~R}WkxJda?#4u;m7zDqn{Or#3i~k(bibJ!z64xRAV4I_+$dxxt)-6a*oGBL|YY}Q%OJhdZao-DW1+;%St)z zvC&}zj${+dIF*i1rt_ooOH-i|lqORz8NFT`D(^FI?7zLUCMdp&|JI@NDCs(q3p}>B z%G%1M-$`Uksn1mGeVW~(%6lO8cvNR@@g@6u4pL*atQ|@1X#;i7gQSgoB#)F(3SKa# zwb*y%#A3V5Q?YjSFhg3ZeMVoT3;^ty$lYUPqTOzWx4nhh`V7_h-_;??WDS})SK?mS z_nK+elINx=nO7jm!X=Ndlg8xSmuv=YA>+n2+}V!;IY?x?(EHri4xTQff1I6tk$=LL6aXYcn@rCn+YIh4kr{^dp9aiPoh z!eVtthG>r()|Uvc-P=)|yppnqtBejsA$BsX|G*RvH_epLR|@#`Vpsl$sb|JHB7&`! zdA_?l$m-I?4@YzKx0OCsASDrudBFe1kXEA8rh&3|_)uT}th{p|H5G}VUSW^N%(Z^S zPZ?{s{LptTrWVG2eT7Hb!`Cg3d^a&%1o8LuMVF6iYp#=I0Ph&3hwXrsYiSb-z$} zMzi(?*-0n4i4o?yXSe7zy$tJmjk!<*nYpUF7J0Rzc6PRTaz@%fx~F<*D+MH`hYgEOJ*hibkbS9%u6=->41!!gGPV)tnK z&pl*DenpMlc*&J{;iQkgGrxdN?}N{ik^52yu3dsym@;r``<&R};b4o#e9nly|7bP} z)8I*)X;vo2Q8gRwZWdm+#7!y;Z;qr-k@A!8pwwvmlG%j9D9Q#gwCorZNz}GI!~NCd z=09ZSQPbCtgiUvrc}E9cZV=V@VDu*Ien4PW^jELJKo7_m~&O>>*ZTvM_!pF7BABA7qZKT4QhW z_46IxCSTOA6?j~RE(*?Um3~$Fbdk>Q}_Hzt9#-B;`9**;&t@EcBxg)_ztHDcYSoB#wt58#ozOoQ_U*a=0XP0V06-^ab zA7+1Px}?h>*egPxEkV?-V21C!S^dAYCKZdP<|gYE6%4c7BP{m)b5E>@CfDwi{58wL zZ*!O+3!ed#YJi^`11@evfXv(q|P?SGOMTK7NYUNQV zZko2WEobWwxXOPa@~rsTp_U5Ye?>~%B&N)d1iv-ckt_;r3@~8E91~L4x6Ge-<^T;| zU{5*5m>#53pFkgXqLw#Cbvmo=j>|vC-kicH7TKl^JaYDUqmlPc)=Ly)Jp7?VUMmLh zhJE4k>kPEjv~1gN-!Sge)&1t$^!Po273#J6&m&{2^RzK|=@3NeYNwOhBtxeQK>=) zS$io#DKNNCSyeURRC@mlM;0iPysoKQ$iMejL#N*#w0(Yr!|HNk^puH2szeD&f1jtj zxLs$Q(yn~8VaTV^H}|GAEy?4kK-S@06f z0M8;;ZduEF=Vn=1{L*B4A{H%5vxc=Ns8+<6(etZwi?7v$B2x4IiIME_sWmSUde3EY zgFA-$bHmH93SH3#T7?LRmD*b=Ddj=?w)Y2H!*#~)C{W&nl#^ZXbu-MVY{-_#q&?Z1 zM&CE?ME+foQ}(!kv(V`dJ#z1Y)}HKdlq(T;C7|Z~eFVnM2gtdmR;#?j zd(NKdDsLFy>txX$D%hjJ@m~BzOxsPGJ`a;LO@28yGrS%tX6 zSEEAq+~ZK;=M{}05kj8SGHbaBA6nH|J!me{-jMGSU3$&sCA_=LK1%v!%}y&CU;oiE z%ZT=680&$|Tf1c=GE}2NJ<>Xsh7~>igE|VOPwA{O7P-h|90}sf{N5nA;?RsXz{t&V zEVov^jOmoNev^#+;^z9)Q){N+pYYLd2s&+g$ly)sTJ5hbN^qxGRm_6b%y|a$4hcKE z1Hqro%R+ainyZ0C9~wHAQLDMG*h?4k9CR~QtrFVjSI(H5ge?m=6{c!5AV@qAZ_PAO z6S2(sjQ*WWwUdSJzAM-#5R!oYND#rYX=b2uK)~`NlbZlOi&vMG}eQ+7z=R3zRoHgfR zHo>HfW@K&cQ8!^ZFK?y)Lap=4;mC88UbL~7mVEdCTEgzE%bE9SoZeIqZF>@Z+B#eY zP&2Be3p>b_KaYI1PJHj+btA4&oRd_?sjfYs(@BC~D=}jJn%7ro8p*@J5rL{h&c4W} zZyCCE*!>zx&3{+bPSw-KqQHh|Qf0R@`dVFNTAeZfn z5eMu}j|10&G)L08Yu8VZv&9K|%y$JV`ma#z;{37KwSpyRU(d~DE8jB+!Ov70X^QTw zjZ_@s>Z7}Ju6Ng6?-VjSH~08iY3$(|DnHHoYTJtMi8rcc%EhUY7f0r;r*5Ve&E3?V zZ;lQ1%`PeqINyJ;ZSn4-IW?!okG&!v4cFWSVJ4&E_Q2X?>Vwvp`b*O_>(5Q?u2dw_ z;mzq}4%u89*UUrQ#yzdSH+`*%$tuXMur-XP%IvaFs*I;ikC|c%Q8@kaoaw4sOO0N3 zbFiBr{1XUxF@4<7*lzHQ4`&Mvy6O3FopV@=f7aJZ*E#M}11196=T0;gjrRwZTchME zPu%J>s5Uf2Ra~+u*q>c-se4FMF>R8SH>8=2J-%{LM=HhqN?mg`1Nm~BZ}OXzf&Tg~ zFQFfU+-w;gFIv=(b-cPhKl?PY-Dg+3$A_7f!=|>1LmVm8QVyi>GC8Oq^#1fG_x_fC z!-R%;VeVPFzLvMmhr^#KtE(NcD-*Ivin%{{8I)uhMr}gcT4nTPD#2ek`txc>ScwArk~Iv z^lOatG``iliqtf;Ga7>`4>$Fj*or=RWzPJtK1(5@b1ZbU-Lm@)FY&wG^9+|6*dB#lI~V%6i9ub!5q^^4b<;Ri;~UmF$MMOc)4Wq^9YPZC zB1oeg3YQK2;=FXjgUGGn&h6Z3?7WWKyLsGd_NJ z7W3(8c*`A&pbx2KCr>>|lGiihP2L|<-X?qJyS&3tR5RrvRP;Mn+WHvI=*R;Hn$B+>FlZxM%nsKt|@A_L~5C&X*S?3R)bQ%8~rhFV3VCS}YAhqmM#MO!D<5{R$Fw zT|rp05V|P+opZ-l65+5pBCfO|6@_ zB5+YRugxne?!dEPXty&cMj{l-;=) zucNsss)4uS9fTHsG%_b=lF+Ca-PQ68NKev}ugU+HQgTLa7}1!T|MUi(%C5_`p`R+9 ztC>zm!~ElwN1YD(2L!f>EGfQ(k>~2|KxQL0z zN4`i|>)x9}c|*osf$uN8gU>$XqRUX9q}g`^1>I9{C;Dql)xCYQyS*@snQjqI6F>Cm z+J;^}Tcfa`(VVA8LfyocS^ z@;oDHxj-OY|M~AH_YFQRANCoQU7fj*ycA7cY9#6%d{FGTi)U!jUyUx(^T*{puAvJ%^D=ND4 zUCm*r-Bmz)lXZKdEX-M&+pG5}i?&jei4SRX2y;uV3ecB3I=mjw zSe!35V0k6s8BLWdq*Ok)*m1S*%GI~CJC&OTzdmB|QI(S18@Mm$tpR`EJE;RPE!m%D z8ZrjRPd&Ba$zU((BYmL?@oHPl+MNgxZEaGznxlk@3MYAz7pgM6*qB3l9x80{urzDAqAuGx`(cv z;mE2$TXwgc$#NPYwYyUP^pOp$eFq=r7~`v8C7tI2D-kU%_BSp#hr(ne4~|0vchf=>*~BxA+MQr5R#^n!1d4FD@iJM4$|&ns2hDAX*j2j{XPN>AOQe$ zYn!U{W^`WJ39z4G1%MN90}Ko%E+wHTA#*_7(Hkxa^FTQvoh2{`f8@^(va+WC^@FS$ z-U!TIb6vAzhmDQ)uK#nIKi^@%a^iI%=~n>&E#R-;Vfe*y*$#5@LOsm`DR$ijwHCc0 z8qT$z3Y{BFZhM78kGUk>CVNJ9O6l9=mprZ=2Fq^%lC z(@-(_l*=-depowP!sTUL;s`wVD6Agx;5=7nfj@1RB{kKG&sd77 z%FiFa9tObv>lY)K)WrV8G4YAx)0|4L@*oc@6VI|)VAx${K ztJS4t2mlZX*@(yw>DU$_OE}_bcc6k90KgGPi~Nu^itV&GKsZ8EuQ*dl5&#}n$nRjn zx;sClh;kDGCVx=e8G#~PI?HAD(k2!Fk}LpV{hwgU50N{#S-OXl6L#Ql7ewnr3wIR! zCmQ@5S~`ZCL}L)%7{Z6ZN7B}X0}ueFNC4p9@YYFNiFSs;elmQJ7=(m39wq(^wqC!a z`B8BIBJTjOdjm<}=oU&~)=7l>;9rwC<8Dd-9Jz5Bu)r-CP;YmvHWJ6Scg7z*k}QsM z(vkzse|0$@Z7z}^j}`W(Fl!qLMA1^=lC;i;)6 zx6haq09Hx>csEd>aa&N%|&N8%=q9}*=iv!1|DX9W^7J^U9_ z>jT4PE78AmETPVD4K^#DBL_f{0RZ6*W~#)?a6!1adD#0QiAW=kEa*^dyfTsZiEMcOMK0#Rset^1OUDb+R0wQha(DPHDRgz?5`m6G<+Z@q$A-P^}f~f zub}|IjsZ8UBd%@%!WJh#15X0ukJ&yh{+^V%epzlk_R@2=;&^zt5uTcZ+YLeIcc?1@O*pTn z;9ZIr1b`Q$xNfSsvjxx52k8bE$9}rZ5&Hjf(|!} zgbaWqGyv@1V7k}%5N=3!B*q(GCGcnRDZX?3J~KH05j42d^`859w1Ih`kRF7SD8@QY zdK$cBhd&H5y5BZ z_#`Hp3;?!GDBF*CP;MSDs2hTCNAU_x&V~a3GB?G!_GdgOcZ9nKI)HFgi3`{p1OSNL zgc6vLxiE04h|tN^wy_aCd0d3-SM^LhP`D5#g$c{;JVLY5=IYag_?D#e;%j0z8Qr zRq^QOszVe21k>Y^+*$FE5NI@th#9e1dSVJm0)RRhE~$_k56RmFiY7uQ)Ee)53_Spn z(zuR7?ZHRFz}=9JgvUhrMMg(BH2|*cxJqeC;6XXLc|eH>iM+R_yzUeLxU=CZMXG>@ zrU(@)-aCc8gbV!;~nZP5=hGBS5&LnBsld zE|CC$-P7AxpHpcN0CV$zxe{Q*Kb0m!7mdR*1psIkT;*1^2;g~Rh>4Br-odAV0D$uV zchPHYKmd%`IZNT2e6=3{;1a-HSt%G2fOCSOFhnGHX(8CRE)oEO$#H2+M+l%{knRW~ z2DIyES>;ot0AP1bH?A5rjR~OnU~%}Oa{VL)yEFOVqoebGCn+0;0NpVHXoSH2gybo? z*ObAe04Px5suoHREWnePwStL%fw3-X8<(a9a^ z=H>w-+`8guY~A2|RCJ8%ntZzw!4BJ!YxwW&&Jz=iL65CD#o;9Br8 z1`o*_1IKP=t)DeSJ|Jpe_`g$)^#Z`d7Z1u0iGq3}3EulzepItItq(w>Is}Mqr~x_& zB>5px&Tu5*0q;JhE&Np(fS5fHAijaf+enyhen^xf)EjS>|C6F@s69|lWB`aW030QQ zeh`fGMG%odjyVQtUK0QyDjfic4NB@mNVZ?9{Bocl5`{pcJ&0h&yY^;acO&^20FGgg z2@%G`S{36>#Ns(A)tyw01%O&JT*D@b5r*_bqEK!`q%jxu65&`o0PbADjh=%V1QUI{ ziSZ>u`_OVF834tMxV{w5CJg!0t^uAzsM&Pe;hilt0PS+PhSkX@jOm9&dHWJE4^`gw zsBt6*pl?(3P?Ql&gnRfAq2wVQy`$n30JO8rm`5$@^WK@qpQDxaF35g-NN zGbJwQ;ZZywCj`ou@PMd4?hzAC4gfn7?n%NSQ#>F~vW1^KSMWr^yqF`tY5&c(s>C!nzApkrj z0btLDEI4GfjT*#35(Y2%N74h(ylK}l)MguqD*}x|xXH>$z!6T{pPm1)o3HO_fm8s1 z1_ak`&Zo9P!QI@5Qz<&0D^^ZW7^tv8xFR83A+>5uxXRUAZ{BF+|A7$N@!P2yQZm%gGpgdF1DLW=#PJ}Pkso`g>5+N{Z7&n z(4T>Al)7#8Ky78JV)^yliwEQYNYVb8g0Rn62xrg*xPI0dhp5)>G(~9lq*f>**xg6|JGEh-$&kwJ#QPyp7}$EN+tKuGjpbuys&cYogtnXw0>A{x?}j?; zlOIxdk>c+~9aaZys|mt?y>0LH_AaT=G*y}5cOFTn1;Bkc$_#Hm$ul*2E;Ti=gs~|59^>!z`jpz%-Ngy6h* z&Y{1_M!5agLWd{RvDZDW(s{B#AONI6aKoi3X_N3@mp|O0u0LIhy<>vswnBV^vF9rq z0LsO1L!C8wlXz_Fv^OQ9d~l@ovncU;>rH*A&Hzj{$i8x4ZYqZTWwYUDTS+8k#BY}0br_$E1Y9wlW?RPapTnFZTrq2)Bx1+ zfZsi;>)G+#*S`t(@Pv85i8&OjlFqsP6U|?C*#8EWbi# zed(r7N`spQelOYxh!sV5SnmJ;U}e)~mbkwQ{&^w=RgfpVekRQ!>ltGOK->=3?zLop zeRoHg3j*d!SRTU`10miaI*bqi8cA?(2z=-KE8ssJ#2tya>fkWbQou_OK$SEA-2XFb z^FtiD|4R9jEGs3jsSfjE)BR zO%QA$LGWw|<;!a0+66#?C2sNN9kfX@1_t|in+(sG`!g)yw_Dem0RXz2%9P3Np1f*AL=W3T?3ILAMf!}$1ea=}(+9dwCv5qmJ!UPkPn(2myFgLS2saOBLSOxv=2)wQH~^esxE{StN{c(iV=w8zJz&4CWp8(Jay`_s z<$laiDI?EL08oaw9z7`iH^8q!gs0ZWO7?+zJ?qv0fM*WZ>Up}GB>!4>u8+_yg>Q8~ z{eJ`TLF6Xk8*ZzU1AHrq&G*v(SH4KpR`SPx# literal 0 HcmV?d00001 diff --git a/tcc_glue.h b/tcc_glue.h new file mode 100644 index 0000000..db757ed --- /dev/null +++ b/tcc_glue.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2010 Luigi Rizzo, Universita` di Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ +/* + * headers to build userland ipfw under tcc. + */ + +#ifndef _TCC_GLUE_H +#define _TCC_GLUE_H + +//#define __restrict +#define NULL ((void *)0) +typedef int size_t; +typedef unsigned char u_char; +typedef unsigned char uint8_t; +typedef unsigned char u_int8_t; +typedef unsigned short u_short; +typedef unsigned short uint16_t; +typedef unsigned short u_int16_t; +typedef int __int32_t; +typedef int int32_t; +typedef int socklen_t; +typedef int pid_t; +typedef unsigned int time_t; +typedef unsigned int uint; +typedef unsigned int u_int; +typedef unsigned int uint32_t; +typedef unsigned int u_int32_t; +typedef unsigned int gid_t; +typedef unsigned int uid_t; +typedef unsigned long u_long; +typedef unsigned long uintptr_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +typedef unsigned long long int u_int64_t; + +typedef uint32_t in_addr_t; +struct in_addr { + uint32_t s_addr; +}; +struct sockaddr_in { + uint8_t _sin_len; + uint8_t sin_family; + uint16_t sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +#define IFNAMSIZ 16 +#define INET6_ADDRSTRLEN 64 + +struct in6_addr { + union { + uint8_t __s6_addr8[16]; + uint16_t __s6_addr16[8]; + uint32_t __s6_addr32[4]; + } __u6; // _addr; /* 128-bit IP6 address */ +}; + + +#define LITTLE_ENDIAN 1234 +#define BYTE_ORDER LITTLE_ENDIAN + +/* to be revised */ +#define EX_OK 0 +#define EX_DATAERR 1 +#define EX_OSERR 2 +#define EX_UNAVAILABLE 3 +#define EX_USAGE 4 +#define EX_NOHOST 5 + +#define EEXIST 1 +#define EINVAL 2 +#define ERANGE 3 +#define ESRCH 4 + +#define IPPROTO_IP 1 +#define IPPROTO_IPV6 2 +#define IPPROTO_RAW 100 + +#define IPTOS_LOWDELAY 100 +#define IPTOS_MINCOST 101 +#define IPTOS_RELIABILITY 102 +#define IPTOS_THROUGHPUT 103 +#define SOCK_RAW 12 +#define AF_INET 2 +#define AF_INET6 28 + +#define INADDR_ANY 0 + + +#define bcmp(src, dst, len) memcmp(src, dst, len) +#define bcopy(src, dst, len) memcpy(dst, src, len) +#define bzero(p, len) memset(p, 0, len) +#define index(s, c) strchr(s, c) + +char *strsep(char **stringp, const char *delim); + +void warn(const char *, ...); +//void warnx(const char *, ...); +#define warnx warn +void err(int, const char *, ...); +#define errx err + +uint16_t htons(uint16_t)__attribute__ ((stdcall)); +uint16_t ntohs(uint16_t)__attribute__ ((stdcall)); +uint32_t htonl(uint32_t)__attribute__ ((stdcall)); +uint32_t ntohl(uint32_t)__attribute__ ((stdcall)); +int inet_aton(const char *cp, struct in_addr *pin)__attribute__ ((stdcall));; +char * inet_ntoa(struct in_addr)__attribute__ ((stdcall));; +const char * inet_ntop(int af, const void * src, char * dst, + socklen_t size)__attribute__ ((stdcall));; +int inet_pton(int af, const char * src, void * dst)__attribute__ ((stdcall));; + +struct group { + gid_t gr_gid; + char gr_name[16]; +}; +struct passwd { + uid_t pw_uid; + char pw_name[16]; +}; + +#define getpwnam(s) (NULL) +#define getpwuid(s) (NULL) + +#define getgrnam(x) (NULL) +#define getgrgid(x) (NULL) + +int getopt(int argc, char * const argv[], const char *optstring); + +int getsockopt(int s, int level, int optname, void * optval, + socklen_t * optlen); + +int setsockopt(int s, int level, int optname, const void *optval, + socklen_t optlen); + +struct protoent { + char *p_name; /* official protocol name */ + char **p_aliases; /* alias list */ + short p_proto; /* protocol # */ +}; + +struct servent { + char *s_name; /* official service name */ + char **s_aliases; /* alias list */ + short s_port; /* port # */ + char *s_proto; /* protocol to use */ +}; + +struct hostent { + char *h_name; /* official name of host */ + char **h_aliases; /* alias list */ + short h_addrtype; /* host address type */ + short h_length; /* length of address */ + char **h_addr_list; /* list of addresses */ +#define h_addr h_addr_list[0] /* address, for backward compat */ +}; + +struct hostent* gethostbyaddr(const char* addr, int len, int type)__attribute__ ((stdcall)); +struct hostent* gethostbyname(const char *name)__attribute__ ((stdcall)); + +struct protoent* getprotobynumber(int number)__attribute__ ((stdcall)); +struct protoent* getprotobyname(const char* name)__attribute__ ((stdcall)); + +struct servent* getservbyport(int port, const char* proto)__attribute__ ((stdcall)); +struct servent* getservbyname(const char* name, const char* proto) __attribute__ ((stdcall)); + +extern int optind; +extern char *optarg; + +#include + +#define WSADESCRIPTION_LEN 256 +#define WSASYS_STATUS_LEN 128 + +typedef struct WSAData { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char FAR * lpVendorInfo; +} WSADATA, * LPWSADATA; + +int WSAStartup( + WORD wVersionRequested, + LPWSADATA lpWSAData + ); + +int +WSACleanup(void); + +int WSAGetLastError(); + +/* return error on process handling */ +#define pipe(f) (-1) +#define kill(p, s) (-1) +#define waitpid(w,s,o) (-1) +#define fork(x) (-1) +#define execvp(f, a) (-1) + +#define _W_INT(i) (i) +#define _WSTATUS(x) (_W_INT(x) & 0177) +#define WIFEXITED(x) (_WSTATUS(x) == 0) +#define WEXITSTATUS(x) (_W_INT(x) >> 8) +#define _WSTOPPED 0177 /* _WSTATUS if process is stopped */ +#define WIFSIGNALED(x) (_WSTATUS(x) != _WSTOPPED && _WSTATUS(x) != 0) +#define WTERMSIG(x) (_WSTATUS(x)) + +#endif /* _TCC_GLUE_H */ diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..9ed47f8 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,53 @@ +# +# $Id: Makefile 5626 2010-03-04 21:55:22Z luigi $ +# +# Makefile for building userland tests +# this is written in a form compatible with gmake + +SCHED_SRCS = test_dn_sched.c +SCHED_SRCS += dn_sched_fifo.c +SCHED_SRCS += dn_sched_wf2q.c +SCHED_SRCS += dn_sched_qfq.c +SCHED_SRCS += dn_sched_rr.c +SCHED_SRCS += dn_heap.c +SCHED_SRCS += main.c + +SCHED_OBJS=$(SCHED_SRCS:.c=.o) + +HEAP_SRCS = dn_heap.c test_dn_heap.c +HEAP_OBJS=$(HEAP_SRCS:.c=.o) + +VPATH= .:../dummynet2 + +#CFLAGS = -I../dummynet2/include -I. -Wall -Werror -O3 -DIPFW +CFLAGS = -I. -I../dummynet2/include/netinet/ipfw -DIPFW +CFLAGS += -Wall -Werror +CFLAGS += -g -O3 +TARGETS= test_sched # no test_heap by default + +all: $(TARGETS) + +test_heap : $(HEAP_OBJS) + $(CC) -o $@ $(HEAP_OBJS) + +test_sched : $(SCHED_OBJS) + $(CC) -o $@ $(SCHED_OBJS) + +$(SCHED_OBJS): dn_test.h +main.o: mylist.h + +clean: + - rm *.o $(TARGETS) *.core + +ALLSRCS = $(SCHED_SRCS) dn_test.h mylist.h \ + dn_sched.h dn_heap.h ip_dn_private.h Makefile +TMPBASE = /tmp/testXYZ +TMPDIR = $(TMPBASE)/test + +tgz: + -rm -rf $(TMPDIR) + mkdir -p $(TMPDIR) + -cp -p $(ALLSRCS) $(TMPDIR) + -(cd ..; cp -p $(ALLSRCS) $(TMPDIR)) + ls -la $(TMPDIR) + (cd $(TMPBASE); tar cvzf /tmp/test.tgz test) diff --git a/test/basic_ipfw.sh b/test/basic_ipfw.sh new file mode 100755 index 0000000..08b66f9 --- /dev/null +++ b/test/basic_ipfw.sh @@ -0,0 +1,72 @@ +#!/bin/sh + +IPFW=./ipfw/ipfw +PING=/bin/ping +RH=127.0.0.1 # remote host +R=10 # test rule number +P=1 # test pipe number + +abort() +{ +echo $* +} + +#insmod dummynet2/ipfw_mod.ko +#$IPFW show > /dev/null +#$IPFW pipe show +echo "Flushing rules, do you agree ?" +$IPFW flush + +# test_msg rule counter +clean() +{ + $IPFW delete $R 2> /dev/null + $IPFW pipe $P delete 2> /dev/null +} + +# simple counter/allow test +echo -n "counter/allow test..." +clean +$IPFW add $R allow icmp from any to 127.0.0.1 > /dev/null +$PING -f -c100 $RH > /dev/null +counter=`$IPFW show | grep $R | head -n 1 | cut -d " " -f3` +[ ! $counter -eq 400 ] && abort "Wrong counter $counter 400" +echo "...OK" + +# simple drop test +echo -n "deny test..." +clean +$IPFW add $R deny icmp from any to 127.0.0.1 > /dev/null +$PING -f -c10 -W 1 $RH > /dev/null +counter=`$IPFW show | grep $R | head -n 1 | cut -d " " -f4` +[ ! $counter -eq 10 ] && abort "Wrong counter $counter 10" +echo "...OK" + +# pipe delay test +echo -n "pipe delay test..." +clean +$IPFW pipe $P config delay 2000ms >/dev/null +$IPFW add $R pipe $P icmp from any to $RH >/dev/null +$PING -f -c10 -W 1 $RH > /dev/null +counter1=`$IPFW show | grep $R | head -n 1 | cut -d " " -f4` +sleep 2 +counter2=`$IPFW show | grep $R | head -n 1 | cut -d " " -f4` +[ ! $counter1 -eq 10 ] && abort "Wrong counter $counter 10" +[ ! $counter2 -eq 20 ] && abort "Wrong counter $counter 20" +echo "...OK" + +# pipe bw test +echo -n "pipe bw test..." +clean +$IPFW pipe $P config bw 2Kbit/s >/dev/null +$IPFW add $R pipe $P icmp from any to $RH >/dev/null +$PING -i 0.1 -c10 -W 1 $RH > /dev/null +counter=`$IPFW show | grep $R | head -n 1 | cut -d " " -f4` +[ $counter -gt 30 ] && abort "Wrong counter $counter should be < 30" +sleep 1 +counter=`$IPFW show | grep $R | head -n 1 | cut -d " " -f4` +[ $counter -gt 30 ] && abort "Wrong counter $counter should be < 30" +echo "...OK" + +# Final clean +clean diff --git a/test/dn_test.h b/test/dn_test.h new file mode 100644 index 0000000..f2a4a51 --- /dev/null +++ b/test/dn_test.h @@ -0,0 +1,157 @@ +/* + * $Id: dn_test.h 5626 2010-03-04 21:55:22Z luigi $ + * + * userspace compatibility code for dummynet schedulers + */ + +#ifndef _DN_TEST_H +#define _DN_TEST_H +#include +#include +#include +#include /* bzero, ffs, ... */ +#include /* strcmp */ +#include +#include +#include + +extern int debug; +#define ND(fmt, args...) do {} while (0) +#define D1(fmt, args...) do {} while (0) +#define D(fmt, args...) fprintf(stderr, "%-8s " fmt "\n", \ + __FUNCTION__, ## args) +#define DX(lev, fmt, args...) do { \ + if (debug > lev) D(fmt, ## args); } while (0) + + +#define offsetof(t,m) (int)((&((t *)0L)->m)) + +#include + +/* prevent include of other system headers */ +#define _NETINET_IP_VAR_H_ /* ip_fw_args */ +#define _IPFW2_H +#define _SYS_MBUF_H_ + +enum { + DN_QUEUE, +}; + +enum { + DN_SCHED_FIFO, + DN_SCHED_WF2QP, +}; + +struct dn_id { + int type, subtype, len, id; +}; +struct dn_fs { + int par[4]; /* flowset parameters */ + + /* simulation entries. + * 'index' is not strictly necessary + * y is used for the inverse mapping , + */ + int index; + int y; /* inverse mapping */ + int base_y; /* inverse mapping */ + int next_y; /* inverse mapping */ + int n_flows; + int first_flow; + int next_flow; /* first_flow + n_flows */ + /* + * when generating, let 'cur' go from 0 to n_flows-1, + * then point to flow first_flow + cur + */ + int cur; +}; +struct dn_sch { +}; +struct dn_flow { + struct dn_id oid; + int length; + int len_bytes; + int drops; + uint64_t tot_bytes; + uint32_t flow_id; + struct list_head h; /* used by the generator */ +}; +struct dn_link { +}; + +struct ip_fw_args { +}; + +struct mbuf { + struct { + int len; + } m_pkthdr; + struct mbuf *m_nextpkt; + int flow_id; /* for testing, index of a flow */ + //int flowset_id; /* for testing, index of a flowset */ + void *cfg; /* config args */ +}; + +#define MALLOC_DECLARE(x) +#define KASSERT(x, y) do { if (!(x)) printf y ; exit(0); } while (0) +struct ipfw_flow_id { +}; + +typedef void * module_t; +struct _md_t { + const char *name; + int (*f)(module_t, int, void *); + void *p; +}; +typedef struct _md_t moduledata_t; +#define DECLARE_MODULE(name, b, c, d) \ + moduledata_t *_g_##name = & b +#define MODULE_DEPEND(a, b, c, d, e) + +#ifdef IPFW +#include +#include +#include +#else +struct dn_queue { + struct dn_fsk *fs; /* parent flowset. */ + struct dn_sch_inst *_si; /* parent sched instance. */ +}; +struct dn_schk { +}; +struct dn_fsk { + struct dn_fs fs; + struct dn_schk *sched; +}; +struct dn_sch_inst { + struct dn_schk *sched; +}; +struct dn_alg { + int type; + const char *name; + void *enqueue, *dequeue; + int q_datalen, si_datalen, schk_datalen; + int (*config)(struct dn_schk *); + int (*new_sched)(struct dn_sch_inst *); + int (*new_fsk)(struct dn_fsk *); + int (*new_queue)(struct dn_queue *q); +}; + +#endif + +#ifndef __FreeBSD__ +int fls(int); +#endif + +static inline void +mq_append(struct mq *q, struct mbuf *m) +{ + if (q->head == NULL) + q->head = m; + else + q->tail->m_nextpkt = m; + q->tail = m; + m->m_nextpkt = NULL; +} + +#endif /* _DN_TEST_H */ diff --git a/test/dynrules.sh b/test/dynrules.sh new file mode 100644 index 0000000..98f5fe6 --- /dev/null +++ b/test/dynrules.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# 20100507 marta, quick test for dyn rules +# ./ipfw/ipfw -d show |grep \ 80 + +IPFW_MOD=dummynet2/ipfw_mod.ko +IPFW=ipfw/ipfw + +# main +# remove any previous loaded module +/sbin/rmmod ipfw_mod +/sbin/insmod ${IPFW_MOD} +echo "25" > /sys/module/ipfw_mod/parameters/dyn_ack_lifetime +${IPFW} add 1 check-state +${IPFW} add 9 allow all from any to any keep-state +${IPFW} add 10 allow all from any to onelab1.iet.unipi.it keep-state + +telnet 72.14.234.104 80 + + diff --git a/test/interpolation.c b/test/interpolation.c new file mode 100644 index 0000000..d6731f1 --- /dev/null +++ b/test/interpolation.c @@ -0,0 +1,335 @@ +#include +#include +#include + +/* gcc interpolation.c -o interpolation */ + +void +err(int eval, const char *fmt, ...) +{ +} +void +errx(int eval, const char *fmt, ...) +{ +} + + +#define ED_MAX_SAMPLES_NO 1000 +#define ED_MAX_LINE_LEN 128 +#define EX_DATAERR 1 +#define EX_UNAVAILABLE 3 +#define ED_TOK_DELAY "delay" +#define ED_TOK_PROB "prob" +#define ED_SEPARATORS " \t\n" +#define ED_TOK_PROFILE_NO "profile_no" + + +struct point { + double prob; /* y */ + double delay; /* x */ +}; + +struct profile { + char filename[128]; /* profile filename */ + int samples[ED_MAX_SAMPLES_NO+1]; /* may be shorter */ + int samples_no; /* actual len of samples[] */ +}; + +/* + * returns 1 if s is a non-negative number, with at least one '.' + */ +static int +is_valid_number(const char *s) +{ +#if 0 + int i, dots_found = 0; + int len = strlen(s); + + for (i = 0; i 1)) + return 0; +#endif + return 1; +} + +static int +compare_points(const void *vp1, const void *vp2) +{ + const struct point *p1 = vp1; + const struct point *p2 = vp2; + double res = 0; + + res = p1->prob - p2->prob; + if (res == 0) + res = p1->delay - p2->delay; + if (res < 0) + return -1; + else if (res > 0) + return 1; + else + return 0; +} + +#define ED_EFMT(s) 1,"error in %s at line %d: "#s,filename,lineno + +/* + * The points defined by the user are stored in the ponts structure. + * The number of user defined points is stored in points_no. + * We assume that The last point for the '1' value of the + * probability should be defined. (XXX add checks for this) + * The user defined sampling value is stored in samples_no. + * The resulting samples are in the "samples" pointer. + */ +static void +interpolate_samples(struct point *p, int points_no, + int *samples, int samples_no, const char *filename) +{ + double dy; /* delta on the y axis */ + double y; /* current value of y */ + double x; /* current value of x */ + double m; /* the y slope */ + int i; /* samples index */ + int curr; /* points current index */ + + dy = 1.0/samples_no; + y = 0; + + for (i=0, curr = 0; i < samples_no; i++, y+=dy) { + /* This statment move the curr pointer to the next point + * skipping the points with the same x value. We are + * guaranteed to exit from the loop because the + * last possible value of y is stricly less than 1 + * and the last possible value of the y points is 1 */ + while ( y >= p[curr+1].prob ) curr++; + + /* compute the slope of the curve */ + m = (p[curr+1].delay - p[curr].delay) / (p[curr+1].prob - p[curr].prob); + /* compute the x value starting from the current point */ + x = p[curr].delay + (y - p[curr].prob) * m; + samples[i] = x; + } + + /* add the last sample */ + samples[i] = p[curr+1].delay; +} + +#if 0 +static void +interpolate_samples_old(struct point *points, int points_no, + int *samples, int samples_no, const char *filename) +{ + int i; /* pointer to the sampled array */ + int j = 0; /* pointer to user defined samples */ + double dy; /* delta y */ + double y; /* current value of y */ + int x; /* computed value of x */ + double m; /* slope of the line */ + double y1, x1, y2, x2; /* two points of the current line */ + + /* make sure that there are enough points. */ + /* XXX Duplicated shoule be removed */ + if (points_no < 3) + errx(EX_DATAERR, "%s too few samples, need at least %d", + filename, 3); + + qsort(points, points_no, sizeof(struct point), compare_points); + + samples_no--; + dy = 1.0/samples_no; + printf("\nsamples no is %d dy is %f ", samples_no, dy); + + /* start with the first two points */ + y1 = points[j].prob * samples_no; + x1 = points[j].delay; + j++; + y2 = points[j].prob * samples_no; + x2 = points[j].delay; + + m = (y2-y1)/(x2-x1); + printf("\nStart"); + printf("\n\tCurrent points x1 y1 %f %f next point x2y2 %f %f m %f\n", + x1, y1, x2, y2, m); + + y = 0; + x = x1; + + for(i=0; i < samples_no+1; i++, y+=dy) { + printf("\ni:%d j:%d y:%f real y:%f", i, j, y, y*samples_no); + if ( (y*samples_no) >= y2 ) { /* move to the next point */ + j++; + if ( j >= points_no ) { + printf("\n\tNo more points, exit with j: %d i: %d and y:%f %f\n", + j, i, y, (y*samples_no)); + break; /* no more user defined points */ + } + /* load a new point */ + y1 = y2; + x1 = x2; + y2 = points[j].prob * samples_no; + x2 = points[j].delay; + m = (y2-y1)/(x2-x1); + if (x1==x2) { /* m = infinito */ + m = -1; + x = x2; + } + /* very small m problem */ + printf ("\ndelta %f\n", (y1 - y2)); + if (abs(y1 - y2) < 0.00001) { /* m = 0 XXX Should this magic number depend on samples_no ? */ + m = 0; + x = x2; + } + printf("\n\tCurrent points x1 y1 %f %f next point x2y2 %f %f (%f/%f)=m \n", + x1, y1, x2, y2, (y2-y1), (x2-x1), m); + } + printf("\n\tcompute step y %f x[%d]=%d ", + y, i, x); + if ((m != -1) && ( m != 0 )) { + x = x + (dy * samples_no)/m; + } + samples[i] = x; + printf(" dy %f x new %d\n", dy*samples_no, x); + printf(" m %f (dy * samples_no)/m %f \n", m, (dy * samples_no)/m); + } + + x = samples[i-1]; + printf("Finish i is %d samples_no is %d\n", i, samples_no); + /* The last point has a probability less than 1 */ + for (; i <= samples_no; i++) + samples[i] = x; +} +#endif + +static void +load_profile(struct profile *p) +{ + FILE *f; /* file handler */ + char line[ED_MAX_LINE_LEN]; + int lineno = 0; + int do_points = 0; + int delay_first = -1; + int i; + + struct point points[1000]; /* MAX_POINTS_NO */ + int points_no = 0; + + char *filename = p->filename; + f = fopen(filename, "r"); + if (f == NULL) { + err(EX_UNAVAILABLE, "fopen: %s", filename); + } + + + while (fgets(line, ED_MAX_LINE_LEN, f)) { /* read commands */ + char *s, *cur = line, *name = NULL, *arg = NULL; + + ++lineno; + + /* parse the line */ + while (cur) { + s = strsep(&cur, ED_SEPARATORS); + if (s == NULL || *s == '#') + break; + if (*s == '\0') + continue; + if (arg) + errx(ED_EFMT("too many arguments")); + if (name == NULL) + name = s; + else + arg = s; + } + + if (name == NULL) + continue; + + if (!strcasecmp(name, ED_TOK_DELAY)) { + if (do_points) + errx(ED_EFMT("duplicated token: %s"), name); + delay_first = 1; + do_points = 1; + continue; + } else if (!strcasecmp(name, ED_TOK_PROB)) { + if (do_points) + errx(ED_EFMT("duplicated token: %s"), name); + delay_first = 0; + do_points = 1; + continue; + } + if (!strcasecmp(name, ED_TOK_PROFILE_NO)) { + int p_no = atof(arg); + if (p_no <= 0) { + p_no = 100; + printf("invalid interpolation samples, using %d\n", + p_no); + } + if (p_no > ED_MAX_SAMPLES_NO) { + p_no = ED_MAX_SAMPLES_NO; + printf("invalid interpolation samples, using %d\n", + p_no); + } + + p->samples_no = p_no; + continue; + + } else if (do_points) { + if (!is_valid_number(name) || !is_valid_number(arg)) + errx(ED_EFMT("invalid point found")); + if (delay_first) { + points[points_no].delay = atof(name); + points[points_no].prob = atof(arg); + } else { + points[points_no].delay = atof(arg); + points[points_no].prob = atof(name); + } + if (points[points_no].prob > 1.0) + errx(ED_EFMT("probability greater than 1.0")); + ++points_no; + /* XXX no more that 1000 */ + continue; + } else { + errx(ED_EFMT("unrecognised command '%s'"), name); + } + } + + for(i=0; i < p->samples_no; i++) { + p->samples[i] = 666; + } + + /* This code assume the user define a value of X for the sampling value, + * and that: + * - the value stored in the emulator structure is X; + * - the allocated structure for the samples is X+1; + */ + interpolate_samples(points, points_no, p->samples, p->samples_no, filename); + + // User defined samples + printf("\nLoaded %d points:\n", points_no); + for(i=0; i < points_no; i++) { + printf("%f %f\n", points[i].prob, points[i].delay); + } + printf("\n"); + printf("The sample value is %d \n", p->samples_no); + +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + printf("Usage: ./interpolation \n"); + return -1; + } + + char *filename; + filename = argv[1]; + + struct profile p; + int i; + + strncpy(p.filename, filename, 128); + load_profile(&p); + printf("-----------\n"); + for (i=0; i<=p.samples_no; i++) + printf("%d %d\n", i, p.samples[i]); + printf("-----------\n"); + return 0; +} diff --git a/test/main.c b/test/main.c new file mode 100644 index 0000000..85fc621 --- /dev/null +++ b/test/main.c @@ -0,0 +1,636 @@ +/* + * $Id: main.c 5626 2010-03-04 21:55:22Z luigi $ + * + * Testing program for schedulers + * + * The framework include a simple controller which, at each + * iteration, decides whether we can enqueue and/or dequeue. + * Then the mainloop runs the required number of tests, + * keeping track of statistics. + */ + +#include "dn_test.h" + +struct q_list { + struct list_head h; +}; + +struct cfg_s { + int ac; + char * const *av; + + const char *name; + int loops; + struct timeval time; + + /* running counters */ + uint32_t _enqueue; + uint32_t drop; + uint32_t pending; + uint32_t dequeue; + + /* generator parameters */ + int th_min, th_max; + int maxburst; + int lmin, lmax; /* packet len */ + int flows; /* number of flows */ + int flowsets; /* number of flowsets */ + int wsum; /* sum of weights of all flows */ + int max_y; /* max random number in the generation */ + int cur_y, cur_fs; /* used in generation, between 0 and max_y - 1 */ + const char *fs_config; /* flowset config */ + int can_dequeue; + int burst; /* count of packets sent in a burst */ + struct mbuf *tosend; /* packet to send -- also flag to enqueue */ + + struct mbuf *freelist; + + struct mbuf *head, *tail; /* a simple tailq */ + + /* scheduler hooks */ + int (*enq)(struct dn_sch_inst *, struct dn_queue *, + struct mbuf *); + struct mbuf * (*deq)(struct dn_sch_inst *); + /* size of the three fields including sched-specific areas */ + int schk_len; + int q_len; /* size of a queue including sched-fields */ + int si_len; /* size of a sch_inst including sched-fields */ + char *q; /* array of flow queues */ + /* use a char* because size is variable */ + struct dn_fsk *fs; /* array of flowsets */ + struct dn_sch_inst *si; + struct dn_schk *sched; + + /* generator state */ + int state; /* 0 = going up, 1: going down */ + + /* + * We keep lists for each backlog level, and always serve + * the one with shortest backlog. llmask contains a bitmap + * of lists, and ll are the heads of the lists. The last + * entry (BACKLOG) contains all entries considered 'full' + * XXX to optimize things, entry i could contain queues with + * 2^{i-1}+1 .. 2^i entries. + */ +#define BACKLOG 30 + uint32_t llmask; + struct list_head ll[BACKLOG + 10]; +}; + +/* FI2Q and Q2FI converts from flow_id to dn_queue and back. + * We cannot easily use pointer arithmetic because it is variable size. + */ +#define FI2Q(c, i) ((struct dn_queue *)((c)->q + (c)->q_len * (i))) +#define Q2FI(c, q) (((char *)(q) - (c)->q)/(c)->q_len) + +int debug = 0; + +struct dn_parms dn_cfg; + +static void controller(struct cfg_s *c); + +/* release a packet: put the mbuf in the freelist, and the queue in + * the bucket. + */ +int +drop(struct cfg_s *c, struct mbuf *m) +{ + struct dn_queue *q; + int i; + + c->drop++; + q = FI2Q(c, m->flow_id); + i = q->ni.length; // XXX or ffs... + + ND("q %p id %d current length %d", q, m->flow_id, i); + if (i < BACKLOG) { + struct list_head *h = &q->ni.h; + c->llmask &= ~(1<<(i+1)); + c->llmask |= (1<<(i)); + list_del(h); + list_add_tail(h, &c->ll[i]); + } + m->m_nextpkt = c->freelist; + c->freelist = m; + return 0; +} + +/* dequeue returns NON-NULL when a packet is dropped */ +static int +enqueue(struct cfg_s *c, void *_m) +{ + struct mbuf *m = _m; + if (c->enq) + return c->enq(c->si, FI2Q(c, m->flow_id), m); + if (c->head == NULL) + c->head = m; + else + c->tail->m_nextpkt = m; + c->tail = m; + return 0; /* default - success */ +} + +/* dequeue returns NON-NULL when a packet is available */ +static void * +dequeue(struct cfg_s *c) +{ + struct mbuf *m; + if (c->deq) + return c->deq(c->si); + if ((m = c->head)) { + m = c->head; + c->head = m->m_nextpkt; + m->m_nextpkt = NULL; + } + return m; +} + +static int +mainloop(struct cfg_s *c) +{ + int i; + struct mbuf *m; + + for (i=0; i < c->loops; i++) { + /* implement histeresis */ + controller(c); + DX(3, "loop %d enq %d send %p rx %d", + i, c->_enqueue, c->tosend, c->can_dequeue); + if ( (m = c->tosend) ) { + c->_enqueue++; + if (enqueue(c, m)) { + drop(c, m); + ND("loop %d enqueue fail", i ); + } else { + ND("enqueue ok"); + c->pending++; + } + } + if (c->can_dequeue) { + c->dequeue++; + if ((m = dequeue(c))) { + c->pending--; + drop(c, m); + c->drop--; /* compensate */ + } + } + } + DX(1, "mainloop ends %d", i); + return 0; +} + +int +dump(struct cfg_s *c) +{ + int i; + struct dn_queue *q; + + for (i=0; i < c->flows; i++) { + q = FI2Q(c, i); + DX(1, "queue %4d tot %10lld", i, q->ni.tot_bytes); + } + DX(1, "done %d loops\n", c->loops); + return 0; +} + +/* interpret a number in human form */ +static long +getnum(const char *s, char **next, const char *key) +{ + char *end = NULL; + long l; + + if (next) /* default */ + *next = NULL; + if (s && *s) { + DX(3, "token is <%s> %s", s, key ? key : "-"); + l = strtol(s, &end, 0); + } else { + DX(3, "empty string"); + l = -1; + } + if (l < 0) { + DX(2, "invalid %s for %s", s ? s : "NULL", (key ? key : "") ); + return 0; // invalid + } + if (!end || !*end) + return l; + if (*end == 'n') + l = -l; /* multiply by n */ + else if (*end == 'K') + l = l*1000; + else if (*end == 'M') + l = l*1000000; + else if (*end == 'k') + l = l*1024; + else if (*end == 'm') + l = l*1024*1024; + else if (*end == 'w') + ; + else {/* not recognized */ + D("suffix %s for %s, next %p", end, key, next); + end--; + } + end++; + DX(3, "suffix now %s for %s, next %p", end, key, next); + if (next && *end) { + DX(3, "setting next to %s for %s", end, key); + *next = end; + } + return l; +} + +/* + * flowsets are a comma-separated list of + * weight:maxlen:flows + * indicating how many flows are hooked to that fs. + * Both weight and range can be min-max-steps. + * In a first pass we just count the number of flowsets and flows, + * in a second pass we complete the setup. + */ +static void +parse_flowsets(struct cfg_s *c, const char *fs, int pass) +{ + char *s, *cur, *next; + int n_flows = 0, n_fs = 0, wsum = 0; + int i, j; + struct dn_fs *prev = NULL; + + DX(3, "--- pass %d flows %d flowsets %d", pass, c->flows, c->flowsets); + if (pass == 0) + c->fs_config = fs; + s = c->fs_config ? strdup(c->fs_config) : NULL; + if (s == NULL) { + if (pass == 0) + D("no fsconfig"); + return; + } + for (next = s; (cur = strsep(&next, ","));) { + char *p = NULL; + int w, w_h, w_steps, wi; + int len, len_h, l_steps, li; + int flows; + + w = getnum(strsep(&cur, ":"), &p, "weight"); + if (w <= 0) + w = 1; + w_h = p ? getnum(p+1, &p, "weight_max") : w; + w_steps = p ? getnum(p+1, &p, "w_steps") : (w_h == w ?1:2); + len = getnum(strsep(&cur, ":"), &p, "len"); + if (len <= 0) + len = 1000; + len_h = p ? getnum(p+1, &p, "len_max") : len; + l_steps = p ? getnum(p+1, &p, "l_steps") : (len_h == len ? 1 : 2); + flows = getnum(strsep(&cur, ":"), NULL, "flows"); + if (flows == 0) + flows = 1; + DX(4, "weight %d..%d (%d) len %d..%d (%d) flows %d", + w, w_h, w_steps, len, len_h, l_steps, flows); + if (w == 0 || w_h < w || len == 0 || len_h < len || + flows == 0) { + DX(4,"wrong parameters %s", fs); + return; + } + n_flows += flows * w_steps * l_steps; + for (i = 0; i < w_steps; i++) { + wi = w + ((w_h - w)* i)/(w_steps == 1 ? 1 : (w_steps-1)); + for (j = 0; j < l_steps; j++, n_fs++) { + struct dn_fs *fs = &c->fs[n_fs].fs; // tentative + int x; + + li = len + ((len_h - len)* j)/(l_steps == 1 ? 1 : (l_steps-1)); + x = (wi*2048)/li; + DX(3, "----- fs %4d weight %4d lmax %4d X %4d flows %d", + n_fs, wi, li, x, flows); + if (pass == 0) + continue; + if (c->fs == NULL || c->flowsets <= n_fs) { + D("error in number of flowsets"); + return; + } + wsum += wi * flows; + fs->par[0] = wi; + fs->par[1] = li; + fs->index = n_fs; + fs->n_flows = flows; + fs->cur = fs->first_flow = prev==NULL ? 0 : prev->next_flow; + fs->next_flow = fs->first_flow + fs->n_flows; + fs->y = x * flows; + fs->base_y = (prev == NULL) ? 0 : prev->next_y; + fs->next_y = fs->base_y + fs->y; + prev = fs; + } + } + } + c->max_y = prev ? prev->base_y + prev->y : 0; + c->flows = n_flows; + c->flowsets = n_fs; + c->wsum = wsum; + if (pass == 0) + return; + + /* now link all flows to their parent flowsets */ + DX(1,"%d flows on %d flowsets max_y %d", c->flows, c->flowsets, c->max_y); + for (i=0; i < c->flowsets; i++) { + struct dn_fs *fs = &c->fs[i].fs; + DX(1, "fs %3d w %5d l %4d flow %5d .. %5d y %6d .. %6d", + i, fs->par[0], fs->par[1], + fs->first_flow, fs->next_flow, + fs->base_y, fs->next_y); + for (j = fs->first_flow; j < fs->next_flow; j++) { + struct dn_queue *q = FI2Q(c, j); + q->fs = &c->fs[i]; + } + } +} + +static int +init(struct cfg_s *c) +{ + int i; + int ac = c->ac; + char * const *av = c->av; + + c->si_len = sizeof(struct dn_sch_inst); + c->q_len = sizeof(struct dn_queue); + moduledata_t *mod = NULL; + struct dn_alg *p = NULL; + + c->th_min = 0; + c->th_max = -20;/* 20 packets per flow */ + c->lmin = c->lmax = 1280; /* packet len */ + c->flows = 1; + c->flowsets = 1; + c->name = "null"; + ac--; av++; + while (ac > 1) { + if (!strcmp(*av, "-n")) { + c->loops = getnum(av[1], NULL, av[0]); + } else if (!strcmp(*av, "-d")) { + debug = atoi(av[1]); + } else if (!strcmp(*av, "-alg")) { + extern moduledata_t *_g_dn_fifo; + extern moduledata_t *_g_dn_wf2qp; + extern moduledata_t *_g_dn_rr; + extern moduledata_t *_g_dn_qfq; +#ifdef WITH_KPS + extern moduledata_t *_g_dn_kps; +#endif + if (!strcmp(av[1], "rr")) + mod = _g_dn_rr; + else if (!strcmp(av[1], "wf2qp")) + mod = _g_dn_wf2qp; + else if (!strcmp(av[1], "fifo")) + mod = _g_dn_fifo; + else if (!strcmp(av[1], "qfq")) + mod = _g_dn_qfq; +#ifdef WITH_KPS + else if (!strcmp(av[1], "kps")) + mod = _g_dn_kps; +#endif + else + mod = NULL; + c->name = mod ? mod->name : "NULL"; + DX(3, "using scheduler %s", c->name); + } else if (!strcmp(*av, "-len")) { + c->lmin = getnum(av[1], NULL, av[0]); + c->lmax = c->lmin; + DX(3, "setting max to %d", c->th_max); + } else if (!strcmp(*av, "-burst")) { + c->maxburst = getnum(av[1], NULL, av[0]); + DX(3, "setting max to %d", c->th_max); + } else if (!strcmp(*av, "-qmax")) { + c->th_max = getnum(av[1], NULL, av[0]); + DX(3, "setting max to %d", c->th_max); + } else if (!strcmp(*av, "-qmin")) { + c->th_min = getnum(av[1], NULL, av[0]); + DX(3, "setting min to %d", c->th_min); + } else if (!strcmp(*av, "-flows")) { + c->flows = getnum(av[1], NULL, av[0]); + DX(3, "setting flows to %d", c->flows); + } else if (!strcmp(*av, "-flowsets")) { + parse_flowsets(c, av[1], 0); + DX(3, "setting flowsets to %d", c->flowsets); + } else { + D("option %s not recognised, ignore", *av); + } + ac -= 2; av += 2; + } + if (c->maxburst <= 0) + c->maxburst = 1; + if (c->loops <= 0) + c->loops = 1; + if (c->flows <= 0) + c->flows = 1; + if (c->flowsets <= 0) + c->flowsets = 1; + if (c->lmin <= 0) + c->lmin = 1; + if (c->lmax <= 0) + c->lmax = 1; + /* multiply by N */ + if (c->th_min < 0) + c->th_min = c->flows * -c->th_min; + if (c->th_max < 0) + c->th_max = c->flows * -c->th_max; + if (c->th_max <= c->th_min) + c->th_max = c->th_min + 1; + if (mod) { + p = mod->p; + DX(3, "using module %s f %p p %p", mod->name, mod->f, mod->p); + DX(3, "modname %s ty %d", p->name, p->type); + c->enq = p->enqueue; + c->deq = p->dequeue; + c->si_len += p->si_datalen; + c->q_len += p->q_datalen; + c->schk_len += p->schk_datalen; + } + /* allocate queues, flowsets and one scheduler */ + c->q = calloc(c->flows, c->q_len); + c->fs = calloc(c->flowsets, sizeof(struct dn_fsk)); + c->si = calloc(1, c->si_len); + c->sched = calloc(c->flows, c->schk_len); + if (c->q == NULL || c->fs == NULL) { + D("error allocating memory for flows"); + exit(1); + } + c->si->sched = c->sched; + if (p) { + if (p->config) + p->config(c->sched); + if (p->new_sched) + p->new_sched(c->si); + } + /* parse_flowsets links queues to their flowsets */ + parse_flowsets(c, av[1], 1); + /* complete the work calling new_fsk */ + for (i = 0; i < c->flowsets; i++) { + if (c->fs[i].fs.par[1] == 0) + c->fs[i].fs.par[1] = 1000; /* default pkt len */ + c->fs[i].sched = c->sched; + if (p && p->new_fsk) + p->new_fsk(&c->fs[i]); + } + + /* initialize the lists for the generator, and put + * all flows in the list for backlog = 0 + */ + for (i=0; i <= BACKLOG+5; i++) + INIT_LIST_HEAD(&c->ll[i]); + + for (i = 0; i < c->flows; i++) { + struct dn_queue *q = FI2Q(c, i); + if (q->fs == NULL) + q->fs = &c->fs[0]; /* XXX */ + q->_si = c->si; + if (p && p->new_queue) + p->new_queue(q); + INIT_LIST_HEAD(&q->ni.h); + list_add_tail(&q->ni.h, &c->ll[0]); + } + c->llmask = 1; + return 0; +} + + +int +main(int ac, char *av[]) +{ + struct cfg_s c; + struct timeval end; + double ll; + int i; + char msg[40]; + + bzero(&c, sizeof(c)); + c.ac = ac; + c.av = av; + init(&c); + gettimeofday(&c.time, NULL); + mainloop(&c); + gettimeofday(&end, NULL); + end.tv_sec -= c.time.tv_sec; + end.tv_usec -= c.time.tv_usec; + if (end.tv_usec < 0) { + end.tv_usec += 1000000; + end.tv_sec--; + } + c.time = end; + ll = end.tv_sec*1000000 + end.tv_usec; + ll *= 1000; /* convert to nanoseconds */ + ll /= c._enqueue; + sprintf(msg, "1::%d", c.flows); + D("%-8s n %d %d time %d.%06d %8.3f qlen %d %d flows %s drops %d", + c.name, c._enqueue, c.loops, + (int)c.time.tv_sec, (int)c.time.tv_usec, ll, + c.th_min, c.th_max, + c.fs_config ? c.fs_config : msg, c.drop); + dump(&c); + DX(1, "done ac %d av %p", ac, av); + for (i=0; i < ac; i++) + DX(1, "arg %d %s", i, av[i]); + return 0; +} + +/* + * The controller decides whether in this iteration we should send + * (the packet is in c->tosend) and/or receive (flag c->can_dequeue) + */ +static void +controller(struct cfg_s *c) +{ + struct mbuf *m; + struct dn_fs *fs; + int flow_id; + + /* histeresis between max and min */ + if (c->state == 0 && c->pending >= c->th_max) + c->state = 1; + else if (c->state == 1 && c->pending <= c->th_min) + c->state = 0; + ND(1, "state %d pending %2d", c->state, c->pending); + c->can_dequeue = c->state; + c->tosend = NULL; + if (c->state) + return; + + if (1) { + int i; + struct dn_queue *q; + struct list_head *h; + + i = ffs(c->llmask) - 1; + if (i < 0) { + DX(2, "no candidate"); + c->can_dequeue = 1; + return; + } + h = &c->ll[i]; + ND(1, "backlog %d p %p prev %p next %p", i, h, h->prev, h->next); + q = list_first_entry(h, struct dn_queue, ni.h); + list_del(&q->ni.h); + flow_id = Q2FI(c, q); + DX(2, "extracted flow %p %d backlog %d", q, flow_id, i); + if (list_empty(h)) { + ND(2, "backlog %d empty", i); + c->llmask &= ~(1<ni.h, h+1); + ND(1, " after %d p %p prev %p next %p", i+1, h+1, h[1].prev, h[1].next); + if (i < BACKLOG) { + ND(2, "backlog %d full", i+1); + c->llmask |= 1<<(1+i); + } + fs = &q->fs->fs; + c->cur_fs = q->fs - c->fs; + fs->cur = flow_id; + } else { + /* XXX this does not work ? */ + /* now decide whom to send the packet, and the length */ + /* lookup in the flow table */ + if (c->cur_y >= c->max_y) { /* handle wraparound */ + c->cur_y = 0; + c->cur_fs = 0; + } + fs = &c->fs[c->cur_fs].fs; + flow_id = fs->cur++; + if (fs->cur >= fs->next_flow) + fs->cur = fs->first_flow; + c->cur_y++; + if (c->cur_y >= fs->next_y) + c->cur_fs++; + } + + /* construct a packet */ + if (c->freelist) { + m = c->tosend = c->freelist; + c->freelist = c->freelist->m_nextpkt; + } else { + m = c->tosend = calloc(1, sizeof(struct mbuf)); + } + if (m == NULL) + return; + + m->cfg = c; + m->m_nextpkt = NULL; + m->m_pkthdr.len = fs->par[1]; // XXX maxlen + m->flow_id = flow_id; + + ND(2,"y %6d flow %5d fs %3d weight %4d len %4d", + c->cur_y, m->flow_id, c->cur_fs, + fs->par[0], m->m_pkthdr.len); + +} + +/* +Packet allocation: +to achieve a distribution that matches weights, for each X=w/lmax class +we should generate a number of packets proportional to Y = X times the number +of flows in the class. +So we construct an array with the cumulative distribution of Y's, +and use it to identify the flow via inverse mapping (if the Y's are +not too many we can use an array for the lookup). In practice, +each flow will have X entries [virtually] pointing to it. + +*/ diff --git a/test/memory_leak.sh b/test/memory_leak.sh new file mode 100644 index 0000000..9bdf093 --- /dev/null +++ b/test/memory_leak.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# this script execute N times the command CMD +# collecting the memory usage on a file. +# The value of the Dirty memory should not increase +# between tests. + +BASE_NAME=ipfw_r5808_ +N=10000 +CMD1="/sbin/insmod ../dummynet2/ipfw_mod.ko" +CMD2="/sbin/rmmod ipfw_mod" + +# main +# remove any previous loaded module +/sbin/rmmod ipfw_mod + +# pre + +for n in `seq $N`; do + $CMD1 + $CMD2 + [ $n = 10 ] && cat /proc/meminfo > /tmp/${BASE_NAME}_${n} + [ $n = 100 ] && cat /proc/meminfo > /tmp/${BASE_NAME}_${n} + [ $n = 1000 ] && cat /proc/meminfo > /tmp/${BASE_NAME}_${n} +done; + +# post diff --git a/test/mylist.h b/test/mylist.h new file mode 100644 index 0000000..b546fc2 --- /dev/null +++ b/test/mylist.h @@ -0,0 +1,49 @@ +/* + * $Id: mylist.h 5626 2010-03-04 21:55:22Z luigi $ + * + * linux-like bidirectional lists + */ + +#ifndef _MYLIST_H +#define _MYLIST_H +struct list_head { + struct list_head *prev, *next; +}; + +#define INIT_LIST_HEAD(l) do { (l)->prev = (l)->next = (l); } while (0) +#define list_empty(l) ( (l)->next == l ) +static inline void +__list_add(struct list_head *o, struct list_head *prev, + struct list_head *next) +{ + next->prev = o; + o->next = next; + o->prev = prev; + prev->next = o; +} + +static inline void +list_add_tail(struct list_head *o, struct list_head *head) +{ + __list_add(o, head->prev, head); +} + +#define list_first_entry(pL, ty, member) \ + (ty *)((char *)((pL)->next) - offsetof(ty, member)) + +static inline void +__list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void +list_del(struct list_head *entry) +{ + ND("called on %p", entry); + __list_del(entry->prev, entry->next); + entry->next = entry->prev = NULL; +} + +#endif /* _MYLIST_H */ diff --git a/test/profile_bench1 b/test/profile_bench1 new file mode 100644 index 0000000..797650f --- /dev/null +++ b/test/profile_bench1 @@ -0,0 +1,26 @@ +profile_no 100 +delay prob +207 0.000264 +255 0.034117 +270 0.072280 +279 0.106749 +288 0.148604 +298 0.184304 +302 0.202194 +353 0.384541 +423 0.588842 +510 0.782126 +516 0.800970 +545 0.845706 +553 0.861411 +573 0.889430 +586 0.912117 +620 0.920003 +661 0.938308 +695 0.944191 +740 0.949112 +765 0.952598 +848 0.957109 +1379 0.983768 +1555 0.983778 +1649 1 diff --git a/test/profile_bench2 b/test/profile_bench2 new file mode 100644 index 0000000..c733868 --- /dev/null +++ b/test/profile_bench2 @@ -0,0 +1,7 @@ +samples 10 +delay prob +0 0 +250 0 +250 0.5 +500 0.5 +500 1 diff --git a/test/profile_bench3 b/test/profile_bench3 new file mode 100644 index 0000000..5d1722e --- /dev/null +++ b/test/profile_bench3 @@ -0,0 +1,5 @@ +profile_no 100 +delay prob +0 0 +50 0.5 +100 1 diff --git a/test/test_dn_heap.c b/test/test_dn_heap.c new file mode 100644 index 0000000..7d3dc05 --- /dev/null +++ b/test/test_dn_heap.c @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 1998-2002,2010 Luigi Rizzo, Universita` di Pisa + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * Userland code for testing binary heaps and hash tables + * + * $Id: test_dn_heap.c 6131 2010-04-22 15:37:36Z svn_panicucci $ + */ + +#include +#include + +#include +#include +#include +#include "dn_test.h" +#include "dn_heap.h" +#define log(x, arg...) fprintf(stderr, ## arg) +#define panic(x...) fprintf(stderr, ## x), exit(1) + +#include + +struct x { + struct x *ht_link; + char buf[0]; +}; + +uint32_t hf(uintptr_t key, int flags, void *arg) +{ + return (flags & DNHT_KEY_IS_OBJ) ? + ((struct x *)key)->buf[0] : *(char *)key; +} + +int matchf(void *obj, uintptr_t key, int flags, void *arg) +{ + char *s = (flags & DNHT_KEY_IS_OBJ) ? + ((struct x *)key)->buf : (char *)key; + return (strcmp(((struct x *)obj)->buf, s) == 0); +} + +void *newfn(uintptr_t key, int flags, void *arg) +{ + char *s = (char *)key; + struct x *p = malloc(sizeof(*p) + 1 + strlen(s)); + if (p) + strcpy(p->buf, s); + return p; +} + +char *strings[] = { + "undici", "unico", "doppio", "devoto", + "uno", "due", "tre", "quattro", "cinque", "sei", + "uno", "due", "tre", "quattro", "cinque", "sei", + NULL, +}; + +int doprint(void *_x, void *arg) +{ + struct x *x = _x; + printf("found element <%s>\n", x->buf); + return (int)arg; +} + +static void +test_hash() +{ + char **p; + struct dn_ht *h; + uintptr_t x = 0; + uintptr_t x1 = 0; + + /* first, find and allocate */ + h = dn_ht_init(NULL, 10, 0, hf, matchf, newfn); + + for (p = strings; *p; p++) { + dn_ht_find(h, (uintptr_t)*p, DNHT_INSERT, NULL); + } + dn_ht_scan(h, doprint, 0); + printf("/* second -- find without allocate */\n"); + h = dn_ht_init(NULL, 10, 0, hf, matchf, NULL); + for (p = strings; *p; p++) { + void **y = newfn((uintptr_t)*p, 0, NULL); + if (x == 0) + x = (uintptr_t)y; + else { + if (x1 == 0) + x1 = (uintptr_t)*p; + } + dn_ht_find(h, (uintptr_t)y, DNHT_INSERT | DNHT_KEY_IS_OBJ, NULL); + } + dn_ht_scan(h, doprint, 0); + printf("remove %p gives %p\n", (void *)x, + dn_ht_find(h, x, DNHT_KEY_IS_OBJ | DNHT_REMOVE, NULL)); + printf("remove %p gives %p\n", (void *)x, + dn_ht_find(h, x, DNHT_KEY_IS_OBJ | DNHT_REMOVE, NULL)); + printf("remove %p gives %p\n", (void *)x, + dn_ht_find(h, x1, DNHT_REMOVE, NULL)); + printf("remove %p gives %p\n", (void *)x, + dn_ht_find(h, x1, DNHT_REMOVE, NULL)); + dn_ht_scan(h, doprint, 0); +} + +int +main(int argc, char *argv[]) +{ + struct dn_heap h; + int i, n, n2, n3; + + test_hash(); + return 0; + + /* n = elements, n2 = cycles */ + n = (argc > 1) ? atoi(argv[1]) : 0; + if (n <= 0 || n > 1000000) + n = 100; + n2 = (argc > 2) ? atoi(argv[2]) : 0; + if (n2 <= 0) + n = 1000000; + n3 = (argc > 3) ? atoi(argv[3]) : 0; + bzero(&h, sizeof(h)); + heap_init(&h, n, -1); + while (n2-- > 0) { + uint64_t prevk = 0; + for (i=0; i < n; i++) + heap_insert(&h, n3 ? n-i: random(), (void *)(100+i)); + + for (i=0; h.elements > 0; i++) { + uint64_t k = h.p[0].key; + if (k < prevk) + panic("wrong sequence\n"); + prevk = k; + if (0) + printf("%d key %llu, val %p\n", + i, h.p[0].key, h.p[0].object); + heap_extract(&h, NULL); + } + } + return 0; +} diff --git a/test/test_dn_sched.c b/test/test_dn_sched.c new file mode 100644 index 0000000..65bbf18 --- /dev/null +++ b/test/test_dn_sched.c @@ -0,0 +1,89 @@ +/* + * $Id: test_dn_sched.c 5626 2010-03-04 21:55:22Z luigi $ + * + * library functions for userland testing of dummynet schedulers + */ + +#include "dn_test.h" + +void +m_freem(struct mbuf *m) +{ + printf("free %p\n", m); +} + +int +dn_sched_modevent(module_t mod, int cmd, void *arg) +{ + return 0; +} + +void +dn_free_pkts(struct mbuf *m) +{ + struct mbuf *x; + while ( (x = m) ) { + m = m->m_nextpkt; + m_freem(x); + } +} + +int +dn_delete_queue(void *_q, void *do_free) +{ + struct dn_queue *q = _q; + if (q->mq.head) + dn_free_pkts(q->mq.head); + free(q); + return 0; +} + +/* + * This is a simplified function for testing purposes, which does + * not implement statistics or random loss. + * Enqueue a packet in q, subject to space and queue management policy + * (whose parameters are in q->fs). + * Update stats for the queue and the scheduler. + * Return 0 on success, 1 on drop. The packet is consumed anyways. + */ +int +dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop) +{ + if (drop) + goto drop; + if (q->ni.length >= 200) + goto drop; + mq_append(&q->mq, m); + q->ni.length++; + q->ni.tot_bytes += m->m_pkthdr.len; + return 0; + +drop: + q->ni.drops++; + return 1; +} + +int +ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg) +{ + if (*v < lo) { + *v = dflt; + } else if (*v > hi) { + *v = hi; + } + return *v; +} + +#ifndef __FreeBSD__ +int +fls(int mask) +{ + int bit; + + if (mask == 0) + return (0); + for (bit = 1; mask != 1; bit++) + mask = (unsigned int)mask >> 1; + return (bit); +} +#endif -- 2.47.0

(+fDef>E=QEYf#z*U$VXYf60`H9PhE>TITz z<7sJS$~%O|wK5HFWw*Z4@#y}N9HPH2*qkV*GNA4K^;d0Y=%Zda_d+P^uzwcG)?W%!Z7 z_B<_Zg0^5E!V$lTJc|ag-=#w~7FO)A>sy(!+XnZ$Xuz}HaA*sQNB8@P;z3)wg{pu`qeQhFy0PJfev{KTozY6&moshFh76T4QE`lmel9W)~J##=N$Ue!K*5Shrqp z#to)7;7XQg!1IloD{Eo#=vi4Xv$Fa-Ses(b5DiTTo&}--^J9@S-*1>}PXj3CE~3_0 zFtcdDj4xWd@5%`~&qc%Rljp7s(e}a2q5<=RkuyJHnCsjb_fpH9UJzIhqd}=GtFC9`f9k zq4=a=X3>CoLQB-lWy9>wb(q&S*oN_(*wLR^X?pr8ezZP6raWEUM8>1naH$7zJ=sFE zlU`Dlg}t_z)>}$WJ1|9v&qD0%AD3np4VZDiq z^s?^vlJV#qN z%XhC}X3>Coe^t)5u$W=5;8$%EJfZ>5-ZqM|uy{QAnM>s+ctisp>|5OZdYC*JeB(17 z++U&r&vTLT;IN$CJD5i_n#Vm}hLs;ZPlwEyueY}JtDmRIeS(=qvuT*`H_Wx~!u2|H zXU)35 z>HbmZ-xs1$%+9w3VPR*!aJ*)&{lX?L>#NMqXo6X3z?^Ks-BY%O&0I3fb=I-;hHUS2 zqWs~(%%TDFYfQAejT}1j^M?6iryZCuXDB;6m{~Mn=5a*3I(3De=fz1qHfq023;Ub8 zCnuOWuQXt;UBkm-hP{ic15NOVCVHMN7vQcc|NMA8J-P0_!Je|#m=!=ufe>$hbuG+{ zOh=|DP7G!i4VXJx zh;~phYYRKiFE?O@&ByP8lY^N>vuVc0>kXK_u8rCLL88RmU}n*PIr=N1<4@4PpzDlh z#hjt|ykKV0fceG9uij2-#N6G}zp9;xP6=if4VW*}!`N6@<5_qzG}Hu-XuyMezg-K9 z2X@W^rjaIiL<1hYS0mcv*EG|owfiyHa?JPnP4ubKY#Qc-VXkw`?UuW|VoflM2F%gj zODsGYYHfl?G~kKwcR}|+A8vKZHo+qr@I-envG8Q5&;*ZYBF@ih`PyNr0gty)H2G62 z^TPbnlu{rZX^HwA>>M)-YDbH=I-#!b6i@S?x!y+6WKSO*g_J@RcnsY=#}U?gsDG!l znkZ_|0DG(D3|aAvMp1|+duB}(s??_Gi!KvIy}p>P`l4`F!zh#{b@u2eq|~PAi@b@V zUSHt;NTNb(qbNj^T~HH+DupQUBK~NvP26sxsMi;`+mC4YoQ6?If1Nuz3Mqvsj){C; z6ipO$`l6>({T7a$=O2YW_az!I<07MbybNnD3r~jfP4I{&Y99F!JJJM?Xuz`xe#4qR zt=;p(R^b}QqToIi4VX8VEcczI7OM{t31Li#=ze8aBi4A_k_Vllso**hM3uYD#n756bc~T&AhK831GmB=^ zFz*}0oFyu+2xb-ym_NxxJFB^%Ev#dK-q+1B%(ZV4Q)2_ii&QYPXu$kfO8+}m}`$IiWz&E&R}NIfEo95MRRw$W`5l;yLUChzzpP} zCYVJ7=IGZAI;p{0*V{JOmCoe~>EJwz2F$fjdxbRzz21IY-l1X>JfZ>56K1Sy3za8B zl+Og`M>OEMMq?NYjYpjUA&RXE<`E5eqCXcGGh?jwTpXCur|~A3MYCy`cQMTFZwqY~ zFJMYE!7LguALO3!4DlL0>>~@9QeDCQE*kLsM2BK5v~h@+li--r9n2#d@a!|5$bF(9 zEFQf+?_v71&M)X}|9XtWY;Q2LXu#Y)p6Ec6KUmnzGYxa?JutAF7BH391~ZEW%s-6$ z3F}tFTzlsg?5+h&#auA6Xuym&2DocS*m+)VnB8}N!@Plxww`vP>_9NHXu!NI^5279 zhPlojNik<=crch*G+^$EoOweaa~~xy2xb-ynBR`x~Wdk^^ep5X>wZFn=$yJbQ9!i{cxDc|;RE51wWkX@W;I;CUI} zu2SoTwy^v35!0u2j$iU}0xDk^oI}xU8s_1K%xl$Cw8Iw#Gm8eyc#19BW5FK`bDew4 zz>Mc^E)HfE4Vb?aIrE5NcGne{Coh4Z)CYr^MFVEMeL9-o%izIYtK0;SXu$KqNO>^d zQy*#~KS~3h??!&#;9I6o>zq#*Y{N?hC~-+JvuMDKxfAXEnd48^=M(BMcT`>%l@DeX z4VZ_<^v>aCo|=ytW_Mjtb4M{}Xs8Kh(SUhfWXDRqC)p*Cxr<_#2IpBcV16>Pb9$1) zu1vWJ9?^j3$|!kqtMFUzvf%uP20W3z-6DsRgQX^TL<62E-)?zc$BU9j?KnzJ z@Q4OHr?o`Ae~z0qv(CK-9bnE-?5f}#iU!Q5MmEOuIzQ7e*FBzM7eJ}2gPBDW`8ZU& zl948OL=*Kml-G8&UK5-j(SQeU?TB`dlr()>dv4hSbA~8(Z7{QFz*()WjW@_O!6O>*xc4l>!t2xizSTId z)dY`dz!Twf&>eCSvD5^QXuy+h8U4-Hu=1nVy5$YWm|R3md@Oj3i3ZI0DxJG_gw334 z%$)0AO*C|4FtcdDd~f9Ib7vrPhLSf0Gm8eycqYp|HyT!+y^dVEt%qp12_Dga$L;fQ z=Q4OQRBnPtG~kKycp(>@Mw;Le4R{`pe6Q8jaE!@Csp8GSV@xz)E=11U6U2|_R#(kdnK4sOyT7UGhX@g;|bA7Nw zE?nh59-L>)ITmbu2FtcdD9Q{2x&lu)<=Sk!OSg8qS(SZ32kza>>t`T#3Ll(~tWDCK0 z77dv9jQl+?!-32h8ft=BG+@S?1>M^n!*T!_EbgI9>ZJ@xVH`9?VeGrn^2=_clm(tsJ?K8=?7#fHpy;|$SA z6U?Fkb9CRT^D@0{xbK4Q4$h%yz~eqo6K21I2X~poo8S=*c;-g79x5J;u_ky#1D@6> zdDM-1r6zbp1D;c&<-xUy&jgPj(L|h|o}OI)y1vd-6Fi~;&o%CWDa3UQ_Bp%@<(}aD zhz2}(|Cno`9V>hKSK(M${%kOhXuyM~*xgS#hsC4U`LbCvYtK0-W-LORoM>OEU^=>ysVe)(v z^Rx*b(L~FGXHW3EfbI|OFVTP}`riewHX8GaIYaR#m_-BT2!9vk(!Fcf^;5C|kGC|P z>&Jdf$7S9oA*Dcg-}tD%(PLV#_cVb-kr{c=e{-0s{fogl6b+bvA31Z^C?LHo+qr z@EjZ&51tvp9a6FX3C@pbz;jU4Jegz@JfZ;)p1+J{zv>Oj`*yNT@Q4OH_)>5*_pVfU zGKq(S`%5(7!F}CP@#NO^;Zr(a4(1UJcs`@%fo-9!tBNN>#U^+}10LMh?OIqo`WQ!F zL4MGd+YYR@t=iughqe#kV~h=-Wq^&~otCPt#^0K+^6bV$2dJ{zG|!X!$eFXc%uVp< zV@j)8pYhJ>I(80I{E^`CBO2uJKP^!+KVz72kA1Ce59Y5m!K^f3e#&-q~&S5I(dX(o~ zlrkQ@hm?8{*Q{}V_Ys9PeoX5v&(+zn5^a7iQ|d?lacO4JfO(ql_Z`Awrqgs^)IY{e zI+tna$HB~^0ki+TB4IJlH_Wx)yo2p?E>rR+{>-o=&Sj$0E3qrj$>%cVb5H2lMp#U}n*P8DFS(pEC@5oxjR3*IzR)#@Kivm{~Mno)9_n?S|RyPi@y@ zZTY1?v)9$ugR=}JT@QIZeKY2tN>p$>XPiw`G#)(*q-I3=>lVMeF~gb#hNtBo9h_r# zoXeDbF*wr2XX_P7M>^l}AktRj(UD5ch;$+oxqFwe$D!eAIm3xi+k@!SUpI)faxLlh znkb|cqPT6G-xbWT`pdNLGn>9~E>q$+!BN~_6NQvQ6gRa*9ffJ#XMTPET&CgQ`bVM1 zk7&TWx9>UOv1T4t#xeKhU>?y#&+|HZxd|T8fakRqzjNkcu@#DteVeJo>H~cT48SeV}+T#wH3m1P3vnbgqEj5c#fqJLd#Pj zv^*8UD$m*qp;dE*(3FDhypSpO=gLS>o~a9&=r7u%XRc%(BVpbaMD81M!(RDKo?8+% zulJIXkRf_4cqH6$p2=ZlBwS&6B+n;X9?A2;mPhiui{+6#ljV^-XDyH9d2!XFMnZ;$ zMn;c>#pfGBJrXRB5WZ#ABZOtkBZSXb9w97R9wD4&)hvWDmzvhsRtPOmg>Z?b z5kkvTA+$UdLd#Pjv}&#p8V_v2LZ;Nebic#Ag-nTew8xADm3fSWnOhKjL@Bj}JrYcw zTjtbR6Z-qo8KUIBgGa)<%S{d|BjIJsBYD2Z@<^VqvpkaL4VFjpoU%NU=V8kud48no z!AQUp2mcv85*Dv8gq4wyv^>)KG|MBc$BYNoyO62;U)^7@ix)Btwd_DGxbkRvP%?%d zJZp0zJaJI9uzS$tr{$iy=d7*;;kXK6T?Ns{7cv#M7#)R_LKJH@kNV2vmMbg0<8wyn zJ{&!_ZXCr|aLnCybQDqwQ7j%G_4&i3iK6~_iKnmvZ08?^UI9b{<|DTtl5cQn3w`_; zW~A6X2LgLxAyZ+;U}n*P`KZl_@P>z~h0Xj(N{^N^YR-Yc{)&0JdoZ(Tz>IhN*1uOI ztbO>F?V7p%dA9#z4(<`mEE+I>HFD;JVXl8|V*B%$vU~b7d+qo}8BwdQhrG_LhwsOv z91pH6W{pSB0;w61-n#`6?oO*(*duDbZoOrXnl;kPb@$;Oj`-9DkuF?x_N*C1T^;%; zqoa^ghyu^&y4$U=qcE-eoE3?m$CTQyK@^q#y4Xaa`|AqFgZ{eCcyy#vGa@~83nKRm zqhUw7LATy=dv#D)mN<{8c!+NHX&Z~#cV~QOS%q$u(|2uN#VZ&T|Roe49I=b+d<|F-?JujE;T$k-GXbnmYw)G8A z?5Ij9vxZAOh-)V%+FlPoWnmw8c1i0sT)r4>TP3bc;%NW4VBa{8siZYJu1w;X(Q!#V zh^r;?xaOO<;&w>N)cyzO0gm;L3;UlLhZA+_dQ9&~DMayXWY;G2xo*?C&+PsVX3BB? zQRrQPXu!PBPDIn49bwobDyuWrvV0s-?Xx#8oX3=0=+EqR_jM0?tJjpf^v=_3J+)t* zjO*4O9hcODxTbCy_0hrb_}u^eDtZ*yf1=5>Bro_0_E zVBN@dwhgusmGlu!U5`6SH>1q!P4{LyvK!-?&>il|G_z>H{8{-2%QSOA_i4R)D$J?R zRr;ci26ovZrr{=dMALX)jFrc0Ygf;Rm7CxZ4S3vN39zv8jV81#Ct6TRY?D29#T4M;MRK$es9lbbnT+*%AA=G1DG~n@n zZ^oE2*51*d-AFXt1dnLIgLCFCcxYp+eIVVI>*yM3f=4vqQJT;(=X{qeBxsq5)6sS*);lyw2_mz*KC4M>OD(+ofy^iwAbwBBqfBJYHw6 zt*>+DoY;kfvf@GO!f9J=>#5rJt~7BJ);ouv>YbkY`k~vP*WK5d-heM-2G7bWv;QheUBNs2 zMmqjTFY*)SkkJmkr#pUCI)|gd7N`VmTy!+E2 z#1Y=pzdoHS>DJweq)Z=|MFSo@NA3zkliFI!6TZ;dvGAz){&-*gI562M9#A= zn@#89P4I{&+WvxlV-Zub2_Dfzn;+PB7BQt7@OZ0bS1_bCW`s*A5S|m=2=9@fqb1$C zJCT%`8K*Sh@&7eC)-@dV<3&v620ZGl$f}uhk{=ws)00vl#5Y7-3vEs4kdx85LQ zq5+Tp-Z+em{TgSD8t`~MGR8)<#`LL_0^zdg##nEAPr8pN_MzZaOEloYSE!;n%E11F zGjC1shz2~zMVX(${`DPHZh}WN(dGwd@H#rO8?%=L_m^nEgRj@Q7S@c@>rX5X9<+6f z+mLlOY^<~C#3c*oo^)m_y;^B&bJKd!w2sx-wXh={f2oeN_FWcXx7BLey50>c#H{Kb zESt8jimWZz>o^;Kng8hZ`YOM~wZ;%iDU7l9=;r&{f&SbeQCYX%;0Pib@chQT-8aPE z@dl6$qTy>AWK1M9qBSOCQVN7?BkNP#(ScI~t=IY!>Mv7zAnh(`BUG-DOxr>7&kvCssMXuxy6=_hSr^_QMI^fBZIZEe&| z7z?W{75n-eDc<^SSX!-(n*kYzq6Fi~;&!R}z)xM6l!T62AV^uWZ@xL0_ z%#kr@?(}u^W(!U5hz2~*nQ@~n%<U=_hSr?z5 zsx>f}qoGe!vTD{$sRzv8+0yT+!!YLHVE-B_-x=Jeq5;qJNY~76>_zYL=Yg$T%rvYu zCSy_xgfA$SZDIEEC5xHpQ~rcF65-yNVqtWjN+}SQecu`sPM`Mlly&Rw;Z2!7E{g^{ zcuv6;hMBQzFfTqGl(BU^<-12`OiF@h8+76HT-k!}wX3%~7%m9?^g& zx}A(Su)YoFW%5n%hz30PMdn&qBgz}>S69G?o8S=*c>KR7KIR!W*srdimYd)a4S4YW zO!s_2i1|_12Z!zn9?znQm}h;*0DjdbKO4*=8t@$94xTW7)voUtz@?FV6Fi~;kNe*A zFnM5w#Y}}Jctiu9v0WKyxHDhhG1%YRPUR+eL<1gN$$I}+jvDf`&7O%nQIq#JF@BT= zJXfo{+7{aU!kw`_M8geuV4uT2;l2v9If6(j5c=P{JLVNhE^Sdlx9%P|mFXjzXuxwF z{>ndAEUb*d9>#Cs20XAQ7UQdPI%BXOW2bk&_Go6Q2h3|*qS_n7URunQe4vR@r!?T1 z+v0a8;h6ihM{XJz`dl!NXuuQUD%vBLy8I|)=%4>!{NEh_RN6ila2>jyWRGv zk3-&KdlLBU(v6M>JJ_oo4`RRA@f=A+7dRf=LDKDbz|-M)z_Y;d;911e9S<@#-|^rV z*G$WkQJ7JxYI)<(Z-K zbE550^~7xt1_Dj8J&I?0+oRfg>J) zdE2A%+-G}Kp4)7X%JV6fvOVhkhx^$cc}Ujws7T8jtFfy<>8qAUrJ3@U zM}gemdG;QWXNJUCmpt&I~JkM7gB zK31x;G;Uk4$xE1GUkYXx4Ve9(LK^En6E+PwY=TEL;K7`9hiaI8I%5e_wh125fG66W z-Z7Yi4S2lDN|Mt3PTo2>4qkL=b^VcJ!6|vmqn6`GE~|QErHx-w^~kPZb4w%pvAr*^ zYG$Y@R<>$RtNq4lmS%be>)%n9M|Oj!Sf1$#>`E3|p0wJ@oMm}3YU8rN^2qM%OE#fe z=nt}Zrf0C$?rxQmo#)AxXL=_Hhpl?#n3DQXHB#9zK51#DtNr2E9S@EMk6Ru&T9xd2 z)YAW1E6;M&OIaQ{p1xvvD43*Y#mPd9MZ&}RKWe02Ju(DsZJkw=Q>v)j) ze#ZmoMUDqY<`s?y!{tiH1H^kB4|WRc91r#v*V!Jm@!ioHQL=x2+m5so9sjgdO7;mE zYv#&+Y!9oyWCy#!sz-LhH`yMw-FejZsD8h~_NaOBdCMbv^&eRt*{eTmd1TN3Tic`B z`laQOW9%JP6tYLU!1BmG>ITarJ2bN9h3v=fw=}Y6D_I`dz2~gfjBITE$JS@Q;O z*t{i7#cu@fKtvP$5x*6?$|iV310MHX!mzM%2wS>@DfL)zenb=f4y1DlQ@#lv(SQfv zC3h{X{CGXHXJX|jHsJA;$jc=jujEjn^e>%`6%)9~SEz&?$c zqFb*`s;6cuAzc(Z05XDOqXV@7|{$FJUTtTL{OgC!TuKy_9--G_%wL z=Fe>r)io(RZ-x8WM!s8Vy-rs3+z}0U9+gyE7S`N>{T@f*@A>n1y_F{lwZ;%iDG-kB ziNc20VbQpkqu8_lggRrQ0gt<{frXVZZ(tCwyrOIqJfZ>5V#Q!vm^`?Hbhrr~(ST=c zPw+MBFW5hD=Hxl)FTYv&fu&6JgNjC#iZ5j<{kYQ0rcb3FFyFnE-#6LEdR&Gbyp$>a z^WZTi8t`DhAI;e(+>6!MlkQ73!6O>*$Zts7!Wv_+BbG81Dm;FDdcsns5zTCRP)dOi zzoOg)FDycDFw>3a+G4*5?m^LjN6zfn78Vce^rcMs20XAO81q_VGA5-!h_|&xGsa+@ z=r7&6+cC!amNJ#E(&xVPN-L#6c-$6I-Fu*S%Sp4ZyJ~ZyDK(rMmNF&&&%fVcmm$yB zkB&l0A&MQgjw;VOit;sjcRDhj2;WC>?YgB*t$&m#>dh~2aD7|P8lsVkraD@r6ryhz30SMaqMtUa|=u(SS$2=*+P&=liV~V-0w`^&L6f;+Fbz zC5I+sQVN8bF+CF+bX>k0Gv(Fb9uy6D@SJb`ca)9wn5*v3Y#XFv6Fi~;&oNH#!NTf6 z#nY9ektTRV1D<`O<;iZO_+NtiOEln-^Q5+gnxBDeU#bZn(ST=(jiM|p9@rN!;~Maw zPdnFTDfZWz8K+8tFo(Z_R_kO1>66!bJlfyyZK(6$#HOmYU!Z4R}s5dC?YDe$ZcdRxvgboFCC_ z3ZCr7R1-X+0nY-R7Gt62rzhQ4YJx{J;F0T3wuQw5`wo89{>{I?U_V>Rl>PhY6-i2g z@C&}*VhiJ#i>Et_y7dMtl4!tlo}#ubtc+oV<7`;$AO0CLyGo@2&rvptvaonyFJT|v zfCu*4Ql=rTF@#bIgwdVzM8@#^>9B6SK@W-sJosvcYhh(f@eJlD`Fd~b(c=X7Wwh&j6iFR-j{r>V?`~5HB z>FJ5T8JuU)fCm@5-2w7mc(M)N-y%F~sI>_m(SYZZPHtdf@xUf8V;X6|Q^_F}|D}6b z_n?#l;mDYtq-c~e*a6F!%DQ#8W0VQux}MTIqY0%H2xB~!{ZA0#EaXtPUWd?ROlhJW zW3c0wF~#3)V$3TIcs>>7m>=wKCn`0;BO35rfxptd6$^9BpNduM-~Rc*Q+2tvzJa3F zm>!f;AjJDK-~W!f(TFnVzCNnYebs)026i6ig(j>s>JY`oY??~{t(h096rx}za7AsBC7rBa0+v$LRjw%9&9!GizZgS$qrkG5q^t4GYPwL8B<|Md%X1>>$^J# zyM|hHDKiIETZsLCTA~_bI(Ea;lG;i^TIQ|COC-B;MNL?z2Q{;3z>KRWu7%ZK!qb}_ zX@W;I;2GPKoe?!%b2!wJTIcuIl7cy{iH3#l|79JJA7{Wk*mb($Hyc;ma;C!a z#&Km4`%0VnqUB6w$8+s+rnqNoKE9l3*m!hY(iY-+W1Qc!|5t<%*S&}<PZ_Aky9lGCP?_gFso(U_M zuG77&G`p{0$~v0ERxk}Yp1CWy+83(Sxht58M&o&&x_frm@no_@@r=#WjkZ?Vo((IQ z3dWRrM&m8U>eb-l;?j| zFvYrbTsjJ=8Bt)DQvVn9knW2*t=C53)}ih36-)`;dcArE(;INC6b*QG_Z{KQ@C@o~ z)M*R$gB47z4R}2HtWc(?H6~+H3WVSA-PeUd_)GLxccs64qIhKm6ZPmm^)i{Bbpu^g zG#;H*sRzveJC4Zx@vFz`Sed?Per3L=F3yoQPk;+W_V!nl}yP7Jg|e%r_QgNqgFCq zVLX~y>H#zET6EVkJyXWYtbYq9b?bHRFoB)AlBw7rE-%xc#dm6wYe$b&DTOE=ZSlLB zGu9|z=dNVR>elP@pqE*d9vmQw4~{03QXnidk^7Cku<{IBv687(w_ca9qo;o$O~rMi z38fSW@zhUrgk39{%DVNsgahgH8oY34G@+CNVe95Z6IHz0!pvcAB~wDTUYBq%jkmhx zKRB9DN`WxvyPqHHIP@~zJ?XxFD(cqj5bD`28t^=T>!&(d%EHQ+m+9ym>>)~hsFIBa zJfZ=Q|5eVh<_C81N~WO(JYFWd4)Zj7$><)GQXt&Q_kD3;5Po1aYJ1wuS#=3YGtZPa<_K`%Fang6I$5+X`n zKAKQUf$&TCtFo;vEJA(ME1096drnl_r!ZDEVZA(O)45!Kj^bC0jzUW5DC)lRyJGRx*tkkItdg1LpR~jxwNC+}8g@KWpt;u8%=DPz*V&%= z9#g^bEb*9P*V~%a9#h%zT<9?sZ?HAjdQ8cW+MZ8%Oh5mWeRb&}k7>lwJO-X2yVP?Y z(~#r&6?i@-8W|OT0<%-|8y?d$j%TYBQ}QOe)Q%~p5yx{tifQO(TXPgVx7waFQ%uF% zv`3Fs=^c!ON!t;*7d66KA@xzFWR5cX*1UND){$Z=Yr;C?8J0~kwcb8D3Mqvs{x{MY zcVUXDq+9nPyb4ihO*PNT146uA#y!f0m1i#_=d9@CmHhY+-jrfWXpJG1QXs^W(b240 zUIj3vTlXQn3!_(S455^Ym@wTv(AU;SrAq7dRxN0{`!W>!gyeag^7N%wQLE*_{}W{` zPjCMP-9$r{r&~4F`pIfN9lhCJqJrfa=<4j7PG!flE<2s#cT`J3Glx=+XI*v<4OyPH z&dy$IUjG3D&g1!glL?*gO zQQ7udiYfL?h1qAm{~K{>jfp}^A&P?UuZiSGEB#)lW*x;<0as79Y-1|w*6Y**+o_GI ze6QUX`@-{gyDt)LOv!&}k9UDA$64diy(4WQu5At?I>Szu>7B90rF$o($4|@MOpET4SP+QjJ&Ru|@$qrHv{6y8rm`E|5z#Lt0}9rIa2&^^dt> z5T4t{RMM^2$)WCd(SQeE(~FL01;*h&{WGR{L<64tBIQ|w@zVs4XmozuMM0dzG~n5xX8#;!es0D1c`KMlG~mHkiKENUXE1)6 z;1LaY-t;{m9!7r^!Sk=+{D=lT-}AjIFASc?vHrZ{&jWj|jVbkRMPpU~DFwole6IqJ zl@MRa!Ru&a|Mn-;E0SoyVKw>;(%mFc(ucl+dZ>uw^H zDNTl`s5RuJrBvDVWQbz_)$`O_C7Pt`$q*HcN6#H;9g&{k`|Qb>BUNek(!-V3>+QN# zr0wf6tu2!(&(x?$+t+0ZY&?~~3gfDtP8I6NX4<3UlC}_+w1E9<8ZiHZ{LYz=wJ%_Af@iBHc$5Y_Z%4{AuAM2dbrU>F z1D^XM-8sbCnaWM@hz300jci?o?a|Iu{D6OcyiBLM2`0O3MPo*klmg)&TcVl;u>ISa z3cB?=BOErfohdb8G@+Ezg!Qirk9Ev@nY7wV4C&VE5b8N78t~j5S)Y0txq6$7`S+>j z5lyr_u;bd9MjG&_yO=tN;yaA)K`8}7|10}r?LpZ5cBa;e{uxt*+5UmN)|ebhDMc9R zeq$l#scyZ_7=yJV&st*$r4$Hp$DLa=tfLjIx1A|IDIkaIJ7{Rf(Y-9CK!~@R;NHrr zg-N)fooQIN?j}N+>gDwVRNi?sp_BsQa^Jh@!Wf5_<7l;ue-2?oSnIUL^sLuhThSw*Bw7NRL-6`93M?6r9k-I7QZ_Q!x%sBAU}Ioa#)8D zwnYb1N^6v7`wphE;6cmqedH(rE1>(+e<2Pk#GXhJCk!lxo#A=^8c zij~&=#!n8K12v(S$)(%yPTfPbNB6tb1LoUso?mylvM~GoV)VOiy>3=>Y0S%!>7xmy z6bOgM5$zcn;Z+?>@fnrY>kz_jMOJ5xCX`YjEJaHAX^c$WdL2Sf-6P#kBU)p6SxSKr z&pSkShWtU~aCYMyKH9;QKdvT+s+1asTl&5IBaF58+Z{|L-MUW>v4^DNM-xgZ5JtO0 z`yp0r-Fh8D*#BbX*BaByQYw1FKXfn^bnA5pJ#{C1KNYpc5K1W!;z_~i#^FCOQ*`Tf z2$gj*6;Bx5%Tfx2fA_s>F^qAzbthA~(z@RozH=v2>O>)wJ-|LF<#-P1WJ;c7Yvyz^ z6&%k=olJDHj?~Mn>%&T0nyWqfSRg!zeR8CGfV06fuhM#*-tjW)yF1fFBU)n!r4$Hv zZSi|@A&lNx(#aG*#h(zC>11lv8bc_hKp5Q)-^;957vS@{^*T9(Wii6F#t=#=5c=P* z6-Ev(##q&@`w-rM5k9|W9I8?v+^)s%%>!W&-r31CqFb*+sGeo$YRkn=9Ze{uK#2Fm zM7NGTfZ45EuR{oX968h))5}sST0-?a$bgp{(yiAaL=JIFP~!B_Ih0Z$d?K=y7Omr+ ziIi@=4xwKCL<1gtv(OcWxf347`rLp=F?SFZwZ;%iDG=@v>8SfhnccfxVEP(j$y`IEEr=2hx!2#PUZXT}j(_GgvuMD4;F#92n;VP- z*a>N-__@O4w}U+ceX+2jQKgoonPTVLoHG*Y^0Vs}M7Uq1YVT#856aJv5tnY==}j@YCZ3_J))+!51;VlIAsZ2T z*@5m=eQiAj-Fh8DoiWjX2X`^Q|MjpDkC_Eu&{xvkw~@g-Ji6K8<>JdKeOiZEN$`x^ z@|u2Er4YrOaYT5|uxerU`~RkyQY-xlVXr~sjV6>*Al!$e$}{Xgm|rP>LY2d=wp>YT z%t(+@AjEaF_kVnEG!kH2XP8EG>veh=wpWHJ);2naQVN78MMjAHU{{&ct=A#cb4N7b z!Pg30VVI+CdWI?AfJZUo9e`S62&EJVaW7VMeR_0;sia$X6JcyV`dw=bp_Bq4zF!a> z;W-(mczc6+kxQ?~r|D8!V+f@b2=N^{H@L8R*&9gXW+)oct-H-A)1yu_;5jrh9@q-> zX%jr60nZ_k@^oSRG{GYp@c6&cu9@9(qje1ZbwT^OOuWN?MCtw#4R~ga>B@B@9@t=p zDV6r;fnAC|)fz)6r9kNazOS)n40bK%U`7c2c9nNzm=dch8dd6%4Bky=d!EcN(dCs$ zO%zfyqUha|2+xRBEv$K}cQVhJoy?OhMCVrIjx z9`R%-WjuOb2oGW(*`8>ws!dyMe@)Z>WK2KF)o5Pm{wfsp&T~!+5uUbn?d=RxQ4`kb zFW45Vm{PauxO5a!3Q^#jfbK6q9YvSUPo0{ZiNYI@bHef4Dy`S42e$nxrXj5{gi;EG zKl9z;kC||=Gu@LOOw;ZDggRrQ0naymj~8R*f$g~p&t?1bz^1KY%6?q;sW+JJ&GxnR zWelNp3*q{X?59T)N+}SY=ld?NvCc}^MHs8P^*V&GYY@fVqY0%H2!9c2 zzu&rwsi0f;A^glLro?AP6G|x%mhe}_qAjdm#&r<9)jw5fz21=#_7I}DUlYO}UB#4t z!1g@7is_y&+k29qu41~`@w~K(sr6U7lpfF0IwFnFA;LL@s)ZG)Uj4?Kb)#7Go`0Q< ze1))HHoWzf=ZVS^h4jm-SPy@z)g@VDCyp5Ie2`%uO95x#gx~CKBMkjU)829 z?BiESue2=*;Ob_K?b^*$(1dmR!dovZ+pyM{zK~Lg!vBicSZACkgN0~aC5LqgVN<)A z5?W&jrBw8zCDF~4(yjXt9^K6}biwG6Af-TfMP&P4ee517>EoCC9Y1ZSbTf@;LZ2uW zU_7taQNWgUGsTU^+t8Wwy88xG#sf=ZUO1k$-Au!d=i+Xrvg5fLHE*!nx*d6TJojSs zI-W0raHC!7@ouKP<9Qa5I-Xym<_qmoe*mH5dA*w{d6BK*)l5alGhsDT{9;?P>uRQy z|Eqm8=_G+%4LsNNPx|%8WA-kS5YQDtwtX<92 z>Ub_*%{1b8u3F7Rm)fOn2an_VEJ`_^hmnoT>{3sxX3Ab}d%nM#DeriGxf<`(wKac2 zevC&S-(_TCrhH=?zjvO$x7DWhJb<1l+vq&E9HH_$+TKN^n$TyaY_W!EL~BeGQVLN# zHoDUHwDR8`a39FTHF&3PC96J!`>bI~Ua2#$^DL!6c=DK5q(+1~&nKHayHAj4J8TV8 zsY2*?6h3MVQ(0?N!Fg+#=))41c+OeF6mvW)*Wi7*wx(+hQ^N5Ku3>6*JeRCt8ge{W zqvnr{&Y>_Php+j*pTC*0+9-#xTh`z$yOk(>dik@+q1LEUk0JJ}?AU*{hAHoOUPh#j z=O1gBh8@q=Jxp}9UC)#rrkLY7riUr(c+Tr#8g@L{9;W0qc0JejFclro9cb%XTk}v4 z-Xd#zp6+2PIi8n#m=f2CMy^ngK%+;U%EtI!ro8d!Ss+OnmV zOzY~qlamycZM*d{Wh+tm_3}Z8LTgmv<9eCOj%PtHQ~Y{6V;v~vcrNH=8gV>V_cA4J zuuFZim#N@*9_nQ(IiAN+kK_4aFH`KJc3+fxndk|9MAMm$#ZcZQ}$zx$Is0e zKRPbO@L(U)%Z}#>j3~$R(>^A8#vW0Bz!=kQnMkE|M2dGzjbZ%g)?4Q5L>bfLr}T7% zr=_#zy)>{b`kCm)#@Uz*%|m(?z-IL`?csP%>t`D8c$W1uwL018>u1X9wp2aW^>cOI zF!>Q4ogeq^#@dnK-sJ?-SAh+4OI-PF)A>niLbckscWlCL?PnU&%ymXD>&E8q2UgPoBizsV6dNv7j z;~birTWaIhIW%##+^pKSP3JJLqfqA|@x+B|2W6S!Ixe3aCbLW>CqL(9ndW@K9(7$= zrm~}1pJmE_*Pd}#WtoO_Tjcev>&3f)2W#>pJUT!1=b$OoV2l~&mW$n>t^3vEny}>& zyyvz?cTbk7sF~~JNB5~{z@wr}EC>q|Ry`4Xl`DYQ5QiP0&1|0nh*7 zufr53&tqAp*e!Zq=+?!9*0CpvuJ!L?)ZI3^b@8C}@#CUw{pVSxkxvBog=oODzwezh zVT_I6VlLk?Ive6a>ks?hj~zzquc0sQ8r`~h(E6ltes_b9wRL?}k?xk({pQZQS*GND znh>_tTBgJUwr7{MOc(#qUbUvKW$G~=J;J3e#Pzk=L`Ow3zw{bjHfz*_o7KC9IAbkS z>G?_&b=D2dEE+H$>idqwvGxV*__a(UF9h?520Zh9&zyw8vtTV#@>jt;q5;osoB6$E zE({)TEmOH1%p)4`{Ih0%Si6STIXlUY*Mwf@9jwSIy~jYsEMYDN?@=M!yE@oLi} zYOGP{RjZ)a%$DbB?gN395yc@p$-Nmqeev2_CVF1SrK6Bih~l+res{Bk6-8d>u+BXU zuzzC~obMlnW)=;YaWANAVP)R)@J0+TmtPdjBO36WfWHn27!QsPGunw_D{RdX==YVj=foVII@BJ|^SV)L*mz)PqLimK zuqEihl@m5+%}> zrxS$9jOEF-4R-gZR%s7xV~(lpcs`P2ignqVn{rHfm2NF^K#`iy5Ds#ODPZzP9!?TPFQFe)4g2K^P=TsryXtgVH|!ixR*r( z=ID+furFbDH^Czs@Zbs1h>mDoZ3A61iDDn}?`7Smq5%)?uXCqM?JU6VeUzq&-MjA7 zKbStn*;M!H8|*QxnV0zYDeT!C(~#DfD5Mmk*vI!98Tk-)=0C^rBHx(sC5%knmSX-# zj;U3bGR#sBnDOl|_ji%bys77X{%%q>z?9XkyPc;@j|9Str0bfS#4qWMbh*|{rlAy4>09_;vYM#bAV}BYm{g00MpPWIUA>a@zZ9{SQ-2J;F0<@n)kuGx2N< z?in$Jv!C4Bcq*+Y-dF3-*R(#rrge;KxAhOzv_9v3wSLvqQ8mwcYx7Z_nfP((wjP^k zJeAm!@2mCUeN8=;%qMGF$5mXn^`#Sxr_%cT_tp9pHL<^5)B3wLt^a3-(XF?>uhzG$ zX?;UY>-n12KO7s~`r`N1dS}gy`)SRLd$Fe9XYM?@_0;=n{pOn1$8TwBmXR=Xn{lH& zvtOxcz3Y9oeosy7lWJPuqo(x(cQHJbQI~yRt&h}<`BY86ch&U!e`?13hWFL_!8Nhp zQPc1D)b#u0nw2*HzFNPhCiY1+vF}k6dv3eYnZN4)6Zig6Syg%X=;O1|$k0&H$k50r zshoys9ETihn8qol9EZv&#+*P!qXvypG%_?&GE!19Q#3U)GBPwYH8M0bGBQ*$H8M0b zGE!7hQZlo<4(~Z|KJVwY?)sj)*1hi^rH}jUXMcX~A7`JvJ+U{ah#R3~w~pVJ+2&wK zD`ML{*Ax3XrTGZub^VmrO;%o)=ZQT)X+BN$GS+@ZDSON%t%xmqz9;rXC3}_9e6`Yi zxQh2ePweT6y zam9+gM6oaL;_r18p4f|(=EIfdBbDYysEDib#NMPdpQL0@QL=}q{=M20dq2g#M8$i7 ziuYy}@3o%T0~LF^V$W3Uaf-d(6Z;b7bwMiLLsYycsWEM%C-yugd!Vv=u(Er96>-g; z*h3Y2w$i+Hc8JXL%arDEy_b1hhGK6}>`jV&MW@#G*u6}kC-w$4lNzDet#4wa?7P)W zD%cZynUXz9+1)xlQL^_?@~{ghbW&PrhI;}8ry_>VlPs%hbh@3l%8e7q<2C5k;rv4<%3SQT-J zp4gKWd$rPht;)2+l;)E?v6m{J@29-3zw)|z)xW2DVvkimU!vH{6#HuB^XZ=0E0pG= zmEB{M-TSLvCesspu41=7pcL`dKTxq#d0nFvhbW&9Q$C-mBCgOAdz6Z}e8pa<*soU+SL}&B zT(RdW_B_SDzk6$3*kjrfPwd6Y>%x`YBbD7tRm7EfVlPzep^80Rv1cpx3Qz1wihYlY zxEd94169OTd17x;KA)uQZXJgrvfqI7YD8V_iG8qQU#B!*sx-ert(??)Vvkgs&r_PW zPEVAwA62u+dQa>@D&jJf=ChRM$Et{H^u*qvWFMh4pQJQjuX@;KPwaz~-HR0aI>kOm z*&R1{nZHLU&CgewU!pYMq%nl+gpc)4RbEHsb-|w4M=04VmF#_KXs zHq;Y)iej%(>~)I$cEuj&IU7}*Qj@cBp7|@_{U8E=WG$nhTVsB9F$x8MpPwY^# zr>clcR}nWtjjWSgjgvCmhs z2PnG-Db0tgnN+?f_FyG@rs`#~RWCD5jq3_Mu@@c6UZ(6GrLv86*REt=r$!gGp4h9E?6FGrI3;_Q8qe2zVlP*+ z_gAtHQnGJXvNw8S-=kz7tYjaeWKUJHH+y0aQ?lnM_W6o^oANsJ^D=)gS0n2FD&hvI zi0h|D)PbJZ6IHxdDR%4RQR(yj)aWAE6MLy*@27g${;G$CTDJ-H#9pJ=hbZ=8ihYh^ z5BJ2LtbD#&vDYg0v1&{k>4`l|$)2O^Zk;75?Ov?bZK6D}XDHbllPC-xAO`Iq8U?qE| zV$W9Wla=i8p4jV^*Tt(mpQ!TucGb%ydSZ`Py-bB-uTtzyYSk#&6MLGHy-r1(b-uN< zd!dTBR8Q>rial7#9;#%Ypk@>4p4e*@dz@mASL`d4-7`J07b?4ls*zQ=8d(igBdcsr z>^X}4ypr8I8&%r9OwFKkJ+Viqc%QH0-8v;#vhPvxp67}Eys~?Wl08k?{aQ7y%lE`y zr7~@dlHEEHT*^LNW!ged?0XdZV8uQ}v8O2ZVo&TPO7oFQ^VXeOQuZ1Z?nTmawVz2PTUZmK=RJMsw@jgUln<`K2Q0%En_H-rt04001 zC-yXzZR(WIHz=RaRCAeHPwaKd=Z7iTtusxf&u>({OuZ-eD8-(y`giNAZpj|6)~Fjj zvG-T(1&X~$v8O2ZW>4(Hl-HFj%~vYTA66qP{Km`t9m?xcmDgG4t4hsZull$^PwZ7n z_81lKu`1rrt9TFg#2&6>&sDPLDcLKO?4h36*D0@yPsnJETC-!6|d$p3iR%w2alD)(ed$5u{Q^}sKWM8RrU708L!AkaZ zO7>DE`#jaZS9oF{p>kcN>f`pPKCY*l!&Z4>&sVYst2`g7e7=Xu^VOc%>y+%nl-)-t zyKhx_zSa|ajAAcVnzwESlkuLRc0Sa5VvkkqC5pXFu@@=!Mo;WR6nm*+FIViF6??NM z_FBarr|fQ>LoYR7sO*j#z0BX^RJJKo>=lZ=QDxddPwaz~?AFarLel>0l;$5)nh*BG zK3K7@Q|zURJy)@ZdSZ`L>}86*La|pV_Ha+^m5P0kvb%MUx3I;4+mzQudScI1?2StH zW+i)x%JWg4*h>_9q>?>K$=;xLHb#45PgU%-O7?msdzz9x#uIzBVvkj_$0^w}l-*-J zvF}mrgBAM_#r}w5kMqP{t7gz~O7rnb^UKr>I^Gj|y2`ZmO7=!2d%2p+Bzj^`QJSw& zvezluM=7sM_QYPJG(SYK4^!+pO7p3n*w-o9Bb4U*Db4Rw@t*F9Jw@5QMzPl^_UX#* znV#6AluUG8%saa&cC-y95_a{W_AMrl4) zv5!#iB1=567b^Bp#U8HM7bw}wJh9g+yT>cdC#s0sr+U~5PwexR>;X#lASL@CC3}@8 z_DaP*NU;xA>_e2@t39!oDfTGE9D<}Qc z%E>ada?ltX~~nu{}*t5`C@-J8soH3-AK`PAL9SpJ8|sO%Udp)YFX`R7t(TT zfcxj1aNgEt=k)vkU)$V&h@#6-77li-^Xp~)xW}<+yH0MgTYkzG|3~*kRP^;* zL;FL&i~W%P{R8}v0n2)|BDN>QI-c-<#GVt`T918OL8D@CR_wR+X?@COkMqPHu4K=0 zY~fg^e~x282N@92)1N)w6MK$gZ&d8fihX#PKYOAl_9n-p9J&4wuh4zP*^@o7 zM=IHK6#IO|K2&Kw)f0QVVy{u`b&9>_3V+$tJ+bdm?9s~SW0cPyQ4yEviM>Fv2P*bp z#a^$xF544(qw>08O7kO>=I>Enm+Of=RLP#9*s~OSfbzOLPwa7ueVt-2RqP#<*X4U+ zPgj|?M%lei*?s3#{ytymiG75Uy-dkop=7^R$zJSlOPDCHpWX`;gxLUf1Y} zyDE`yS|sjw2qpUnC3}=7_7uflrDU&GvM*M$M|)y#P-EIS#U8KN2dGRNps?7AnK1i|WE7=Q`>>HHbvpun=D)v2!y+*OGRhrNB#2&2TJxysoLuo!*Wt%)t z?0Jg)ykZYf^SA|S9+&Tly;x~JM6rh{*&|dBTj+^BOR?80yEiJk_fbAy?1?>Fu{S98 zCdGcMVlVN;o~PK)D|YL4Yq=A3iDEDF#6Co^7c2G>CHol_?-icdgA{wJVoz7>m8y@c z^28pcB5uC&`6Wv8RAZZJPwa_G_HreArILNP%5}A#*z44&GFGw2DfS?x`Fc<6^Ofw) ziXBSxS<2@dJ+UV%yH_f^?@{dcsCitoC-x>Kd%R*#RO~rwY=hrS5zOu?H*m zG{v5w*bge%6FsqqD7&XCyJsr94^?(g_QYPM*dyA$W$^99=-*GxWmdL*C1LNoNcF@X zr8GZZX?}^)e2U6->7LkY75iYN`5{X4VXA-6^u!*dG@q*2(>1%Yd$uR`{)#jl zE6rDUVqc`N4Tfnv{7eO$dK_ClrkAf@>brFp7c*XW5oR>@wZWM8LbKdNMJ_QW2b*pn4|s$yTE z#&x*K%ly4au?MSo4^{ErRn27rJ+ap)_87$;tJs57wh8vc-cPaTD$VC9%_l0mhk9a9 zRX)E*$zG#mpQrMCxF_}$#a^Y@s}=hM#UAO2y;!k_sCW-k@qU|%_b5;7MT$LGv4<-5 zK8iis6MKX5x;Ulzc%}K_%I9M|u_r3o%N2X2VvkUEkM+bJrex1l5tpqZE<{CKoG12d zC3}OCy-CS_lj`5&J+X%>_6)_IrP!0zOe)b6dzxaeR_wKkeXX*4vM2Tu#U7?2E<#0I zhKjgUPweXyd#GX$SL~w{d%7p~48>lnG+(bYe?)0M(-V8WS}7f(B5s(9xG*)k$o9nE ztm1uyl08YuzCz`?Tux8sa#jCG+*I~9g00k$)2KQuTipBd1B93nh#LyL5h8kdJA0bi9JHGXRB$~4-iB0Eo2r_tV> z?jYZ%5xLj9+1pJbVg-B1B-*Q&&QrgeMEi?f2N^Vp_W6(wGJF#4y{QiJ*d(G>aLt@V z`*cC4%uADK@27Q;RaTjnZ&)0p%xX_-3lr{588ap|rhj}ZV*PebqWvb_dFsFbo=n6F{j8i!`%G`^sf3AX6GkUbK-qI{D{q=iduN(cbIoMhx6`&fHEztf z(c@B4oauh5X)@6)v=R6i?Q?0Idcq&0eT%(=-1r#nd$Jtl*2id{TIL}4JVtxP)j<*; zBcg;{lOChJhtnzZ!eg}8>l`HiG1~h;9Axcdw7;2kkn+c9zqxjhTC0qZ>+EB+cQrU= zI;7LS$<#r*r_=sM%t5Y6r#-)Lkb&v6#{dozmrnbxItNKeCw${W2YDi$_PT_F%(gBk zYPo~PL0(EH8bzCn(`nzi>6EERC!&Q8ze=Y)9&^eZx7ysYTg*WM9w(~BQz4HN;Vn1V zI%Ogrr+v4ngZ$YlBkGBNoQM?l{P%I%yR)39W>`;&XnN^!qFBiFro|=dDS4ds8nshT z<>N%UDD&mxwC}lg%KY>=5hrTyG==tD*eP?}6xwUB4szENB3Q_tFopKXFix3N3lZ!& zQ;24PJ@yWA z>k~w*km643DUl(^SY-q6!yA2gZ7%0Q)WO0?NP3S+?_#t_oIWPWDo=6+&S~f4BF>r zIA!K%&|ZghkQEuUZ-uasmVB7{I08gp`A!DyljNPJ_GHk$na)8DWzat7-$5F!GD6Rt zrqaGe(J6D)RH9JW>yJ}ue}(Ood0;B-TQeMF{8ZX^zgkF3o0BIXSmf}htujKZFHR-$ zge_j1O8Z<#r{;I35)fr7r_%mD*C}&gD(&5m4sv2D?XT(_6D4L>S-BuJIMHHwBKMl$ed|JNvrHu&zLf1Jn+1`k6S*C z_Bx64ROK|HLdgED#U-LL;7KA<$QAk|5htGN_aqV1S|%ao(eV#GGA^}7^yV>7(w;jw z?Eij}_E{ee^2n34XEzS=^pmvbxel`UN!s_dIY_bflxTDLleE|3oHB==q`iaGL4LN{ zETrg^NrbjaVf}h%(moTzdFr>Bw7;Ttkhn}DyjAnoFENwI6v$)?5pnTMChgk_oO%{# z5@n)2>oSQr(VnfDM2SESWYRwQ->K*OOd?s-)BY*irwck|u6~O49as)>^Ha2U+&RcU zo}zv7t%HnyiuU=>4l?;E+TR#D$egE$Dk1ywrwHo|ZMK$K`xNb4&G)!KP#=5*SpU^&Pu z(`nx#LBqJBG^-A5LE)1J%jfBJI+%}XV88-;271>mb{$ zr-W~OlSTV038&02S+w^WIY`f^iCWJWW&xxz;{S`)+0DsS2x%c&g@U+9!lKWzIcKd!L?z1kI#~f z8Q?~%jL^@ZnY6#0a-JGKllB+-4l-dT?QgprWbRDbdlVhyZL3Vn4HOQtc_!`m-40Sa zllG0e4sv=X?K8a{q{A~ry|6`(XK3$_a?0HB4DB1-93W0XVX5%-YK&_o5&V5 z@5?6gg*HxQ6RDyMpQU|{hf~iL&l0gh&%b?^_Kp{)%wL|ReX_KJ{L89G)SU7xktvW_ z&l2$hdF5H!H_kZqtbdjmAjTVI&(i)T)G71jv$Vg*caX+siEJV1C9{ZRp|P-8M6@XL zhgr1Gu5s##n?;m}7N*Ri{cgf3lWRRC^z-s8B3vM)vuLj^J5TMKMf*!P2Wgl^`z`)^b7-Fq=ak9MA)-W?k{sIm zX`M2k<mc_(M-&R{ zJn|e7EUc4hl@VHf*{WGcvF16VUevSwIocHq7f;9vzI;PC7r*xK3Kg_wB9EU2XOb&l962y6d_8d16UPJC~ksd7g;e=thP-PXq}` zM?OzDd(nMzO@E$P5bv&e(ep%;(BazWi4kMmW%fKzI6JF-^_+R0hzaT7YIB!)M819g zv#-qc^N4i&{f-a0bsiDZYIo~**F2(LJe4$$C<}J$Cu<&YLio=M^9bj=5?{@m<`J=? z&HLvO&U-yynIGp7MWRf%7l>+tCpi0H0vxfZ-Y-1%>JnO9#RtS^79_WIhq_65SZLBNMpzCc8EbC)^v0x?X~bHd^p z;ja1o3q)pT_fy^H6N#@ISHwlm_m?7OK2d&;yPje5i6z3O$@7VxsqQjU<`d4{I=(i~ zn@_}u$Xzj?a87vemDxU@NELBWKc6V;bjqDn~d;zGjNuSFz0_VD;|6Cc8`AKV%8{e{GZ zVeXngTSz#!4H9GQxAvu<`rg|6v!zh*Hp{$97{Z(U53i!3^HF>%v>++`9L6VCYwJ}J@{6C206%RIN3aCX=D%B)&U z+%BS^bTKj5-kabn^YLOL{Bm~>`|V=FIdjifro&4_vgo_RUn0W0xStyM64B!kcYFT+ zl7Bu-e2Lg7^4R}gA}TI&Yjws;MC3{LC}q)0M5c&>cU~g43h%9WiHH#`JoplEMrief z)gEE5pI;)Zo8T-deUe_Wgs^U&Z9{&)ga{YeCT0ndETa3qC4_UHjIW+Ym-uJV=}U;M zBKy6(gs2x9dwU5nS;XK+ONg?rZap7fLX@6z`)bn?VzFq?MN5eg;XmD%5{aURyc$(tQHSdx(=y}S^M3b=Btd|Mv&fm70Uw@g%7CCd%%S4FC^SfUr zDh1bxmkDR@uCLAA@(JfFEgy12K5?J$x*ooaL)MkA)A&Hd155IZ#gks*z3e{!a1|i z_f*iU#A1<2dc8`7i!tp@uM*bjne z0%D4=>C6HmM3i}{fUv&uYtu$i0Z}XFMDG?5BTC$}q&)>h@{D#ao7NThkCDz45RD>Z zo7ae#cJ6wDUn7deEa1A=2q2yGI4>3kl~;OClj*Y(mPT525&yF7|3+!lS8a506iR zbsKEkisH3}M1RqnM->t)#2EXILL%=0H`jfIgmag=&l8>~BnAm@$txt{Iy&suZ+Ri% zd~fA@s=SbxCFVqX3yA?DtAATa;tgVg@Rn|G5cy*M9{vW= zRYbub-XKE6Nbm1&5MzZ+?|*}c7JWg=8^i^{HT4a`x#Qa>SKb>$naJUY-nEi& zc6$3*A6!W|Un2XEnJbC#&WSQyEyDSl+b6}Cw}`RA zS0}wi?zC}1UwED`Ne~Sng`LJs- z5h$$Or|%N@Cfh!8fN zwuU$&^s{&k5g^##Tthf_q*^18v?VodwxT4J)$^U1YDrdT-%eA}wo9betvCaT0Lapc=XjL7PLdYdQ|_5AB?B0%)i zBi|;P#i(iG+eEI&qO;#7ibcFHew(NiIpOWMiS)USb*$gkw+ZL0A)kJ}d)v3l*JcZ> zBdoIx+s2Sx*AdPQfWD{tts`PYd+u3BeAe=I+p+0?*7;UJt*`2QPi3qls>CY9GK))$ z;#OHT3$NR}j!3L`kBxV)Ba%g&)~q9ji7a|*9kD?8bI5w4EWmBA8`l#tqOTmZo>(R{ zKXg6OBrN#gdcrw1$R}6&dcwKW#D^?gPxKSL=WFYUt)iaw>xnesho7t`5=DFVt|tP- ztiR4e>@O~TT)(XM*~|Ky59zsq2o?H?*g%vEu3I+{iDCu#-VH>(=+Pe8K-?}yM2~GC z=8GKl!Um#1Jhf^A5ig{8X9F=$%!&4FASMevf4zYiA$s%E8;Ch#%+~Q8B3E$reTUd5 z>^|rnVzog2`3~Wnr{~kp!|xD*V*E4p9pZYy_1rr|rtrE~-XY?|xUS?K|JCNIcZgJ> zpKsnFO2z#2+&jc(F)Qg>Ld+D=bYlsTFM5z$N~|32j)Hqi23t3 z;$0$1c+}1B63!i$zIx)`C8EU`a^$;2yqKF$dY9NKR#)b{OVkP-zVR+`y^x~BDkDZj zRqqlpP41rY*t^7Z(dG^tiOi#J&0n#R2*1j$!>El!wD9>`Hxfrhybs+-tQBLe5gUmq ztu0I#H!>yV(b50ST<5NN{6->Dyv>=lkr*gOL<=_(#lq`WZ6qoM`=*V=N-_7W+(;Z2 zJ;?rzL}HlRTk1CwLqyGIHWKSZCb|4QVu`TVb?*_WVnpeot% zWTC_Lr9_;VcbAnC+r@13n^K}g^dQZpL~k(;zho1^H23WxdYvi`^)=;bq-aV6jziH)nc9Yk7dL;VZmW#M6h_@^hg;oUij)0WyCV! zQM1a3W-&I-FC(^#oUpdcdMoX2Pk9*;FFc{TjBrl=_sMml%>Qi{w-EisSR!}}ktclP z+AYKi(Vs?dA@W6@|K}EBPiyaB{YGvfngZP;*zsG4KXqu?5^2rI($XfTjhv8HCVI4t zEkvS_>zOS?sK^Nmw^%#M+%<35LJSwPtq->l&gr;5*=x5Di-l)4ZSh}k3ED~w5}NP5 zm537BxNR%poZsTBdGuCdr_j%YtwfE;S~Ip18-xYtZ)MBES6dXkvz0h6vhnt8-?kG5ZVrfH*A18{r=iwMX1f^|ug_pND=xREw;Y_yG}+@9qo!_W?0e z*kbwzM6QU77d{|@#cJ644~Rg~!io=kyB~eyx`c$5vBb#yE8Kgr_I*G&ClvYgeAMC+ zneD;{#C$Q<3MwaRMBfxv?!V&Euben4>WL{Qocq6gT>mNe{onep?@yDB6sA6M6BrX z|N9}4|G2Z}V7+r0GhqU1#XFa&9}=Nr4zl<|OXAp(ZL8LW9}+`^M{WC%xJ`KG-Vcef zBKLmtArT^?^2~=sljzX`w-HN31{ko7xJ_`~y^Sao@9f5JBb*bQeAbz@t>yo&HZR&n zB#AlW8{3FL*%$bpa?LOHZzCc^yf4T=>S^kBB&tkqSQ|vc)L({f~$_u* zC`LqcDu{fMH(stFQpKD7HC7pclvfZz!e09;hW_(0 zBHrsiCc27TckW~2l<=0I?L@hdqW5+pPR#ZCZMXc;ZLeFl6RBbZd-rxCP^^6=ZzqC; zuRgt<=qlpk#qC6mi1&i+M7(%v^L7Gauj7~7iEQEFKWz73dF%2Cu}-`>y73cYVC(4A z`rY~oQ6zTd-Sr9KoUG{6>Jy(3!-Qw%d_vqOvQ5z^M5^$pEuRo+LaVz!A;N?$>OLV- zguR+RA<{*hcB~|v^9FtG=~qeIC&r@xs3fw*$n)QozBLf*3Exv`l|+!pv@*0*-j!w)coyEqE7TgXRN10jtbmGvv)g~Re#>qmT&!Kh??SY)mE&xq@V6pwsH6p0q*d`85JQNgR95!*zTSpOL@ zT|~jQ&j{z%44)J=pAi+J&Bs3@f?92A?Oz==X)N+byGLk0eMVG@i0iz^7X@v3{^~vc zGlkpt5G#c(?zhSan@-$A3=#eN^gTqjh>N9ri2Y)v>+L=MyFPaBA)e{dN<)agVe`$X0Nq>!=16a?(_fp^}2mTsu*wF zrjUQ_^UwSf_Yo1|&Goc>#9{Gpv$(i6|KOIWbMx^p4Mc>m+Ty`oQOebC->8hh*Bw@ng$^ z+q=?eA( za#_D_U;3}2UuPjg(%Zfy`iYt!{E{dV^^CL1i22SFUlPta$v*byz9c4y-23L2*1l7B z9;^J4s1Tlcs>=+idowYHAI702e_q%XcS|c@m3izmUy~`NEI~~ z))4oJs4T4^_K0ZuyoQKq&Dg#X<7Au{HGfk>oDpMyb_a-^0tr7r)C;Xf9UxAKdG2io zi2M!i9^~!={%<1wbAU(|UN`vw(LqS@+yNp|_~Dxeh;t%ql^pPY*T3t4Z#>qvAK>c) zM4~-2_F4J-0isdV6LgTsyx@+(h=cxba|RyteUsIepNAbJx{4Y7$b-aDA=jjX{@(KJ zL1LE3TFVX+al-EJ93-w4TK(i8ag*p%4j%N+kUtzGmWbZ!qOXVw@l=nmh(@8+{$Kf@ zGw}DXh|n$W@770rMNAQS^^vcLLeat}z9ROC+25S6h+HvpSo#&QQfPja)gJN1)5l*C z14M82#aBdX%jqc2`o_txh$SK)UigYAZjGjdi4Q;Y*MANjmMm6xJJk{?V$9#KmRKUj z2{E0`vhnM+#9-kGn`(&|@kP(x zT4I~fbA2t5FGeY+YKcT)_rOC$nV4lq9wLH73;%M6C=mAg*CAq^@RsC5#4yq8O+V!S zR%pQ?Vx!2$YY!1sVpLgnh{zK495_T|i@f^NA)->`=b*#HU?F?>VWL93rTV>vh*gn0 z4-@Oe+~J|aM7HQ1G7l3?LSru;Cbo;&&5FZBm0*AOFp(v)-}b}ADe=^ohY9CSE?>4e zdD#ElgG;_99u&RIbzl2`+ZFS*^>n!FON!xN6KP_cnff)6Av8AqYvR0U;Y(lp;;Sud zZTi~U)Ubwq@)@-=nDK{47HQ0M=q?;mwUu<*L%I>Na@$)}$g zb;Jna8;k0Qa)E5DBL<0CQbnEr`9IZl#4w@NvvtIMtvSK^wf}~=N9ZT?8v^ItnLp|q zB20MipT8k`i#3_JZ-|{DZ#?u3Q7XJ8{TpJCcUhHu_gh!%P2Z!bX{Z;gPj?(4l0=*TeS}CB>xYjX zA+8m3nQ2FeQ=)fx;Rq2R`oUL@`0wK0c!W4AGUSdUL}r0|GUlz zR*Z;l`j!Y4v>_i6r5N4}D8ih(34fx5Oi21TyPeV!4R!m#wG79CrP;{$E?{`j%KG z`irl=B|?N&kAF)fiah`Gw?u;&YlYPlC&UP?Z$07M-J+a>rF=F*;%y-0Y(dLQPQ{t4cr@r&;U1`g8i!3f7#arJI`K{xhgo$HDTU!g_ zMPA+c9Z@INpTDrU#16p5?}!R9lHpO}ypXi}QQ{uqnKvIL_6R>5ew3&d@jmV-F$ZYvXiDaRl_l^=N!s~WfWkl?Jb(F{yd86s5{|aZfV??aTHdh@Z(uCdraLhU% z$=!ntJ?8%&BXZ#;dBh!k%gUpz)QxBK}#e8VxejOE*Q8k8R+0)=&U z9U}&d?04)Ku|nkM3&;FVb?eeVY!;)PD;tPZv48CP1|nQ&Bf5b|6nnacHV_>|&-h47 z8TTs9qz0lyyp_&wAZlNB=eorWM4s@Uw;G5n!M?MB*eQCn!wtkVVV$!LM5B=F;^V|J zVfS9gi7J8o{%!ViGE^KIpa7nSlH{i<3yzJ z@K=r#DZ+y9949EU#LnY{a}%7;H%=ZW5=GAJa)QVc@qXbdlLVw%VR z*L_c9h>U&v_r4bjZR-;Ed{0pH4vF6rd17?>nDvyHiO>F?=r7n`{hlZhvzrgTCz1qm z;CmugjN%%;CvruuJM%peAf5_7MP!K8!hWZS2r;L=*=p%H%Jn zh@K*^c0Wyoh;u~-oF=lx`0#J1i6{~8_n#)tiBZbKrwNE$_xx$%plD%%RpzW)uF}&) zqo`-cX<~%1`^nQpmhhiWO~i8H^EWgRgG66&OA|4wb%(9>yQ7KdEOK396HzQY;fW@q zQDm*$CgOyU{naKSQ>>hjz?;V1MZc|MwTGejtX3oLTk* z5hvau9{hpW(Apkr{xx#KL&y^Q{Z9Ts)Cr$&cZTRH#!;7^A#M~A*ZT}{RP?zwogtb< zpK{w7B2q|k&l%t8C~Y}&{28J|?7@5X3^7c|_3|12v)9&~A<9I2?K(rW6KgVu&JgwD zyU25Ah+vU3yPqY(g@+F~OY9N;9BY*^?jCLAS>hhicTYS^#EY@kjI%_!SPgsWEKwl( z!Q!*lSBGw2-FTMhC}L;lSt3uYRUSEO^-b=PUZce>W#8ZuM2}Vw5k3935i6LU- zu%?;VE&AmTnu!ci=5RByPsH-~&Hmrx^GBki$bP^7(f^dE+kW&v-*4=XM6>AeC;jL@ z-Hov&+98oR$g6q!tpE7sLIbxKE z(|?>J3PmPKI>(liY}#thI7dVX4_|c7|16ZZ&JnAHXKp!1?D?;|ci4N5h!(Nac#gPM z#QQJjh*~j24F8FEM2zBY`iTe?{(RR@{=0A=`pN&x&5WOjSm9&2KM_5|cE#?wen}8O0@9XpZ)ht{_rzVCQcr>@&ZvHMuRt9AR0v`8FGQRN$6+9 z1^?bN?E>+jh>PqCM51{AzTyIrEc(HBF8E9O$p!zl!LKh6Lt3?J{Z3sVCWv|hej&~a zuZ#SJ*eFJW1AifcL=@ch3sEIzi1EJ=14W!Z@(Zy|o zJD2}L%oO_B_X{yZ#C!cO#0W79IQ@$+`?c*Cwf5}YE=HbRV2~%qW50(%jfk(m!1zV? za2N~}a;3naOxS%c4EBo{d<_P}MBdl{gUuoezJ$SU!Tz1qLXpQVYG+W^-5rB{+8N}D z6}&<1jD7!?GiSV~o$))PBdMLiG~pX*?F{k-`}B6k@5IrC?FMLxUW# zwv#}EG|{JI&>&yboI`_Zk!e@bV4s-hZlyKDb)W9FpQh#Pqqh8Wng-K_4%-`p6(X9t z8iVD+=cA1A+mSfT7-atB?io{zL4okG=Z!(G*mt_z7=#Ms9b-@;GTRPgkRjHrs*OQu ztFIm(Ni7(kr55Efw2Pp}UNFxW4~kV69u?i3j* zF~Fd|c_a7y&}#{&$8iB+Qu z0S1FbJzd%xWKMAVd{}#f$wIDvRv9tU`*VBax4!y7dxIfDt10aba)s>AwKtd`vftA7 z2Bo4stJ)jni743F-k?Ny!h!Y%>0-Rv)ZQRRJk_y-@%tvCM+f8gwa(QY3_6HN`CA8r zJ4K`n?_f|Sdf4O+1{vafoAeF_#loNGbuj25o?70)AW)1_-s@lxAuPD7gF&vCFCXq; zut#Kxju#mW61{NPMFz#PM$!CGO9`!6=A5I*+5iw(j% zxO>l87aJ@PzOm$DgLu)xl@}Y-iAdRDwMS&p{TCa=iE-4=7n_zdw0&A_Ip-h1fY#pA z`UQ717$TzS`i=(u#adHzM}v8y%-tQ0-z^NIIvPZYHb2_Y;DU(CjE)AiqJ=MaG$;|d z|B?jw6 z&TP2EV7Nd6gA5Xdk6j&PP$wk4Imn<;jF#^VGPqT=a72(nXAwJ(1R2CsyT<_OK?XMo z_S_(Y3K6GkgAC4y47oMP_^mm79%K+IdYRKf1~S{QlkuBDcefDX^H+8SVBA zNP1f*gIe*XCZUr-jfmXTP6i`HFZ^UDgKE*^&+lZgL1^r)P6nAGkGgrPeNyd zaM9+}&Ia*9^Rqh}#ELSDIvc+;dET@Tv94a)*gJ$)~=GNgM~@ZT>r$P<}=JfQk;iU#Kg6pkI4T8lR!_O}@ zSSGSo{iVk5+uI*6HOLh2VS|DVGDMHxC)oIX&lqJPVvXpIV1sbcSKc3N&1KwY>5LCH zNEV}}slf&}icvvMutA`R?q$ISLBfJ-gAFRgYEOBvL7Di<_={kJp+fc}!3G6_{cNzo zK9Qe;x){`nRfs=!@gJoO>0fN*9A_VV!wh3=##hvWr2Ph{{b}4AR96 z`qM53VZx@zyBN$8GrOO<7{7h6y}J6(Sbx{mAhy-(eD~x5G2-0aJG&Z`iWVkyHOLh` zQCe4n8%3U<+tr|-@RrxR8VnX0yR56hV$oNA(bZsz7>j<_)wG=K(H8Hfn?a)RjV|2` z7K^?zqMJdG(BaM93>w5!fA3~+TSaxc!Sq%n z!8(#YA)!T@wsq_iAqM9~eh%#JKYH)g-C(U4uSRt@EjK!~y>E)Ko)T|`?&)s)ZnAi& zyFnje<;hkVaSlvocS|$w@oHXogY#nbps2e+?^e02-}~K-bws_(SF5`l91*z=J$xhc zHh=EY!yr%OvB(|Zk+tsaVbD+HmQg(n%7hN5^)Sd5$jdzp%EeiW>w6en zD@O0-Jq#K|ynoxn;2sf8XL}d~hz!~BGJ_Su>#n}cAW^Ih-gud5xvisly*ToGz;Sd2Gr4mAiD_siTFYA{svR-;1wWq&Tz_?=ews#Qj;I&KOzm>{xfWvD^C z7)RBH8Wf7$ax&B)ONG=+MXP49qF8vjFW0sC{1)pe(ZWNQ8;lU`IeWRmcoAPgJx$Arnr;4b zbx(s#5plQlG?*!(`=31x8pTX=R8NB#v5J-6(*WYssTn;DYDDBN>S<6RJYii=gY$yD zvZwJoxA|aCgLv`O$({z)LiVm#7^Dat-h73@aFMb9afLyY7-NsP!eE2wWiqcY7%aSQ z;S~lsV**^G(^Xd(Gz)L};0lAX(e72XT~`%~u$|`;vmg44QKOH zx4jL939j3F8*CI=^nu<61!DKwb5_m5pWo_jTF%FAi_`Mn#_v|p1HBE_iP_EZ-Udkm zIoI1DQ0TDxl?M5jy8GqdUTIJy*zdg3;6X7)df-ZfTScTyxY8g^)SPpr!4T0~ExFR* zHZfvcd8NU%!h1JgX)sp!Pvw;cVIsb2t~96?UU%k7gPx*)?-Xv3CHm!vaN~DE{@=n4 zAjbTO;Rdrrd&Y+wzk3yDh8vWLNGY@s@!sm)aO3wqenq&!a-p%K;ReBC&&j!PgA!q{ zo>v*x!#7=JFiVUaKE2A| z5itTeq1Ze3F~|^aPeS_`u^Xy>1O3?hVYB=j*DAv`Lhk3sl< z+;3g8`xw-Cnh{P5sBi)wB>ya@UwgMX=5LQc%hA|J_hx|Iw!0$;*^YE`WU}k zdpcijkRp1JE3ft+Z~XacgO#G!`}frb(XBZl!TJnx)EKlE=h%}T3gz@|GWqyS3y>Qz|W=({_wIbd>h%neDqViL#X3@e!5eB!4 zm8H`W{%=OwUt|1Egbu&Pf6XEK8iQL!{)xNBph)=PBi9&|3*^ab3~m(pXZ|$?4IGa;?Ewks&YcYmg#lTcLdo z=7@+J(AQwR@cBFY8svyLP3~)uD^_kN_BFUo==rI>2K|Kv=k+yyH+8;Yl@a5gjeU*Z zzNT$`4U)u;#LxN~q>1(%wc0HF@Rz;@BgEV)DAJ&`HAh*$t0N5{)+KI=G{_ZNy)Dup zRrpw9q`?r;FHep%SlQ}P*6GS=BgdmyoIR2iX^=0hQxItoD3Fbj28p64`Z&^{QndN& zNQ2B~cNYE0k|NnX$_={C_}y3?ew{(O;2LBhV$bdU*BO)x51(+IL4eqsnt7eUR?(;A zT<42i>-$@_Yf-EEt#p@Z`Pc0VsZ+=Wh4i@I#nn>Jjc(*u*oU~wv^Z3;P|kf0m=*?;3ke#NFk++|v9Iz=G`3fZcVT7_ItNW^db zTR2!DqZBe-Aq5KArjTO_=^EwF9;J}`6*5U7OBM2-LTVIp%8mSrEkb|i-@-pCWQ;=Q zDrAj9b}8hzLN2+(|+tWrp&LXIk= zYkzsCRmd?n@+ykP3wyQAof5fA&5K ziB-s0h0Ih)p+dGRq(LEF{^;MHfeIO^kS7(gLLnb2nF?91kTQiFRLFUS^c?7FVGDbVLJ}1+O(Dw^ zQl^l@3JLg=Kl^nGxkn+7D`cTUHY?dzkKMt;T0_qofoSaOm= zURB5rg`8AKr@{X1xj`X+SI9#Oc}^j#6!M8ejwz(m-~8M2TZP=MkjV;pSs~jLQm2qh zZue)uULmmx8LNz~kDOAV~g`81HufO}Z=T8b5rI4o-^0GocQph(7>2Rlu{a38q&t0a)%6BQ` zafQ69kPj8|wL;q6@tB@fInWT^<3fZWT zLkht^{Mmae%klVJl#@vVX`jA_y5HY`#BiIl_T0hmj?`D}*G+Ihk2m zRVTCVt+(rW6VbO$o;>H|$?uaVPZCJbhFEI(TiZC;yZ=)H`8fjl=LGV(@Al>SG6MNZ z0{H-e{CNWTn*{P}1oFEC^4T{;9s>Cq0{KP)`AY=yGX(N60{M*h_ql%wfxMqU9th-z z2;{#Zkl$!SEVcZpU)h)E3kl?!K)#MZetXApe9wKJ%;k@_Z?Qd=-IwkU&06 zARi@=Unh`H`RYFRFCvhq1hONL4-v>m2;`Rt{w?$PW<6M+xND+7L@E|K6}K&mSd_KS>}TB#`eXkdF|^FA~Vd2;?)O zzC3?|K;BOv4+QcT2;?IK@~Z^$F9_rdcwe5k2&5*E?;?;NCy-wtkpGuJK4;bE{v`zR zRc(l+mcOZugMIlwCXk;Ykl!JY&tCWC`C?$cG5zCkW)12;}1g@`vGpRQyj_ zZoim7zLG$`op(XoIu_okS&3HKY@INKz^kSvDEVKdC`~W^9bZA zfjkh%hY94z3FPMq=CK5-tej9Rk@B$afRSj}pkw6UfI1>CXj!v?#uIU6Ue_yAkW(nOH24*8wXp$_YufX z63G8UAphpJFQH2yK7nKe@*M>7V+8WE1oB%1@`rXr9s+qrAUgv2FoFCn0{K4)jZR`SgcA z_frD-lLYb}fqXZC{8t3>^91s{1oB5e(3j^CfourmTL|Q@63G8VAfNKVKCjOwkaq~= z+X>_^6Ua}sA(oc#n{6C1@_%h#o<{@{6390Y$PW<6M+xNb6Ue{xb$#xiM<9;~BqWe; zCXl~GAU{nY|A;_7?d$vU%n9Ue0{MCZ`5^-NNdo!D1o9dGUZ49ZfjlFS7j1~8-oLYr zgZ2Jj5Xi3*$iMuj`ttm70(pZ#IDvcs`J!*>%i|G9NFd)%Ab*)aeu_YTqYbgt@~3`lU!E@{kZS_@Is*9t0{JL` z{4#<369W0nf4?u!mlDWV5y%G#vR7i0(nXxI|BI-fqaBOeu+Rn zP9UHAAN1weF;Ca4Y9~`-o`iMa{CxuXr)`LZ`ycra`{h~?$Tfka1oF)U^8Ezz z*V+(^Jb$l^gWC9q1oE%^M}3*UkU+kSK;9;hoIt*{4Y5f0pSN*P!k;FP-yx7M_|Cq} zuM-y)FT|DnFj zpF<#L1oB23Vrk)N8wXqXcM!-=5Xk>VAfNi@`VxKtfxM4EzJ@@)oK>iki{I3M^ zd%lOrLm;mc$c8}v41xUD1oEo{@=pom^S`$*&m#h11oEu}@*@QDw+ZA|2;_GNh)N{NBINm+-R*WJ(~H1hOKKuO*NV5y+3VA(p=L zGi@B~JHJIBfAIVIrTBaT`4R$oMj$1Dd>4WI6$1I&1oCSH@-YJWLm%$T{Kp97%i0i& ze!jAegZlYe0{I>S`Ktu-lLYb`1oD3q$Uh^HfAuf6%k^1*5n_{U>paPWh}HbQK6xd4 zSnuNu14o8=n&#QbE9-2_B7VDFCvkRn!mjv^m-Vy!nkTDQCnxN+ZIQ%bQ1fT`9nZY` zSKYG{_9QKMS>;(!^JTtX^XO^zyyE4n-K5JP<&hs3{BaWVtcFy^f~w+W%~sniJYnqS z#yRc4JZHg}f8{-U_AYz<`Q_thPo7>frZb+rvaeir>asXn>7Nx|?c-^Lv)eu%wkk1p|WT<$!E%n!iCz{x{;yP&`XK5-3u&Rzw z*>M)v@W59d-pSuk^oa&|XB%E}p^-M&td3XUoiHXVGt0xgcxdUOSLaeGJ!qqy9=uUg z4-We3ff~j2;i$nLP^hv8R66a0rE+^}EM*yM0h*_x?rbhbJt_ z*Kx+``T;dR%L|?r^@Bz0SZ5An6|Y5nU;iSEV;l0C*F~AHvmoX0ly&Qa-P}x*e4TG= zTVBBevst}d?YMV8l_GT*ZrWQhV3G~2(Rs98XPEW8g`u`M~<#bvz>66jF#0W}Xny0E$}??n2|RD4+r zd$XLgFb$F<4_}BZmyQcP23k1KbtYkwSDb}){ow7e9tJV&oO;<@!6weCI!KbBj`NI_ zd0q=9j;qQA!t7u)gwmcWXtYgJY&dR%xQg$$1&cElZsH`mh0@59y*fv^m$R_s^|s73 z8K~vT*WWy=%ZC^Kg?%i%xjDWWO7<+c&C42u2uqHtRszixz~7|Gy4t*TDE>JWMx4>Z$KCJ6a$%AMPC4)K56TEebGpXXVNO)Cm zZ#{n}+qX_XgSI7Q(9i{RuQJHioFrv??*%r*nP6S@M43WO)iPgO#wNj5U!4*;ZcsgB zA=Z1%y_5=$>PdUt!=1k)BG2TwA(YdWNv9ko)LBQ1Z9*#LC^F8p=4Beg@`VW{3X$6c zO*lsppGLe6!j0$4fl61ZPC1Iuq7f3Mdt>?ZeUFxmJ?YicSsK6;hRu-0k!NeI%NeX| z!nE)&cGnYFQr%q6V1%ucs@(_`%yDoCmiqB`{_E-Wgk4XVhplg(wVPj)X(~p*U{&*y zt@83tHU@<-EqR*nxM(+8fCfCE8Aak8`kL$cuctl~#1m3=%L6DKjBawVtu~?;HB{%T zIEz@FR9+0Y#stqf6@^aXs%G*10HS3TtI0YJ3^7%_hLxu0FRFN51mPX8ZT07zhd~zd zB)CmD+Xr#&?|kQsEgxOI;jt%|&%8Ihs~0Cwq4!ZKS2-Zy(m9WEwodZfAYoCRmlZb5 zcJ1M{A+d#NpJn4ivDg@LZ(I8we= zzadEO1m{qOie?*Fs_laZ4^?g^+QP>&<1kRx6S1DTSu_C8IYV4r2i@X2ueD!<(LmG{ zEcetd5@)YQhtNoSX;ZdJ^N61`To`-ZcbtNk_?{H6aQwh)j`*&ZwrHoZDo%J- zYm`^OD)I%;ZKf;H_evJ#S(PVT3L&Sj1L;fWO!ASrH4EsJvT)}`P*!3^*@Cv`-Y#N| z{jCQS3oePcK#EaZ-FY!iTTAB*mZMQzvVC6O@zOtM?6oIX{xphVh{O(j2+3BPjk1~@ z&?;K>_v!??7kY68uMaTTRO78iXI1L<}muT7K${p^_XN(n}jFJL#%-X;h`RGSR~ zp$aKloUT%IHUqpZN;la~uPIzNgM#0jM{&7|ELAsp>_baP6qiA0|>ixRL6<)wcS%H_i}NuhHV^DA91y61g3D|wig5syHKOJ@RedYVVugfGf% z#zI(YsxH}2#D%C#JdKj1Jqpf&5iGIed(Yn^@do6a<2wEJ0XT^bdJp3q*D#*%IB!0= zyngoR^0CKQcOik)lyU7w6Cab+UY(lWG$^2#cs`V{SB}#nFSZHnKqFpMW|TTFs=Tb( zF0SHQpa}CqqmG$Gk(zAaXP_my1=Uc!0mWuxN;sxi#=3G&OJ4DEhpX#QEy5dt+zFmS z=zSprs|ai>K{s;Cbu9KVLOSO?hEf|#XC7y)mj>!^KoID5ur?M;%N9VaU$Z>Z>s!EU z7W-n;4>^$5*|vzFZeep#mzA&`>K%NPB$a)2q_!z_&Q_Vf13NX?NMG~bW|z;GOZ;*s z@Ol08@rCzH0M0P|(OceY%zxsGO}gW5v%4(cXAD-PfCs~r++{T6?dn`Qr>}W$KY8rI zk<9B)zM{qY%6seSGs(pP)&k%FigSj0+d7gvGP#jjIun4w5~&tet7%ljc6Q3|Yv?Dk z8T6rc`9|15*^T1}Zo--iaw<*^b{7_u;fBMo;9a$rqYct&5Vdi-6s8eRc+FcheCM=T zQ;N+LSQTX1j=;BOsM391^7LRiGb z_+Z1gOLnuIuQm(^;GMQD?8oPNHogcL}7ic6;J5s!dMazs{mrm7iAu@lGi0=jo^LJ>w>LwO> z72mfKQJw;g=!UG_)L!1p8JbqJU2yGPT}!jR1T{x|4M6VQ&*0F$4(d2WwZuUZe?T1e z!r^4ZtGe8Vc=$VsV`%}$%(*1X=w8P9h7J(vSyJS|0QW_+QSQ9YL^C3&Z(m6$oBFhWt4pn2sSf1lH0;w2~ z2846Y`F#PK*oxP6oUKt`%W28ic~ScpdtW*tIIfgbj9h+*OOWL(j_z4dVozAkMU@6< z#$3)z=p!=Ckl!wp33&!5p}d6QSnt!=&EROH5MLWcv<%c}hv#LPdC$Oq6QGqaUs^4M=QeSpzqqdUZMuwc?7)E3mghI_yjN3P`npg5z`Lg?B-N*_V zMFE1EC2=Np?9OQi=81ld>0orlEl>~R6!&tlqJxc-tpP5bNm(asn}OBTch2Q16r7-7 zZuXrS^S1|!J7pgv(yL<8=q~l=?D5mfXWmylGgTWF^=NE72L@yN z1Gu;q!oIt799Tka;m~e{&2BlbHykAZ@{J>fa~fw=9C0Q*Nj)tYN^u09O=Q#6