From fb0f29946bd2927f41c752e10fe31e8c79b1b1c3 Mon Sep 17 00:00:00 2001 From: Kyle Kyrazis Date: Thu, 27 Oct 2022 18:47:39 +0000 Subject: [PATCH 1/5] Initial Functionality for Onload + xnic --- .clang-format | 23 + .gitignore | 2 + .vscode/settings.json | 5 + mk/before.mk | 2 +- mk/linux_gcc.mk | 8 +- mk/platform/gnu_x86_64.mk | 2 +- scripts/onload_profiles/swxtch.opf | 7 + scripts/swxtch_init.sh | 5 + src/include/ci/efhw/device.h | 21 +- src/include/etherfabric/ef_vi.h | 764 +++--- src/lib/ciul/ef_vi_internal.h | 185 +- src/lib/ciul/efswxtch_vi.c | 447 ++++ src/lib/ciul/efxdp_vi.c | 209 +- src/lib/ciul/mmake.mk | 5 + src/lib/ciul/vi_init.c | 239 +- src/lib/efthrm/tcp_helper_resource.c | 2885 ++++++++++------------ src/lib/transport/ip/ip_internal.h | 561 ++--- src/lib/transport/ip/netif.c | 781 +++--- src/lib/transport/ip/netif_event.c | 1093 ++++---- src/lib/transport/ip/netif_init.c | 1623 ++++++------ src/lib/transport/ip/netif_tx.c | 180 +- src/lib/transport/ip/tcp_close.c | 414 ++-- src/lib/transport/ip/tcp_connect.c | 954 ++++--- src/lib/transport/ip/tcp_recv.c | 1144 +++++---- src/lib/transport/ip/udp_recv.c | 795 +++--- src/lib/transport/unix/dpdk.c | 33 + src/lib/transport/unix/internal.h | 744 +++--- src/lib/transport/unix/mmake.mk | 8 +- src/lib/transport/unix/netif_init.c | 100 +- src/lib/transport/unix/tcp_fd.c | 1257 +++++----- src/lib/transport/unix/zc_intercept.c | 165 +- src/tests/ef_vi/mmake.mk | 3 + src/tests/rtt/mmake.mk | 3 + src/tests/trade_sim/mmake.mk | 3 + src/tests/unit/mmake.mk | 3 + src/tools/ip/mmake.mk | 3 + src/tools/onload_remote_monitor/mmake.mk | 3 + test_programs/mock_xnic/Makefile | 21 + test_programs/mock_xnic/README.md | 14 + test_programs/mock_xnic/main.c | 432 ++++ test_programs/mock_xnic/mp_commands.c | 101 + test_programs/mock_xnic/mp_commands.h | 14 + test_programs/tcp_receiver.py | 20 + test_programs/tcp_sender.py | 18 + test_programs/udp_receiver.py | 11 + test_programs/udp_sender.py | 15 + 46 files changed, 8192 insertions(+), 7133 deletions(-) create mode 100644 .clang-format create mode 100644 .vscode/settings.json create mode 100644 scripts/onload_profiles/swxtch.opf create mode 100755 scripts/swxtch_init.sh create mode 100644 src/lib/ciul/efswxtch_vi.c create mode 100644 src/lib/transport/unix/dpdk.c create mode 100644 test_programs/mock_xnic/Makefile create mode 100644 test_programs/mock_xnic/README.md create mode 100644 test_programs/mock_xnic/main.c create mode 100644 test_programs/mock_xnic/mp_commands.c create mode 100644 test_programs/mock_xnic/mp_commands.h create mode 100644 test_programs/tcp_receiver.py create mode 100644 test_programs/tcp_sender.py create mode 100644 test_programs/udp_receiver.py create mode 100644 test_programs/udp_sender.py diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..59cd09a23 --- /dev/null +++ b/.clang-format @@ -0,0 +1,23 @@ +--- +BasedOnStyle: Google +IndentWidth: 2 +ColumnLimit: 79 +AlignAfterOpenBracket: DontAlign +SpacesInConditionalStatement: true +SortIncludes: false +BreakBeforeBraces: Linux +SpaceBeforeCpp11BracedList: true +SpaceBeforeParens: Never +SpaceAfterCStyleCast: true +AllowShortBlocksOnASingleLine: Empty +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +SpacesInContainerLiterals: true +Cpp11BracedListStyle: false +MaxEmptyLinesToKeep: 2 +AlignConsecutiveMacros: AcrossEmptyLinesAndComments +AlignConsecutiveBitFields: AcrossEmptyLinesAndComments +AlignTrailingComments: true +SpacesBeforeTrailingComments: 5 +SpaceAfterLogicalNot: true diff --git a/.gitignore b/.gitignore index 1aa7cf694..64735be2d 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,5 @@ Thumbs.db /src/lib/zf/doxygen/html.zip /src/lib/zf/doxygen/latex /src/lib/zf/doxygen/rtf + +/test_programs/mock_xnic/xnic_data diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..fd76620f3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "ip_internal.h": "c" + } +} diff --git a/mk/before.mk b/mk/before.mk index c419be348..a5b3d20f8 100644 --- a/mk/before.mk +++ b/mk/before.mk @@ -44,7 +44,7 @@ export cxxflags # Include directories. # MMAKE_INCLUDE_DIR := $(TOPPATH)/src/include -MMAKE_INCLUDE := -I. -I$(BUILD)/include -I$(MMAKE_INCLUDE_DIR) +MMAKE_INCLUDE := -I. -I$(BUILD)/include -I$(MMAKE_INCLUDE_DIR) -I/usr/local/include diff --git a/mk/linux_gcc.mk b/mk/linux_gcc.mk index 45e09d0eb..7672d4e35 100644 --- a/mk/linux_gcc.mk +++ b/mk/linux_gcc.mk @@ -94,8 +94,8 @@ cwarnings += -Wno-deprecated-declarations endif -MMAKE_CFLAGS += $(MMAKE_CARCH) $(cwarnings) -MMAKE_CXXFLAGS += $(MMAKE_CARCH) $(cxxwarnings) +MMAKE_CFLAGS += $(MMAKE_CARCH) $(cwarnings) -msse3 +MMAKE_CXXFLAGS += $(MMAKE_CARCH) $(cxxwarnings) -msse3 MMAKE_CPPFLAGS := MMAKE_CFLAGS_DLL := -fPIC @@ -194,8 +194,8 @@ endef define MMakeLinkCApp set -x; \ -$(CLINK) $(MMAKE_CARCH) $(CFLAGS) -Wl,-E $(MMAKE_DIR_LINKFLAGS) $(filter %.o,$^) \ - $$libs -lm -lpthread -lrt -lresolv -lanl -o $@ +$(CLINK) $(MMAKE_CARCH) $(CFLAGS) $(MMAKE_DPDK) -Wl,-E $(MMAKE_DIR_LINKFLAGS) $(filter %.o,$^) \ + $$libs -lm -lpthread -lrt -lresolv -lanl $(MMAKE_DPDK_LIBS) -o $@ endef diff --git a/mk/platform/gnu_x86_64.mk b/mk/platform/gnu_x86_64.mk index 7f9272b74..6ff17a0d1 100644 --- a/mk/platform/gnu_x86_64.mk +++ b/mk/platform/gnu_x86_64.mk @@ -2,7 +2,7 @@ # X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. GNU := 1 MMAKE_CARCH ?= -mtune=native -MMAKE_CARCH := -m64 $(MMAKE_CTUNE) +MMAKE_CARCH := -march=native -m64 $(MMAKE_CTUNE) MMAKE_RELOCATABLE_LIB := -z combreloc diff --git a/scripts/onload_profiles/swxtch.opf b/scripts/onload_profiles/swxtch.opf new file mode 100644 index 000000000..7a7ea1d78 --- /dev/null +++ b/scripts/onload_profiles/swxtch.opf @@ -0,0 +1,7 @@ +onload_set EF_SPIN_USEC 10000000000 +onload_set EF_TCP_CONNECT_SPIN 1 +onload_set EF_TCP_ACCEPT_SPIN 1 +onload_set EF_TCP_RECV_SPIN 1 +onload_set EF_TCP_SEND_SPIN 1 +onload_set EF_UDP_RECV_SPIN 1 +onload_set EF_UDP_SEND_SPIN 1 diff --git a/scripts/swxtch_init.sh b/scripts/swxtch_init.sh new file mode 100755 index 000000000..b0ba41bc3 --- /dev/null +++ b/scripts/swxtch_init.sh @@ -0,0 +1,5 @@ +#! /bin/bash + +sudo ethtool -K eth1 lro off +sudo ~/onload/build/x86_64_linux-$(uname -r)/driver/linux/load.sh onload +echo eth1 | sudo tee /sys/module/sfc_resource/afxdp/register diff --git a/src/include/ci/efhw/device.h b/src/include/ci/efhw/device.h index 5b197f2b0..1e19e2c72 100644 --- a/src/include/ci/efhw/device.h +++ b/src/include/ci/efhw/device.h @@ -5,10 +5,11 @@ /* NB: this enum must be aligned with enum ef_vi_arch */ enum efhw_arch { - EFHW_ARCH_EF10 = 1, - EFHW_ARCH_EF100, - EFHW_ARCH_EFCT, - EFHW_ARCH_AF_XDP, + EFHW_ARCH_EF10 = 1, + EFHW_ARCH_EF100, + EFHW_ARCH_EFCT, + EFHW_ARCH_AF_XDP, + EFHW_ARCH_SWXTCH, }; /*---------------------------------------------------------------------------- @@ -18,15 +19,15 @@ enum efhw_arch { *---------------------------------------------------------------------------*/ enum efhw_function { - EFHW_FUNCTION_PF, - EFHW_FUNCTION_VF, + EFHW_FUNCTION_PF, + EFHW_FUNCTION_VF, }; struct efhw_device_type { - int arch; /* enum efhw_arch */ - char variant; /* 'A', 'B', ... */ - int revision; /* 0, 1, ... */ - int function; /* enum efhw_function */ + int arch; /* enum efhw_arch */ + char variant; /* 'A', 'B', ... */ + int revision; /* 0, 1, ... */ + int function; /* enum efhw_function */ }; #endif diff --git a/src/include/etherfabric/ef_vi.h b/src/include/etherfabric/ef_vi.h index 600940080..4560295cb 100644 --- a/src/include/etherfabric/ef_vi.h +++ b/src/include/etherfabric/ef_vi.h @@ -2,7 +2,7 @@ /* X-SPDX-Copyright-Text: (c) Copyright 2007-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** \author Solarflare Communications, Inc. ** \brief Virtual Interface definitions for EtherFabric Virtual ** Interface HAL. @@ -25,44 +25,44 @@ * for compilers/platforms that don't provide them */ #if defined(__GNUC__) -# ifdef __KERNEL__ -# include -# include -# include -# include -# else -# include -# ifndef __STDC_FORMAT_MACROS -# define __STDC_FORMAT_MACROS -# endif -# include -# include -# include -# include -# include -# endif -# define EF_VI_ALIGN(x) __attribute__ ((aligned (x))) -# define ef_vi_inline static inline -# define ef_vi_pure __attribute__ ((pure)) -# define ef_vi_cold __attribute__ ((cold)) +#ifdef __KERNEL__ +#include +#include +#include +#include +#else +#include +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif +#include +#include +#include +#include +#include +#endif +#define EF_VI_ALIGN(x) __attribute__((aligned(x))) +#define ef_vi_inline static inline +#define ef_vi_pure __attribute__((pure)) +#define ef_vi_cold __attribute__((cold)) /* Expect noinline to be defined in kernel */ -# if defined(__KERNEL__) && defined (noinline) -# define ef_vi_noinline noinline -# else -# define ef_vi_noinline __attribute__ ((noinline)) -# endif +#if defined(__KERNEL__) && defined(noinline) +#define ef_vi_noinline noinline +#else +#define ef_vi_noinline __attribute__((noinline)) +#endif #else -# error Unknown compiler +#error Unknown compiler #endif /*! \brief Cache line sizes for alignment purposes */ #if defined(__powerpc64__) || defined(__powerpc__) -# define EF_VI_DMA_ALIGN 128 +#define EF_VI_DMA_ALIGN 128 #else -# define EF_VI_DMA_ALIGN 64 +#define EF_VI_DMA_ALIGN 64 #endif @@ -76,23 +76,23 @@ extern "C" { /*! \brief An ef_driver_handle is needed to allocate resources. */ #ifdef __KERNEL__ -typedef struct efhw_nic* ef_driver_handle; +typedef struct efhw_nic* ef_driver_handle; #else -typedef int ef_driver_handle; +typedef int ef_driver_handle; #endif /*! \brief A pointer to an event queue */ -typedef uint32_t ef_eventq_ptr; +typedef uint32_t ef_eventq_ptr; /*! \brief An address */ -typedef uint64_t ef_addr; +typedef uint64_t ef_addr; /*! \brief An address of an I/O area for a virtual interface */ -typedef char* ef_vi_ioaddr_t; +typedef char* ef_vi_ioaddr_t; /*! \brief Reference to a non-local address space */ typedef uint64_t ef_addrspace; -#define EF_ADDRSPACE_LOCAL ((uint64_t)-1) +#define EF_ADDRSPACE_LOCAL ((uint64_t) -1) struct ef_vi; struct ef_filter_spec; @@ -103,11 +103,11 @@ struct ef_filter_cookie; **********************************************************************/ /*! \brief The maximum number of queues per virtual interface */ -#define EF_VI_MAX_QS 32 +#define EF_VI_MAX_QS 32 /*! \brief The minimum size of array to pass when polling the event queue */ -#define EF_VI_EVENT_POLL_MIN_EVS 2 +#define EF_VI_EVENT_POLL_MIN_EVS 2 /*! \brief The maximum number of efct receive queues per virtual interface */ -#define EF_VI_MAX_EFCT_RXQS 8 +#define EF_VI_MAX_EFCT_RXQS 8 /********************************************************************** @@ -121,11 +121,11 @@ struct ef_filter_cookie; ** events. It is typically used to identify the buffer associated with ** the transfer. */ -typedef int ef_request_id; +typedef int ef_request_id; /*! \brief Mask to use with an ef_request_id. */ -#define EF_REQUEST_ID_MASK 0xffffffff +#define EF_REQUEST_ID_MASK 0xffffffff /*! \brief A token that identifies something that has happened. @@ -138,131 +138,131 @@ typedef int ef_request_id; typedef union { /** A generic event, to query the type when it is unknown */ struct { - unsigned type :16; + unsigned type : 16; } generic; /** An event of type EF_EVENT_TYPE_RX */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned rq_id :32; - unsigned len :16; - unsigned flags :16; - unsigned ofs :16; /* AF_XDP specific */ + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned rq_id : 32; + unsigned len : 16; + unsigned flags : 16; + unsigned ofs : 16; /* AF_XDP specific */ } rx; /** An event of type EF_EVENT_TYPE_RX_DISCARD */ - struct { /* This *must* have same initial layout as [rx]. */ - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned rq_id :32; - unsigned len :16; - unsigned flags :16; - unsigned subtype :16; + struct { /* This *must* have same initial layout as [rx]. */ + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned rq_id : 32; + unsigned len : 16; + unsigned flags : 16; + unsigned subtype : 16; } rx_discard; /** An event of type EF_EVENT_TYPE_TX */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned flags :8; - unsigned desc_id :16; + unsigned type : 16; + unsigned q_id : 8; + unsigned flags : 8; + unsigned desc_id : 16; } tx; /** An event of type EF_EVENT_TYPE_TX_ERROR */ - struct { /* This *must* have same layout as [tx]. */ - unsigned type :16; - unsigned q_id :8; - unsigned flags :8; - unsigned desc_id :16; - unsigned subtype :16; + struct { /* This *must* have same layout as [tx]. */ + unsigned type : 16; + unsigned q_id : 8; + unsigned flags : 8; + unsigned desc_id : 16; + unsigned subtype : 16; } tx_error; /** An event of type EF_EVENT_TYPE_TX_WITH_TIMESTAMP */ - struct { /* This *must* have same layout as [tx] up to [flags]. */ - unsigned type :16; - unsigned q_id :8; - unsigned flags :8; - unsigned rq_id :32; - unsigned ts_sec :32; - unsigned ts_nsec :32; + struct { /* This *must* have same layout as [tx] up to [flags]. */ + unsigned type : 16; + unsigned q_id : 8; + unsigned flags : 8; + unsigned rq_id : 32; + unsigned ts_sec : 32; + unsigned ts_nsec : 32; } tx_timestamp; /** An event of type EF_EVENT_TYPE_TX_ALT */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned alt_id :16; + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned alt_id : 16; } tx_alt; /** An event of type EF_EVENT_TYPE_RX_NO_DESC_TRUNC */ struct { - unsigned type :16; - unsigned q_id :8; + unsigned type : 16; + unsigned q_id : 8; } rx_no_desc_trunc; /** An event of type EF_EVENT_TYPE_RX_PACKED_STREAM */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned flags :16; - unsigned n_pkts :16; - unsigned ps_flags :8; + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned flags : 16; + unsigned n_pkts : 16; + unsigned ps_flags : 8; } rx_packed_stream; /** An event of type EF_EVENT_TYPE_SW */ struct { - unsigned type :16; - unsigned data; + unsigned type : 16; + unsigned data; } sw; /** An event of type EF_EVENT_TYPE_RX_MULTI */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned n_descs :16; - unsigned flags :16; + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned n_descs : 16; + unsigned flags : 16; } rx_multi; /** An event of type EF_EVENT_TYPE_RX_MULTI_DISCARD */ - struct { /* Common layout with rx_multi. */ - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned n_descs :16; - unsigned flags :16; - unsigned subtype :16; + struct { /* Common layout with rx_multi. */ + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned n_descs : 16; + unsigned flags : 16; + unsigned subtype : 16; } rx_multi_discard; /** An event of type EF_EVENT_TYPE_RX_MULTI_PKTS */ struct { - unsigned type :16; - unsigned q_id :8; - unsigned __reserved :8; - unsigned n_pkts :16; - unsigned flags :16; + unsigned type : 16; + unsigned q_id : 8; + unsigned __reserved : 8; + unsigned n_pkts : 16; + unsigned flags : 16; } rx_multi_pkts; /** An event of type EF_EVENT_TYPE_MEMCPY */ struct { - unsigned type :16; - unsigned __reserved :16; - unsigned dma_id :32; + unsigned type : 16; + unsigned __reserved : 16; + unsigned dma_id : 32; } memcpy; /** An event of type EF_EVENT_TYPE_RX_REF */ struct { - unsigned type :16; - unsigned len :16; - unsigned pkt_id :32; - unsigned q_id :8; - unsigned user :24; + unsigned type : 16; + unsigned len : 16; + unsigned pkt_id : 32; + unsigned q_id : 8; + unsigned user : 24; } rx_ref; /** An event of type EF_EVENT_TYPE_RX_REF_DISCARD */ struct { - unsigned type :16; - unsigned len :16; - unsigned pkt_id :32; - unsigned q_id :8; - unsigned user :24; - unsigned flags :16; + unsigned type : 16; + unsigned len : 16; + unsigned pkt_id : 32; + unsigned q_id : 8; + unsigned user : 24; + unsigned flags : 16; } rx_ref_discard; } ef_event; /*! \brief Type of event in an ef_event e */ -#define EF_EVENT_TYPE(e) ((e).generic.type) +#define EF_EVENT_TYPE(e) ((e).generic.type) /*! \brief Possible types of events */ @@ -307,69 +307,67 @@ enum { /* Macros to look up various information per event */ /*! \brief Get the number of bytes received */ -#define EF_EVENT_RX_BYTES(e) ((e).rx.len) +#define EF_EVENT_RX_BYTES(e) ((e).rx.len) /*! \brief Get the RX descriptor ring ID used for a received packet. */ -#define EF_EVENT_RX_Q_ID(e) ((e).rx.q_id) +#define EF_EVENT_RX_Q_ID(e) ((e).rx.q_id) /*! \brief Get the dma_id used for a received packet. */ -#define EF_EVENT_RX_RQ_ID(e) ((e).rx.rq_id) +#define EF_EVENT_RX_RQ_ID(e) ((e).rx.rq_id) /*! \brief True if the CONTinuation Of Packet flag is set for an RX event */ -#define EF_EVENT_RX_CONT(e) ((e).rx.flags & EF_EVENT_FLAG_CONT) +#define EF_EVENT_RX_CONT(e) ((e).rx.flags & EF_EVENT_FLAG_CONT) /*! \brief True if the Start Of Packet flag is set for an RX event */ -#define EF_EVENT_RX_SOP(e) ((e).rx.flags & EF_EVENT_FLAG_SOP) +#define EF_EVENT_RX_SOP(e) ((e).rx.flags & EF_EVENT_FLAG_SOP) /*! \brief True if the next buffer flag is set for a packed stream event */ -#define EF_EVENT_RX_PS_NEXT_BUFFER(e) ((e).rx_packed_stream.flags & \ - EF_EVENT_FLAG_PS_NEXT_BUFFER) +#define EF_EVENT_RX_PS_NEXT_BUFFER(e) \ + ((e).rx_packed_stream.flags & EF_EVENT_FLAG_PS_NEXT_BUFFER) /*! \brief True if the iSCSIOK flag is set for an RX event */ -#define EF_EVENT_RX_ISCSI_OKAY(e) ((e).rx.flags & EF_EVENT_FLAG_ISCSI_OK) +#define EF_EVENT_RX_ISCSI_OKAY(e) ((e).rx.flags & EF_EVENT_FLAG_ISCSI_OK) /* RX-event flags. */ /*! \brief Start Of Packet flag. */ -#define EF_EVENT_FLAG_SOP 0x1 +#define EF_EVENT_FLAG_SOP 0x1 /*! \brief CONTinuation Of Packet flag. */ -#define EF_EVENT_FLAG_CONT 0x2 +#define EF_EVENT_FLAG_CONT 0x2 /*! \brief iSCSI CRC validated OK flag. */ -#define EF_EVENT_FLAG_ISCSI_OK 0x4 +#define EF_EVENT_FLAG_ISCSI_OK 0x4 /*! \brief Multicast flag. */ -#define EF_EVENT_FLAG_MULTICAST 0x8 +#define EF_EVENT_FLAG_MULTICAST 0x8 /*! \brief Packed Stream Next Buffer flag. */ -#define EF_EVENT_FLAG_PS_NEXT_BUFFER 0x10 +#define EF_EVENT_FLAG_PS_NEXT_BUFFER 0x10 /* TX-event flags. */ /*! \brief Packets were sent successfully with CTPIO. */ -#define EF_EVENT_FLAG_CTPIO 0x1 +#define EF_EVENT_FLAG_CTPIO 0x1 /*! \brief Get the TX descriptor ring ID used for a transmitted packet. */ -#define EF_EVENT_TX_Q_ID(e) ((e).tx.q_id) +#define EF_EVENT_TX_Q_ID(e) ((e).tx.q_id) /*! \brief True if packets were sent successfully with CTPIO. */ -#define EF_EVENT_TX_CTPIO(e) ((e).tx.flags & EF_EVENT_FLAG_CTPIO) +#define EF_EVENT_TX_CTPIO(e) ((e).tx.flags & EF_EVENT_FLAG_CTPIO) /*! \brief Get the RX descriptor ring ID used for a discarded packet. */ -#define EF_EVENT_RX_DISCARD_Q_ID(e) ((e).rx_discard.q_id) +#define EF_EVENT_RX_DISCARD_Q_ID(e) ((e).rx_discard.q_id) /*! \brief Get the dma_id used for a discarded packet. */ -#define EF_EVENT_RX_DISCARD_RQ_ID(e) ((e).rx_discard.rq_id) +#define EF_EVENT_RX_DISCARD_RQ_ID(e) ((e).rx_discard.rq_id) /*! \brief True if the CONTinuation Of Packet flag is set for an RX_DISCARD ** event */ -#define EF_EVENT_RX_DISCARD_CONT(e) ((e).rx_discard.flags&EF_EVENT_FLAG_CONT) +#define EF_EVENT_RX_DISCARD_CONT(e) ((e).rx_discard.flags & EF_EVENT_FLAG_CONT) /*! \brief True if the Start Of Packet flag is set for an RX_DISCARD event */ -#define EF_EVENT_RX_DISCARD_SOP(e) ((e).rx_discard.flags&EF_EVENT_FLAG_SOP) +#define EF_EVENT_RX_DISCARD_SOP(e) ((e).rx_discard.flags & EF_EVENT_FLAG_SOP) /*! \brief Get the reason for an EF_EVENT_TYPE_RX_DISCARD event */ -#define EF_EVENT_RX_DISCARD_TYPE(e) ((e).rx_discard.subtype) +#define EF_EVENT_RX_DISCARD_TYPE(e) ((e).rx_discard.subtype) /*! \brief Get the length of a discarded packet */ -#define EF_EVENT_RX_DISCARD_BYTES(e) ((e).rx_discard.len) +#define EF_EVENT_RX_DISCARD_BYTES(e) ((e).rx_discard.len) /*! \brief Get the RX descriptor ring ID used for a received packet. */ -#define EF_EVENT_RX_MULTI_Q_ID(e) ((e).rx_multi.q_id) +#define EF_EVENT_RX_MULTI_Q_ID(e) ((e).rx_multi.q_id) /*! \brief True if the CONTinuation Of Packet flag is set for an RX HT event */ -#define EF_EVENT_RX_MULTI_CONT(e) ((e).rx_multi.flags & \ - EF_EVENT_FLAG_CONT) +#define EF_EVENT_RX_MULTI_CONT(e) ((e).rx_multi.flags & EF_EVENT_FLAG_CONT) /*! \brief True if the Start Of Packet flag is set for an RX HT event */ -#define EF_EVENT_RX_MULTI_SOP(e) ((e).rx_multi.flags & \ - EF_EVENT_FLAG_SOP) +#define EF_EVENT_RX_MULTI_SOP(e) ((e).rx_multi.flags & EF_EVENT_FLAG_SOP) /*! \brief Get the reason for an EF_EVENT_TYPE_RX_MULTI_DISCARD event */ -#define EF_EVENT_RX_MULTI_DISCARD_TYPE(e) ((e).rx_multi_discard.subtype) +#define EF_EVENT_RX_MULTI_DISCARD_TYPE(e) ((e).rx_multi_discard.subtype) /*! \brief The reason for an EF_EVENT_TYPE_RX_DISCARD event */ enum { @@ -394,26 +392,26 @@ enum { }; /*! \brief Get the TX descriptor ring ID used for a transmit error */ -#define EF_EVENT_TX_ERROR_Q_ID(e) ((e).tx_error.q_id) +#define EF_EVENT_TX_ERROR_Q_ID(e) ((e).tx_error.q_id) /*! \brief Get the reason for a TX_ERROR event */ -#define EF_EVENT_TX_ERROR_TYPE(e) ((e).tx_error.subtype) +#define EF_EVENT_TX_ERROR_TYPE(e) ((e).tx_error.subtype) /*! \brief The adapter clock has previously been set in sync with the ** system */ -#define EF_VI_SYNC_FLAG_CLOCK_SET 1 +#define EF_VI_SYNC_FLAG_CLOCK_SET 1 /*! \brief The adapter clock is in sync with the external clock (PTP) */ -#define EF_VI_SYNC_FLAG_CLOCK_IN_SYNC 2 +#define EF_VI_SYNC_FLAG_CLOCK_IN_SYNC 2 /*! \brief Get the TX descriptor ring ID used for a timestamped packet. */ -#define EF_EVENT_TX_WITH_TIMESTAMP_Q_ID(e) ((e).tx_timestamp.q_id) +#define EF_EVENT_TX_WITH_TIMESTAMP_Q_ID(e) ((e).tx_timestamp.q_id) /*! \brief Get the dma_id used for a timestamped packet. */ -#define EF_EVENT_TX_WITH_TIMESTAMP_RQ_ID(e) ((e).tx_timestamp.rq_id) +#define EF_EVENT_TX_WITH_TIMESTAMP_RQ_ID(e) ((e).tx_timestamp.rq_id) /*! \brief Get the number of seconds from the timestamp of a transmitted ** packet */ -#define EF_EVENT_TX_WITH_TIMESTAMP_SEC(e) ((e).tx_timestamp.ts_sec) +#define EF_EVENT_TX_WITH_TIMESTAMP_SEC(e) ((e).tx_timestamp.ts_sec) /*! \brief Get the number of nanoseconds from the timestamp of a transmitted ** packet */ -#define EF_EVENT_TX_WITH_TIMESTAMP_NSEC(e) ((e).tx_timestamp.ts_nsec) +#define EF_EVENT_TX_WITH_TIMESTAMP_NSEC(e) ((e).tx_timestamp.ts_nsec) /*! \brief Mask for the sync flags in the timestamp of a transmitted packet */ #define EF_EVENT_TX_WITH_TIMESTAMP_SYNC_MASK \ (EF_VI_SYNC_FLAG_CLOCK_SET | EF_VI_SYNC_FLAG_CLOCK_IN_SYNC) @@ -422,9 +420,9 @@ enum { ((e).tx_timestamp.ts_nsec & EF_EVENT_TX_WITH_TIMESTAMP_SYNC_MASK) /*! \brief Get the TX descriptor ring ID used for a TX alternative packet. */ -#define EF_EVENT_TX_ALT_Q_ID(e) ((e).tx_alt.q_id) +#define EF_EVENT_TX_ALT_Q_ID(e) ((e).tx_alt.q_id) /*! \brief Get the TX alternative ID used for a TX alternative packet. */ -#define EF_EVENT_TX_ALT_ALT_ID(e) ((e).tx_alt.alt_id) +#define EF_EVENT_TX_ALT_ALT_ID(e) ((e).tx_alt.alt_id) /*! \brief The reason for an EF_EVENT_TYPE_TX_ERROR event */ enum { @@ -441,17 +439,17 @@ enum { /*! \brief Get the RX descriptor ring ID used for a received packet that ** was truncated due to a lack of descriptors. */ -#define EF_EVENT_RX_NO_DESC_TRUNC_Q_ID(e) ((e).rx_no_desc_trunc.q_id) +#define EF_EVENT_RX_NO_DESC_TRUNC_Q_ID(e) ((e).rx_no_desc_trunc.q_id) /*! \brief Mask for the data in a software generated event */ -#define EF_EVENT_SW_DATA_MASK 0xffff +#define EF_EVENT_SW_DATA_MASK 0xffff /*! \brief Get the data for an EF_EVENT_TYPE_SW event */ -#define EF_EVENT_SW_DATA(e) ((e).sw.data) +#define EF_EVENT_SW_DATA(e) ((e).sw.data) /*! \brief Output format for an ef_event */ -#define EF_EVENT_FMT "[ev:%x]" +#define EF_EVENT_FMT "[ev:%x]" /*! \brief Get the type of an event */ -#define EF_EVENT_PRI_ARG(e) (unsigned) (e).generic.type +#define EF_EVENT_PRI_ARG(e) (unsigned) (e).generic.type /* ***************** */ @@ -462,9 +460,9 @@ enum { */ typedef struct { /** base address of the buffer */ - ef_addr iov_base EF_VI_ALIGN(8); + ef_addr iov_base EF_VI_ALIGN(8); /** length of the buffer */ - unsigned iov_len; + unsigned iov_len; } ef_iovec; #define EF_RIOV_FLAG_TRANSLATE_ADDR 0x1 @@ -475,11 +473,11 @@ typedef struct { */ typedef struct { /** base address of the buffer */ - ef_addr iov_base EF_VI_ALIGN(8); + ef_addr iov_base EF_VI_ALIGN(8); /** length of the buffer */ - unsigned iov_len; - uint32_t flags; /* EF_RIOV_FLAG_* */ - ef_addrspace addrspace; + unsigned iov_len; + uint32_t flags; /* EF_RIOV_FLAG_* */ + ef_addrspace addrspace; } ef_remote_iovec; @@ -502,84 +500,84 @@ typedef struct { /*! \brief Flags that can be requested when allocating an ef_vi */ enum ef_vi_flags { /** Default setting */ - EF_VI_FLAGS_DEFAULT = 0x0, + EF_VI_FLAGS_DEFAULT = 0x0, /** Receive iSCSI header digest enable: hardware verifies header digest ** (CRC) when packet is iSCSI */ - EF_VI_ISCSI_RX_HDIG = 0x2, + EF_VI_ISCSI_RX_HDIG = 0x2, /** Transmit iSCSI header digest enable: hardware calculates and inserts ** header digest (CRC) when packet is iSCSI */ - EF_VI_ISCSI_TX_HDIG = 0x4, + EF_VI_ISCSI_TX_HDIG = 0x4, /** Receive iSCSI data digest enable: hardware verifies data digest (CRC) ** when packet is iSCSI */ - EF_VI_ISCSI_RX_DDIG = 0x8, + EF_VI_ISCSI_RX_DDIG = 0x8, /** Transmit iSCSI data digest enable: hardware calculates and inserts ** data digest (CRC) when packet is iSCSI */ - EF_VI_ISCSI_TX_DDIG = 0x10, + EF_VI_ISCSI_TX_DDIG = 0x10, /** Use physically addressed TX descriptor ring */ - EF_VI_TX_PHYS_ADDR = 0x20, + EF_VI_TX_PHYS_ADDR = 0x20, /** Use physically addressed RX descriptor ring */ - EF_VI_RX_PHYS_ADDR = 0x40, + EF_VI_RX_PHYS_ADDR = 0x40, /** IP checksum calculation and replacement is disabled */ - EF_VI_TX_IP_CSUM_DIS = 0x80, + EF_VI_TX_IP_CSUM_DIS = 0x80, /** TCP/UDP checksum calculation and replacement is disabled */ - EF_VI_TX_TCPUDP_CSUM_DIS= 0x100, + EF_VI_TX_TCPUDP_CSUM_DIS = 0x100, /** Drop transmit packets that are not TCP or UDP */ - EF_VI_TX_TCPUDP_ONLY = 0x200, + EF_VI_TX_TCPUDP_ONLY = 0x200, /** Drop packets with a mismatched IP source address ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_IP = 0x400, /* Siena only */ + EF_VI_TX_FILTER_IP = 0x400, /* Siena only */ /** Drop packets with a mismatched MAC source address ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MAC = 0x800, /* Siena only */ + EF_VI_TX_FILTER_MAC = 0x800, /* Siena only */ /** Set lowest bit of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_1 = 0x1000, /* Siena only */ + EF_VI_TX_FILTER_MASK_1 = 0x1000, /* Siena only */ /** Set lowest 2 bits of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_2 = 0x2000, /* Siena only */ + EF_VI_TX_FILTER_MASK_2 = 0x2000, /* Siena only */ /** Set lowest 3 bits of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_3 = (0x1000 | 0x2000), /* Siena only */ + EF_VI_TX_FILTER_MASK_3 = (0x1000 | 0x2000), /* Siena only */ /** Disable using TX descriptor push, so always use doorbell for transmit */ - EF_VI_TX_PUSH_DISABLE = 0x4000, + EF_VI_TX_PUSH_DISABLE = 0x4000, /** Always use TX descriptor push, so never use doorbell for transmit ** (7000 series and newer) */ - EF_VI_TX_PUSH_ALWAYS = 0x8000, /* ef10 only */ + EF_VI_TX_PUSH_ALWAYS = 0x8000, /* ef10 only */ /** Add timestamp to received packets (7000 series and newer) */ - EF_VI_RX_TIMESTAMPS = 0x10000, /* ef10 only */ + EF_VI_RX_TIMESTAMPS = 0x10000, /* ef10 only */ /** Add timestamp to transmitted packets (7000 series and newer), ** cannot be combined with EF_VI_TX_ALT */ - EF_VI_TX_TIMESTAMPS = 0x20000, /* ef10 only */ + EF_VI_TX_TIMESTAMPS = 0x20000, /* ef10 only */ /* Flag EF_VI_TX_LOOPBACK (0x40000) has been removed. Similar * functionality can now be achieved with protection domain and * EF_PD_MCAST_LOOP flag. * Flag value 0x40000 is not to be reused. */ /** Enable packed stream mode for received packets (7000 series and newer) */ - EF_VI_RX_PACKED_STREAM = 0x80000, /* ef10 only */ + EF_VI_RX_PACKED_STREAM = 0x80000, /* ef10 only */ /** Use 64KiB packed stream buffers, instead of the 1024KiB default (7000 * series and newer) */ - EF_VI_RX_PS_BUF_SIZE_64K = 0x100000, /* ef10 only */ + EF_VI_RX_PS_BUF_SIZE_64K = 0x100000, /* ef10 only */ /** Enable RX event merging mode for received packets; ** see ef_vi_receive_unbundle() and ef_vi_receive_get_bytes() for more ** details on using RX event merging mode */ - EF_VI_RX_EVENT_MERGE = 0x200000, /* ef10 only */ + EF_VI_RX_EVENT_MERGE = 0x200000, /* ef10 only */ /** Enable the "TX alternatives" feature (8000 series and newer), ** cannot be combined with EF_VI_TX_TIMESTAMPS */ EF_VI_TX_ALT = 0x400000, /** Controls whether the hardware event timer is enabled (8000 series and ** newer) */ - EF_VI_ENABLE_EV_TIMER = 0x800000, + EF_VI_ENABLE_EV_TIMER = 0x800000, /** Enable the "cut-through PIO" feature (X2000 series and newer). */ EF_VI_TX_CTPIO = 0x1000000, /** When using CTPIO, prevent poisoned frames from reaching the wire (X2000 ** series and newer). */ EF_VI_TX_CTPIO_NO_POISON = 0x2000000, /** Zerocopy - relevant for AF_XDP */ - EF_VI_RX_ZEROCOPY = 0x4000000, + EF_VI_RX_ZEROCOPY = 0x4000000, /** Support ef_vi_transmit_memcpy() (SN1000 series and newer). */ - EF_VI_ALLOW_MEMCPY = 0x8000000, + EF_VI_ALLOW_MEMCPY = 0x8000000, /** Disallow efct backward-compatibility emulation */ - EF_VI_EFCT_UNIQUEUE = 0x10000000, + EF_VI_EFCT_UNIQUEUE = 0x10000000, /** Require no shared traffic on the receive queue(s) of this application. */ /** Useful only for X3 series: other cards never use shared queues. ** Exclusive queues have two effects: @@ -588,14 +586,14 @@ enum ef_vi_flags { ** application ** -# This application can guarantee that it will not receive any packets ** for which it did not explicitly add a filter */ - EF_VI_RX_EXCLUSIVE = 0x20000000, + EF_VI_RX_EXCLUSIVE = 0x20000000, }; /*! \brief Flags that can be returned when an ef_vi has been allocated */ enum ef_vi_out_flags { /** Clock sync status */ - EF_VI_OUT_CLOCK_SYNC_STATUS = 0x1, /* ef10 only */ + EF_VI_OUT_CLOCK_SYNC_STATUS = 0x1, /* ef10 only */ }; @@ -613,7 +611,7 @@ enum ef_vi_rx_discard_err_flags { /** Ethernet frame length error */ EF_VI_DISCARD_RX_ETH_LEN_ERR = 0x8, /** To be discard in software (includes frame length error) */ - EF_VI_DISCARD_RX_TOBE_DISC = 0x10, /* Siena only */ + EF_VI_DISCARD_RX_TOBE_DISC = 0x10, /* Siena only */ /* Inner TCP or UDP checksum error */ EF_VI_DISCARD_RX_INNER_L4_CSUM_ERR = 0x20, /* Inner IP checksum error */ @@ -625,8 +623,8 @@ enum ef_vi_rx_discard_err_flags { /*! \brief Timestamp formats supported by various cards. */ enum ef_timestamp_format { - TS_FORMAT_SECONDS_27FRACTION = 0, - TS_FORMAT_SECONDS_QTR_NANOSECONDS = 1 + TS_FORMAT_SECONDS_27FRACTION = 0, + TS_FORMAT_SECONDS_QTR_NANOSECONDS = 1 }; @@ -646,6 +644,8 @@ enum ef_vi_arch { EF_VI_ARCH_EFCT, /** Arbitrary NICs using AF_XDP */ EF_VI_ARCH_AF_XDP, + /** swXtch.io specific implemenation */ + EF_VI_ARCH_SWXTCH, }; /*! \brief State of TX descriptor ring @@ -654,17 +654,17 @@ enum ef_vi_arch { */ typedef struct { /** Previous slot that has been handled */ - uint32_t previous; + uint32_t previous; /** Descriptors added to the ring */ - uint32_t added; + uint32_t added; /** Descriptors removed from the ring */ - uint32_t removed; + uint32_t removed; /** Bytes added to the cut-through FIFO */ - uint32_t ct_added; + uint32_t ct_added; /** Bytes removed from the cut-through FIFO */ - uint32_t ct_removed; + uint32_t ct_removed; /** Timestamp in nanoseconds */ - uint32_t ts_nsec; + uint32_t ts_nsec; } ef_vi_txq_state; /*! \brief State of efct receive queue @@ -695,19 +695,19 @@ typedef struct { */ typedef struct { /** Descriptors posted to the nic */ - uint32_t posted; + uint32_t posted; /** Descriptors added to the ring */ - uint32_t added; + uint32_t added; /** Descriptors removed from the ring */ - uint32_t removed; + uint32_t removed; /** Packets received as part of a jumbo (7000-series only) */ - uint32_t in_jumbo; /* ef10 only */ + uint32_t in_jumbo; /* ef10 only */ /** Bytes received as part of a jumbo (7000-series only) */ - uint32_t bytes_acc; /* ef10 only */ + uint32_t bytes_acc; /* ef10 only */ /** Last descriptor index completed (7000-series only) */ - uint16_t last_desc_i; /* ef10 only */ + uint16_t last_desc_i; /* ef10 only */ /** Credit for packed stream handling (7000-series only) */ - uint16_t rx_ps_credit_avail; /* ef10 only */ + uint16_t rx_ps_credit_avail; /* ef10 only */ ef_vi_efct_rxq_ptr rxq_ptr[EF_VI_MAX_EFCT_RXQS]; /* efct only */ } ef_vi_rxq_state; @@ -740,13 +740,13 @@ typedef struct { */ typedef struct { /** Mask for indexes within ring, to wrap around */ - uint32_t mask; + uint32_t mask; /** Maximum space in the cut-through FIFO, reduced to account for header */ - uint32_t ct_fifo_bytes; + uint32_t ct_fifo_bytes; /** Pointer to descriptors */ - void* descriptors; + void* descriptors; /** Pointer to IDs */ - uint32_t* ids; + uint32_t* ids; } ef_vi_txq; /*! \brief RX descriptor ring @@ -755,11 +755,11 @@ typedef struct { */ typedef struct { /** Mask for indexes within ring, to wrap around */ - uint32_t mask; + uint32_t mask; /** Pointer to descriptors */ - void* descriptors; + void* descriptors; /** Pointer to IDs */ - uint32_t* ids; + uint32_t* ids; } ef_vi_rxq; typedef int ef_vi_efct_superbuf_refresh_t(struct ef_vi*, int); @@ -776,9 +776,9 @@ typedef struct { #else /** contiguous area of superbuf memory */ const char* superbuf; - uint64_t* current_mappings; + uint64_t* current_mappings; #endif - uint32_t config_generation; + uint32_t config_generation; ef_vi_efct_superbuf_refresh_t* refresh_func; } ef_vi_efct_rxq; @@ -817,13 +817,13 @@ typedef struct { */ struct ef_vi_nic_type { /** Architecture of the NIC */ - unsigned char arch; + unsigned char arch; /** Variant of the NIC */ - char variant; + char variant; /** Revision of the NIC */ - unsigned char revision; + unsigned char revision; /** Flags indicating hardware features */ - unsigned char nic_flags; + unsigned char nic_flags; }; /*! \brief Per-packet overhead information @@ -852,11 +852,11 @@ struct ef_pio; */ enum ef_vi_tx_extra_flags { /** Enable use of the mark field. */ - EF_VI_TX_EXTRA_MARK = 0x1, + EF_VI_TX_EXTRA_MARK = 0x1, /** True to enable use of the ingress_mport field. */ - EF_VI_TX_EXTRA_INGRESS_MPORT = 0x2, + EF_VI_TX_EXTRA_INGRESS_MPORT = 0x2, /** True to enable use of the egress_mport field. */ - EF_VI_TX_EXTRA_EGRESS_MPORT = 0x4, + EF_VI_TX_EXTRA_EGRESS_MPORT = 0x4, /** Capsule metadata is present as prefix to frame data. */ EF_VI_TX_EXTRA_CAPSULE_METADATA = 0x8, }; @@ -866,11 +866,11 @@ struct ef_vi_tx_extra { /** Flags indicating which options to apply. */ enum ef_vi_tx_extra_flags flags; /** Packet mark value. */ - uint32_t mark; + uint32_t mark; /** Port used to enter virtual switch. */ - uint16_t ingress_mport; + uint16_t ingress_mport; /** Port used to leave virtual switch. */ - uint16_t egress_mport; + uint16_t egress_mport; }; /*! \brief A virtual interface. @@ -884,153 +884,149 @@ struct ef_vi_tx_extra { */ typedef struct ef_vi { /** True if the virtual interface has been initialized */ - unsigned inited; + unsigned inited; /** The resource ID of the virtual interface */ - unsigned vi_resource_id; + unsigned vi_resource_id; /** The instance ID of the virtual interface */ - unsigned vi_i; + unsigned vi_i; /** NIC-global ID of this virtual interface, or -1 */ - unsigned abs_idx; + unsigned abs_idx; /** fd used for original initialisation */ - ef_driver_handle dh; + ef_driver_handle dh; /** The length of a receive buffer */ - unsigned rx_buffer_len; + unsigned rx_buffer_len; /** The length of the prefix at the start of a received packet */ - unsigned rx_prefix_len; + unsigned rx_prefix_len; /** efct: The last call to transmit_ctpio didn't have space; remember this * for the call to ctpio_fallback */ - uint8_t last_ctpio_failed; + uint8_t last_ctpio_failed; /** The mask to select which errors cause a discard event */ - uint64_t rx_discard_mask; + uint64_t rx_discard_mask; /** The timestamp correction (ticks) for received packets */ - int rx_ts_correction; + int rx_ts_correction; /** The offset to packet length in receive buffer */ - unsigned rx_pkt_len_offset; + unsigned rx_pkt_len_offset; /** The mask of packet length in receive buffer */ - unsigned rx_pkt_len_mask; + unsigned rx_pkt_len_mask; /** The timestamp correction (ns) for transmitted packets */ - int tx_ts_correction_ns; + int tx_ts_correction_ns; /** The timestamp format used by the hardware */ - enum ef_timestamp_format ts_format; + enum ef_timestamp_format ts_format; /** Pointer to virtual interface memory */ - char* vi_mem_mmap_ptr; + char* vi_mem_mmap_ptr; /** Length of virtual interface memory */ - int vi_mem_mmap_bytes; + int vi_mem_mmap_bytes; /** Pointer to virtual interface I/O region */ - char* vi_io_mmap_ptr; + char* vi_io_mmap_ptr; /** Length of virtual interface I/O region */ - int vi_io_mmap_bytes; + int vi_io_mmap_bytes; /** Pointer to CTPIO region */ - char* vi_ctpio_mmap_ptr; + char* vi_ctpio_mmap_ptr; /** Controls rate of writes into CTPIO aperture */ - uint32_t vi_ctpio_wb_ticks; + uint32_t vi_ctpio_wb_ticks; /** Length of region allocated at ep_state */ - int ep_state_bytes; + int ep_state_bytes; /** True if the virtual interface is in a cluster */ - int vi_clustered; + int vi_clustered; /** True if packed stream mode is enabled for the virtual interface */ - int vi_is_packed_stream; + int vi_is_packed_stream; /** True if no special mode is enabled for the virtual interface */ - int vi_is_normal; + int vi_is_normal; /** The packed stream buffer size for the virtual interface */ - unsigned vi_ps_buf_size; + unsigned vi_ps_buf_size; /** I/O address for the virtual interface */ - ef_vi_ioaddr_t io; + ef_vi_ioaddr_t io; /** Programmed I/O region linked to the virtual interface */ - struct ef_pio* linked_pio; + struct ef_pio* linked_pio; /** Base of the event queue for the virtual interface */ - char* evq_base; + char* evq_base; /** Mask for offsets within the event queue for the virtual interface */ - unsigned evq_mask; + unsigned evq_mask; /** True if the event queue uses phase bits */ - int evq_phase_bits; + int evq_phase_bits; /** The timer quantum for the virtual interface, in nanoseconds */ - unsigned timer_quantum_ns; + unsigned timer_quantum_ns; /** The threshold at which to switch from using TX descriptor push to ** using a doorbell */ - unsigned tx_push_thresh; + unsigned tx_push_thresh; /** The TX descriptor ring for the virtual interface */ - ef_vi_txq vi_txq; + ef_vi_txq vi_txq; /** The RX descriptor ring for the virtual interface */ - ef_vi_rxq vi_rxq; + ef_vi_rxq vi_rxq; /** The state of the virtual interface */ - ef_vi_state* ep_state; + ef_vi_state* ep_state; /** The flags for the virtual interface */ - enum ef_vi_flags vi_flags; + enum ef_vi_flags vi_flags; /** Flags returned when the virtual interface is allocated */ - enum ef_vi_out_flags vi_out_flags; + enum ef_vi_out_flags vi_out_flags; /** Statistics for the virtual interface */ - ef_vi_stats* vi_stats; + ef_vi_stats* vi_stats; /** Virtual queues for the virtual interface */ - struct ef_vi* vi_qs[EF_VI_MAX_QS]; + struct ef_vi* vi_qs[EF_VI_MAX_QS]; /** Number of virtual queues for the virtual interface */ - int vi_qs_n; + int vi_qs_n; /** Id of queue a pending PFTF packet belongs to */ - uint8_t future_qid; + uint8_t future_qid; /** Attached rxqs for efct VIs (NB: not necessarily in rxq order) */ - ef_vi_efct_rxq efct_rxq[EF_VI_MAX_EFCT_RXQS]; + ef_vi_efct_rxq efct_rxq[EF_VI_MAX_EFCT_RXQS]; /** efct kernel/userspace shared queue area. */ struct efab_efct_rxq_uk_shm_base* efct_shm; /** 1 + highest allowed index of a used element in efct_rxq */ - int max_efct_rxq; + int max_efct_rxq; /** Number of TX alternatives for the virtual interface */ - unsigned tx_alt_num; + unsigned tx_alt_num; /** Mapping from end-user TX alternative IDs to hardware IDs */ - unsigned* tx_alt_id2hw; + unsigned* tx_alt_id2hw; /** Mapping from hardware TX alternative IDs to end-user IDs */ - unsigned* tx_alt_hw2id; + unsigned* tx_alt_hw2id; /** The type of NIC hosting the virtual interface */ - struct ef_vi_nic_type nic_type; + struct ef_vi_nic_type nic_type; /** Callback to invoke AF_XDP send operations */ - int (*xdp_kick)(struct ef_vi*); - void* xdp_kick_context; + int (*xdp_kick)(struct ef_vi*); + void* xdp_kick_context; /*! \brief Driver-dependent operations. */ /* Doxygen comment above is the detailed description of ef_vi::ops */ struct ops { /** Transmit a packet from a single packet buffer */ - int (*transmit)(struct ef_vi*, ef_addr base, int len, - ef_request_id); + int (*transmit)(struct ef_vi*, ef_addr base, int len, ef_request_id); /** Transmit a packet from a vector of packet buffers */ - int (*transmitv)(struct ef_vi*, const ef_iovec*, int iov_len, - ef_request_id); + int (*transmitv)( + struct ef_vi*, const ef_iovec*, int iov_len, ef_request_id); /** Initialize TX descriptors on the TX descriptor ring, for a vector ** of packet buffers */ - int (*transmitv_init)(struct ef_vi*, const ef_iovec*, - int iov_len, ef_request_id); + int (*transmitv_init)( + struct ef_vi*, const ef_iovec*, int iov_len, ef_request_id); /** Submit newly initialized TX descriptors to the NIC */ void (*transmit_push)(struct ef_vi*); /** Transmit a packet already resident in Programmed I/O */ - int (*transmit_pio)(struct ef_vi*, int offset, int len, - ef_request_id dma_id); + int (*transmit_pio)( + struct ef_vi*, int offset, int len, ef_request_id dma_id); /** Copy a packet to Programmed I/O region and transmit it */ int (*transmit_copy_pio)(struct ef_vi*, int pio_offset, - const void* src_buf, int len, - ef_request_id dma_id); + const void* src_buf, int len, ef_request_id dma_id); /** Warm Programmed I/O transmit path for subsequent transmit */ void (*transmit_pio_warm)(struct ef_vi*); /** Copy a packet to Programmed I/O region and warm transmit path */ - void (*transmit_copy_pio_warm)(struct ef_vi*, int pio_offset, - const void* src_buf, int len); + void (*transmit_copy_pio_warm)( + struct ef_vi*, int pio_offset, const void* src_buf, int len); /** Transmit a vector of packet buffers using CTPIO */ void (*transmitv_ctpio)(struct ef_vi*, size_t frame_len, - const struct iovec* iov, - int iov_len, unsigned threshold); + const struct iovec* iov, int iov_len, unsigned threshold); /** Transmit a vector of packet buffers using CTPIO and copy to fallback */ void (*transmitv_ctpio_copy)(struct ef_vi*, size_t frame_len, - const struct iovec* iov, - int iov_len, unsigned threshold, - void* fallback); + const struct iovec* iov, int iov_len, unsigned threshold, + void* fallback); /** Select a TX alternative as the destination for future sends */ int (*transmit_alt_select)(struct ef_vi*, unsigned alt_id); /** Select the "normal" data path as the destination for future sends */ @@ -1060,17 +1056,19 @@ typedef struct ef_vi { /** Initialize TX descriptors on the TX descriptor ring, using * extra options and (optionally) remote buffers */ int (*transmitv_init_extra)(struct ef_vi*, const struct ef_vi_tx_extra*, - const ef_remote_iovec*, int iov_len, - ef_request_id); + const ef_remote_iovec*, int iov_len, ef_request_id); ssize_t (*transmit_memcpy)(struct ef_vi*, const ef_remote_iovec* dst_iov, - int dst_iov_len, const ef_remote_iovec* src_iov, - int src_iov_len); + int dst_iov_len, const ef_remote_iovec* src_iov, int src_iov_len); int (*transmit_memcpy_sync)(struct ef_vi*, ef_request_id dma_id); - int (*transmit_ctpio_fallback)(struct ef_vi* vi, ef_addr dma_addr, - size_t len, ef_request_id dma_id); + int (*transmit_ctpio_fallback)( + struct ef_vi* vi, ef_addr dma_addr, size_t len, ef_request_id dma_id); int (*transmitv_ctpio_fallback)(struct ef_vi* vi, const ef_iovec* dma_iov, - int dma_iov_len, ef_request_id dma_id); - } ops; /**< Driver-dependent operations. */ + int dma_iov_len, ef_request_id dma_id); + void (*rx_fill_pkt)( + struct ef_vi* vi, char* output_buffer, int event_index); + void (*tx_fill_pkt)( + struct ef_vi* vi, const char* output_buffer, const unsigned len); + } ops; /**< Driver-dependent operations. */ /* Doxygen comment above is documentation for the ops member of ef_vi */ /*! \brief Driver-dependent operations not corresponding to a public API. */ @@ -1079,7 +1077,7 @@ typedef struct ef_vi { struct internal_ops { /** A filter has just been added to the given VI */ int (*post_filter_add)(struct ef_vi*, const struct ef_filter_spec* fs, - const struct ef_filter_cookie* cookie, int rxq); + const struct ef_filter_cookie* cookie, int rxq); } internal_ops; } ef_vi; @@ -1112,7 +1110,6 @@ ef_vi_inline enum ef_vi_flags ef_vi_flags(ef_vi* vi) } - /*! \brief Return the instance ID of the virtual interface ** ** \param vi The virtual interface to query. @@ -1179,7 +1176,7 @@ extern const char* ef_vi_driver_interface_str(void); ** When a large packet is received that is scattered over multiple packet ** buffers, the prefix is only present in the first buffer. */ -ef_vi_inline int ef_vi_receive_prefix_len(const ef_vi* vi) +ef_vi_inline int ef_vi_receive_prefix_len(const ef_vi* vi) { return vi->rx_prefix_len; } @@ -1300,7 +1297,7 @@ ef_vi_inline int ef_vi_receive_capacity(const ef_vi* vi) ** packets. This function only writes a few bytes into host memory, and is ** very fast. */ -#define ef_vi_receive_init(vi, addr, dma_id) \ +#define ef_vi_receive_init(vi, addr, dma_id) \ (vi)->ops.receive_init((vi), (addr), (dma_id)) @@ -1375,11 +1372,12 @@ extern int ef_vi_receive_post(ef_vi* vi, ef_addr addr, ef_request_id dma_id); ** If the virtual interface does not have RX timestamps enabled, the ** behavior of this function is undefined. ** -** Note: ef_eventq_poll(), efct_vi_rx_future_poll() and efct_vi_rx_future_peek() +** Note: ef_eventq_poll(), efct_vi_rx_future_poll() and +*efct_vi_rx_future_peek() ** invalidate timestamps retrieved by previous poll function. */ -extern int ef_vi_receive_get_timestamp(ef_vi* vi, const void* pkt, - ef_timespec* ts_out); +extern int ef_vi_receive_get_timestamp( + ef_vi* vi, const void* pkt, ef_timespec* ts_out); /*! \brief Retrieve the UTC timestamp associated with a received packet, @@ -1429,10 +1427,8 @@ extern int ef_vi_receive_get_timestamp(ef_vi* vi, const void* pkt, ** In case of error the timestamp result (*ts_out) is set to zero, and a ** non-zero error code is returned (see Return value above). */ -extern int -ef_vi_receive_get_timestamp_with_sync_flags(ef_vi* vi, const void* pkt, - ef_timespec* ts_out, - unsigned* flags_out); +extern int ef_vi_receive_get_timestamp_with_sync_flags( + ef_vi* vi, const void* pkt, ef_timespec* ts_out, unsigned* flags_out); /*! \brief Retrieve the number of bytes in a received packet in RX event @@ -1452,8 +1448,8 @@ ef_vi_receive_get_timestamp_with_sync_flags(ef_vi* vi, const void* pkt, ** ** \return 0 on success, or a negative error code */ -extern int -ef_vi_receive_get_bytes(ef_vi* vi, const void* pkt, uint16_t* bytes_out); +extern int ef_vi_receive_get_bytes( + ef_vi* vi, const void* pkt, uint16_t* bytes_out); /*! \brief Retrieve the user_mark and user_flag fields in a received packet @@ -1472,9 +1468,8 @@ ef_vi_receive_get_bytes(ef_vi* vi, const void* pkt, uint16_t* bytes_out); ** ** \return 0 on success, or a negative error code */ -extern int -ef_vi_receive_get_user_data(ef_vi* vi, const void* pkt, uint32_t* user_mark, - uint8_t* user_flag); +extern int ef_vi_receive_get_user_data( + ef_vi* vi, const void* pkt, uint32_t* user_mark, uint8_t* user_flag); /*! \brief Maximum number of receive completions per receive event. */ @@ -1511,8 +1506,8 @@ ef_vi_receive_get_user_data(ef_vi* vi, const void* pkt, uint32_t* user_mark, ** must be called, or the length examined in the packet prefix (see ** ef_vi_receive_query_layout()). */ -extern int ef_vi_receive_unbundle(ef_vi* ep, const ef_event* event, - ef_request_id* ids); +extern int ef_vi_receive_unbundle( + ef_vi* ep, const ef_event* event, ef_request_id* ids); extern ef_request_id ef_vi_rxq_next_desc_id(ef_vi* vi); @@ -1527,8 +1522,7 @@ extern ef_request_id ef_vi_rxq_next_desc_id(ef_vi* vi); ** ** Set which errors cause an EF_EVENT_TYPE_RX_DISCARD event */ -extern int -ef_vi_receive_set_discards(ef_vi* vi, unsigned discard_err_flags); +extern int ef_vi_receive_set_discards(ef_vi* vi, unsigned discard_err_flags); /********************************************************************** @@ -1644,8 +1638,8 @@ ef_vi_inline int ef_vi_transmit_capacity(const ef_vi* vi) ** address) must contain the packet to transmit. This function only writes ** a few bytes into host memory, and is very fast. */ -extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, - ef_request_id dma_id); +extern int ef_vi_transmit_init( + ef_vi* vi, ef_addr addr, int bytes, ef_request_id dma_id); /*! \brief Initialize TX descriptors on the TX descriptor ring, for a @@ -1678,7 +1672,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** updated, but the buffers containing constant data are re-used ** - this minimizes the amount of data written between transmits. */ -#define ef_vi_transmitv_init(vi, iov, iov_len, dma_id) \ +#define ef_vi_transmitv_init(vi, iov, iov_len, dma_id) \ (vi)->ops.transmitv_init((vi), (iov), (iov_len), (dma_id)) /*! \brief Initialize TX descriptors on the TX descriptor ring, with @@ -1694,9 +1688,8 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** space (EF_ADDRSPACE_LOCAL) and cannot be translated; this is a ** limitation of the hardware. It can, however, be zero length. */ -#define ef_vi_transmitv_init_extra(vi, extra, iov, iov_len, dma_id) \ - (vi)->ops.transmitv_init_extra((vi), (extra), (iov), \ - (iov_len), (dma_id)) +#define ef_vi_transmitv_init_extra(vi, extra, iov, iov_len, dma_id) \ + (vi)->ops.transmitv_init_extra((vi), (extra), (iov), (iov_len), (dma_id)) /*! \brief Submit newly initialized TX descriptors to the NIC ** @@ -1739,7 +1732,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** functions separately, but unless there is a batch of packets to ** transmit, calling this function is often the right thing to do. */ -#define ef_vi_transmit(vi, base, len, dma_id) \ +#define ef_vi_transmit(vi, base, len, dma_id) \ (vi)->ops.transmit((vi), (base), (len), (dma_id)) @@ -1777,7 +1770,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** updated, but the buffers containing constant data are re-used ** - this minimizes the amount of data written between transmits. */ -#define ef_vi_transmitv(vi, iov, iov_len, dma_id) \ +#define ef_vi_transmitv(vi, iov, iov_len, dma_id) \ (vi)->ops.transmitv((vi), (iov), (iov_len), (dma_id)) @@ -1811,7 +1804,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** - maximum size ** - avoiding reuse until transmission is complete. */ -#define ef_vi_transmit_pio(vi, offset, len, dma_id) \ +#define ef_vi_transmit_pio(vi, offset, len, dma_id) \ (vi)->ops.transmit_pio((vi), (offset), (len), (dma_id)) @@ -1854,9 +1847,8 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** - maximum size ** - avoiding reuse until transmission is complete. */ -#define ef_vi_transmit_copy_pio(vi, pio_offset, src_buf, len, dma_id) \ - (vi)->ops.transmit_copy_pio((vi), (pio_offset), (src_buf), \ - (len), (dma_id)) +#define ef_vi_transmit_copy_pio(vi, pio_offset, src_buf, len, dma_id) \ + (vi)->ops.transmit_copy_pio((vi), (pio_offset), (src_buf), (len), (dma_id)) /*! \brief Warm Programmed I/O transmit path for subsequent transmit @@ -1876,8 +1868,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** it follows a different code path. See ef_vi_transmit_copy_pio_warm() for ** a warming function designed to warm for ef_vi_transmit_copy_pio(). */ -#define ef_vi_transmit_pio_warm(vi) \ - (vi)->ops.transmit_pio_warm((vi)) +#define ef_vi_transmit_pio_warm(vi) (vi)->ops.transmit_pio_warm((vi)) /*! \brief Copy a packet to Programmed I/O region and warm transmit path @@ -1910,7 +1901,7 @@ extern int ef_vi_transmit_init(ef_vi* vi, ef_addr addr, int bytes, ** it follows a different code path. See ef_vi_transmit_pio_warm() for ** a warming function designed to warm for ef_vi_transmit_pio(). */ -#define ef_vi_transmit_copy_pio_warm(vi, pio_offset, src_buf, len) \ +#define ef_vi_transmit_copy_pio_warm(vi, pio_offset, src_buf, len) \ (vi)->ops.transmit_copy_pio_warm((vi), (pio_offset), (src_buf), (len)) @@ -1937,7 +1928,7 @@ extern void ef_vi_transmit_init_undo(ef_vi* vi); /*! \brief Maximum number of transmit completions per transmit event. */ -#define EF_VI_TRANSMIT_BATCH 64 +#define EF_VI_TRANSMIT_BATCH 64 /*! \brief Unbundle an event of type of type EF_EVENT_TYPE_TX or @@ -1966,8 +1957,8 @@ extern void ef_vi_transmit_init_undo(ef_vi* vi); ** re-used (for example as a packet buffer for a descriptor on the TX ring, ** or on the RX ring). */ -extern int ef_vi_transmit_unbundle(ef_vi* ep, const ef_event* event, - ef_request_id* ids); +extern int ef_vi_transmit_unbundle( + ef_vi* ep, const ef_event* event, ef_request_id* ids); /*! \brief Return the number of TX alternatives allocated for a virtual @@ -1982,7 +1973,6 @@ extern int ef_vi_transmit_unbundle(ef_vi* ep, const ef_event* event, extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); - /*! \brief Select a TX alternative as the destination for future sends ** ** \param vi The virtual interface associated with the TX alternative. @@ -1998,7 +1988,7 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** - if the TX alternative is in the GO state, the packet is immediately ** transmitted. */ -#define ef_vi_transmit_alt_select(vi, alt_id) \ +#define ef_vi_transmit_alt_select(vi, alt_id) \ (vi)->ops.transmit_alt_select((vi), (alt_id)) @@ -2012,7 +2002,7 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** immediately, in the normal way. This call undoes the effect of ** ef_vi_transmit_alt_select(). */ -#define ef_vi_transmit_alt_select_normal(vi) \ +#define ef_vi_transmit_alt_select_normal(vi) \ (vi)->ops.transmit_alt_select_default((vi)) @@ -2024,7 +2014,7 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** Transitions a TX alternative to the STOP state. Packets that are sent ** to a TX alternative in the STOP state are buffered on the adapter. */ -#define ef_vi_transmit_alt_stop(vi, alt_id) \ +#define ef_vi_transmit_alt_stop(vi, alt_id) \ (vi)->ops.transmit_alt_stop((vi), (alt_id)) @@ -2042,7 +2032,7 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** returned to the application. The application should normally wait until ** all packets have been sent before transitioning to a different state. */ -#define ef_vi_transmit_alt_go(vi, alt_id) \ +#define ef_vi_transmit_alt_go(vi, alt_id) \ (vi)->ops.transmit_alt_go((vi), (alt_id)) @@ -2063,7 +2053,7 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** Memory for the TX alternative remains allocated, and is not freed until ** the virtual interface is freed. */ -#define ef_vi_transmit_alt_discard(vi, alt_id) \ +#define ef_vi_transmit_alt_discard(vi, alt_id) \ (vi)->ops.transmit_alt_discard((vi), (alt_id)) @@ -2078,8 +2068,8 @@ extern unsigned ef_vi_transmit_alt_num_ids(ef_vi* vi); ** This function returns parameters which are needed by the ** ef_vi_transmit_alt_usage() function below. */ -extern int ef_vi_transmit_alt_query_overhead(ef_vi* vi, - struct ef_vi_transmit_alt_overhead* params); +extern int ef_vi_transmit_alt_query_overhead( + ef_vi* vi, struct ef_vi_transmit_alt_overhead* params); /*! \brief Calculate a packet's buffer usage @@ -2111,9 +2101,8 @@ extern int ef_vi_transmit_alt_query_overhead(ef_vi* vi, ** is provided instead to allow applications to calculate their buffer ** usage accurately. */ -ef_vi_inline ef_vi_pure uint32_t -ef_vi_transmit_alt_usage(const struct ef_vi_transmit_alt_overhead* params, - uint32_t pkt_len) +ef_vi_inline ef_vi_pure uint32_t ef_vi_transmit_alt_usage( + const struct ef_vi_transmit_alt_overhead* params, uint32_t pkt_len) { pkt_len += params->pre_round; pkt_len &= params->mask; @@ -2182,10 +2171,10 @@ extern void ef_vi_set_tx_push_threshold(ef_vi* vi, unsigned threshold); ** The buffers referenced by @p frame_iov can be reused as soon as this ** call returns. */ -#define ef_vi_transmitv_ctpio(vi, frame_len, frame_iov, \ - frame_iov_len, ct_threshold) \ - (vi)->ops.transmitv_ctpio((vi), (frame_len), (frame_iov), \ - (frame_iov_len), (ct_threshold)) +#define ef_vi_transmitv_ctpio( \ + vi, frame_len, frame_iov, frame_iov_len, ct_threshold) \ + (vi)->ops.transmitv_ctpio( \ + (vi), (frame_len), (frame_iov), (frame_iov_len), (ct_threshold)) /*! \brief Transmit a packet using CTPIO from an array of buffers, @@ -2204,12 +2193,10 @@ extern void ef_vi_set_tx_push_threshold(ef_vi* vi, unsigned threshold); ** ef_vi_transmit_ctpio_fallback. This is an optimisation to avoid the need ** to copy the data in a separate step. */ -#define ef_vi_transmitv_ctpio_copy(vi, frame_len, frame_iov, \ - frame_iov_len, ct_threshold, \ - fallback) \ +#define ef_vi_transmitv_ctpio_copy( \ + vi, frame_len, frame_iov, frame_iov_len, ct_threshold, fallback) \ (vi)->ops.transmitv_ctpio_copy((vi), (frame_len), (frame_iov), \ - (frame_iov_len), (ct_threshold), \ - (fallback)) + (frame_iov_len), (ct_threshold), (fallback)) /*! \brief Transmit a packet using CTPIO ** @@ -2244,9 +2231,8 @@ extern void ef_vi_set_tx_push_threshold(ef_vi* vi, unsigned threshold); ** ** The buffer @p frame_buf can be reused as soon as this call returns. */ -ef_vi_inline void -ef_vi_transmit_ctpio(ef_vi* vi, const void* frame_buf, size_t frame_len, - unsigned ct_threshold) +ef_vi_inline void ef_vi_transmit_ctpio( + ef_vi* vi, const void* frame_buf, size_t frame_len, unsigned ct_threshold) { struct iovec iov = { (void*) frame_buf, frame_len }; ef_vi_transmitv_ctpio(vi, frame_len, &iov, 1, ct_threshold); @@ -2299,7 +2285,7 @@ ef_vi_transmit_ctpio(ef_vi* vi, const void* frame_buf, size_t frame_len, ** for all packet sizes. For use with ef_vi_transmit_ctpio() and ** ef_vi_transmitv_ctpio(). */ -#define EF_VI_CTPIO_CT_THRESHOLD_SNF 0xffff +#define EF_VI_CTPIO_CT_THRESHOLD_SNF 0xffff /*! \brief Request the NIC copy data from one place to another @@ -2331,8 +2317,8 @@ ef_vi_transmit_ctpio(ef_vi* vi, const void* frame_buf, size_t frame_len, ** -EOPNOTSUPP the VI was created without EF_VI_ALLOW_MEMCPY. */ #define ef_vi_transmit_memcpy(vi, dst_iov, dst_iov_len, src_iov, src_iov_len) \ - (vi)->ops.transmit_memcpy((vi), (dst_iov), (dst_iov_len), (src_iov), \ - (src_iov_len)) + (vi)->ops.transmit_memcpy( \ + (vi), (dst_iov), (dst_iov_len), (src_iov), (src_iov_len)) /*! \brief Require a completion event for all preceding ef_vi_transmit_memcpy() @@ -2351,7 +2337,7 @@ ef_vi_transmit_ctpio(ef_vi* vi, const void* frame_buf, size_t frame_len, ** -EAGAIN if the descriptor ring is full. ** -EOPNOTSUPP the VI was created without EF_VI_ALLOW_MEMCPY. */ -#define ef_vi_transmit_memcpy_sync(vi, dma_id) \ +#define ef_vi_transmit_memcpy_sync(vi, dma_id) \ (vi)->ops.transmit_memcpy_sync((vi), (dma_id)) @@ -2384,6 +2370,7 @@ extern int ef_eventq_check_event_phase_bit(const ef_vi* vi, int look_ahead); extern int efxdp_ef_eventq_check_event(const ef_vi* vi, int look_ahead); extern int efct_ef_eventq_check_event(const ef_vi* vi); +extern int efswxtch_ef_eventq_check_event(const ef_vi* vi); /*! \brief Returns true if ef_eventq_poll() will return event(s) @@ -2394,8 +2381,7 @@ extern int efct_ef_eventq_check_event(const ef_vi* vi); ** ** Returns true if ef_eventq_poll() will return event(s). */ -ef_vi_inline int -ef_eventq_has_event(const ef_vi* vi) +ef_vi_inline int ef_eventq_has_event(const ef_vi* vi) { if( ! vi->evq_phase_bits ) return ef_eventq_check_event(vi, 0); @@ -2403,6 +2389,8 @@ ef_eventq_has_event(const ef_vi* vi) switch( vi->nic_type.arch ) { case EF_VI_ARCH_AF_XDP: return efxdp_ef_eventq_check_event(vi, 0); + case EF_VI_ARCH_SWXTCH: + return efswxtch_ef_eventq_check_event(vi); case EF_VI_ARCH_EFCT: return efct_ef_eventq_check_event(vi); default: @@ -2428,8 +2416,7 @@ ef_eventq_has_event(const ef_vi* vi) ** This function returns quickly. It is useful for an application to ** determine whether it is falling behind in its event processing. */ -ef_vi_inline int -ef_eventq_has_many_events(const ef_vi* evq, int n_events) +ef_vi_inline int ef_eventq_has_many_events(const ef_vi* evq, int n_events) { if( evq->evq_phase_bits ) return ef_eventq_check_event_phase_bit(evq, n_events); @@ -2467,10 +2454,16 @@ ef_eventq_has_many_events(const ef_vi* evq, int n_events) ** This function returns immediately, even if there are no outstanding ** events. The array might not be full on return. */ -#define ef_eventq_poll(evq, evs, evs_len) \ +#define ef_eventq_poll(evq, evs, evs_len) \ (evq)->ops.eventq_poll((evq), (evs), (evs_len)) +/* These are hacky functions used to onload packets into mbufs */ +#define ef_fill_rx_data(evq, pkt, index) \ + (evq)->ops.rx_fill_pkt((evq), (pkt), (index)) +#define ef_fill_tx_data(evq, pkt, len) \ + (evq)->ops.tx_fill_pkt((evq), (pkt), (len)) + /*! \brief Returns the capacity of an event queue ** ** \param vi The event queue to query. @@ -2490,7 +2483,7 @@ ef_eventq_has_many_events(const ef_vi* evq, int n_events) ** may get up to one event for each descriptor plus two further events per ** packet. */ -extern int ef_eventq_capacity(ef_vi* vi); +extern int ef_eventq_capacity(ef_vi* vi); /*! \brief Get the current offset into the event queue. @@ -2525,11 +2518,11 @@ enum ef_vi_layout_type { /*! \brief Layout of the data that is delivered into receive buffers. */ typedef struct { /** The type of layout */ - enum ef_vi_layout_type evle_type; + enum ef_vi_layout_type evle_type; /** Offset to the data */ - int evle_offset; + int evle_offset; /** Description of the layout */ - const char* evle_description; + const char* evle_description; } ef_vi_layout_entry; @@ -2553,10 +2546,8 @@ typedef struct { ** The first entry is always of type EF_VI_LAYOUT_FRAME, and the offset is ** the same as the value returned by ef_vi_receive_prefix_len(). */ -extern int -ef_vi_receive_query_layout(ef_vi* vi, - const ef_vi_layout_entry**const layout_out, - int* layout_len_out); +extern int ef_vi_receive_query_layout(ef_vi* vi, + const ef_vi_layout_entry** const layout_out, int* layout_len_out); /*! \brief Retrieve the discard flags associated with a received packet. @@ -2574,11 +2565,10 @@ ef_vi_receive_query_layout(ef_vi* vi, ** ** Read CLASS field from the prefix of received packet and return discard flags ** about packet length, CRC or checksum validation errors. -** +** */ -extern int -ef_vi_receive_get_discard_flags(ef_vi* vi, const void* pkt, - unsigned* discard_flags); +extern int ef_vi_receive_get_discard_flags( + ef_vi* vi, const void* pkt, unsigned* discard_flags); #ifdef __cplusplus } diff --git a/src/lib/ciul/ef_vi_internal.h b/src/lib/ciul/ef_vi_internal.h index 5cd0d59e8..b5c008bc0 100644 --- a/src/lib/ciul/ef_vi_internal.h +++ b/src/lib/ciul/ef_vi_internal.h @@ -28,38 +28,44 @@ * Initialisation state. */ -#define EF_VI_INITED_NIC 0x1 -#define EF_VI_INITED_IO 0x2 -#define EF_VI_INITED_RXQ 0x4 -#define EF_VI_INITED_TXQ 0x8 -#define EF_VI_INITED_EVQ 0x10 -#define EF_VI_INITED_TIMER 0x20 -#define EF_VI_INITED_RX_TIMESTAMPING 0x40 -#define EF_VI_INITED_TX_TIMESTAMPING 0x80 -#define EF_VI_INITED_OUT_FLAGS 0x100 +#define EF_VI_INITED_NIC 0x1 +#define EF_VI_INITED_IO 0x2 +#define EF_VI_INITED_RXQ 0x4 +#define EF_VI_INITED_TXQ 0x8 +#define EF_VI_INITED_EVQ 0x10 +#define EF_VI_INITED_TIMER 0x20 +#define EF_VI_INITED_RX_TIMESTAMPING 0x40 +#define EF_VI_INITED_TX_TIMESTAMPING 0x80 +#define EF_VI_INITED_OUT_FLAGS 0x100 /********************************************************************** * Debugging. */ -#define __EF_VI_BUILD_ASSERT_NAME(_x) __EF_VI_BUILD_ASSERT_ILOATHECPP(_x) -#define __EF_VI_BUILD_ASSERT_ILOATHECPP(_x) __EF_VI_BUILD_ASSERT__##_x +#define __EF_VI_BUILD_ASSERT_NAME(_x) __EF_VI_BUILD_ASSERT_ILOATHECPP(_x) +#define __EF_VI_BUILD_ASSERT_ILOATHECPP(_x) __EF_VI_BUILD_ASSERT__##_x #define EF_VI_BUILD_ASSERT(e) \ - { __attribute__((__unused__)) \ - typedef char __EF_VI_BUILD_ASSERT_NAME(__LINE__)[(e) ? 1 : -1]; } + { \ + __attribute__((__unused__)) typedef char __EF_VI_BUILD_ASSERT_NAME( \ + __LINE__)[(e) ? 1 : -1]; \ + } #ifdef NDEBUG -# define EF_VI_ASSERT(x) do{}while(0) -# ifdef __KERNEL__ -# define EF_VI_BUG_ON(x) WARN_ON(x) -# else -# define EF_VI_BUG_ON(x) do{}while(0) -# endif +#define EF_VI_ASSERT(x) \ + do { \ + } while( 0 ) +#ifdef __KERNEL__ +#define EF_VI_BUG_ON(x) WARN_ON(x) #else -# define EF_VI_ASSERT(x) BUG_ON(!(x)) -# define EF_VI_BUG_ON(x) BUG_ON(x) +#define EF_VI_BUG_ON(x) \ + do { \ + } while( 0 ) +#endif +#else +#define EF_VI_ASSERT(x) BUG_ON(! (x)) +#define EF_VI_BUG_ON(x) BUG_ON(x) #endif @@ -68,101 +74,100 @@ */ #ifdef NDEBUG -# define EF_VI_DEBUG(x) +#define EF_VI_DEBUG(x) #else -# define EF_VI_DEBUG(x) x +#define EF_VI_DEBUG(x) x #endif -#define EF_VI_ROUND_UP(i, align) (((i)+(align)-1u) & ~((align)-1u)) -#define EF_VI_ALIGN_FWD(p, align) (((p)+(align)-1u) & ~((align)-1u)) -#define EF_VI_ALIGN_BACK(p, align) ((p) & ~((align)-1u)) -#define EF_VI_PTR_ALIGN_BACK(p, align) \ - ((char*)EF_VI_ALIGN_BACK(((intptr_t)(p)), ((intptr_t)(align)))) -#define EF_VI_IS_POW2(x) ((x) && ! ((x) & ((x) - 1))) +#define EF_VI_ROUND_UP(i, align) (((i) + (align) -1u) & ~((align) -1u)) +#define EF_VI_ALIGN_FWD(p, align) (((p) + (align) -1u) & ~((align) -1u)) +#define EF_VI_ALIGN_BACK(p, align) ((p) & ~((align) -1u)) +#define EF_VI_PTR_ALIGN_BACK(p, align) \ + ((char*) EF_VI_ALIGN_BACK(((intptr_t) (p)), ((intptr_t) (align)))) +#define EF_VI_IS_POW2(x) ((x) && ! ((x) & ((x) -1))) /* This macro must be defined to the same value as EFHW_NIC_PAGE_SIZE * in ci/efhw/common.h. Only defined numerically so that there be no * dependency on that header here */ -#define EF_VI_PAGE_SIZE 4096 -#define EF_VI_PAGE_SHIFT 12 +#define EF_VI_PAGE_SIZE 4096 +#define EF_VI_PAGE_SHIFT 12 -#define EF_VI_TX_TIMESTAMP_TS_NSEC_INVALID (1u<<30) +#define EF_VI_TX_TIMESTAMP_TS_NSEC_INVALID (1u << 30) -#define EF_VI_EV_SIZE 8 +#define EF_VI_EV_SIZE 8 -#define EF_VI_EVS_PER_CACHE_LINE (EF_VI_CACHE_LINE_SIZE / EF_VI_EV_SIZE) +#define EF_VI_EVS_PER_CACHE_LINE (EF_VI_CACHE_LINE_SIZE / EF_VI_EV_SIZE) /* required for CI_PAGE_SIZE and related things */ #include "ci/compat.h" /*---------------------------------------------------------------------------- * - * Helpers to turn bit shifts into dword shifts and check that the bit fields - * haven't overflown the dword etc. Aim is to preserve consistency with the + * Helpers to turn bit shifts into dword shifts and check that the bit fields + * haven't overflown the dword etc. Aim is to preserve consistency with the * autogenerated headers - once stable we could hard code. * *---------------------------------------------------------------------------*/ /* mask constructors */ -#define __EFVI_MASK(WIDTH,T) ((((T)1) << (WIDTH)) - 1) -#define __EFVI_MASK32(WIDTH) __EFVI_MASK((WIDTH),uint32_t) -#define __EFVI_MASK64(WIDTH) __EFVI_MASK((WIDTH),uint64_t) +#define __EFVI_MASK(WIDTH, T) ((((T) 1) << (WIDTH)) - 1) +#define __EFVI_MASK32(WIDTH) __EFVI_MASK((WIDTH), uint32_t) +#define __EFVI_MASK64(WIDTH) __EFVI_MASK((WIDTH), uint64_t) -#define __EFVI_MASKFIELD32(LBN, WIDTH) ((uint32_t) \ - (__EFVI_MASK32(WIDTH) << (LBN))) +#define __EFVI_MASKFIELD32(LBN, WIDTH) \ + ((uint32_t) (__EFVI_MASK32(WIDTH) << (LBN))) /* constructors for fields which span the first and second dwords */ #define __LW(LBN) (32 - LBN) -#define LOW(v, LBN, WIDTH) ((uint32_t) \ - (((v) & __EFVI_MASK64(__LW((LBN)))) << (LBN))) -#define HIGH(v, LBN, WIDTH) ((uint32_t)(((v) >> __LW((LBN))) & \ - __EFVI_MASK64((WIDTH - __LW((LBN)))))) +#define LOW(v, LBN, WIDTH) \ + ((uint32_t) (((v) &__EFVI_MASK64(__LW((LBN)))) << (LBN))) +#define HIGH(v, LBN, WIDTH) \ + ((uint32_t) (((v) >> __LW((LBN))) & __EFVI_MASK64((WIDTH - __LW((LBN)))))) /* constructors for fields within the second dword */ -#define __DW2(LBN) ((LBN) - 32) +#define __DW2(LBN) ((LBN) -32) /* constructors for fields which span the second and third dwords */ #define __LW2(LBN) (64 - LBN) -#define LOW2(v, LBN, WIDTH) ((uint32_t) \ - (((v) & __EFVI_MASK64(__LW2((LBN)))) << ((LBN) - 32))) -#define HIGH2(v, LBN, WIDTH) ((uint32_t) \ - (((v) >> __LW2((LBN))) & __EFVI_MASK64((WIDTH - __LW2((LBN)))))) +#define LOW2(v, LBN, WIDTH) \ + ((uint32_t) (((v) &__EFVI_MASK64(__LW2((LBN)))) << ((LBN) -32))) +#define HIGH2(v, LBN, WIDTH) \ + ((uint32_t) (((v) >> __LW2((LBN))) & __EFVI_MASK64((WIDTH - __LW2((LBN)))))) /* constructors for fields within the third dword */ -#define __DW3(LBN) ((LBN) - 64) +#define __DW3(LBN) ((LBN) -64) + - /* constructors for fields which span the third and fourth dwords */ #define __LW3(LBN) (96 - LBN) -#define LOW3(v, LBN, WIDTH) ((uint32_t) \ - (((v) & __EFVI_MASK64(__LW3((LBN)))) << ((LBN) - 64))) -#define HIGH3(v, LBN, WIDTH) ((unit32_t) \ - (((v) >> __LW3((LBN))) & __EFVI_MASK64((WIDTH - __LW3((LBN)))))) +#define LOW3(v, LBN, WIDTH) \ + ((uint32_t) (((v) &__EFVI_MASK64(__LW3((LBN)))) << ((LBN) -64))) +#define HIGH3(v, LBN, WIDTH) \ + ((unit32_t) (((v) >> __LW3((LBN))) & __EFVI_MASK64((WIDTH - __LW3((LBN)))))) /* constructors for fields within the fourth dword */ -#define __DW4(LBN) ((LBN) - 96) +#define __DW4(LBN) ((LBN) -96) /* checks that the autogenerated headers our consistent with our model */ -#define WIDTHCHCK(a, b) EF_VI_BUG_ON((a) != (b)) -#define RANGECHCK(v, WIDTH) \ - EF_VI_BUG_ON(((uint64_t)(v) & ~(__EFVI_MASK64((WIDTH)))) != 0) +#define WIDTHCHCK(a, b) EF_VI_BUG_ON((a) != (b)) +#define RANGECHCK(v, WIDTH) \ + EF_VI_BUG_ON(((uint64_t) (v) & ~(__EFVI_MASK64((WIDTH)))) != 0) /* fields within the first dword */ -#define DWCHCK(LBN, WIDTH) EF_VI_BUG_ON(((LBN) < 0) || (((LBN)+(WIDTH)) > 32)) +#define DWCHCK(LBN, WIDTH) \ + EF_VI_BUG_ON(((LBN) < 0) || (((LBN) + (WIDTH)) > 32)) /* fields which span the first and second dwords */ -#define LWCHK(LBN, WIDTH) EF_VI_BUG_ON(WIDTH < __LW(LBN)) +#define LWCHK(LBN, WIDTH) EF_VI_BUG_ON(WIDTH < __LW(LBN)) /********************************************************************** * Extracting bit fields. */ -#define QWORD_GET_U(field, val) \ - ((unsigned) CI_QWORD_FIELD(val, field)) +#define QWORD_GET_U(field, val) ((unsigned) CI_QWORD_FIELD(val, field)) -#define QWORD_TEST_BIT(field, val) \ - ( !!CI_QWORD_FIELD(val, field) ) +#define QWORD_TEST_BIT(field, val) (! ! CI_QWORD_FIELD(val, field)) /********************************************************************** @@ -170,10 +175,10 @@ */ /* The gap left after each packet in a packed stream buffer. */ -#define EF_VI_PS_PACKET_GAP 64 +#define EF_VI_PS_PACKET_GAP 64 /* Firmware aligns DMAs onto this boundary. */ -#define EF_VI_PS_ALIGNMENT 64 +#define EF_VI_PS_ALIGNMENT 64 /* The negative offset from the start of a packet's DMA to where we put the * ef_packed_stream_packet header. @@ -183,8 +188,7 @@ * cache line so that we only have to write into one cache line, and so * that we don't dirty the cache line that holds packet data. */ -#define EF_VI_PS_METADATA_OFFSET \ - (sizeof(ef_packed_stream_packet)) +#define EF_VI_PS_METADATA_OFFSET (sizeof(ef_packed_stream_packet)) /* The amount of space we leave at the start of each buffer before the * first DMA. Needs to be enough space for ef_packed_stream_packet, plus @@ -194,33 +198,33 @@ * Firmware requires this be a multiple of EF_VI_PS_ALIGNMENT, and also * important for it to be a multiple of EF_VI_DMA_ALIGN. */ -#define EF_VI_PS_DMA_START_OFFSET 256 +#define EF_VI_PS_DMA_START_OFFSET 256 /* Doxbox SF-112241-TC: One credit is consumed on crossing a 64KB boundary * in buffer space. */ -#define EF_VI_PS_SPACE_PER_CREDIT 0x10000 +#define EF_VI_PS_SPACE_PER_CREDIT 0x10000 /********************************************************************** * Custom descriptor for ef_vi_transmit_memcpy_sync() (of type EV_DRIVER) */ -#define EF_VI_EV_DRIVER_MEMCPY_SYNC_DMA_ID_LBN 0 -#define EF_VI_EV_DRIVER_MEMCPY_SYNC_DMA_ID_WIDTH 32 -#define EF_VI_EV_DRIVER_SUBTYPE_LBN 55 -#define EF_VI_EV_DRIVER_SUBTYPE_WIDTH 4 -#define EF_VI_EV_DRIVER_SUBTYPE_MEMCPY_SYNC 15 +#define EF_VI_EV_DRIVER_MEMCPY_SYNC_DMA_ID_LBN 0 +#define EF_VI_EV_DRIVER_MEMCPY_SYNC_DMA_ID_WIDTH 32 +#define EF_VI_EV_DRIVER_SUBTYPE_LBN 55 +#define EF_VI_EV_DRIVER_SUBTYPE_WIDTH 4 +#define EF_VI_EV_DRIVER_SUBTYPE_MEMCPY_SYNC 15 -/* ******************************************************************** +/* ******************************************************************** */ extern void ef10_vi_init(ef_vi*) EF_VI_HF; extern void ef10_ef_eventq_prime(ef_vi*); extern void ef10_ef_eventq_prime_bug35388_workaround(ef_vi*); -extern int ef10_ef_eventq_poll(ef_vi*, ef_event*, int evs_len); +extern int ef10_ef_eventq_poll(ef_vi*, ef_event*, int evs_len); extern void ef10_ef_eventq_timer_prime(ef_vi*, unsigned v); extern void ef10_ef_eventq_timer_run(ef_vi*, unsigned v); @@ -230,7 +234,7 @@ extern void ef10_ef_eventq_timer_zero(ef_vi*); extern void ef100_vi_init(ef_vi*) EF_VI_HF; extern void ef100_ef_eventq_prime(ef_vi*); -extern int ef100_ef_eventq_poll(ef_vi*, ef_event*, int evs_len); +extern int ef100_ef_eventq_poll(ef_vi*, ef_event*, int evs_len); extern void ef100_ef_eventq_timer_prime(ef_vi*, unsigned v); extern void ef100_ef_eventq_timer_run(ef_vi*, unsigned v); @@ -240,26 +244,25 @@ extern void ef100_ef_eventq_timer_zero(ef_vi*); extern void efxdp_vi_init(ef_vi*) EF_VI_HF; extern long efxdp_vi_mmap_bytes(ef_vi*); +extern void efswxtch_vi_init(ef_vi*) EF_VI_HF; + extern void efct_vi_init(ef_vi*) EF_VI_HF; -extern int efct_vi_mmap_init(ef_vi* vi, int rxq_capacity) EF_VI_HF; +extern int efct_vi_mmap_init(ef_vi* vi, int rxq_capacity) EF_VI_HF; extern void efct_vi_munmap(ef_vi* vi) EF_VI_HF; -extern int ef_pd_cluster_free(ef_pd*, ef_driver_handle); +extern int ef_pd_cluster_free(ef_pd*, ef_driver_handle); extern void ef_vi_packed_stream_update_credit(ef_vi* vi); extern void ef_vi_set_intf_ver(char* intf_ver, size_t len); enum ef_vi_capability; -extern int -__ef_vi_capabilities_get(ef_driver_handle handle, int ifindex, int pd_id, - ef_driver_handle pd_dh, enum ef_vi_capability cap, - unsigned long* value); -extern int -ef_pd_capabilities_get(ef_driver_handle handle, ef_pd* pd, - ef_driver_handle pd_dh, enum ef_vi_capability cap, - unsigned long* value); +extern int __ef_vi_capabilities_get(ef_driver_handle handle, int ifindex, + int pd_id, ef_driver_handle pd_dh, enum ef_vi_capability cap, + unsigned long* value); +extern int ef_pd_capabilities_get(ef_driver_handle handle, ef_pd* pd, + ef_driver_handle pd_dh, enum ef_vi_capability cap, unsigned long* value); extern unsigned ef_vi_evq_clear_stride(void); -#endif /* __CI_EF_VI_INTERNAL_H__ */ +#endif /* __CI_EF_VI_INTERNAL_H__ */ diff --git a/src/lib/ciul/efswxtch_vi.c b/src/lib/ciul/efswxtch_vi.c new file mode 100644 index 000000000..9c07397dd --- /dev/null +++ b/src/lib/ciul/efswxtch_vi.c @@ -0,0 +1,447 @@ +#include "ef_vi_internal.h" +#include "logging.h" +#include +#include +#include + +/* + The names of the rings must match what is in the swxtch primary process + */ +static const char *_TX_RING = "TX_RING"; +static const char *_TX_COMP_RING = "TX_COMP_RING"; +static const char *_RX_RING = "RX_RING"; +static const char *_RX_FILL_RING = "RX_FILL_RING"; +static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; +static const char *_TX_PREP_RING = "TX_PREP_RING"; +static const char *_RX_PREP_RING = "RX_PREP_RING"; + +typedef struct swxtch_rings { + struct rte_mempool *mempool; + struct rte_ring *rx_fill_ring; + struct rte_ring *rx_ring; + struct rte_ring *tx_ring; + struct rte_ring *tx_comp_ring; + struct rte_ring *tx_prep_ring; + struct rte_ring *rx_prep_ring; +} swxtch_rings; + +static swxtch_rings m_rings; + +static struct rte_mbuf + *pending_evs[16]; // 16 is the exact size of the event request + +void efswxtch_drain_ring(struct rte_ring *ring) +{ + unsigned available = 0; + int count = 0; + int burst_size = 32; + struct rte_mbuf *bufs[burst_size]; + + do { + count = rte_ring_dequeue_burst( + ring, (void **) &bufs[0], burst_size, &available); + rte_pktmbuf_free_bulk(bufs, count); + } while( available != 0 ); +} + +void efswxtch_drain_rings(void) +{ + efswxtch_drain_ring(m_rings.rx_fill_ring); + efswxtch_drain_ring(m_rings.rx_ring); + efswxtch_drain_ring(m_rings.rx_prep_ring); + efswxtch_drain_ring(m_rings.tx_prep_ring); + efswxtch_drain_ring(m_rings.tx_comp_ring); + efswxtch_drain_ring(m_rings.tx_ring); +} + +int efswxtch_init_rings(void) +{ + m_rings.mempool = rte_mempool_lookup(_RX_MBUF_POOL); + m_rings.rx_fill_ring = rte_ring_lookup(_RX_FILL_RING); + m_rings.rx_ring = rte_ring_lookup(_RX_RING); + m_rings.tx_ring = rte_ring_lookup(_TX_RING); + m_rings.tx_comp_ring = rte_ring_lookup(_TX_COMP_RING); + m_rings.tx_prep_ring = rte_ring_lookup(_TX_PREP_RING); + m_rings.rx_prep_ring = rte_ring_lookup(_RX_PREP_RING); + if( m_rings.mempool == NULL ) { + ef_log("NO MEMPOOL"); + return -1; + } + if( m_rings.tx_ring == NULL ) { + ef_log("NO TX RING"); + return -1; + } + if( m_rings.tx_comp_ring == NULL ) { + ef_log("NO TX COMP RING"); + return -1; + } + if( m_rings.rx_fill_ring == NULL ) { + ef_log("NO FILL RING"); + return -1; + } + if( m_rings.rx_ring == NULL ) { + ef_log("NO RX RING"); + return -1; + } + if( m_rings.tx_prep_ring == NULL ) { + ef_log("NO PREP RING"); + return -1; + } + if( m_rings.rx_prep_ring == NULL ) { + ef_log("NO RX PREP RING"); + return -1; + } + + efswxtch_drain_rings(); + + return 0; +} + +static void efswxtch_ef_vi_tx_fill_pkt( + ef_vi *vi, const char *pkt, const unsigned len) +{ + struct rte_mbuf *mbufs[1]; + if( rte_mempool_get_bulk(m_rings.mempool, (void **) mbufs, 1) == 0 ) { + memcpy(rte_pktmbuf_mtod(mbufs[0], char *), pkt, len); + mbufs[0]->data_len = len; + rte_ring_enqueue_bulk(m_rings.tx_prep_ring, (void *) mbufs, 1, NULL); + } else { + ef_log("failed to fill tx packet. Out of buffers"); + } +} + +static int efswxtch_ef_vi_transmitv_init( + ef_vi *vi, const ef_iovec *iov, int iov_len, ef_request_id dma_id) +{ + ef_vi_txq *q = &vi->vi_txq; + ef_vi_txq_state *qs = &vi->ep_state->txq; + int i; + if( iov_len != 1 ) + return -EINVAL; /* Multiple buffers per packet not supported */ + + if( qs->added - qs->removed >= q->mask ) + return -EAGAIN; + + i = qs->added++ & q->mask; + EF_VI_BUG_ON(q->ids[i] != EF_REQUEST_ID_MASK); + q->ids[i] = dma_id; + return 0; +} + +static void efswxtch_ef_vi_transmit_push(ef_vi *vi) +{ + struct rte_mbuf *mbufs[EF_VI_TRANSMIT_BATCH]; + int removed; + + removed = rte_ring_dequeue_burst( + m_rings.tx_prep_ring, (void **) mbufs, EF_VI_TRANSMIT_BATCH, NULL); + if( removed != 0 ) { + rte_ring_enqueue_bulk(m_rings.tx_ring, (void **) mbufs, removed, NULL); + } else { + ef_log("pushing but have no data"); + } +} + +static int efswxtch_ef_vi_transmit( + ef_vi *vi, ef_addr base, int len, ef_request_id dma_id) +{ + ef_iovec iov = { base, len }; + int rc = efswxtch_ef_vi_transmitv_init(vi, &iov, 1, dma_id); + if( rc == 0 ) { + wmb(); + efswxtch_ef_vi_transmit_push(vi); + } + return rc; +} + +static int efswxtch_ef_vi_transmitv( + ef_vi *vi, const ef_iovec *iov, int iov_len, ef_request_id dma_id) +{ + int rc = efswxtch_ef_vi_transmitv_init(vi, iov, iov_len, dma_id); + if( rc == 0 ) { + wmb(); + efswxtch_ef_vi_transmit_push(vi); + } + return rc; +} + +static int efswxtch_ef_vi_transmit_pio( + ef_vi *vi, int offset, int len, ef_request_id dma_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_copy_pio( + ef_vi *vi, int offset, const void *src_buf, int len, ef_request_id dma_id) +{ + return -EOPNOTSUPP; +} + +static void efswxtch_ef_vi_transmit_pio_warm(ef_vi *vi) +{ + /* PIO is unsupported so do nothing */ +} + +static void efswxtch_ef_vi_transmit_copy_pio_warm( + ef_vi *vi, int pio_offset, const void *src_buf, int len) +{ + /* PIO is unsupported so do nothing */ +} + +static void efswxtch_ef_vi_transmitv_ctpio(ef_vi *vi, size_t frame_len, + const struct iovec *iov, int iovcnt, unsigned threshold) +{ + /* CTPIO is unsupported so do nothing. Fallback will send the packet. */ +} + +static void efswxtch_ef_vi_transmitv_ctpio_copy(ef_vi *vi, size_t frame_len, + const struct iovec *iov, int iovcnt, unsigned threshold, void *fallback) +{ + // TODO copy to fallback +} + +static int efswxtch_ef_vi_transmit_ctpio_fallback( + ef_vi *vi, ef_addr dma_addr, size_t len, ef_request_id dma_id) +{ + EF_VI_ASSERT(vi->vi_flags & EF_VI_TX_CTPIO); + return efswxtch_ef_vi_transmit(vi, dma_addr, len, dma_id); +} + +static int efswxtch_ef_vi_transmitv_ctpio_fallback( + ef_vi *vi, const ef_iovec *dma_iov, int dma_iov_len, ef_request_id dma_id) +{ + EF_VI_ASSERT(vi->vi_flags & EF_VI_TX_CTPIO); + return efswxtch_ef_vi_transmitv(vi, dma_iov, dma_iov_len, dma_id); +} + +static int efswxtch_ef_vi_transmit_ctpio_fallback_not_supp( + ef_vi *vi, ef_addr dma_addr, size_t len, ef_request_id dma_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmitv_ctpio_fallback_not_supp( + ef_vi *vi, const ef_iovec *dma_iov, int dma_iov_len, ef_request_id dma_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_alt_select(ef_vi *vi, unsigned alt_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_alt_select_normal(ef_vi *vi) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_alt_stop(ef_vi *vi, unsigned alt_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_alt_discard(ef_vi *vi, unsigned alt_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_alt_go(ef_vi *vi, unsigned alt_id) +{ + return -EOPNOTSUPP; +} + +static ssize_t efswxtch_ef_vi_transmit_memcpy(struct ef_vi *vi, + const ef_remote_iovec *dst_iov, int dst_iov_len, + const ef_remote_iovec *src_iov, int src_iov_len) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_transmit_memcpy_sync( + struct ef_vi *vi, ef_request_id dma_id) +{ + return -EOPNOTSUPP; +} + +static int efswxtch_ef_vi_receive_init( + ef_vi *vi, ef_addr addr, ef_request_id dma_id) +{ + ef_vi_rxq *q = &vi->vi_rxq; + ef_vi_rxq_state *qs = &vi->ep_state->rxq; + struct rte_mbuf *mbufs[1]; + int i; + if( qs->added - qs->removed >= q->mask ) + return -EAGAIN; + + i = qs->added++ & q->mask; + q->ids[i] = dma_id; + + if( rte_mempool_get_bulk(m_rings.mempool, (void **) mbufs, 1) == 0 ) { + rte_ring_enqueue_bulk(m_rings.rx_prep_ring, (void *) mbufs, 1, NULL); + } + + return 0; +} + +static void efswxtch_ef_vi_receive_push(ef_vi *vi) +{ + int size = rte_ring_get_capacity(m_rings.rx_prep_ring); + struct rte_mbufs *mbufs[size]; + int dequeued = rte_ring_dequeue_burst( + m_rings.rx_prep_ring, (void **) &mbufs[0], size, NULL); + if( dequeued == 0 ) { + ef_log("failed to get rx prep ring buffs"); + return; + } + if( rte_ring_enqueue_bulk( + m_rings.rx_fill_ring, (void **) &mbufs[0], dequeued, NULL) == 0 ) { + ef_log("failed to enqueue on the fill ring"); + } +} + +static void efswxtch_ef_eventq_prime(ef_vi *vi) +{ + // TODO +} + +static void efswxtch_rx_fill_pkt(ef_vi *vi, char *pkt, int index) +{ + struct rte_mbuf *mbuf = pending_evs[index]; + memcpy(pkt, rte_pktmbuf_mtod(mbuf, unsigned char *), + rte_pktmbuf_data_len(mbuf)); + rte_pktmbuf_free(mbuf); +} + +static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) +{ + // n is the index of the current event we're filling in. consists of both RX + // events and TX completion events + int n = 0, count = 0; + unsigned available = 0, page = 0; + + ef_vi_rxq *rx_q = &vi->vi_rxq; + ef_vi_txq *tx_q = &vi->vi_txq; + ef_vi_rxq_state *rx_qs = &vi->ep_state->rxq; + ef_vi_txq_state *tx_qs = &vi->ep_state->txq; + struct rte_mbuf *rx_bufs[evs_len]; + struct rte_mbuf *tx_bufs[EF_VI_TRANSMIT_BATCH]; + do { + count = rte_ring_dequeue_burst( + m_rings.rx_ring, (void **) rx_bufs, evs_len, &available); + for( int i = 0; i < count; i++ ) { + unsigned desc_i = rx_qs->removed++ & rx_q->mask; + evs[n].rx.type = EF_EVENT_TYPE_RX; + evs[n].rx.q_id = 0; + evs[n].rx.rq_id = rx_q->ids[desc_i]; // dma_id + + // mark the descriptor reusable + rx_q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ + + evs[n].rx.flags = EF_EVENT_FLAG_SOP; + evs[n].rx.len = rte_pktmbuf_data_len(rx_bufs[i]); + evs[n].rx.ofs = 0; + + pending_evs[n] = rx_bufs[i]; + ++n; + } + + } while( available != 0 && n < evs_len ); + + if( n < evs_len ) { + available = 0; + page = 0; + do { + // TX can acknowledge multiple at once using the last id + count = rte_ring_dequeue_burst(m_rings.tx_comp_ring, (void **) tx_bufs, + EF_VI_TRANSMIT_BATCH, &available); + if( count != 0 ) { + int desc_id = + (tx_qs->removed + count + (EF_VI_TRANSMIT_BATCH * page)) & + tx_q->mask; + evs[n].tx.type = EF_EVENT_TYPE_TX; + evs[n].tx.desc_id = desc_id; + evs[n].tx.flags = 0; + evs[n].tx.q_id = 0; + ++n; + ++page; + rte_pktmbuf_free_bulk(tx_bufs, count); + } + } while( available != 0 && n < evs_len ); + } + + return n; +} + +static void efswxtch_ef_eventq_timer_prime(ef_vi *vi, unsigned v) +{ + // TODO +} + +static void efswxtch_ef_eventq_timer_run(ef_vi *vi, unsigned v) +{ + // TODO +} + +static void efswxtch_ef_eventq_timer_clear(ef_vi *vi) +{ + // TODO +} + +static void efswxtch_ef_eventq_timer_zero(ef_vi *vi) +{ + // TODO +} + +int efswxtch_ef_eventq_check_event(const ef_vi *_vi) +{ + return rte_ring_count(m_rings.rx_ring) > 0 || + rte_ring_count(m_rings.tx_comp_ring) > 0; +} + +void efswxtch_vi_init(ef_vi *vi) +{ + efswxtch_init_rings(); + vi->ops.transmit = efswxtch_ef_vi_transmit; + vi->ops.transmitv = efswxtch_ef_vi_transmitv; + vi->ops.transmitv_init = efswxtch_ef_vi_transmitv_init; + vi->ops.transmit_push = efswxtch_ef_vi_transmit_push; + vi->ops.transmit_pio = efswxtch_ef_vi_transmit_pio; + vi->ops.transmit_copy_pio = efswxtch_ef_vi_transmit_copy_pio; + vi->ops.transmit_pio_warm = efswxtch_ef_vi_transmit_pio_warm; + vi->ops.transmit_copy_pio_warm = efswxtch_ef_vi_transmit_copy_pio_warm; + vi->ops.transmitv_ctpio = efswxtch_ef_vi_transmitv_ctpio; + vi->ops.transmitv_ctpio_copy = efswxtch_ef_vi_transmitv_ctpio_copy; + vi->ops.transmit_alt_select = efswxtch_ef_vi_transmit_alt_select; + vi->ops.transmit_alt_select_default = + efswxtch_ef_vi_transmit_alt_select_normal; + vi->ops.transmit_alt_stop = efswxtch_ef_vi_transmit_alt_stop; + vi->ops.transmit_alt_go = efswxtch_ef_vi_transmit_alt_go; + vi->ops.transmit_alt_discard = efswxtch_ef_vi_transmit_alt_discard; + vi->ops.receive_init = efswxtch_ef_vi_receive_init; + vi->ops.receive_push = efswxtch_ef_vi_receive_push; + vi->ops.eventq_poll = efswxtch_ef_eventq_poll; + vi->ops.eventq_prime = efswxtch_ef_eventq_prime; + vi->ops.eventq_timer_prime = efswxtch_ef_eventq_timer_prime; + vi->ops.eventq_timer_run = efswxtch_ef_eventq_timer_run; + vi->ops.eventq_timer_clear = efswxtch_ef_eventq_timer_clear; + vi->ops.eventq_timer_zero = efswxtch_ef_eventq_timer_zero; + vi->ops.transmit_memcpy = efswxtch_ef_vi_transmit_memcpy; + vi->ops.transmit_memcpy_sync = efswxtch_ef_vi_transmit_memcpy_sync; + vi->ops.rx_fill_pkt = efswxtch_rx_fill_pkt; + vi->ops.tx_fill_pkt = efswxtch_ef_vi_tx_fill_pkt; + if( vi->vi_flags & EF_VI_TX_CTPIO ) { + vi->ops.transmit_ctpio_fallback = efswxtch_ef_vi_transmit_ctpio_fallback; + vi->ops.transmitv_ctpio_fallback = efswxtch_ef_vi_transmitv_ctpio_fallback; + } else { + vi->ops.transmit_ctpio_fallback = + efswxtch_ef_vi_transmit_ctpio_fallback_not_supp; + vi->ops.transmitv_ctpio_fallback = + efswxtch_ef_vi_transmitv_ctpio_fallback_not_supp; + } + + vi->rx_buffer_len = 2048; + vi->rx_prefix_len = 0; + vi->evq_phase_bits = 1; /* We set this flag for ef_eventq_has_event */ + vi->nic_type.arch = EF_VI_ARCH_SWXTCH; +} diff --git a/src/lib/ciul/efxdp_vi.c b/src/lib/ciul/efxdp_vi.c index 014ba7454..0259b41a3 100644 --- a/src/lib/ciul/efxdp_vi.c +++ b/src/lib/ciul/efxdp_vi.c @@ -7,9 +7,9 @@ * within the macro. */ #ifdef __has_include -# if __has_include("linux/if_xdp.h") -# define HAVE_AF_XDP -# endif +#if __has_include("linux/if_xdp.h") +#define HAVE_AF_XDP +#endif #endif #include "ef_vi_internal.h" @@ -38,7 +38,7 @@ static void efxdp_tx_kick(ef_vi* vi) { if( vi->xdp_kick(vi) == 0 ) { ef_vi_txq_state* qs = &vi->ep_state->txq; - qs->previous = qs->added; + qs->previous = qs->added; } } @@ -48,27 +48,27 @@ static void efxdp_tx_kick(ef_vi* vi) */ static struct efab_af_xdp_offsets* xdp_offsets(ef_vi* vi) { - return (struct efab_af_xdp_offsets*)vi->evq_base; + return (struct efab_af_xdp_offsets*) vi->evq_base; } #define RING_THING(vi, ring, thing) \ - ((void*)(vi->evq_base + xdp_offsets(vi)->rings.ring.thing)) + ((void*) (vi->evq_base + xdp_offsets(vi)->rings.ring.thing)) #define RING_PRODUCER(vi, ring) \ - ((volatile uint32_t*)RING_THING(vi, ring, producer)) + ((volatile uint32_t*) RING_THING(vi, ring, producer)) #define RING_CONSUMER(vi, ring) \ - ((volatile uint32_t*)RING_THING(vi, ring, consumer)) + ((volatile uint32_t*) RING_THING(vi, ring, consumer)) #define RING_DESC(vi, ring) RING_THING(vi, ring, desc) -static int efxdp_ef_vi_transmitv_init(ef_vi* vi, const ef_iovec* iov, - int iov_len, ef_request_id dma_id) +static int efxdp_ef_vi_transmitv_init( + ef_vi* vi, const ef_iovec* iov, int iov_len, ef_request_id dma_id) { - ef_vi_txq* q = &vi->vi_txq; + ef_vi_txq* q = &vi->vi_txq; ef_vi_txq_state* qs = &vi->ep_state->txq; struct xdp_desc* dq = RING_DESC(vi, tx); - int i; + int i; if( iov_len != 1 ) return -EINVAL; /* Multiple buffers per packet not supported */ @@ -76,9 +76,9 @@ static int efxdp_ef_vi_transmitv_init(ef_vi* vi, const ef_iovec* iov, if( qs->added - qs->removed >= q->mask ) return -EAGAIN; - i = qs->added++ & q->mask; + i = qs->added++ & q->mask; dq[i].addr = iov->iov_base; - dq[i].len = iov->iov_len; + dq[i].len = iov->iov_len; EF_VI_BUG_ON(q->ids[i] != EF_REQUEST_ID_MASK); q->ids[i] = dma_id; return 0; @@ -98,15 +98,15 @@ static void efxdp_ef_vi_transmit_push(ef_vi* vi) EF_VI_BUG_ON(vi->ep_state->txq.added == vi->ep_state->txq.previous); if( vi->ep_state->txq.added - vi->ep_state->txq.removed < 3 || (vi->ep_state->txq.added ^ vi->ep_state->txq.previous) / - (AF_XDP_TX_BATCH_MAX >> 2) ) + (AF_XDP_TX_BATCH_MAX >> 2) ) efxdp_tx_kick(vi); } -static int efxdp_ef_vi_transmit(ef_vi* vi, ef_addr base, int len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmit( + ef_vi* vi, ef_addr base, int len, ef_request_id dma_id) { ef_iovec iov = { base, len }; - int rc = efxdp_ef_vi_transmitv_init(vi, &iov, 1, dma_id); + int rc = efxdp_ef_vi_transmitv_init(vi, &iov, 1, dma_id); if( rc == 0 ) { wmb(); efxdp_ef_vi_transmit_push(vi); @@ -114,8 +114,8 @@ static int efxdp_ef_vi_transmit(ef_vi* vi, ef_addr base, int len, return rc; } -static int efxdp_ef_vi_transmitv(ef_vi* vi, const ef_iovec* iov, int iov_len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmitv( + ef_vi* vi, const ef_iovec* iov, int iov_len, ef_request_id dma_id) { int rc = efxdp_ef_vi_transmitv_init(vi, iov, iov_len, dma_id); if( rc == 0 ) { @@ -125,15 +125,14 @@ static int efxdp_ef_vi_transmitv(ef_vi* vi, const ef_iovec* iov, int iov_len, return rc; } -static int efxdp_ef_vi_transmit_pio(ef_vi* vi, int offset, int len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmit_pio( + ef_vi* vi, int offset, int len, ef_request_id dma_id) { return -EOPNOTSUPP; } -static int efxdp_ef_vi_transmit_copy_pio(ef_vi* vi, int offset, - const void* src_buf, int len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmit_copy_pio( + ef_vi* vi, int offset, const void* src_buf, int len, ef_request_id dma_id) { return -EOPNOTSUPP; } @@ -143,54 +142,46 @@ static void efxdp_ef_vi_transmit_pio_warm(ef_vi* vi) /* PIO is unsupported so do nothing */ } -static void efxdp_ef_vi_transmit_copy_pio_warm(ef_vi* vi, int pio_offset, - const void* src_buf, int len) +static void efxdp_ef_vi_transmit_copy_pio_warm( + ef_vi* vi, int pio_offset, const void* src_buf, int len) { /* PIO is unsupported so do nothing */ } static void efxdp_ef_vi_transmitv_ctpio(ef_vi* vi, size_t frame_len, - const struct iovec* iov, int iovcnt, - unsigned threshold) + const struct iovec* iov, int iovcnt, unsigned threshold) { /* CTPIO is unsupported so do nothing. Fallback will send the packet. */ } static void efxdp_ef_vi_transmitv_ctpio_copy(ef_vi* vi, size_t frame_len, - const struct iovec* iov, int iovcnt, - unsigned threshold, void* fallback) + const struct iovec* iov, int iovcnt, unsigned threshold, void* fallback) { // TODO copy to fallback } -static int efxdp_ef_vi_transmit_ctpio_fallback(ef_vi* vi, ef_addr dma_addr, - size_t len, ef_request_id dma_id) +static int efxdp_ef_vi_transmit_ctpio_fallback( + ef_vi* vi, ef_addr dma_addr, size_t len, ef_request_id dma_id) { - EF_VI_ASSERT( vi->vi_flags & EF_VI_TX_CTPIO ); + EF_VI_ASSERT(vi->vi_flags & EF_VI_TX_CTPIO); return efxdp_ef_vi_transmit(vi, dma_addr, len, dma_id); } -static int efxdp_ef_vi_transmitv_ctpio_fallback(ef_vi* vi, - const ef_iovec* dma_iov, - int dma_iov_len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmitv_ctpio_fallback( + ef_vi* vi, const ef_iovec* dma_iov, int dma_iov_len, ef_request_id dma_id) { - EF_VI_ASSERT( vi->vi_flags & EF_VI_TX_CTPIO ); + EF_VI_ASSERT(vi->vi_flags & EF_VI_TX_CTPIO); return efxdp_ef_vi_transmitv(vi, dma_iov, dma_iov_len, dma_id); } -static int efxdp_ef_vi_transmit_ctpio_fallback_not_supp(ef_vi* vi, - ef_addr dma_addr, - size_t len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmit_ctpio_fallback_not_supp( + ef_vi* vi, ef_addr dma_addr, size_t len, ef_request_id dma_id) { return -EOPNOTSUPP; } -static int efxdp_ef_vi_transmitv_ctpio_fallback_not_supp(ef_vi* vi, - const ef_iovec* dma_iov, - int dma_iov_len, - ef_request_id dma_id) +static int efxdp_ef_vi_transmitv_ctpio_fallback_not_supp( + ef_vi* vi, const ef_iovec* dma_iov, int dma_iov_len, ef_request_id dma_id) { return -EOPNOTSUPP; } @@ -221,33 +212,31 @@ static int efxdp_ef_vi_transmit_alt_go(ef_vi* vi, unsigned alt_id) } static ssize_t efxdp_ef_vi_transmit_memcpy(struct ef_vi* vi, - const ef_remote_iovec* dst_iov, - int dst_iov_len, - const ef_remote_iovec* src_iov, - int src_iov_len) + const ef_remote_iovec* dst_iov, int dst_iov_len, + const ef_remote_iovec* src_iov, int src_iov_len) { return -EOPNOTSUPP; } -static int efxdp_ef_vi_transmit_memcpy_sync(struct ef_vi* vi, - ef_request_id dma_id) +static int efxdp_ef_vi_transmit_memcpy_sync( + struct ef_vi* vi, ef_request_id dma_id) { return -EOPNOTSUPP; } /* Note: for AF_XDP devices dma_id is disregarded */ -static int efxdp_ef_vi_receive_init(ef_vi* vi, ef_addr addr, - ef_request_id dma_id) +static int efxdp_ef_vi_receive_init( + ef_vi* vi, ef_addr addr, ef_request_id dma_id) { - ef_vi_rxq* q = &vi->vi_rxq; + ef_vi_rxq* q = &vi->vi_rxq; ef_vi_rxq_state* qs = &vi->ep_state->rxq; - uint64_t* dq = RING_DESC(vi, fr); - int i; + uint64_t* dq = RING_DESC(vi, fr); + int i; if( qs->added - qs->removed >= q->mask ) return -EAGAIN; - i = qs->added++ & q->mask; + i = qs->added++ & q->mask; dq[i] = addr; return 0; } @@ -268,9 +257,7 @@ int efxdp_ef_eventq_check_event(const ef_vi* _vi, int look_ahead) ef_vi* vi = (ef_vi*) _vi; /* drop const */ EF_VI_ASSERT(vi->evq_base); EF_VI_BUG_ON(look_ahead < 0); - return *RING_CONSUMER(vi, rx) - *RING_PRODUCER(vi, rx) + - *RING_CONSUMER(vi, cr) - *RING_PRODUCER(vi, cr) - > look_ahead; + return 0; } @@ -278,6 +265,10 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) { int n = 0; + /* We can't let the control planes version get out of sync with our userspace + * app */ + return 0; + /* rx_buffer_len is power of two */ EF_VI_ASSERT(((vi->rx_buffer_len - 1) & vi->rx_buffer_len) == 0); @@ -287,15 +278,15 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) uint32_t prod = *RING_PRODUCER(vi, rx); if( cons != prod ) { - ef_vi_rxq* q = &vi->vi_rxq; + ef_vi_rxq* q = &vi->vi_rxq; ef_vi_rxq_state* qs = &vi->ep_state->rxq; struct xdp_desc* dq = RING_DESC(vi, rx); do { unsigned desc_i = qs->removed++ & q->mask; - evs[n].rx.type = EF_EVENT_TYPE_RX; - evs[n].rx.q_id = 0; + evs[n].rx.type = EF_EVENT_TYPE_RX; + evs[n].rx.q_id = 0; /* AF_XDP devices do not use dma_ids as * FIFO behaviour of rx ring is not guaranteed (Zerocopy). @@ -306,21 +297,21 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) * for the client to resolve themselves. */ evs[n].rx.rq_id = dq[desc_i].addr / vi->rx_buffer_len; - q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ + q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ /* FIXME: handle jumbo, multicast */ evs[n].rx.flags = EF_EVENT_FLAG_SOP; /* In case of AF_XDP offset of the placement of payload from * the beginning of the packet buffer may vary. */ - evs[n].rx.ofs = dq[desc_i].addr & (vi->rx_buffer_len - 1); - evs[n].rx.len = dq[desc_i].len; + evs[n].rx.ofs = dq[desc_i].addr & (vi->rx_buffer_len - 1); + evs[n].rx.len = dq[desc_i].len; ++n; ++cons; } while( cons != prod && n != evs_len ); - /* Full memory barrier needed to ensure the descriptors aren't overwritten - * by incoming packets before the read accesses above */ + /* Full memory barrier needed to ensure the descriptors aren't + * overwritten by incoming packets before the read accesses above */ ci_mb(); *RING_CONSUMER(vi, rx) = cons; } @@ -338,10 +329,10 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) else cons += EF_VI_TRANSMIT_BATCH; - evs[n].tx.type = EF_EVENT_TYPE_TX; + evs[n].tx.type = EF_EVENT_TYPE_TX; evs[n].tx.desc_id = cons; - evs[n].tx.flags = 0; - evs[n].tx.q_id = 0; + evs[n].tx.flags = 0; + evs[n].tx.q_id = 0; ++n; } while( cons != prod && n != evs_len ); @@ -349,7 +340,6 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) * We just recorded the value of 'cons` for later use to access `q->ids` * from `ef_vi_transmit_unbundle`. */ *RING_CONSUMER(vi, cr) = cons; - } } if( efxdp_tx_need_kick(vi) ) @@ -382,44 +372,43 @@ void efxdp_vi_init(ef_vi* vi) { EF_VI_BUILD_ASSERT(EFAB_AF_XDP_DESC_BYTES == sizeof(struct xdp_desc)); - vi->ops.transmit = efxdp_ef_vi_transmit; - vi->ops.transmitv = efxdp_ef_vi_transmitv; - vi->ops.transmitv_init = efxdp_ef_vi_transmitv_init; - vi->ops.transmit_push = efxdp_ef_vi_transmit_push; - vi->ops.transmit_pio = efxdp_ef_vi_transmit_pio; - vi->ops.transmit_copy_pio = efxdp_ef_vi_transmit_copy_pio; - vi->ops.transmit_pio_warm = efxdp_ef_vi_transmit_pio_warm; - vi->ops.transmit_copy_pio_warm = efxdp_ef_vi_transmit_copy_pio_warm; - vi->ops.transmitv_ctpio = efxdp_ef_vi_transmitv_ctpio; - vi->ops.transmitv_ctpio_copy = efxdp_ef_vi_transmitv_ctpio_copy; - vi->ops.transmit_alt_select = efxdp_ef_vi_transmit_alt_select; + vi->ops.transmit = efxdp_ef_vi_transmit; + vi->ops.transmitv = efxdp_ef_vi_transmitv; + vi->ops.transmitv_init = efxdp_ef_vi_transmitv_init; + vi->ops.transmit_push = efxdp_ef_vi_transmit_push; + vi->ops.transmit_pio = efxdp_ef_vi_transmit_pio; + vi->ops.transmit_copy_pio = efxdp_ef_vi_transmit_copy_pio; + vi->ops.transmit_pio_warm = efxdp_ef_vi_transmit_pio_warm; + vi->ops.transmit_copy_pio_warm = efxdp_ef_vi_transmit_copy_pio_warm; + vi->ops.transmitv_ctpio = efxdp_ef_vi_transmitv_ctpio; + vi->ops.transmitv_ctpio_copy = efxdp_ef_vi_transmitv_ctpio_copy; + vi->ops.transmit_alt_select = efxdp_ef_vi_transmit_alt_select; vi->ops.transmit_alt_select_default = efxdp_ef_vi_transmit_alt_select_normal; - vi->ops.transmit_alt_stop = efxdp_ef_vi_transmit_alt_stop; - vi->ops.transmit_alt_go = efxdp_ef_vi_transmit_alt_go; - vi->ops.transmit_alt_discard = efxdp_ef_vi_transmit_alt_discard; - vi->ops.receive_init = efxdp_ef_vi_receive_init; - vi->ops.receive_push = efxdp_ef_vi_receive_push; - vi->ops.eventq_poll = efxdp_ef_eventq_poll; - vi->ops.eventq_prime = efxdp_ef_eventq_prime; - vi->ops.eventq_timer_prime = efxdp_ef_eventq_timer_prime; - vi->ops.eventq_timer_run = efxdp_ef_eventq_timer_run; - vi->ops.eventq_timer_clear = efxdp_ef_eventq_timer_clear; - vi->ops.eventq_timer_zero = efxdp_ef_eventq_timer_zero; - vi->ops.transmit_memcpy = efxdp_ef_vi_transmit_memcpy; - vi->ops.transmit_memcpy_sync = efxdp_ef_vi_transmit_memcpy_sync; + vi->ops.transmit_alt_stop = efxdp_ef_vi_transmit_alt_stop; + vi->ops.transmit_alt_go = efxdp_ef_vi_transmit_alt_go; + vi->ops.transmit_alt_discard = efxdp_ef_vi_transmit_alt_discard; + vi->ops.receive_init = efxdp_ef_vi_receive_init; + vi->ops.receive_push = efxdp_ef_vi_receive_push; + vi->ops.eventq_poll = efxdp_ef_eventq_poll; + vi->ops.eventq_prime = efxdp_ef_eventq_prime; + vi->ops.eventq_timer_prime = efxdp_ef_eventq_timer_prime; + vi->ops.eventq_timer_run = efxdp_ef_eventq_timer_run; + vi->ops.eventq_timer_clear = efxdp_ef_eventq_timer_clear; + vi->ops.eventq_timer_zero = efxdp_ef_eventq_timer_zero; + vi->ops.transmit_memcpy = efxdp_ef_vi_transmit_memcpy; + vi->ops.transmit_memcpy_sync = efxdp_ef_vi_transmit_memcpy_sync; if( vi->vi_flags & EF_VI_TX_CTPIO ) { - vi->ops.transmit_ctpio_fallback = efxdp_ef_vi_transmit_ctpio_fallback; + vi->ops.transmit_ctpio_fallback = efxdp_ef_vi_transmit_ctpio_fallback; vi->ops.transmitv_ctpio_fallback = efxdp_ef_vi_transmitv_ctpio_fallback; - } - else { + } else { vi->ops.transmit_ctpio_fallback = - efxdp_ef_vi_transmit_ctpio_fallback_not_supp; + efxdp_ef_vi_transmit_ctpio_fallback_not_supp; vi->ops.transmitv_ctpio_fallback = - efxdp_ef_vi_transmitv_ctpio_fallback_not_supp; + efxdp_ef_vi_transmitv_ctpio_fallback_not_supp; } - vi->rx_buffer_len = 2048; - vi->rx_prefix_len = 0; + vi->rx_buffer_len = 2048; + vi->rx_prefix_len = 0; vi->evq_phase_bits = 1; /* We set this flag for ef_eventq_has_event */ } @@ -429,6 +418,12 @@ long efxdp_vi_mmap_bytes(ef_vi* vi) } #else void efxdp_vi_init(ef_vi* vi) {} -long efxdp_vi_mmap_bytes(ef_vi* vi) { return 0; } -int efxdp_ef_eventq_check_event(const ef_vi* _vi, int look_ahead) { return 0; } +long efxdp_vi_mmap_bytes(ef_vi* vi) +{ + return 0; +} +int efxdp_ef_eventq_check_event(const ef_vi* _vi, int look_ahead) +{ + return 0; +} #endif diff --git a/src/lib/ciul/mmake.mk b/src/lib/ciul/mmake.mk index eb0534ac8..625802bd2 100644 --- a/src/lib/ciul/mmake.mk +++ b/src/lib/ciul/mmake.mk @@ -9,6 +9,10 @@ TARGETS := $(CIUL_LIB) endif MMAKE_TYPE := LIB +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu + + # Standalone subset for descriptor munging only. EFVI_SRCS := \ pt_tx.c \ @@ -46,6 +50,7 @@ LIB_SRCS += \ vi_discard.c \ capabilities.c \ smartnic_exts.c \ + efswxtch_vi.c \ ctpio.c # librt is needed on old glibc, e.g. on RHEL 6 diff --git a/src/lib/ciul/vi_init.c b/src/lib/ciul/vi_init.c index e0ab45626..3b987b857 100644 --- a/src/lib/ciul/vi_init.c +++ b/src/lib/ciul/vi_init.c @@ -20,9 +20,9 @@ #include #endif -#define EF_VI_STATE_BYTES(rxq_sz, txq_sz) \ - (sizeof(ef_vi_state) + (rxq_sz) * sizeof(uint32_t) \ - + (txq_sz) * sizeof(uint32_t)) +#define EF_VI_STATE_BYTES(rxq_sz, txq_sz) \ + (sizeof(ef_vi_state) + (rxq_sz) * sizeof(uint32_t) + \ + (txq_sz) * sizeof(uint32_t)) unsigned ef_vi_evq_clear_stride(void) @@ -33,11 +33,11 @@ unsigned ef_vi_evq_clear_stride(void) return atoi(s); #endif -# ifdef __x86_64__ +#ifdef __x86_64__ return sys_is_numa() ? EF_VI_EVS_PER_CACHE_LINE : 0; -# else +#else return EF_VI_EVS_PER_CACHE_LINE; -# endif +#endif } @@ -79,7 +79,7 @@ void ef_vi_init_state(ef_vi* vi) int ef_vi_add_queue(ef_vi* evq_vi, ef_vi* add_vi) { int q_label; - if (evq_vi->vi_qs_n == EF_VI_MAX_QS) + if( evq_vi->vi_qs_n == EF_VI_MAX_QS ) return -EBUSY; q_label = evq_vi->vi_qs_n++; EF_VI_BUG_ON(evq_vi->vi_qs[q_label] != NULL); @@ -115,11 +115,11 @@ const char* ef_vi_driver_interface_str(void) int ef_vi_rxq_reinit(ef_vi* vi, ef_vi_reinit_callback cb, void* cb_arg) { ef_vi_state* state = vi->ep_state; - int di; - + int di; + /* shared rxqs always claim to have a full rxq because buffer posting is * managed elsewhere, but it's a lie. */ - if( vi->vi_rxq.mask && !vi->max_efct_rxq ) { + if( vi->vi_rxq.mask && ! vi->max_efct_rxq ) { while( state->rxq.removed < state->rxq.added ) { di = state->rxq.removed & vi->vi_rxq.mask; BUG_ON(vi->vi_rxq.ids[di] == EF_REQUEST_ID_MASK); @@ -138,7 +138,7 @@ int ef_vi_rxq_reinit(ef_vi* vi, ef_vi_reinit_callback cb, void* cb_arg) int ef_vi_txq_reinit(ef_vi* vi, ef_vi_reinit_callback cb, void* cb_arg) { ef_vi_state* state = vi->ep_state; - int di; + int di; while( state->txq.removed < state->txq.added ) { di = state->txq.removed & vi->vi_txq.mask; @@ -156,7 +156,7 @@ int ef_vi_txq_reinit(ef_vi* vi, ef_vi_reinit_callback cb, void* cb_arg) int ef_vi_evq_reinit(ef_vi* vi) { - memset(vi->evq_base, (char)0xff, vi->evq_mask + 1); + memset(vi->evq_base, (char) 0xff, vi->evq_mask + 1); vi->ep_state->evq.evq_ptr = 0; return 0; } @@ -169,56 +169,57 @@ int ef_vi_evq_reinit(ef_vi* vi) static int ef_vi_calc_rxq_descriptors_bytes(enum ef_vi_arch arch, int qsize) { switch( arch ) { - case EF_VI_ARCH_EF10: - case EF_VI_ARCH_EF100: - return 8 * qsize; - case EF_VI_ARCH_EFCT: - return EFCT_RX_DESCRIPTOR_BYTES * CI_EFCT_MAX_SUPERBUFS * - EF_VI_MAX_EFCT_RXQS; - default: - EF_VI_BUG_ON(1); - return 8 * qsize; + case EF_VI_ARCH_EF10: + case EF_VI_ARCH_EF100: + return 8 * qsize; + case EF_VI_ARCH_EFCT: + return EFCT_RX_DESCRIPTOR_BYTES * CI_EFCT_MAX_SUPERBUFS * + EF_VI_MAX_EFCT_RXQS; + default: + EF_VI_BUG_ON(1); + return 8 * qsize; } } static int tx_desc_bytes(struct ef_vi* vi) { switch( vi->nic_type.arch ) { - case EF_VI_ARCH_EF10: - return 8; - case EF_VI_ARCH_EF100: - return 16; - case EF_VI_ARCH_EFCT: - return EFCT_TX_DESCRIPTOR_BYTES; - default: - EF_VI_BUG_ON(1); - return 8; + case EF_VI_ARCH_EF10: + return 8; + case EF_VI_ARCH_EF100: + return 16; + case EF_VI_ARCH_EFCT: + return EFCT_TX_DESCRIPTOR_BYTES; + default: + EF_VI_BUG_ON(1); + return 8; } } static int tx_fifo_bytes(struct ef_vi* vi) { switch( vi->nic_type.arch ) { - case EF_VI_ARCH_EF10: - case EF_VI_ARCH_EF100: - case EF_VI_ARCH_AF_XDP: - /* No FIFO, so return a large number to indicate no limit */ - return INT_MAX; - case EF_VI_ARCH_EFCT: - /* 32k FIFO, reduced by 8 bytes for the TX header. Hardware reduces this - * by one cache line to make their overflow tracking easier */ - return EFCT_TX_FIFO_BYTES - EFCT_TX_ALIGNMENT - EFCT_TX_HEADER_BYTES; - default: - EF_VI_BUG_ON(1); - return 0; + case EF_VI_ARCH_EF10: + case EF_VI_ARCH_EF100: + case EF_VI_ARCH_AF_XDP: + case EF_VI_ARCH_SWXTCH: + /* No FIFO, so return a large number to indicate no limit */ + return INT_MAX; + case EF_VI_ARCH_EFCT: + /* 32k FIFO, reduced by 8 bytes for the TX header. Hardware reduces this + * by one cache line to make their overflow tracking easier */ + return EFCT_TX_FIFO_BYTES - EFCT_TX_ALIGNMENT - EFCT_TX_HEADER_BYTES; + default: + EF_VI_BUG_ON(1); + return 0; } } int ef_vi_rx_ring_bytes(struct ef_vi* vi) { EF_VI_ASSERT(vi->inited & EF_VI_INITED_RXQ); - return ef_vi_calc_rxq_descriptors_bytes(vi->nic_type.arch, - vi->vi_rxq.mask + 1); + return ef_vi_calc_rxq_descriptors_bytes( + vi->nic_type.arch, vi->vi_rxq.mask + 1); } @@ -230,41 +231,46 @@ int ef_vi_tx_ring_bytes(struct ef_vi* vi) int ef_vi_init(struct ef_vi* vi, int arch, int variant, int revision, - unsigned ef_vi_flags, unsigned char nic_flags, - ef_vi_state* state) + unsigned ef_vi_flags, unsigned char nic_flags, ef_vi_state* state) { memset(vi, 0, sizeof(*vi)); /* vi->vi_qs_n = 0; */ /* vi->inited = 0; */ /* vi->vi_i = 0; */ - vi->nic_type.arch = arch; - vi->nic_type.variant = variant; - vi->nic_type.revision = revision; + vi->nic_type.arch = arch; + vi->nic_type.variant = variant; + vi->nic_type.revision = revision; vi->nic_type.nic_flags = nic_flags; - vi->vi_flags = (enum ef_vi_flags) ef_vi_flags; - vi->ep_state = state; + vi->vi_flags = (enum ef_vi_flags) ef_vi_flags; + vi->ep_state = state; /* vi->vi_stats = NULL; */ /* vi->io = NULL; */ /* vi->linked_pio = NULL; */ /* vi->tx_alt_num = 0; */ /* vi->tx_alt_ids = NULL; */ - vi->vi_is_normal = !(ef_vi_flags & EF_VI_RX_EVENT_MERGE) && - !(ef_vi_flags & EF_VI_RX_PACKED_STREAM); + vi->vi_is_normal = ! (ef_vi_flags & EF_VI_RX_EVENT_MERGE) && + ! (ef_vi_flags & EF_VI_RX_PACKED_STREAM); switch( arch ) { - case EF_VI_ARCH_EF10: - ef10_vi_init(vi); - break; - case EF_VI_ARCH_EF100: - ef100_vi_init(vi); - break; - case EF_VI_ARCH_EFCT: - efct_vi_init(vi); - break; - case EF_VI_ARCH_AF_XDP: - efxdp_vi_init(vi); - break; - default: - return -EINVAL; + case EF_VI_ARCH_EF10: + ef10_vi_init(vi); + break; + case EF_VI_ARCH_EF100: + ef100_vi_init(vi); + break; + case EF_VI_ARCH_EFCT: + efct_vi_init(vi); + break; + case EF_VI_ARCH_AF_XDP: +#ifndef __KERNEL__ + /* In the control plane we still need the xdp implementation for + * consistency even though we disable it almost entirely*/ + efswxtch_vi_init(vi); +#else + efxdp_vi_init(vi); +#endif + break; + default: + return -EINVAL; } vi->inited |= EF_VI_INITED_NIC; return 0; @@ -274,34 +280,36 @@ int ef_vi_init(struct ef_vi* vi, int arch, int variant, int revision, void ef_vi_init_io(struct ef_vi* vi, void* io_area) { EF_VI_BUG_ON(vi->inited & EF_VI_INITED_IO); - EF_VI_BUG_ON((vi->nic_type.arch != EF_VI_ARCH_AF_XDP) && io_area == NULL); + EF_VI_BUG_ON(! (vi->nic_type.arch == EF_VI_ARCH_AF_XDP || + vi->nic_type.arch == EF_VI_ARCH_SWXTCH) && + io_area == NULL); vi->io = io_area; vi->inited |= EF_VI_INITED_IO; } void ef_vi_init_rxq(struct ef_vi* vi, int ring_size, void* descriptors, - void* ids, int prefix_len) + void* ids, int prefix_len) { EF_VI_BUG_ON(vi->inited & EF_VI_INITED_RXQ); EF_VI_BUG_ON(ring_size & (ring_size - 1)); /* not power-of-2 */ - vi->vi_rxq.mask = ring_size - 1; + vi->vi_rxq.mask = ring_size - 1; vi->vi_rxq.descriptors = descriptors; - vi->vi_rxq.ids = ids; - vi->rx_prefix_len = prefix_len; + vi->vi_rxq.ids = ids; + vi->rx_prefix_len = prefix_len; vi->inited |= EF_VI_INITED_RXQ; } -void ef_vi_init_txq(struct ef_vi* vi, int ring_size, void* descriptors, - void* ids) +void ef_vi_init_txq( + struct ef_vi* vi, int ring_size, void* descriptors, void* ids) { EF_VI_BUG_ON(vi->inited & EF_VI_INITED_TXQ); - vi->vi_txq.mask = ring_size - 1; + vi->vi_txq.mask = ring_size - 1; vi->vi_txq.ct_fifo_bytes = tx_fifo_bytes(vi); - vi->vi_txq.descriptors = descriptors; - vi->vi_txq.ids = ids; - vi->tx_push_thresh = 16; + vi->vi_txq.descriptors = descriptors; + vi->vi_txq.ids = ids; + vi->tx_push_thresh = 16; if( vi->vi_flags & EF_VI_TX_PUSH_DISABLE ) vi->tx_push_thresh = 0; if( vi->vi_flags & EF_VI_TX_PUSH_ALWAYS ) @@ -311,7 +319,7 @@ void ef_vi_init_txq(struct ef_vi* vi, int ring_size, void* descriptors, static char* ef_vi_xdp_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, - int rxq_size, int rx_prefix_len, int txq_size) + int rxq_size, int rx_prefix_len, int txq_size) { /* We need to initialise event queue to access things in the mapped memory */ ef_vi_init_evq(vi, 1, q_mem); @@ -323,8 +331,7 @@ static char* ef_vi_xdp_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, static char* ef_vi_sfc_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, - int evq_size, int rxq_size, int rx_prefix_len, - int txq_size) + int evq_size, int rxq_size, int rx_prefix_len, int txq_size) { if( evq_size ) { ef_vi_init_evq(vi, evq_size, q_mem); @@ -332,27 +339,28 @@ static char* ef_vi_sfc_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, } if( rxq_size ) { ef_vi_init_rxq(vi, rxq_size, q_mem, ids, rx_prefix_len); - q_mem += (ef_vi_rx_ring_bytes(vi) + CI_PAGE_SIZE-1) & CI_PAGE_MASK; + q_mem += (ef_vi_rx_ring_bytes(vi) + CI_PAGE_SIZE - 1) & CI_PAGE_MASK; ids += rxq_size; } if( txq_size ) { ef_vi_init_txq(vi, txq_size, q_mem, ids); - q_mem += (ef_vi_tx_ring_bytes(vi) + CI_PAGE_SIZE-1) & CI_PAGE_MASK; + q_mem += (ef_vi_tx_ring_bytes(vi) + CI_PAGE_SIZE - 1) & CI_PAGE_MASK; } return q_mem; } -char* ef_vi_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, - int evq_size, int rxq_size, int rx_prefix_len, - int txq_size) +char* ef_vi_init_qs(struct ef_vi* vi, char* q_mem, uint32_t* ids, int evq_size, + int rxq_size, int rx_prefix_len, int txq_size) { - if( vi->nic_type.arch == EF_VI_ARCH_AF_XDP ) - return ef_vi_xdp_init_qs(vi, q_mem, ids, rxq_size, rx_prefix_len, txq_size); + if( vi->nic_type.arch == EF_VI_ARCH_AF_XDP || + vi->nic_type.arch == EF_VI_ARCH_SWXTCH ) + return ef_vi_xdp_init_qs( + vi, q_mem, ids, rxq_size, rx_prefix_len, txq_size); else - return ef_vi_sfc_init_qs(vi, q_mem, ids, evq_size, rxq_size, - rx_prefix_len, txq_size); + return ef_vi_sfc_init_qs( + vi, q_mem, ids, evq_size, rxq_size, rx_prefix_len, txq_size); } @@ -391,9 +399,10 @@ void ef_vi_init_rx_timestamping(struct ef_vi* vi, int rx_ts_correction) * We should only get here on Medford II or later, so use a * value that we know is appropriate for that hardware. */ - LOG(ef_log("%s: ERROR: NIC returned zero timestamp correction. " - "Firmware update required to get accurate timestamps.", - __FUNCTION__)); + LOG( + ef_log("%s: ERROR: NIC returned zero timestamp correction. " + "Firmware update required to get accurate timestamps.", + __FUNCTION__)); vi->rx_ts_correction = -76; } @@ -417,14 +426,14 @@ void ef_vi_init_tx_timestamping(struct ef_vi* vi, int tx_ts_correction) * medford2 and later. */ if( vi->nic_type.variant >= 'C' ) - tx_ts_correction /= 4; /* convert to ns */ + tx_ts_correction /= 4; /* convert to ns */ /* Bottom two bits of the nsec field contain the sync flags, and we * don't want to affect those when we add in the correction, so - * ensure those bits are zero + * ensure those bits are zero */ vi->tx_ts_correction_ns = - tx_ts_correction &~ EF_EVENT_TX_WITH_TIMESTAMP_SYNC_MASK; + tx_ts_correction & ~EF_EVENT_TX_WITH_TIMESTAMP_SYNC_MASK; vi->inited |= EF_VI_INITED_TX_TIMESTAMPING; } @@ -439,18 +448,18 @@ void ef_vi_init_out_flags(struct ef_vi* vi, unsigned flags) void ef_vi_reset_rxq(struct ef_vi* vi) { ef_vi_rxq_state* qs = &vi->ep_state->rxq; - qs->posted = 0; + qs->posted = 0; /* shared rxqs have their buffer posting managed elsewhere, not by the app, * so let's make it look like the queue is constantly full */ if( vi->max_efct_rxq ) qs->added = vi->vi_rxq.mask + 1; else qs->added = 0; - qs->removed = 0; - qs->in_jumbo = 0; - qs->bytes_acc = 0; + qs->removed = 0; + qs->in_jumbo = 0; + qs->bytes_acc = 0; qs->rx_ps_credit_avail = 1; - qs->last_desc_i = vi->vi_is_packed_stream ? vi->vi_rxq.mask : 0; + qs->last_desc_i = vi->vi_is_packed_stream ? vi->vi_rxq.mask : 0; if( vi->vi_rxq.mask ) { int i; for( i = 0; i <= vi->vi_rxq.mask; ++i ) @@ -462,12 +471,12 @@ void ef_vi_reset_rxq(struct ef_vi* vi) void ef_vi_reset_txq(struct ef_vi* vi) { ef_vi_txq_state* qs = &vi->ep_state->txq; - qs->previous = 0; - qs->added = 0; - qs->removed = 0; - qs->ct_added = 0; - qs->ct_removed = 0; - qs->ts_nsec = EF_VI_TX_TIMESTAMP_TS_NSEC_INVALID; + qs->previous = 0; + qs->added = 0; + qs->removed = 0; + qs->ct_added = 0; + qs->ct_removed = 0; + qs->ts_nsec = EF_VI_TX_TIMESTAMP_TS_NSEC_INVALID; if( vi->vi_txq.mask ) { int i; @@ -481,19 +490,21 @@ void ef_vi_reset_evq(struct ef_vi* vi, int clear_ring) { if( clear_ring ) memset(vi->evq_base, (char) 0xff, vi->evq_mask + 1); - vi->ep_state->evq.evq_ptr = 0; + vi->ep_state->evq.evq_ptr = 0; vi->ep_state->evq.evq_clear_stride = -((int) ef_vi_evq_clear_stride()); - EF_VI_BUG_ON( vi->ep_state->evq.evq_clear_stride > 0 ); + EF_VI_BUG_ON(vi->ep_state->evq.evq_clear_stride > 0); vi->ep_state->evq.sync_timestamp_synchronised = 0; - vi->ep_state->evq.sync_timestamp_major = ~0u; - /* Set unsol_seq to default, but leave 1 credit-space in reserve for overflow event. */ + vi->ep_state->evq.sync_timestamp_major = ~0u; + /* Set unsol_seq to default, but leave 1 credit-space in reserve for overflow + * event. */ vi->ep_state->evq.unsol_credit_seq = CI_CFG_TIME_SYNC_EVENT_EVQ_CAPACITY - 1; - vi->ep_state->evq.sync_flags = 0; + vi->ep_state->evq.sync_flags = 0; } int ef_eventq_capacity(ef_vi* vi) { - EF_VI_ASSERT( vi->ep_state->evq.evq_clear_stride <= 0 ); - return vi->evq_mask / EF_VI_EV_SIZE - 1u + vi->ep_state->evq.evq_clear_stride; + EF_VI_ASSERT(vi->ep_state->evq.evq_clear_stride <= 0); + return vi->evq_mask / EF_VI_EV_SIZE - 1u + + vi->ep_state->evq.evq_clear_stride; } diff --git a/src/lib/efthrm/tcp_helper_resource.c b/src/lib/efthrm/tcp_helper_resource.c index cf25b1c0a..08976c050 100644 --- a/src/lib/efthrm/tcp_helper_resource.c +++ b/src/lib/efthrm/tcp_helper_resource.c @@ -52,20 +52,20 @@ #include #ifdef NDEBUG -# define DEBUG_STR "" +#define DEBUG_STR "" #else -# define DEBUG_STR " debug" +#define DEBUG_STR " debug" #endif #if CI_CFG_PKT_BUF_SIZE == EFHW_NIC_PAGE_SIZE #define HW_PAGES_PER_SET_S CI_CFG_PKTS_PER_SET_S -#define PKTS_PER_HW_PAGE 1 +#define PKTS_PER_HW_PAGE 1 #elif CI_CFG_PKT_BUF_SIZE * 2 == EFHW_NIC_PAGE_SIZE #define HW_PAGES_PER_SET_S (CI_CFG_PKTS_PER_SET_S - 1) -#define PKTS_PER_HW_PAGE 2 +#define PKTS_PER_HW_PAGE 2 #elif CI_CFG_PKT_BUF_SIZE * 4 == EFHW_NIC_PAGE_SIZE #define HW_PAGES_PER_SET_S (CI_CFG_PKTS_PER_SET_S - 2) -#define PKTS_PER_HW_PAGE 4 +#define PKTS_PER_HW_PAGE 4 #else #error "Unknown value for CI_CFG_PKT_BUF_SIZE" #endif @@ -78,25 +78,25 @@ #define EFAB_THR_MAX_NUM_INSTANCES 0x00010000 -static const unsigned EFCT_HUGEPAGES_PER_RXQ = 2; /* EFCT TODO: un-hardcode */ +static const unsigned EFCT_HUGEPAGES_PER_RXQ = 2; /* EFCT TODO: un-hardcode */ /* Provides upper limit to EF_MAX_PACKETS. default is 512K packets, - * which equates to roughly 1GB of memory + * which equates to roughly 1GB of memory */ static unsigned max_packets_per_stack = 0x80000; module_param(max_packets_per_stack, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(max_packets_per_stack, - "Limit the number of packet buffers that each Onload stack " - "can allocate. This module option places an upper limit " - "on the EF_MAX_PACKETS option. Changes to this module " - "option are not applied retrospectively to stacks already " - "existing before the change."); + "Limit the number of packet buffers that each Onload stack " + "can allocate. This module option places an upper limit " + "on the EF_MAX_PACKETS option. Changes to this module " + "option are not applied retrospectively to stacks already " + "existing before the change."); static int allow_insecure_setuid_sharing; module_param(allow_insecure_setuid_sharing, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(allow_insecure_setuid_sharing, - "Override default security rules and allow setuid processes " - "to map Onload stacks created by other users."); + "Override default security rules and allow setuid processes " + "to map Onload stacks created by other users."); #ifdef CONFIG_PREEMPT unsigned long oo_avoid_wakeup_under_pressure = 1; @@ -105,74 +105,64 @@ unsigned long oo_avoid_wakeup_under_pressure = 0; #endif module_param(oo_avoid_wakeup_under_pressure, ulong, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(oo_avoid_wakeup_under_pressure, - "Avoid endpoint wakeups for this number of jiffies after " - "NAPI budget limited interrupt handler. This is typically " - "needed on realtime kernels, where you can see " - "\"stall on CPU\" messages when this value is set to 0."); + "Avoid endpoint wakeups for this number of jiffies after " + "NAPI budget limited interrupt handler. This is typically " + "needed on realtime kernels, where you can see " + "\"stall on CPU\" messages when this value is set to 0."); DEFINE_PER_CPU(unsigned long, oo_budget_limit_last_ts); #if HZ < 100 -# error FIXME: Not able to cope with low HZ at the moment. +#error FIXME: Not able to cope with low HZ at the moment. #endif - /* Periodic timer fires roughly 10 times per sec. */ -#define CI_TCP_HELPER_PERIODIC_BASE_T ((unsigned long)(HZ*9/100)) -#define CI_TCP_HELPER_PERIODIC_FLOAT_T ((unsigned long)(HZ*1/100)) +/* Periodic timer fires roughly 10 times per sec. */ +#define CI_TCP_HELPER_PERIODIC_BASE_T ((unsigned long) (HZ * 9 / 100)) +#define CI_TCP_HELPER_PERIODIC_FLOAT_T ((unsigned long) (HZ * 1 / 100)) unsigned long periodic_poll = CI_TCP_HELPER_PERIODIC_BASE_T; unsigned long periodic_poll_skew = CI_TCP_HELPER_PERIODIC_FLOAT_T; module_param(periodic_poll, ulong, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(periodic_poll, - "Number of jiffies between periodic polls of " - "any Onload stack. Defaults to 90ms."); + "Number of jiffies between periodic polls of " + "any Onload stack. Defaults to 90ms."); module_param(periodic_poll_skew, ulong, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(periodic_poll_skew, - "Allowed time skew for periodic polls. " - "Defaults to 10ms."); + "Allowed time skew for periodic polls. " + "Defaults to 10ms."); /* Global structure for onload driver */ efab_tcp_driver_t efab_tcp_driver; -static void -efab_tcp_helper_rm_free_locked(tcp_helper_resource_t*); +static void efab_tcp_helper_rm_free_locked(tcp_helper_resource_t*); #if ! CI_CFG_UL_INTERRUPT_HELPER -static void -efab_tcp_helper_rm_schedule_free(tcp_helper_resource_t*); +static void efab_tcp_helper_rm_schedule_free(tcp_helper_resource_t*); #endif #if ! CI_CFG_UL_INTERRUPT_HELPER -static int -oo_handle_wakeup_int_driven(void*, int is_timeout, - struct efhw_nic*, int budget); -static int -oo_handle_wakeup_or_timeout(void*, int is_timeout, - struct efhw_nic*, int budget); -static void -tcp_helper_initialize_and_start_periodic_timer(tcp_helper_resource_t*); -static void -tcp_helper_stop_periodic_work(tcp_helper_resource_t*); +static int oo_handle_wakeup_int_driven( + void*, int is_timeout, struct efhw_nic*, int budget); +static int oo_handle_wakeup_or_timeout( + void*, int is_timeout, struct efhw_nic*, int budget); +static void tcp_helper_initialize_and_start_periodic_timer( + tcp_helper_resource_t*); +static void tcp_helper_stop_periodic_work(tcp_helper_resource_t*); -static void -tcp_helper_close_pending_endpoints(tcp_helper_resource_t*); +static void tcp_helper_close_pending_endpoints(tcp_helper_resource_t*); #endif #if CI_CFG_NIC_RESET_SUPPORT -static void -tcp_helper_purge_txq_work(struct work_struct *data); +static void tcp_helper_purge_txq_work(struct work_struct* data); -static void -tcp_helper_reset_stack_work(struct work_struct *data); +static void tcp_helper_reset_stack_work(struct work_struct* data); #endif #if CI_CFG_EPOLL3 -static void -get_os_ready_list(tcp_helper_resource_t* thr, int ready_list); +static void get_os_ready_list(tcp_helper_resource_t* thr, int ready_list); #endif -static void -efab_tcp_helper_drop_os_socket(tcp_helper_resource_t* trs, - tcp_helper_endpoint_t* ep); +static void efab_tcp_helper_drop_os_socket( + tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep); /* Allocate a block of IDs from the pool of ID blocks */ static int efab_ipid_alloc(efab_ipid_cb_t* ipid); @@ -188,27 +178,25 @@ static int efab_ipid_free(efab_ipid_cb_t* ipid, int base); * *---------------------------------------------------------------------------*/ -ci_inline int -oo_trusted_lock_is_locked(tcp_helper_resource_t* trs) +ci_inline int oo_trusted_lock_is_locked(tcp_helper_resource_t* trs) { return trs->trusted_lock & OO_TRUSTED_LOCK_LOCKED; } -static int -oo_trusted_lock_try_lock(tcp_helper_resource_t* trs) +static int oo_trusted_lock_try_lock(tcp_helper_resource_t* trs) { return trs->trusted_lock == OO_TRUSTED_LOCK_UNLOCKED && - ci_cas32u_succeed(&trs->trusted_lock, OO_TRUSTED_LOCK_UNLOCKED, - OO_TRUSTED_LOCK_LOCKED); + ci_cas32u_succeed(&trs->trusted_lock, OO_TRUSTED_LOCK_UNLOCKED, + OO_TRUSTED_LOCK_LOCKED); } /* Returns true if flags were set, or false if the lock was not locked. * NB. We ignore flags if AWAITING_FREE. */ -static int -oo_trusted_lock_set_flags_if_locked(tcp_helper_resource_t* trs, unsigned flags) +static int oo_trusted_lock_set_flags_if_locked( + tcp_helper_resource_t* trs, unsigned flags) { unsigned l; @@ -229,19 +217,18 @@ oo_trusted_lock_set_flags_if_locked(tcp_helper_resource_t* trs, unsigned flags) * 1 if unlock has been deferred * If has_shared is set both locks would get deferred. */ -static int -oo_trusted_lock_drop(tcp_helper_resource_t* trs, - int in_dl_context, int has_shared) +static int oo_trusted_lock_drop( + tcp_helper_resource_t* trs, int in_dl_context, int has_shared) { unsigned l; ci_uint64 sl_flags; ci_netif* ni = &trs->netif; - again: +again: l = trs->trusted_lock; ci_assert_flags(l, OO_TRUSTED_LOCK_LOCKED); - if(CI_UNLIKELY( l & OO_TRUSTED_LOCK_AWAITING_FREE )) { + if( CI_UNLIKELY(l & OO_TRUSTED_LOCK_AWAITING_FREE) ) { /* We may be called from the stack workqueue, so postpone destruction * to the point where wq may be flushed */ /* rm_free_locked expects trusted lock only @@ -266,34 +253,35 @@ oo_trusted_lock_drop(tcp_helper_resource_t* trs, if( ci_cas32_fail(&trs->trusted_lock, l, new_l) ) goto again; - if( has_shared || - ef_eplock_lock_or_set_flag(&trs->netif.state->lock, - CI_EPLOCK_NETIF_CLOSE_ENDPOINT) ) { + if( has_shared || ef_eplock_lock_or_set_flag(&trs->netif.state->lock, + CI_EPLOCK_NETIF_CLOSE_ENDPOINT) ) { /* let's reset the shared lock flag to avoid flag ping pong */ - ef_eplock_clear_flags(&trs->netif.state->lock, CI_EPLOCK_NETIF_CLOSE_ENDPOINT); + ef_eplock_clear_flags( + &trs->netif.state->lock, CI_EPLOCK_NETIF_CLOSE_ENDPOINT); /* We've got both locks. If in non-dl context, do the work, else * defer work and locks to workitem. */ if( in_dl_context ) { - /* the flag needs to be reinstated for atomic work to undertake the work */ - oo_trusted_lock_set_flags_if_locked(trs, OO_TRUSTED_LOCK_CLOSE_ENDPOINT); + /* the flag needs to be reinstated for atomic work to undertake the + * work */ + oo_trusted_lock_set_flags_if_locked( + trs, OO_TRUSTED_LOCK_CLOSE_ENDPOINT); trs->netif.flags |= CI_NETIF_FLAG_IN_DL_CONTEXT; OO_DEBUG_TCPH(ci_log("%s: [%u] defer CLOSE_ENDPOINT to workitem", - __FUNCTION__, trs->id)); + __FUNCTION__, trs->id)); tcp_helper_defer_dl2work(trs, OO_THR_AFLAG_UNLOCK_TRUSTED); return 1; } - OO_DEBUG_TCPH(ci_log("%s: [%u] CLOSE_ENDPOINT now", - __FUNCTION__, trs->id)); + OO_DEBUG_TCPH( + ci_log("%s: [%u] CLOSE_ENDPOINT now", __FUNCTION__, trs->id)); tcp_helper_close_pending_endpoints(trs); if( ! has_shared ) efab_eplock_unlock_and_wake(ni, in_dl_context); - } - else { + } else { /* Untrusted lock holder now responsible for invoking non-atomic work. */ OO_DEBUG_TCPH(ci_log("%s: [%u] defer CLOSE_ENDPOINT to untrusted lock", - __FUNCTION__, trs->id)); + __FUNCTION__, trs->id)); } goto again; } @@ -305,30 +293,28 @@ oo_trusted_lock_drop(tcp_helper_resource_t* trs, unsigned new_l = l & ~OO_TRUSTED_LOCK_OS_READY; if( ci_cas32_fail(&trs->trusted_lock, l, new_l) ) goto again; - if( has_shared || - ef_eplock_lock_or_set_flag(&trs->netif.state->lock, - CI_EPLOCK_NETIF_NEED_WAKE) ) { + if( has_shared || ef_eplock_lock_or_set_flag(&trs->netif.state->lock, + CI_EPLOCK_NETIF_NEED_WAKE) ) { /* We've got both locks, do the work now. */ - OO_DEBUG_TCPH(ci_log("%s: [%u] OS READY now", - __FUNCTION__, trs->id)); + OO_DEBUG_TCPH(ci_log("%s: [%u] OS READY now", __FUNCTION__, trs->id)); #if CI_CFG_EPOLL3 - CI_READY_LIST_EACH(trs->netif.state->ready_lists_in_use, tmp, i) { + CI_READY_LIST_EACH(trs->netif.state->ready_lists_in_use, tmp, i) + { get_os_ready_list(trs, i); - if( ! oo_p_dllink_is_empty(&trs->netif, - oo_p_dllink_ptr(&trs->netif, - &trs->netif.state->ready_lists[i])) ) + if( ! oo_p_dllink_is_empty( + &trs->netif, oo_p_dllink_ptr(&trs->netif, + &trs->netif.state->ready_lists[i])) ) ci_waitable_wakeup_all(&trs->ready_list_waitqs[i]); } #endif if( ! has_shared ) efab_eplock_unlock_and_wake(ni, in_dl_context); - } - else { + } else { /* Untrusted lock holder now responsible for invoking work. */ OO_DEBUG_TCPH(ci_log("%s: [%u] defer OS READY WAKE to trusted lock", - __FUNCTION__, trs->id)); + __FUNCTION__, trs->id)); } goto again; } @@ -353,7 +339,8 @@ oo_trusted_lock_drop(tcp_helper_resource_t* trs, if( ci_cas32_succeed(&trs->trusted_lock, l, OO_TRUSTED_LOCK_LOCKED) ) { if( has_shared ) ef_eplock_holder_set_flags(&trs->netif.state->lock, sl_flags); - else if ( ef_eplock_trylock_and_set_flags(&trs->netif.state->lock, sl_flags) ) + else if( ef_eplock_trylock_and_set_flags( + &trs->netif.state->lock, sl_flags) ) efab_eplock_unlock_and_wake(ni, in_dl_context); } goto again; @@ -364,8 +351,8 @@ oo_trusted_lock_drop(tcp_helper_resource_t* trs, /* Returns true if the lock is obtained, or false otherwise. * The flags will be set (unless AWAITING_FREE). */ -static int -oo_trusted_lock_lock_and_set_flags(tcp_helper_resource_t* trs, unsigned flags) +static int oo_trusted_lock_lock_and_set_flags( + tcp_helper_resource_t* trs, unsigned flags) { unsigned l, new_l; @@ -390,13 +377,13 @@ oo_trusted_lock_lock_and_set_flags(tcp_helper_resource_t* trs, unsigned flags) * *---------------------------------------------------------------------------*/ -int -efab_tcp_helper_netif_try_lock(tcp_helper_resource_t* trs, int in_dl_context) +int efab_tcp_helper_netif_try_lock( + tcp_helper_resource_t* trs, int in_dl_context) { if( oo_trusted_lock_try_lock(trs) ) { ci_netif* ni = &trs->netif; if( ci_netif_trylock(&trs->netif) ) { - ci_assert( ! (ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT) ); + ci_assert(! (ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT)); if( in_dl_context ) ni->flags |= CI_NETIF_FLAG_IN_DL_CONTEXT; return 1; @@ -407,10 +394,11 @@ efab_tcp_helper_netif_try_lock(tcp_helper_resource_t* trs, int in_dl_context) } -void -efab_tcp_helper_netif_unlock(tcp_helper_resource_t* trs, int in_dl_context) +void efab_tcp_helper_netif_unlock( + tcp_helper_resource_t* trs, int in_dl_context) { - ci_assert_equiv(in_dl_context, trs->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT); + ci_assert_equiv( + in_dl_context, trs->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT); #if 0 /* See ON-13698 & ON-13099: we want it to be true, but it fires for now. */ ci_assert_impl(trs->netif.flags & CI_NETIF_FLAGS_AVOID_ATOMIC, !in_dl_context); @@ -428,25 +416,22 @@ efab_tcp_helper_netif_unlock(tcp_helper_resource_t* trs, int in_dl_context) } -/* Returns 1 if the locks are held, or 0 if not and the flags are set. - * +/* Returns 1 if the locks are held, or 0 if not and the flags are set. + * * NB if trusted lock has OO_TRUSTED_LOCK_AWAITING_FREE this function - * will return 0, but the flags will not be set + * will return 0, but the flags will not be set */ -int -efab_tcp_helper_netif_lock_or_set_flags(tcp_helper_resource_t* trs, - unsigned trusted_flags, - ci_uint64 untrusted_flags, - int in_dl_context) +int efab_tcp_helper_netif_lock_or_set_flags(tcp_helper_resource_t* trs, + unsigned trusted_flags, ci_uint64 untrusted_flags, int in_dl_context) { do { if( efab_tcp_helper_netif_try_lock(trs, in_dl_context) ) return 1; - if( ef_eplock_set_flags_if_locked(&trs->netif.state->lock, - untrusted_flags) ) + if( ef_eplock_set_flags_if_locked( + &trs->netif.state->lock, untrusted_flags) ) return 0; if( oo_trusted_lock_set_flags_if_locked(trs, trusted_flags) ) - return 0; + return 0; } while( 1 ); } #endif /* CI_CFG_UL_INTERRUPT_HELPER */ @@ -458,20 +443,20 @@ efab_tcp_helper_netif_lock_or_set_flags(tcp_helper_resource_t* trs, * *---------------------------------------------------------------------------*/ -static int thr_table_ctor(tcp_helpers_table_t *table) +static int thr_table_ctor(tcp_helpers_table_t* table) { ci_dllist_init(&table->all_stacks); ci_dllist_init(&table->started_stacks); table->stack_count = 0; ci_irqlock_ctor(&table->lock); ci_id_pool_ctor(&table->instances, EFAB_THR_MAX_NUM_INSTANCES, - /* initial size */ 8); + /* initial size */ 8); return 0; } #if ! CI_CFG_UL_INTERRUPT_HELPER -void tcp_helper_kill_stack(tcp_helper_resource_t *thr) +void tcp_helper_kill_stack(tcp_helper_resource_t* thr) { ci_uint32 n_ep_orphaned; ci_netif* netif = &thr->netif; @@ -516,9 +501,10 @@ void tcp_helper_kill_stack(tcp_helper_resource_t *thr) } while( ci_cas32u_fail(&netif->n_ep_orphaned, n_ep_orphaned, 0) ); if( n_ep_orphaned > 0 ) { - ci_log("%s: ERROR: force-kill stack [%d]: " - "leaking %d OS sockets and filters", - __func__, thr->id, n_ep_orphaned); + ci_log( + "%s: ERROR: force-kill stack [%d]: " + "leaking %d OS sockets and filters", + __func__, thr->id, n_ep_orphaned); #ifndef NDEBUG dump_stack_to_logger(&thr->netif, ci_log_dump_fn, NULL); #endif @@ -528,7 +514,7 @@ void tcp_helper_kill_stack(tcp_helper_resource_t *thr) #endif -static void thr_table_dtor(tcp_helpers_table_t *table) +static void thr_table_dtor(tcp_helpers_table_t* table) { /* Onload is going away, so kill off any remaining stacks. */ @@ -552,8 +538,8 @@ static void thr_table_dtor(tcp_helpers_table_t *table) ci_irqlock_unlock(&table->lock, &lock_flags); if( thr->ref[OO_THR_REF_FILE] != 0 ) - ci_log("%s: ERROR: non-orphaned stack=%u ref "OO_THR_REF_FMT, - __FUNCTION__, thr->id, OO_THR_REF_ARG(thr->ref)); + ci_log("%s: ERROR: non-orphaned stack=%u ref " OO_THR_REF_FMT, + __FUNCTION__, thr->id, OO_THR_REF_ARG(thr->ref)); #if ! CI_CFG_UL_INTERRUPT_HELPER OO_DEBUG_TCPH(ci_log("%s: killing stack %d", __FUNCTION__, thr->id)); @@ -570,17 +556,16 @@ static void thr_table_dtor(tcp_helpers_table_t *table) } - -static -int efab_thr_table_check_name(const char* name, struct net* netns) +static int efab_thr_table_check_name(const char* name, struct net* netns) { /* Check that there is no name collision with already-existing stacks. */ tcp_helpers_table_t* table = &THR_TABLE; - tcp_helper_resource_t *thr2; - ci_dllink *link; + tcp_helper_resource_t* thr2; + ci_dllink* link; - CI_DLLIST_FOR_EACH(link, &table->all_stacks) { + CI_DLLIST_FOR_EACH(link, &table->all_stacks) + { thr2 = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); if( netns == thr2->netif.cplane->cp_netns && strncmp(thr2->netif.state->name, name, CI_CFG_STACK_NAME_LEN) == 0 && @@ -591,17 +576,18 @@ int efab_thr_table_check_name(const char* name, struct net* netns) } -int efab_thr_get_inaccessible_stack_info(unsigned id, uid_t* uid, uid_t* euid, - ci_int32* share_with, char* name) +int efab_thr_get_inaccessible_stack_info( + unsigned id, uid_t* uid, uid_t* euid, ci_int32* share_with, char* name) { tcp_helpers_table_t* table = &THR_TABLE; ci_irqlock_state_t lock_flags; - tcp_helper_resource_t *thr; - ci_dllink *link; + tcp_helper_resource_t* thr; + ci_dllink* link; int match; ci_irqlock_lock(&table->lock, &lock_flags); - CI_DLLIST_FOR_EACH(link, &table->all_stacks) { + CI_DLLIST_FOR_EACH(link, &table->all_stacks) + { thr = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); match = thr->id == id; @@ -611,12 +597,11 @@ int efab_thr_get_inaccessible_stack_info(unsigned id, uid_t* uid, uid_t* euid, /* Translate the share_with uid from the target stack's user_ns * to the kernel space. */ - uid_t kshare_with = ci_make_kuid(tcp_helper_get_user_ns(thr), - NI_OPTS(&thr->netif).share_with); + uid_t kshare_with = ci_make_kuid( + tcp_helper_get_user_ns(thr), NI_OPTS(&thr->netif).share_with); /* Then translate that into the user_ns of the requestor */ *share_with = ci_current_from_kuid_munged(kshare_with); - } - else { + } else { /* Special value indicating either none (0) or all (-1) doesn't need * translation. */ @@ -634,8 +619,8 @@ int efab_thr_get_inaccessible_stack_info(unsigned id, uid_t* uid, uid_t* euid, } -int efab_thr_user_can_access_stack(uid_t uid, uid_t euid, - tcp_helper_resource_t* thr) +int efab_thr_user_can_access_stack( + uid_t uid, uid_t euid, tcp_helper_resource_t* thr) { uid_t kshare_with; @@ -645,8 +630,8 @@ int efab_thr_user_can_access_stack(uid_t uid, uid_t euid, uid == 0 ) return 1; - kshare_with = ci_make_kuid(tcp_helper_get_user_ns(thr), - NI_OPTS(&thr->netif).share_with); + kshare_with = ci_make_kuid( + tcp_helper_get_user_ns(thr), NI_OPTS(&thr->netif).share_with); if( /* Owner does not allow other users to map this stack. */ kshare_with == 0 || /* Stack can be shared with another user, but not this user. */ @@ -667,17 +652,17 @@ int efab_thr_can_access_stack(tcp_helper_resource_t* thr, int check_user) */ if( /* We're not about to give a user access to the stack. */ - ! (check_user & EFAB_THR_TABLE_LOOKUP_CHECK_USER) ) + ! (check_user & EFAB_THR_TABLE_LOOKUP_CHECK_USER) ) return 1; return efab_thr_user_can_access_stack(ci_getuid(), ci_geteuid(), thr); } -/* +/* * If this returns 0 it will have taken a reference either through: * - efab_thr_ref(); or * - efab_tcp_helper_k_ref_count_inc() if it is an orphan; - * + * * It is up to the caller to drop the appropriate reference when safe * to do so. * @@ -688,15 +673,13 @@ int efab_thr_can_access_stack(tcp_helper_resource_t* thr, int check_user) * efab_tcp_helper_k_ref_count_inc() case as you won't see parented * stacks. */ -int efab_thr_table_lookup(const char* name, struct net* netns, - unsigned id, int flags, - enum oo_thr_ref_type ref_type, - tcp_helper_resource_t** thr_p) +int efab_thr_table_lookup(const char* name, struct net* netns, unsigned id, + int flags, enum oo_thr_ref_type ref_type, tcp_helper_resource_t** thr_p) { tcp_helpers_table_t* table = &THR_TABLE; ci_irqlock_state_t lock_flags; - tcp_helper_resource_t *thr; - ci_dllink *link; + tcp_helper_resource_t* thr; + ci_dllink* link; int match, rc = -ENODEV; ci_assert(thr_p != NULL); @@ -706,14 +689,14 @@ int efab_thr_table_lookup(const char* name, struct net* netns, ci_assert_flags(flags, EFAB_THR_TABLE_LOOKUP_CHECK_USER); ci_irqlock_lock(&table->lock, &lock_flags); - CI_DLLIST_FOR_EACH(link, &table->all_stacks) { + CI_DLLIST_FOR_EACH(link, &table->all_stacks) + { thr = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); if( name ) { match = (strcmp(thr->name, name) == 0) && (thr->netif.cplane->cp_netns == netns); - } - else { + } else { match = thr->id == id; } @@ -724,28 +707,26 @@ int efab_thr_table_lookup(const char* name, struct net* netns, * we're in a context where we have a current user namespace * (if user namespaces are supported). */ - uid_t kshare_with = ci_make_kuid(tcp_helper_get_user_ns(thr), - NI_OPTS(&thr->netif).share_with); - - ci_log("User %d:%d can't share stack %d(%s) owned by %d:%d " - "share_with=%d", - ci_current_from_kuid_munged(ci_getuid()), - ci_current_from_kuid_munged(ci_geteuid()), - thr->id, thr->name, - ci_current_from_kuid_munged(thr->netif.kuid), - ci_current_from_kuid_munged(thr->netif.keuid), - NI_OPTS(&thr->netif).share_with > 0 ? - ci_current_from_kuid_munged(kshare_with) : - NI_OPTS(&thr->netif).share_with); + uid_t kshare_with = ci_make_kuid( + tcp_helper_get_user_ns(thr), NI_OPTS(&thr->netif).share_with); + + ci_log( + "User %d:%d can't share stack %d(%s) owned by %d:%d " + "share_with=%d", + ci_current_from_kuid_munged(ci_getuid()), + ci_current_from_kuid_munged(ci_geteuid()), thr->id, thr->name, + ci_current_from_kuid_munged(thr->netif.kuid), + ci_current_from_kuid_munged(thr->netif.keuid), + NI_OPTS(&thr->netif).share_with > 0 + ? ci_current_from_kuid_munged(kshare_with) + : NI_OPTS(&thr->netif).share_with); } rc = -EACCES; - } - else if( (thr->ref[OO_THR_REF_FILE] != 0) != - ! (flags & EFAB_THR_TABLE_LOOKUP_NO_UL) ) { + } else if( (thr->ref[OO_THR_REF_FILE] != 0) != + ! (flags & EFAB_THR_TABLE_LOOKUP_NO_UL) ) { /* Orphan stacks flag does not match */ rc = -EBUSY; - } - else { + } else { /* Success */ rc = oo_thr_ref_get(thr->ref, ref_type); *thr_p = thr; @@ -779,10 +760,10 @@ static unsigned rescale(unsigned v, unsigned new_scale, unsigned old_scale) static void tcp_helper_reduce_max_packets(ci_netif* ni, int new_max_packets) { ci_assert_lt(new_max_packets, NI_OPTS(ni).max_packets); - NI_OPTS(ni).max_rx_packets = rescale(NI_OPTS(ni).max_rx_packets, - new_max_packets, NI_OPTS(ni).max_packets); - NI_OPTS(ni).max_tx_packets = rescale(NI_OPTS(ni).max_tx_packets, - new_max_packets, NI_OPTS(ni).max_packets); + NI_OPTS(ni).max_rx_packets = rescale( + NI_OPTS(ni).max_rx_packets, new_max_packets, NI_OPTS(ni).max_packets); + NI_OPTS(ni).max_tx_packets = rescale( + NI_OPTS(ni).max_tx_packets, new_max_packets, NI_OPTS(ni).max_packets); NI_OPTS(ni).max_packets = new_max_packets; if( ni->state != NULL ) { ni->state->opts.max_packets = NI_OPTS(ni).max_packets; @@ -793,17 +774,17 @@ static void tcp_helper_reduce_max_packets(ci_netif* ni, int new_max_packets) #if ! CI_CFG_UL_INTERRUPT_HELPER -static int -__tcp_helper_kill_stack_by_id(unsigned id, unsigned ignore_id) +static int __tcp_helper_kill_stack_by_id(unsigned id, unsigned ignore_id) { tcp_helpers_table_t* table = &THR_TABLE; ci_irqlock_state_t lock_flags; - tcp_helper_resource_t *thr = NULL; - ci_dllink *link; + tcp_helper_resource_t* thr = NULL; + ci_dllink* link; int rc = -ENODEV; ci_irqlock_lock(&table->lock, &lock_flags); - CI_DLLIST_FOR_EACH(link, &table->all_stacks) { + CI_DLLIST_FOR_EACH(link, &table->all_stacks) + { thr = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); if( ignore_id || thr->id == id ) { OO_DEBUG_TCPH(ci_log("Stack to release [%d]", thr->id)); @@ -819,11 +800,11 @@ __tcp_helper_kill_stack_by_id(unsigned id, unsigned ignore_id) tcp_helper_kill_stack(thr); if( ignore_id ) - OO_DEBUG_TCPH(ci_log("Orphaned stack %d(%s) owned by %d:%d has been " - "released.", - thr->id, thr->name, - ci_current_from_kuid_munged(thr->netif.kuid), - ci_current_from_kuid_munged(thr->netif.keuid))); + OO_DEBUG_TCPH( + ci_log("Orphaned stack %d(%s) owned by %d:%d has been " + "released.", + thr->id, thr->name, ci_current_from_kuid_munged(thr->netif.kuid), + ci_current_from_kuid_munged(thr->netif.keuid))); /* Remove reference we took in this function */ oo_thr_ref_drop(thr->ref, OO_THR_REF_BASE); @@ -839,20 +820,19 @@ int tcp_helper_kill_stack_by_id(unsigned id) #endif -void -tcp_helper_resource_assert_valid(tcp_helper_resource_t* thr, int no_ul, - const char *file, int line) +void tcp_helper_resource_assert_valid( + tcp_helper_resource_t* thr, int no_ul, const char* file, int line) { _ci_assert(thr, file, line); _ci_assert_nequal(thr->id, CI_ID_POOL_ID_NONE, file, line); _ci_assert_equal(thr->id, thr->netif.state->stack_id, file, line); - if (no_ul >=0) { - if ((no_ul && thr->ref[OO_THR_REF_FILE] > 0) || - (!no_ul && thr->ref[OO_THR_REF_FILE] == 0)) { + if( no_ul >= 0 ) { + if( (no_ul && thr->ref[OO_THR_REF_FILE] > 0) || + (! no_ul && thr->ref[OO_THR_REF_FILE] == 0) ) { ci_log("%s %d: %s check %u for %szero ul ref=%d", file, line, - __FUNCTION__, thr->id, no_ul ? "" : "non-", - thr->ref[OO_THR_REF_FILE]); + __FUNCTION__, thr->id, no_ul ? "" : "non-", + thr->ref[OO_THR_REF_FILE]); } _ci_assert(no_ul || thr->ref[OO_THR_REF_FILE], file, line); } @@ -890,8 +870,7 @@ int tcp_helper_vi_hw_stack_id(tcp_helper_resource_t* trs, int hwport) struct efrm_vi* vi = tcp_helper_vi(trs, intf_i); struct efrm_pd* pd = efrm_vi_get_pd(vi); return efrm_pd_stack_id_get(pd); - } - else + } else return -1; } @@ -902,8 +881,7 @@ int tcp_helper_cluster_vi_hw_stack_id(tcp_helper_cluster_t* thc, int hwport) if( thc->thc_vi_set[hwport] != NULL ) { struct efrm_pd* pd = efrm_vi_set_get_pd(thc->thc_vi_set[hwport]); return efrm_pd_stack_id_get(pd); - } - else + } else return -1; } @@ -918,8 +896,8 @@ int tcp_helper_cluster_vi_base(tcp_helper_cluster_t* thc, int hwport) } -int tcp_helper_vi_hw_rx_loopback_supported(tcp_helper_resource_t* trs, - int hwport) +int tcp_helper_vi_hw_rx_loopback_supported( + tcp_helper_resource_t* trs, int hwport) { int intf_i; ci_assert_lt((unsigned) hwport, CI_CFG_MAX_HWPORTS); @@ -930,8 +908,8 @@ int tcp_helper_vi_hw_rx_loopback_supported(tcp_helper_resource_t* trs, } -int tcp_helper_vi_hw_drop_filter_supported(tcp_helper_resource_t* trs, - int hwport) +int tcp_helper_vi_hw_drop_filter_supported( + tcp_helper_resource_t* trs, int hwport) { int intf_i; ci_assert_lt((unsigned) hwport, CI_CFG_MAX_HWPORTS); @@ -943,7 +921,7 @@ int tcp_helper_vi_hw_drop_filter_supported(tcp_helper_resource_t* trs, void tcp_helper_get_filter_params(tcp_helper_resource_t* trs, int hwport, - int* vi_id, int* rxq, unsigned *flags) + int* vi_id, int* rxq, unsigned* flags) { int intf_i; ci_assert_lt((unsigned) hwport, CI_CFG_MAX_HWPORTS); @@ -953,13 +931,11 @@ void tcp_helper_get_filter_params(tcp_helper_resource_t* trs, int hwport, if( NI_OPTS_TRS(trs).shared_rxq_num >= 0 ) { *rxq = NI_OPTS_TRS(trs).shared_rxq_num; *flags |= EFHW_FILTER_F_PREF_RXQ; - } - else if( vi->efct_shm ) { + } else if( vi->efct_shm ) { if( vi->efct_shm->q[0].superbuf_pkts ) { *rxq = vi->efct_shm->q[0].qid; *flags |= EFHW_FILTER_F_PREF_RXQ; - } - else { + } else { *flags |= EFHW_FILTER_F_ANY_RXQ; } } @@ -968,13 +944,14 @@ void tcp_helper_get_filter_params(tcp_helper_resource_t* trs, int hwport, int tcp_helper_post_filter_add(tcp_helper_resource_t* trs, int hwport, - const struct efx_filter_spec* spec, int rxq, - bool replace) + const struct efx_filter_spec* spec, int rxq, bool replace) { int intf_i; struct efhw_nic* nic; - int hugepages = max(1, DIV_ROUND_UP(NI_OPTS_TRS(trs).rxq_size * EFCT_PKT_STRIDE, CI_HUGEPAGE_SIZE)); + int hugepages = + max(1, DIV_ROUND_UP(NI_OPTS_TRS(trs).rxq_size * EFCT_PKT_STRIDE, + CI_HUGEPAGE_SIZE)); ci_assert_lt((unsigned) hwport, CI_CFG_MAX_HWPORTS); if( (intf_i = trs->netif.hwport_to_intf_i[hwport]) < 0 ) return 0; @@ -986,7 +963,7 @@ int tcp_helper_post_filter_add(tcp_helper_resource_t* trs, int hwport, int qix; int rc; - if( vi_rs->q[EFHW_RXQ].capacity == 0 ) /* e.g. EF_RXQ_SIZE=0 */ + if( vi_rs->q[EFHW_RXQ].capacity == 0 ) /* e.g. EF_RXQ_SIZE=0 */ return 0; ci_assert_ge(rxq, 0); @@ -998,9 +975,8 @@ int tcp_helper_post_filter_add(tcp_helper_resource_t* trs, int hwport, if( qix == -EALREADY ) return 0; - rc = efrm_rxq_alloc(vi_rs, rxq, qix, true, hugepages, - trs->thc_efct_memfd, &trs->thc_efct_memfd_off, - &trs->nic[intf_i].thn_efct_rxq[qix]); + rc = efrm_rxq_alloc(vi_rs, rxq, qix, true, hugepages, trs->thc_efct_memfd, + &trs->thc_efct_memfd_off, &trs->nic[intf_i].thn_efct_rxq[qix]); if( rc < 0 ) { ci_log("%s: ERROR: efrm_rxq_alloc failed (%d)\n", __func__, rc); return rc; @@ -1011,11 +987,10 @@ int tcp_helper_post_filter_add(tcp_helper_resource_t* trs, int hwport, if( NI_OPTS(&trs->netif).int_driven ) { ci_bit_set(&trs->netif.state->evq_prime_deferred, intf_i); if( efab_tcp_helper_netif_lock_or_set_flags(trs, - OO_TRUSTED_LOCK_NEED_POLL | OO_TRUSTED_LOCK_NEED_PRIME, - CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_NEED_PRIME, 0) ) { + OO_TRUSTED_LOCK_NEED_POLL | OO_TRUSTED_LOCK_NEED_PRIME, + CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_NEED_PRIME, 0) ) { ef_eplock_holder_set_flag(&trs->netif.state->lock, - CI_EPLOCK_NETIF_NEED_POLL | - CI_EPLOCK_NETIF_NEED_PRIME); + CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_NEED_PRIME); efab_tcp_helper_netif_unlock(trs, 0); } } @@ -1027,19 +1002,18 @@ int tcp_helper_post_filter_add(tcp_helper_resource_t* trs, int hwport, #if CI_CFG_PIO -static int allocate_pio(tcp_helper_resource_t* trs, int intf_i, - struct efrm_pd *pd, struct efhw_nic* nic, - unsigned *pio_buf_offset) +static int allocate_pio(tcp_helper_resource_t* trs, int intf_i, + struct efrm_pd* pd, struct efhw_nic* nic, unsigned* pio_buf_offset) { ci_netif* ni = &trs->netif; ci_netif_state* ns = ni->state; ci_netif_state_nic_t* nsn = &ns->nic[intf_i]; - ci_netif_nic_t *netif_nic = &trs->netif.nic_hw[intf_i]; + ci_netif_nic_t* netif_nic = &trs->netif.nic_hw[intf_i]; struct tcp_helper_nic* trs_nic = &trs->nic[intf_i]; int rc = 0; if( nic->pio_num == 0 ) - return 0; + return 0; if( trs_nic->thn_pio_rs == NULL ) { rc = efrm_pio_alloc(pd, &trs_nic->thn_pio_rs); @@ -1047,27 +1021,25 @@ static int allocate_pio(tcp_helper_resource_t* trs, int intf_i, if( NI_OPTS(ni).pio == 1 ) { if( rc == -ENOSPC ) { NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: WARNING: all PIO bufs allocated to other stacks. " - "Continuing without PIO. Use EF_PIO to control this.", - ns->pretty_name); + "[%s]: WARNING: all PIO bufs allocated to other stacks. " + "Continuing without PIO. Use EF_PIO to control this.", + ns->pretty_name); return 0; - } - else { - CI_NDEBUG( if( rc != -ENETDOWN && rc != -EPERM ) ) - /* ENETDOWN means absent hardware, so this failure is - * expected, and we should not warn about it in NDEBUG - * builds. EPERM is expected on NICs that don't - * support PIO. - */ - NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: Unable to alloc PIO (%d), will continue without it", - ns->pretty_name, rc); + } else { + CI_NDEBUG(if( rc != -ENETDOWN && rc != -EPERM )) + /* ENETDOWN means absent hardware, so this failure is + * expected, and we should not warn about it in NDEBUG + * builds. EPERM is expected on NICs that don't + * support PIO. + */ + NI_LOG(ni, RESOURCE_WARNINGS, + "[%s]: Unable to alloc PIO (%d), will continue without it", + ns->pretty_name, rc); return 0; } - } - else { - OO_DEBUG_VM (ci_log ("%s: ERROR: efrm_pio_alloc(%d) failed %d", - __FUNCTION__, intf_i, rc)); + } else { + OO_DEBUG_VM(ci_log("%s: ERROR: efrm_pio_alloc(%d) failed %d", + __FUNCTION__, intf_i, rc)); return rc; } } @@ -1080,41 +1052,39 @@ static int allocate_pio(tcp_helper_resource_t* trs, int intf_i, trs_nic->thn_pio_rs = NULL; if( NI_OPTS(ni).pio == 1 ) { NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: Unable to link PIO (%d), will continue without it", - ns->pretty_name, rc); + "[%s]: Unable to link PIO (%d), will continue without it", + ns->pretty_name, rc); return 0; - } - else { - OO_DEBUG_VM (ci_log ("%s: ERROR: efrm_pio_link_vi(%d) failed %d", - __FUNCTION__, intf_i, rc)); + } else { + OO_DEBUG_VM(ci_log("%s: ERROR: efrm_pio_link_vi(%d) failed %d", + __FUNCTION__, intf_i, rc)); return rc; } } - + /* efrm_pio_link_vi() success */ - rc = efrm_pio_map_kernel(tcp_helper_vi(trs, intf_i), - (void**) &netif_nic->pio.pio_io); + rc = efrm_pio_map_kernel( + tcp_helper_vi(trs, intf_i), (void**) &netif_nic->pio.pio_io); if( rc < 0 ) { efrm_pio_unlink_vi(trs_nic->thn_pio_rs, tcp_helper_vi(trs, intf_i), NULL); efrm_pio_release(trs_nic->thn_pio_rs, true); trs_nic->thn_pio_rs = NULL; if( NI_OPTS(ni).pio == 1 ) { NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: Unable to kmap PIO (%d), will continue without it", - ns->pretty_name, rc); + "[%s]: Unable to kmap PIO (%d), will continue without it", + ns->pretty_name, rc); return 0; - } - else { + } else { OO_DEBUG_VM(ci_log("%s: ERROR: efrm_pio_map_kernel(%d) failed %d", - __FUNCTION__, intf_i, rc)); + __FUNCTION__, intf_i, rc)); return rc; } - } + } /* efrm_pio_map_kernel() success */ /* Set up the pio struct so we can call ef_vi_pio_memcpy */ - netif_nic->pio.pio_buffer = - (uint8_t*)ns + ns->pio_bufs_ofs + *pio_buf_offset; + netif_nic->pio.pio_buffer = + (uint8_t*) ns + ns->pio_bufs_ofs + *pio_buf_offset; netif_nic->pio.pio_len = efrm_pio_get_size(trs_nic->thn_pio_rs); /* Advertise that PIO can be used on this VI */ nsn->oo_vi_flags |= OO_VI_FLAGS_PIO_EN; @@ -1128,7 +1098,7 @@ static int allocate_pio(tcp_helper_resource_t* trs, int intf_i, netif_nic->vis[CI_Q_ID_NORMAL].linked_pio = &netif_nic->pio; trs->pio_mmap_bytes += CI_PAGE_SIZE; *pio_buf_offset += efrm_pio_get_size(trs_nic->thn_pio_rs); - /* Drop original ref to PIO region as linked VI now holds it */ + /* Drop original ref to PIO region as linked VI now holds it */ efrm_pio_release(trs_nic->thn_pio_rs, true); /* Initialise the buddy allocator for the PIO region. */ ci_pio_buddy_ctor(ni, &nsn->pio_buddy, nsn->pio_io_len); @@ -1151,14 +1121,14 @@ static void get_if_name(ci_netif* ni, int intf_i, char* buf_out) if( ifindex == 0 ) goto no_dev; ndev = dev_get_by_index(&init_net, ifindex); - if( !ndev ) + if( ! ndev ) goto no_dev; memcpy(buf_out, ndev->name, IFNAMSIZ); dev_put(ndev); return; - no_dev: +no_dev: /* cannot identify the device, let's produce a name */ snprintf(buf_out, IFNAMSIZ, "noif/hwp0x%x", hwport); @@ -1167,25 +1137,22 @@ static void get_if_name(ci_netif* ni, int intf_i, char* buf_out) /* Evaluates whether timestamping is to be enabled * based on respective netif options and NIC architecture. */ -static int -check_timestamping_support(const char* stack_name, const char* dir, - int user_val, int device_supports_ts, - const char* if_name, - int* out_try_ts, int* out_retry_without) +static int check_timestamping_support(const char* stack_name, const char* dir, + int user_val, int device_supports_ts, const char* if_name, int* out_try_ts, + int* out_retry_without) { *out_try_ts = (user_val != 0); *out_retry_without = 0; if( ! device_supports_ts && (user_val == 3) ) { - ci_log( - "[%s]: %s timestamping not supported on given interface (%s)", + ci_log("[%s]: %s timestamping not supported on given interface (%s)", stack_name, dir, if_name); return -ENOENT; } if( ! device_supports_ts && (user_val == 2) ) { ci_log( - "[%s]: %s timestamping not supported on given interface (%s), " - "continuing with timestamping disabled on this particular interface", - stack_name, dir, if_name); + "[%s]: %s timestamping not supported on given interface (%s), " + "continuing with timestamping disabled on this particular interface", + stack_name, dir, if_name); *out_try_ts = 0; } if( user_val == 1 ) { @@ -1195,40 +1162,41 @@ check_timestamping_support(const char* stack_name, const char* dir, } -static int allocate_pd(ci_netif* ni, struct vi_allocate_info* info, - struct efhw_nic* nic) +static int allocate_pd( + ci_netif* ni, struct vi_allocate_info* info, struct efhw_nic* nic) { int rc = 0; switch( NI_OPTS(ni).packet_buffer_mode ) { - case 0: - break; + case 0: + break; - case CITP_PKTBUF_MODE_PHYS: - info->ef_vi_flags |= EF_VI_RX_PHYS_ADDR | EF_VI_TX_PHYS_ADDR; - break; + case CITP_PKTBUF_MODE_PHYS: + info->ef_vi_flags |= EF_VI_RX_PHYS_ADDR | EF_VI_TX_PHYS_ADDR; + break; - default: - rc = -EINVAL; - return rc; + default: + rc = -EINVAL; + return rc; } if( info->cluster == NULL ) { rc = efrm_pd_alloc(&info->pd, info->client, - ((info->ef_vi_flags & EF_VI_RX_PHYS_ADDR) ? - EFRM_PD_ALLOC_FLAG_PHYS_ADDR_MODE : 0) | - ((info->oo_vi_flags & OO_VI_FLAGS_TX_HW_LOOPBACK_EN) ? - EFRM_PD_ALLOC_FLAG_HW_LOOPBACK : 0) ); + ((info->ef_vi_flags & EF_VI_RX_PHYS_ADDR) + ? EFRM_PD_ALLOC_FLAG_PHYS_ADDR_MODE + : 0) | + ((info->oo_vi_flags & OO_VI_FLAGS_TX_HW_LOOPBACK_EN) + ? EFRM_PD_ALLOC_FLAG_HW_LOOPBACK + : 0)); if( rc != 0 ) { - OO_DEBUG_VM (ci_log ("%s: ERROR: efrm_pd_alloc(%d) failed %d", - __FUNCTION__, info->intf_i, rc)); + OO_DEBUG_VM(ci_log("%s: ERROR: efrm_pd_alloc(%d) failed %d", + __FUNCTION__, info->intf_i, rc)); return rc; } ci_assert(info->pd); info->release_pd = 1; info->vi_set = NULL; - } - else { + } else { int hwport = ni->intf_i_to_hwport[info->intf_i]; ci_assert_ge(hwport, 0); info->vi_set = info->cluster->thc_vi_set[hwport]; @@ -1240,32 +1208,30 @@ static int allocate_pd(ci_netif* ni, struct vi_allocate_info* info, } #if CI_CFG_CTPIO -static int /*bool*/ should_try_ctpio(ci_netif* ni, struct efhw_nic* nic, - struct vi_allocate_info* info) +static int /*bool*/ should_try_ctpio( + ci_netif* ni, struct efhw_nic* nic, struct vi_allocate_info* info) { - return - nic->flags & NIC_FLAG_CTPIO_ONLY || - /* Stack configured to use CTPIO. */ - (NI_OPTS(ni).ctpio > 0 && - /* NIC claims support for CTPIO. */ - (nic->flags & NIC_FLAG_TX_CTPIO) != 0 && - /* CTPIO bypasses the NIC's switch. When the switch is enabled, don't use - * CTPIO unless we've been told to do so explicitly. */ - (~nic->flags & NIC_FLAG_MCAST_LOOP_HW || - NI_OPTS(ni).ctpio_switch_bypass)); + return nic->flags & NIC_FLAG_CTPIO_ONLY || + /* Stack configured to use CTPIO. */ + (NI_OPTS(ni).ctpio > 0 && + /* NIC claims support for CTPIO. */ + (nic->flags & NIC_FLAG_TX_CTPIO) != 0 && + /* CTPIO bypasses the NIC's switch. When the switch is enabled, + * don't use CTPIO unless we've been told to do so explicitly. */ + (~nic->flags & NIC_FLAG_MCAST_LOOP_HW || + NI_OPTS(ni).ctpio_switch_bypass)); } #endif -static int -get_vi_settings(ci_netif* ni, struct efhw_nic* nic, - struct vi_allocate_info* info) +static int get_vi_settings( + ci_netif* ni, struct efhw_nic* nic, struct vi_allocate_info* info) { char if_name[IFNAMSIZ]; int rc; info->wakeup_cpu_core = NI_OPTS(ni).irq_core; - info->log_resource_warnings = NI_OPTS(ni).log_category & - (1 << (EF_LOG_RESOURCE_WARNINGS)); + info->log_resource_warnings = + NI_OPTS(ni).log_category & (1 << (EF_LOG_RESOURCE_WARNINGS)); if( NI_OPTS(ni).irq_core < 0 && NI_OPTS(ni).irq_channel < 0 ) { info->wakeup_cpu_core = raw_smp_processor_id(); info->log_resource_warnings = 0; @@ -1277,8 +1243,8 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, * EF100 has different Rx merging mechanism and hasn't RX cut-through. */ if( NI_OPTS(ni).rx_merge_mode || (nic->devtype.arch != EFHW_ARCH_EF100 && - nic->devtype.arch != EFHW_ARCH_EFCT && - ! (nic->flags & NIC_FLAG_RX_CUT_THROUGH)) ) { + nic->devtype.arch != EFHW_ARCH_EFCT && + ! (nic->flags & NIC_FLAG_RX_CUT_THROUGH)) ) { info->efhw_flags |= HIGH_THROUGHPUT_EFHW_VI_FLAGS; info->ef_vi_flags |= EF_VI_RX_EVENT_MERGE; } @@ -1286,17 +1252,17 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, if( nic->flags & NIC_FLAG_CTPIO_ONLY ) info->oo_vi_flags |= OO_VI_FLAGS_TX_CTPIO_ONLY; else - info->oo_vi_flags &=~ OO_VI_FLAGS_TX_CTPIO_ONLY; + info->oo_vi_flags &= ~OO_VI_FLAGS_TX_CTPIO_ONLY; if( nic->flags & NIC_FLAG_RX_SHARED ) info->oo_vi_flags |= OO_VI_FLAGS_RX_SHARED; else - info->oo_vi_flags &=~ OO_VI_FLAGS_RX_SHARED; + info->oo_vi_flags &= ~OO_VI_FLAGS_RX_SHARED; if( nic->flags & NIC_FLAG_HW_MULTICAST_REPLICATION ) info->oo_vi_flags |= OO_VI_FLAGS_HW_MULTICAST_REPLICATION; else - info->oo_vi_flags &=~ OO_VI_FLAGS_HW_MULTICAST_REPLICATION; + info->oo_vi_flags &= ~OO_VI_FLAGS_HW_MULTICAST_REPLICATION; if( (nic->flags & NIC_FLAG_MCAST_LOOP_HW) && (NI_OPTS(ni).mcast_recv_hw_loop) ) { @@ -1311,8 +1277,8 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, #if CI_CFG_CTPIO if( should_try_ctpio(ni, nic, info) ) NI_LOG(ni, CONFIG_WARNINGS, - "[%s]: WARNING: Packets sent by CTPIO will not be looped back.", - ni->state->pretty_name); + "[%s]: WARNING: Packets sent by CTPIO will not be looped back.", + ni->state->pretty_name); #endif } else { info->efhw_flags &= ~EFHW_VI_TX_LOOPBACK; @@ -1323,21 +1289,21 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, info->retry_without_ctpio = 0; if( NI_OPTS(ni).af_xdp_zerocopy ) { - if (nic->flags & NIC_FLAG_RX_ZEROCOPY) { + if( nic->flags & NIC_FLAG_RX_ZEROCOPY ) { info->ef_vi_flags |= EF_VI_RX_ZEROCOPY; info->efhw_flags |= EFHW_VI_RX_ZEROCOPY; } else { NI_LOG(ni, CONFIG_WARNINGS, - "[%s]: WARNING: Zerocopy is required but NIC does not support it", - ni->state->pretty_name); + "[%s]: WARNING: Zerocopy is required but NIC does not support it", + ni->state->pretty_name); } } #if CI_CFG_CTPIO if( should_try_ctpio(ni, nic, info) ) { info->try_ctpio = 1; - info->retry_without_ctpio = NI_OPTS(ni).ctpio < 2 && - ! (nic->flags & NIC_FLAG_CTPIO_ONLY); + info->retry_without_ctpio = + NI_OPTS(ni).ctpio < 2 && ! (nic->flags & NIC_FLAG_CTPIO_ONLY); if( NI_OPTS(ni).ctpio_mode == EF_CTPIO_MODE_SF_NP ) { info->ef_vi_flags |= EF_VI_TX_CTPIO_NO_POISON; @@ -1347,14 +1313,13 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, info->ctpio_threshold = NI_OPTS(ni).ctpio_ct_thresh; else info->ctpio_threshold = EF_VI_CTPIO_CT_THRESHOLD_SNF; - } - else { + } else { info->vi_ctpio_mmap_bytes = 0; if( NI_OPTS(ni).ctpio == 2 ) { char if_name[IFNAMSIZ]; get_if_name(ni, info->intf_i, if_name); ci_log("[%s]: CTPIO is required, but interface %s does not support it.", - ni->state->pretty_name, if_name); + ni->state->pretty_name, if_name); return -EINVAL; } } @@ -1363,19 +1328,15 @@ get_vi_settings(ci_netif* ni, struct efhw_nic* nic, get_if_name(ni, info->intf_i, if_name); rc = check_timestamping_support(ni->state->pretty_name, "RX", - NI_OPTS(ni).rx_timestamping, - (nic->flags & NIC_FLAG_HW_RX_TIMESTAMPING) != 0, - if_name, - &info->try_rx_ts, - &info->retry_without_rx_ts); + NI_OPTS(ni).rx_timestamping, + (nic->flags & NIC_FLAG_HW_RX_TIMESTAMPING) != 0, if_name, + &info->try_rx_ts, &info->retry_without_rx_ts); if( rc == 0 ) rc = check_timestamping_support(ni->state->pretty_name, "TX", - NI_OPTS(ni).tx_timestamping, - (nic->flags & NIC_FLAG_HW_TX_TIMESTAMPING) != 0, - if_name, - &info->try_tx_ts, - &info->retry_without_tx_ts); + NI_OPTS(ni).tx_timestamping, + (nic->flags & NIC_FLAG_HW_TX_TIMESTAMPING) != 0, if_name, + &info->try_tx_ts, &info->retry_without_tx_ts); return rc; } @@ -1403,9 +1364,9 @@ static int find_and_release_orphaned_stack(void) static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, - struct efrm_vi *evq_virs, int q_tag) + struct efrm_vi* evq_virs, int q_tag) { - int rc = -EDOM; /* Placate compiler. */ + int rc = -EDOM; /* Placate compiler. */ unsigned evq_min; /* There are various VI flags that can be requested by the caller, and we @@ -1421,28 +1382,28 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, int oo_vi_flags; } features[] = { { - .attempt = info->try_rx_ts, - .retry_without = info->retry_without_rx_ts, - .description = "RX timestamping", - .ef_vi_flags = EF_VI_RX_TIMESTAMPS, - .efhw_flags = EFHW_VI_RX_TIMESTAMPS | EFHW_VI_RX_PREFIX, - .oo_vi_flags = OO_VI_FLAGS_RX_HW_TS_EN, + .attempt = info->try_rx_ts, + .retry_without = info->retry_without_rx_ts, + .description = "RX timestamping", + .ef_vi_flags = EF_VI_RX_TIMESTAMPS, + .efhw_flags = EFHW_VI_RX_TIMESTAMPS | EFHW_VI_RX_PREFIX, + .oo_vi_flags = OO_VI_FLAGS_RX_HW_TS_EN, }, { - .attempt = info->try_tx_ts, - .retry_without = info->retry_without_tx_ts, - .description = "TX timestamping", - .ef_vi_flags = EF_VI_TX_TIMESTAMPS, - .efhw_flags = EFHW_VI_TX_TIMESTAMPS, - .oo_vi_flags = OO_VI_FLAGS_TX_HW_TS_EN, + .attempt = info->try_tx_ts, + .retry_without = info->retry_without_tx_ts, + .description = "TX timestamping", + .ef_vi_flags = EF_VI_TX_TIMESTAMPS, + .efhw_flags = EFHW_VI_TX_TIMESTAMPS, + .oo_vi_flags = OO_VI_FLAGS_TX_HW_TS_EN, }, { - .attempt = info->try_ctpio, - .retry_without = info->retry_without_ctpio, - .description = "CTPIO", - .ef_vi_flags = EF_VI_TX_CTPIO, - .efhw_flags = EFHW_VI_TX_CTPIO, - .oo_vi_flags = OO_VI_FLAGS_CTPIO_EN, + .attempt = info->try_ctpio, + .retry_without = info->retry_without_ctpio, + .description = "CTPIO", + .ef_vi_flags = EF_VI_TX_CTPIO, + .efhw_flags = EFHW_VI_TX_CTPIO, + .oo_vi_flags = OO_VI_FLAGS_CTPIO_EN, }, }; const int feature_count = sizeof(features) / sizeof(features[0]); @@ -1486,7 +1447,7 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, for( i = 0; i < feature_count; ++i ) if( feature_mask & (1 << i) ) { info->ef_vi_flags |= features[i].ef_vi_flags; - info->efhw_flags |= features[i].efhw_flags; + info->efhw_flags |= features[i].efhw_flags; info->oo_vi_flags |= features[i].oo_vi_flags; } @@ -1494,22 +1455,17 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, * is made to find and release orphaned stack and try allocation again. */ for( i = 0; i < 2; ++i ) { rc = efrm_vi_resource_alloc(info->client, evq_virs, info->vi_set, -1, - info->pd, info->name, - info->efhw_flags, - info->evq_capacity, info->txq_capacity, - info->rxq_capacity, q_tag, q_tag, - info->wakeup_cpu_core, - info->wakeup_channel, - info->virs, - &info->vi_io_mmap_bytes, - &info->vi_ctpio_mmap_bytes, NULL, NULL, - info->log_resource_warnings); + info->pd, info->name, info->efhw_flags, info->evq_capacity, + info->txq_capacity, info->rxq_capacity, q_tag, q_tag, + info->wakeup_cpu_core, info->wakeup_channel, info->virs, + &info->vi_io_mmap_bytes, &info->vi_ctpio_mmap_bytes, NULL, NULL, + info->log_resource_warnings); /* If we succeeded, there is no need to find and release orphan stack. */ if( rc != -EBUSY ) break; /* If first allocation returned EBUSY there is try to search and release - * orphaned stack. If it succeed another allocation will be attempted. */ + * orphaned stack. If it succeed another allocation will be attempted. */ if( i == 0 && find_and_release_orphaned_stack() != 0 ) break; } @@ -1525,8 +1481,8 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, * about the interrupt affinity. In this case, and only in this case, do * we enable the warnings in the innards of the allocation functions. */ info_base.wakeup_cpu_core = NI_OPTS(ni).irq_core; - info_base.log_resource_warnings = NI_OPTS(ni).log_category & - (1 << (EF_LOG_RESOURCE_WARNINGS)); + info_base.log_resource_warnings = + NI_OPTS(ni).log_category & (1 << (EF_LOG_RESOURCE_WARNINGS)); /* Fake out the loop counter to give us one more shot. */ ++feature_mask; } @@ -1536,23 +1492,23 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, n_shm_rxqs = efhw_nic_max_shared_rxqs(efrm_client_get_nic(info->client)); info->vi_efct_shm_mmap_bytes = - n_shm_rxqs ? CI_ROUND_UP(CI_EFCT_SHM_BYTES(n_shm_rxqs), PAGE_SIZE) : 0; + n_shm_rxqs ? CI_ROUND_UP(CI_EFCT_SHM_BYTES(n_shm_rxqs), PAGE_SIZE) : 0; if( rc < 0 ) { - OO_DEBUG_VM (ci_log ("%s: ERROR: efrm_vi_resource_alloc(%d) failed %d", - __FUNCTION__, info->intf_i, rc)); + OO_DEBUG_VM(ci_log("%s: ERROR: efrm_vi_resource_alloc(%d) failed %d", + __FUNCTION__, info->intf_i, rc)); if( info->release_pd ) efrm_pd_release(info->pd); - } - else { + } else { /* Warn about any requested features that we didn't get. */ for( i = 0; i < feature_count; ++i ) if( features[i].attempt && ! (feature_mask & (1 << i)) ) { char if_name[IFNAMSIZ]; get_if_name(ni, info->intf_i, if_name); - ci_log("[%s]: enabling %s on interface %s failed, " - "continuing with it disabled on this interface", - ni->state->pretty_name, features[i].description, if_name); + ci_log( + "[%s]: enabling %s on interface %s failed, " + "continuing with it disabled on this interface", + ni->state->pretty_name, features[i].description, if_name); } } @@ -1562,37 +1518,36 @@ static int allocate_vi(ci_netif* ni, struct vi_allocate_info* info, static int tcp_helper_superbuf_config_refresh(ef_vi* vi, int qid) { - return efrm_rxq_refresh_kernel(vi->dh, vi->efct_shm->q[qid].qid, - vi->efct_rxq[qid].superbufs); + return efrm_rxq_refresh_kernel( + vi->dh, vi->efct_shm->q[qid].qid, vi->efct_rxq[qid].superbufs); } static int initialise_vi(ci_netif* ni, struct ef_vi* vi, struct efrm_vi* vi_rs, - struct efrm_vi_mappings* vm, void* vi_state, - int vi_arch, int vi_variant, int vi_revision, - unsigned char vi_nic_flags, - struct vi_allocate_info* alloc_info, - unsigned* vi_out_flags, ef_vi_stats* vi_stats) + struct efrm_vi_mappings* vm, void* vi_state, int vi_arch, int vi_variant, + int vi_revision, unsigned char vi_nic_flags, + struct vi_allocate_info* alloc_info, unsigned* vi_out_flags, + ef_vi_stats* vi_stats) { uint32_t* vi_ids = (void*) ((ef_vi_state*) vi_state + 1); efrm_vi_get_mappings(vi_rs, vm); ef_vi_init(vi, vi_arch, vi_variant, vi_revision, alloc_info->ef_vi_flags, - vi_nic_flags, (ef_vi_state*) vi_state); - *vi_out_flags = (vm->out_flags & EFHW_VI_CLOCK_SYNC_STATUS) ? - EF_VI_OUT_CLOCK_SYNC_STATUS : 0; + vi_nic_flags, (ef_vi_state*) vi_state); + *vi_out_flags = (vm->out_flags & EFHW_VI_CLOCK_SYNC_STATUS) + ? EF_VI_OUT_CLOCK_SYNC_STATUS + : 0; - ef_vi_init_out_flags( vi, *vi_out_flags); + ef_vi_init_out_flags(vi, *vi_out_flags); ef_vi_init_io(vi, vm->io_page); ef_vi_init_timer(vi, vm->timer_quantum_ns); ef_vi_init_evq(vi, vm->evq_size, vm->evq_base); if( vm->rxq_size > 0 ) { - ef_vi_init_rxq(vi, vm->rxq_size, vm->rxq_descriptors, vi_ids, - vm->rxq_prefix_len); + ef_vi_init_rxq( + vi, vm->rxq_size, vm->rxq_descriptors, vi_ids, vm->rxq_prefix_len); vi_ids += vm->rxq_size; - } - else { + } else { /* efct_poll_rx() will crash if called when rx hasn't been inited, so * guarantee that it never will be even if somebody corrupts the shared * memory */ @@ -1609,7 +1564,7 @@ static int initialise_vi(ci_netif* ni, struct ef_vi* vi, struct efrm_vi* vi_rs, return rc; for( i = 0; i < vi->max_efct_rxq; ++i ) efct_vi_attach_rxq_internal(vi, i, -1 /* resource ID not needed */, - tcp_helper_superbuf_config_refresh); + tcp_helper_superbuf_config_refresh); } ef_vi_init_state(vi); ef_vi_set_stats_buf(vi, vi_stats); @@ -1631,12 +1586,12 @@ static int af_xdp_kick(ef_vi* vi) } static int allocate_vis(tcp_helper_resource_t* trs, - ci_resource_onload_alloc_t* alloc, - void* vi_state, tcp_helper_cluster_t* thc) + ci_resource_onload_alloc_t* alloc, void* vi_state, + tcp_helper_cluster_t* thc) { /* Format is "onload:pretty_name-intf_i" * Do not use slash in this name! */ - char vf_name[7 + CI_CFG_STACK_NAME_LEN+8 + 3]; + char vf_name[7 + CI_CFG_STACK_NAME_LEN + 8 + 3]; ci_netif* ni = &trs->netif; ci_netif_state* ns = ni->state; int rc, intf_i; @@ -1681,7 +1636,8 @@ static int allocate_vis(tcp_helper_resource_t* trs, if( ! NI_OPTS(ni).tx_push ) base_ef_vi_flags |= EF_VI_TX_PUSH_DISABLE; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { int vi_i; for( vi_i = 0; vi_i < CI_MAX_VIS_PER_INTF; ++vi_i ) { trs->nic[intf_i].thn_vi_rs[vi_i] = NULL; @@ -1693,18 +1649,19 @@ static int allocate_vis(tcp_helper_resource_t* trs, trs->nic[intf_i].thn_pio_io_mmap_bytes = 0; #endif memset(trs->nic[intf_i].thn_efct_rxq, 0, - sizeof(trs->nic[intf_i].thn_efct_rxq)); + sizeof(trs->nic[intf_i].thn_efct_rxq)); } /* This loop does the work of allocating a vi, using the information built * up in the alloc_info structure. It then updates the nsn structure with * the resultant resource information. */ - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct tcp_helper_nic* trs_nic = &trs->nic[intf_i]; ci_netif_state_nic_t* nsn = &ns->nic[intf_i]; struct efhw_nic* nic = - efrm_client_get_nic(trs_nic->thn_oo_nic->efrm_client); + efrm_client_get_nic(trs_nic->thn_oo_nic->efrm_client); struct efrm_vi_mappings* vm = (void*) ni->vi_data; unsigned vi_out_flags = 0; struct device* dev; @@ -1713,11 +1670,11 @@ static int allocate_vis(tcp_helper_resource_t* trs, BUILD_BUG_ON(sizeof(ni->vi_data) < sizeof(struct efrm_vi_mappings)); - alloc_info.hwport_flags = 0; /* Placate compiler. */ + alloc_info.hwport_flags = 0; /* Placate compiler. */ /* Get interface properties. */ rc = oo_cp_get_hwport_properties(ni->cplane, ns->intf_i_to_hwport[intf_i], - &alloc_info.hwport_flags, NULL); + &alloc_info.hwport_flags, NULL); if( rc < 0 ) goto error_out; @@ -1734,8 +1691,8 @@ static int allocate_vis(tcp_helper_resource_t* trs, ci_assert(trs_nic->thn_oo_nic != NULL); ci_assert(alloc_info.client != NULL); - snprintf(vf_name, sizeof(vf_name), "onload:%s-%d", - ns->pretty_name, intf_i); + snprintf( + vf_name, sizeof(vf_name), "onload:%s-%d", ns->pretty_name, intf_i); rc = get_vi_settings(ni, nic, &alloc_info); if( rc != 0 ) @@ -1758,16 +1715,15 @@ static int allocate_vis(tcp_helper_resource_t* trs, trs->thc_rss_instance = efrm_vi_set_get_vi_instance(vi_rs); ns->rss_instance = trs->thc_rss_instance; ns->cluster_size = thc->thc_cluster_size; - } - else { + } else { ns->cluster_size = 1; } vi = ci_netif_vi(ni, intf_i); - rc = initialise_vi(ni, vi, tcp_helper_vi(trs, intf_i), vm, - vi_state, nic->devtype.arch, nic->devtype.variant, - nic->devtype.revision, efhw_vi_nic_flags(nic), - &alloc_info, &vi_out_flags, &ni->state->vi_stats); + rc = initialise_vi(ni, vi, tcp_helper_vi(trs, intf_i), vm, vi_state, + nic->devtype.arch, nic->devtype.variant, nic->devtype.revision, + efhw_vi_nic_flags(nic), &alloc_info, &vi_out_flags, + &ni->state->vi_stats); if( rc < 0 ) goto error_out; @@ -1780,22 +1736,22 @@ static int allocate_vis(tcp_helper_resource_t* trs, #if CI_CFG_CTPIO nsn->ctpio_ct_threshold = alloc_info.ctpio_threshold; nsn->ctpio_max_frame_len = nsn->ctpio_frame_len_check = - nsn->oo_vi_flags & OO_VI_FLAGS_CTPIO_EN ? - NI_OPTS(ni).ctpio_max_frame_len : 0; + nsn->oo_vi_flags & OO_VI_FLAGS_CTPIO_EN + ? NI_OPTS(ni).ctpio_max_frame_len + : 0; #endif dev = efrm_vi_get_dev(vi_rs); strncpy(nsn->dev_name, dev ? dev_name(dev) : "?", sizeof(nsn->dev_name)); if( dev ) put_device(dev); nsn->dev_name[sizeof(nsn->dev_name) - 1] = '\0'; - nsn->vi_instance[0] = - (ci_uint16) EFAB_VI_RESOURCE_INSTANCE(vi_rs); + nsn->vi_instance[0] = (ci_uint16) EFAB_VI_RESOURCE_INSTANCE(vi_rs); nsn->vi_abs_idx[0] = efhw_nic_rel_to_abs_idx(nic, nsn->vi_instance[0]); nsn->vi_arch = (ci_uint8) nic->devtype.arch; nsn->vi_variant = (ci_uint8) nic->devtype.variant; nsn->vi_revision = (ci_uint8) nic->devtype.revision; nsn->vi_nic_flags = efhw_vi_nic_flags(nic); - nsn->vi_channel = (ci_uint8)efrm_vi_get_channel(vi_rs); + nsn->vi_channel = (ci_uint8) efrm_vi_get_channel(vi_rs); nsn->vi_flags = alloc_info.ef_vi_flags; nsn->vi_out_flags = vi_out_flags; nsn->vi_evq_bytes = efrm_vi_rm_evq_bytes(vi_rs, -1); @@ -1811,8 +1767,8 @@ static int allocate_vis(tcp_helper_resource_t* trs, trs->io_mmap_bytes += alloc_info.vi_io_mmap_bytes; trs->efct_shm_mmap_bytes += alloc_info.vi_efct_shm_mmap_bytes; - vi_state = (char*) vi_state + - ef_vi_calc_state_bytes(vm->rxq_size, vm->txq_size); + vi_state = + (char*) vi_state + ef_vi_calc_state_bytes(vm->rxq_size, vm->txq_size); #if CI_CFG_CTPIO trs_nic->thn_ctpio_io_mmap_bytes = alloc_info.vi_ctpio_mmap_bytes; @@ -1866,10 +1822,10 @@ static int allocate_vis(tcp_helper_resource_t* trs, * to be the best for that */ alloc_info.try_ctpio = false; - for( vi_i = 1; vi_i < num_vis; ++vi_i) { - struct efrm_vi *vi_rs; - int qid = ef_vi_add_queue(ci_netif_vi(ni, intf_i), - &ni->nic_hw[intf_i].vis[vi_i]); + for( vi_i = 1; vi_i < num_vis; ++vi_i ) { + struct efrm_vi* vi_rs; + int qid = ef_vi_add_queue( + ci_netif_vi(ni, intf_i), &ni->nic_hw[intf_i].vis[vi_i]); ci_assert_equal(qid, vi_i); alloc_info.virs = &trs_nic->thn_vi_rs[vi_i]; rc = allocate_vi(ni, &alloc_info, tcp_helper_vi(trs, intf_i), qid); @@ -1879,27 +1835,24 @@ static int allocate_vis(tcp_helper_resource_t* trs, goto error_out; } vi_rs = trs_nic->thn_vi_rs[vi_i]; - rc = initialise_vi(ni, &ni->nic_hw[intf_i].vis[vi_i], - vi_rs, vm, - vi_state, nic->devtype.arch, nic->devtype.variant, - nic->devtype.revision, efhw_vi_nic_flags(nic), - &alloc_info, &vi_out_flags, &ni->state->vi_stats); + rc = initialise_vi(ni, &ni->nic_hw[intf_i].vis[vi_i], vi_rs, vm, + vi_state, nic->devtype.arch, nic->devtype.variant, + nic->devtype.revision, efhw_vi_nic_flags(nic), &alloc_info, + &vi_out_flags, &ni->state->vi_stats); if( rc < 0 ) { if( release_pd ) efrm_pd_release(alloc_info.pd); /* vi keeps a ref to pd */ goto error_out; } - nsn->vi_instance[vi_i] = - (ci_uint16) EFAB_VI_RESOURCE_INSTANCE(vi_rs); + nsn->vi_instance[vi_i] = (ci_uint16) EFAB_VI_RESOURCE_INSTANCE(vi_rs); nsn->vi_abs_idx[vi_i] = - efhw_nic_rel_to_abs_idx(nic, nsn->vi_instance[vi_i]); + efhw_nic_rel_to_abs_idx(nic, nsn->vi_instance[vi_i]); trs->io_mmap_bytes += alloc_info.vi_io_mmap_bytes; vi_state = (char*) vi_state + ef_vi_calc_state_bytes(vm->rxq_size, vm->txq_size); } - } - else + } else #endif ci_assert_equal(ci_netif_num_vis(ni), 1); @@ -1912,7 +1865,8 @@ static int allocate_vis(tcp_helper_resource_t* trs, return 0; error_out: - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { int vi_i; for( vi_i = ci_netif_num_vis(ni) - 1; vi_i >= 0; --vi_i ) { if( trs->nic[intf_i].thn_vi_rs[vi_i] ) { @@ -1937,20 +1891,22 @@ static int deferred_vis(tcp_helper_resource_t* trs) /* hugetlbfs pages are incompatible with AF_XDP */ if( NI_OPTS(ni).huge_pages != 0 ) { NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: WARNING: huge pages are incompatible with AF_XDP. " - "Disabling hugepage support.", - ni->state->pretty_name); + "[%s]: WARNING: huge pages are incompatible with AF_XDP. " + "Ignoring and not disabling hugepage support.", + ni->state->pretty_name); - NI_OPTS(ni).huge_pages = 0; + NI_OPTS(ni).huge_pages = 1; } /* All buffers need to be allocated before AF_XDP sockets are usable. */ - while( (rc = efab_tcp_helper_more_bufs(trs)) == 0 ); + while( (rc = efab_tcp_helper_more_bufs(trs)) == 0 ) + ; if( rc != -ENOSPC ) return rc; } - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct tcp_helper_nic* trs_nic = &trs->nic[intf_i]; int vi_i; @@ -1958,9 +1914,8 @@ static int deferred_vis(tcp_helper_resource_t* trs) uint32_t mmap_bytes; rc = efrm_vi_resource_deferred(trs_nic->thn_vi_rs[vi_i], - CI_CFG_PKT_BUF_SIZE, - offsetof(ci_ip_pkt_fmt, dma_start), - &mmap_bytes); + CI_CFG_PKT_BUF_SIZE, offsetof(ci_ip_pkt_fmt, dma_start), + &mmap_bytes); if( rc < 0 ) return rc; @@ -1971,13 +1926,13 @@ static int deferred_vis(tcp_helper_resource_t* trs) * someone else would get if they checked separately. */ ci_assert_equal(ni->state->nic[intf_i].vi_io_mmap_bytes, - efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 0)); + efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 0)); ci_assert_equal(trs_nic->thn_vi_mmap_bytes[vi_i], - efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 1)); + efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 1)); ci_assert_equal( - efab_vi_resource_mmap_bytes(tcp_helper_vi(trs, intf_i), 0), - efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 0)); + efab_vi_resource_mmap_bytes(tcp_helper_vi(trs, intf_i), 0), + efab_vi_resource_mmap_bytes(trs_nic->thn_vi_rs[vi_i], 0)); } } @@ -1986,9 +1941,9 @@ static int deferred_vis(tcp_helper_resource_t* trs) } -static void vi_complete(void *completion_void) +static void vi_complete(void* completion_void) { - complete((struct completion *)completion_void); + complete((struct completion*) completion_void); } #if CI_CFG_NIC_RESET_SUPPORT @@ -2006,14 +1961,14 @@ static void release_pkts(tcp_helper_resource_t* trs) int n_free = 0; #endif - for (i = 0; i < ni->pkt_sets_n; i++) { + for( i = 0; i < ni->pkt_sets_n; i++ ) { ci_assert(ni->pkt_bufs[i]); #ifndef NDEBUG n_free += ni->packets->set[i].n_free; #endif OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - oo_iobufset_resource_release(ni->nic_hw[intf_i].pkt_rs[i], - intfs_suspended(trs) & (1 << intf_i)); + oo_iobufset_resource_release( + ni->nic_hw[intf_i].pkt_rs[i], intfs_suspended(trs) & (1 << intf_i)); } #ifndef NDEBUG if( ~trs->netif.flags & CI_NETIF_FLAG_WEDGED ) @@ -2022,9 +1977,9 @@ static void release_pkts(tcp_helper_resource_t* trs) /* Now release everything allocated in allocate_netif_hw_resources. */ OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ci_free(ni->nic_hw[intf_i].pkt_rs); + ci_free(ni->nic_hw[intf_i].pkt_rs); - for (i = 0; i < ni->pkt_sets_n; i++) + for( i = 0; i < ni->pkt_sets_n; i++ ) oo_iobufset_pages_release(ni->pkt_bufs[i]); vfree(ni->pkt_bufs); } @@ -2033,7 +1988,8 @@ static void release_pkts(tcp_helper_resource_t* trs) static void detach_efct_rxqs(tcp_helper_resource_t* trs) { int intf_i; - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { int num_vis = ci_netif_num_vis(&trs->netif); int vi_i; struct tcp_helper_nic* trs_nic = &trs->nic[intf_i]; @@ -2055,10 +2011,11 @@ static void release_vi(tcp_helper_resource_t* trs) int intf_i; /* Flush vis first to ensure our bufs won't be used any more */ - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { int vi_i; for( vi_i = ci_netif_num_vis(&trs->netif) - 1; vi_i >= 0; --vi_i ) { - struct efrm_vi *vi_rs = trs->nic[intf_i].thn_vi_rs[vi_i]; + struct efrm_vi* vi_rs = trs->nic[intf_i].thn_vi_rs[vi_i]; reinit_completion(&trs->complete); efrm_vi_register_flush_callback(vi_rs, &vi_complete, &trs->complete); efrm_vi_resource_stop_callback(vi_rs); @@ -2067,29 +2024,28 @@ static void release_vi(tcp_helper_resource_t* trs) } /* Now do the rest of vi release */ - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { int num_vis = ci_netif_num_vis(&trs->netif); int vi_i; struct tcp_helper_nic* trs_nic = &trs->nic[intf_i]; - ci_netif_nic_t *netif_nic = &trs->netif.nic_hw[intf_i]; + ci_netif_nic_t* netif_nic = &trs->netif.nic_hw[intf_i]; #if CI_CFG_PIO || (CI_CFG_WANT_BPF_NATIVE && CI_HAVE_BPF_NATIVE) struct efhw_nic* nic = - efrm_client_get_nic(trs_nic->thn_oo_nic->efrm_client); + efrm_client_get_nic(trs_nic->thn_oo_nic->efrm_client); #endif #if CI_CFG_PIO - if( NI_OPTS(&trs->netif).pio && - (nic->devtype.arch == EFHW_ARCH_EF10) && + if( NI_OPTS(&trs->netif).pio && (nic->devtype.arch == EFHW_ARCH_EF10) && (trs_nic->thn_pio_io_mmap_bytes != 0) ) { - efrm_pio_unmap_kernel(tcp_helper_vi(trs, intf_i), - (void*)netif_nic->pio.pio_io); - ci_pio_buddy_dtor(&trs->netif, - &trs->netif.state->nic[intf_i].pio_buddy); + efrm_pio_unmap_kernel( + tcp_helper_vi(trs, intf_i), (void*) netif_nic->pio.pio_io); + ci_pio_buddy_dtor(&trs->netif, &trs->netif.state->nic[intf_i].pio_buddy); } #endif #if CI_CFG_CTPIO if( trs_nic->thn_ctpio_io_mmap != NULL ) - efrm_ctpio_unmap_kernel(tcp_helper_vi(trs, intf_i), - trs_nic->thn_ctpio_io_mmap); + efrm_ctpio_unmap_kernel( + tcp_helper_vi(trs, intf_i), trs_nic->thn_ctpio_io_mmap); #endif for( vi_i = num_vis - 1; vi_i >= 0; --vi_i ) { ef_vi* vi = &trs->netif.nic_hw[intf_i].vis[vi_i]; @@ -2125,9 +2081,9 @@ static void tcp_helper_leak_check(tcp_helper_resource_t* trs) for( i = 0; i < CI_TCP_AUX_TYPE_NUM; i++ ) { ci_assert_equal(ni->state->n_aux_bufs[i], 0); if( ni->state->n_aux_bufs[i] != 0 ) { - ci_log("%s[%d]: aux_bufs[%s]: leaked %d out of %d", - __func__, NI_ID(ni), ci_tcp_aux_type2str(i), - ni->state->n_aux_bufs[i], ni->state->max_aux_bufs[i]); + ci_log("%s[%d]: aux_bufs[%s]: leaked %d out of %d", __func__, NI_ID(ni), + ci_tcp_aux_type2str(i), ni->state->n_aux_bufs[i], + ni->state->max_aux_bufs[i]); } } @@ -2143,9 +2099,9 @@ static void tcp_helper_leak_check(tcp_helper_resource_t* trs) */ table_n_entries = ni->state->stats.table_n_entries #if CI_CFG_IPV6 - + ni->state->stats.ipv6_table_n_entries + + ni->state->stats.ipv6_table_n_entries #endif - ; + ; #ifndef NDEBUG oof_cb_sw_filter_apply(&trs->netif); @@ -2157,7 +2113,7 @@ static void tcp_helper_leak_check(tcp_helper_resource_t* trs) ! (trs->trusted_lock & OO_TRUSTED_LOCK_SWF_UPDATE) && ! (trs->netif.state->lock.lock & CI_EPLOCK_NETIF_SWF_UPDATE) ) ci_log("%s[%d]: leaked %d software filters", __func__, NI_ID(ni), - table_n_entries); + table_n_entries); ci_assert_equal(ni->state->reserved_pktbufs, 0); } @@ -2173,15 +2129,15 @@ static void ci_ipid_ctor(ci_netif* ni) ci_assert(ni); ipid = NI_IPID(ni); - memset( ipid, 0, sizeof(*ipid)); + memset(ipid, 0, sizeof(*ipid)); if( (range = efab_ipid_alloc(&efab_tcp_driver.ipid)) < 0 ) { - ipid->no_free = 1; /* skip range release in dtor */ + ipid->no_free = 1; /* skip range release in dtor */ range = CI_IPID_MIN; /* just use range 0 anyway */ } - ci_assert( (range + CI_IPID_BLOCK_MASK) < 0x10000); - ipid->base = (ci_uint16)range; + ci_assert((range + CI_IPID_BLOCK_MASK) < 0x10000); + ipid->base = (ci_uint16) range; ipid->next = 0; #if CI_CFG_IPV6 ipid->ip6_base = range << 16; @@ -2201,15 +2157,14 @@ static void ci_ipid_dtor(ci_netif* ni) /* Skip range relese if allocation failed in ctor */ if( ipid->no_free ) return; - ci_assert( ipid->base <= (ci_uint16)(0x10000 - CI_IPID_BLOCK_LENGTH) ); - ci_assert( !(ipid->base & CI_IPID_BLOCK_MASK)); - efab_ipid_free(&efab_tcp_driver.ipid, (ci_int32)ipid->base); + ci_assert(ipid->base <= (ci_uint16) (0x10000 - CI_IPID_BLOCK_LENGTH)); + ci_assert(! (ipid->base & CI_IPID_BLOCK_MASK)); + efab_ipid_free(&efab_tcp_driver.ipid, (ci_int32) ipid->base); } -static int -allocate_netif_resources(ci_resource_onload_alloc_t* alloc, - tcp_helper_resource_t* trs, int cluster_size) +static int allocate_netif_resources(ci_resource_onload_alloc_t* alloc, + tcp_helper_resource_t* trs, int cluster_size) { ci_netif* ni = &trs->netif; ci_netif_state* ns; @@ -2252,59 +2207,59 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, /* FIXME: Reconsider the size of this table. */ entries = NI_OPTS(ni).max_ep_bufs * 2; no_seq_table_entries = 1u << ci_log2_ge(entries, 1); - } - else { + } else { no_seq_table_entries = 0; } /* pkt_sets_n should be zeroed before possible NIC reset */ if( NI_OPTS(ni).max_packets > max_packets_per_stack ) { - OO_DEBUG_ERR(ci_log("WARNING: EF_MAX_PACKETS reduced from %d to %d due to " - "max_packets_per_stack module option", - NI_OPTS(ni).max_packets, max_packets_per_stack)); + OO_DEBUG_ERR( + ci_log("WARNING: EF_MAX_PACKETS reduced from %d to %d due to " + "max_packets_per_stack module option", + NI_OPTS(ni).max_packets, max_packets_per_stack)); ni->state = NULL; tcp_helper_reduce_max_packets(ni, max_packets_per_stack); } ni->pkt_sets_n = 0; ni->pkt_sets_max = - (NI_OPTS(ni).max_packets + PKTS_PER_SET - 1) >> CI_CFG_PKTS_PER_SET_S; + (NI_OPTS(ni).max_packets + PKTS_PER_SET - 1) >> CI_CFG_PKTS_PER_SET_S; /* Find size of netif state to allocate. */ - vi_state_bytes = ef_vi_calc_state_bytes(NI_OPTS(ni).rxq_size, - NI_OPTS(ni).txq_size); + vi_state_bytes = + ef_vi_calc_state_bytes(NI_OPTS(ni).rxq_size, NI_OPTS(ni).txq_size); vi_state_bytes *= ci_netif_num_vis(ni); #if CI_CFG_TCP_SHARED_LOCAL_PORTS if( ci_netif_should_allocate_tcp_shared_local_ports(ni) ) { - no_active_wild_pools = is_power_of_2(cluster_size) ? cluster_size : - RSS_HASH_SIZE; + no_active_wild_pools = + is_power_of_2(cluster_size) ? cluster_size : RSS_HASH_SIZE; /* Max active wilds is bounded by the number of local IPs and * shared local ports. */ - no_active_wild_table_entries = - CI_MIN((ci_uint32)CI_CFG_MAX_LOCAL_IPADDRS, - CI_MAX(NI_OPTS(ni).tcp_shared_local_ports, - NI_OPTS(ni).tcp_shared_local_ports_max)); + no_active_wild_table_entries = CI_MIN((ci_uint32) CI_CFG_MAX_LOCAL_IPADDRS, + CI_MAX(NI_OPTS(ni).tcp_shared_local_ports, + NI_OPTS(ni).tcp_shared_local_ports_max)); /* Quadruple the size to ensure the hash table does not get too full. */ no_active_wild_table_entries <<= 2; /* Round up to a power of two. */ if( no_active_wild_table_entries > 1 ) no_active_wild_table_entries = - 1u << (__fls(no_active_wild_table_entries - 1) + 1); - } - else { + 1u << (__fls(no_active_wild_table_entries - 1) + 1); + } else { no_active_wild_pools = 0; no_active_wild_table_entries = 0; } #endif - filter_table_size = sizeof(ci_netif_filter_table) + - sizeof(ci_netif_filter_table_entry_fast) * (no_table_entries - 1); - filter_table_ext_size = sizeof(ci_netif_filter_table_entry_ext) * - no_table_entries; + filter_table_size = + sizeof(ci_netif_filter_table) + + sizeof(ci_netif_filter_table_entry_fast) * (no_table_entries - 1); + filter_table_ext_size = + sizeof(ci_netif_filter_table_entry_ext) * no_table_entries; #if CI_CFG_IPV6 - ip6_filter_table_size = sizeof(ci_ip6_netif_filter_table) + - sizeof(ci_ip6_netif_filter_table_entry) * (no_table_entries - 1); + ip6_filter_table_size = + sizeof(ci_ip6_netif_filter_table) + + sizeof(ci_ip6_netif_filter_table_entry) * (no_table_entries - 1); #endif /* Allocate shmbuf for netif state. When calculating the size, it's @@ -2323,9 +2278,8 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, /* This is the worst-case amount of space needed for DMA addrs, i.e. when * we're never able to find any higher-order pages. It's extremely likely * that only a fraction of this space will ever be used: */ - dma_addrs_bytes = ni->pkt_sets_max * CI_CFG_MAX_INTERFACES * - PKTS_PER_SET / (PAGE_SIZE / CI_CFG_PKT_BUF_SIZE) * - sizeof(ef_addr); + dma_addrs_bytes = ni->pkt_sets_max * CI_CFG_MAX_INTERFACES * PKTS_PER_SET / + (PAGE_SIZE / CI_CFG_PKT_BUF_SIZE) * sizeof(ef_addr); sz += dma_addrs_bytes; sz = CI_ROUND_UP(sz, __alignof__(struct oo_p_dllink)); #if CI_CFG_TCP_SHARED_LOCAL_PORTS @@ -2372,7 +2326,7 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, /* [shmbuf] backs the shared stack state and the socket buffers. First, * count the pages required for the latter. */ i = (NI_OPTS(ni).max_ep_bufs / EP_BUF_PER_PAGE) >> - OO_SHARED_BUFFER_CHUNK_ORDER; + OO_SHARED_BUFFER_CHUNK_ORDER; /* Now add in the pages for the shared state. */ i += sz / OO_SHARED_BUFFER_CHUNK_SIZE; @@ -2380,10 +2334,12 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, * for the sockets). These pages get zeroed, so all fields in the shared * state can be assumed to have been zero-initialised. */ rc = oo_shmbuf_alloc(&ni->shmbuf, OO_SHARED_BUFFER_CHUNK_ORDER, i, - sz / OO_SHARED_BUFFER_CHUNK_SIZE); + sz / OO_SHARED_BUFFER_CHUNK_SIZE); if( rc < 0 ) { - OO_DEBUG_ERR(ci_log("%s: failed to alloc shmbuf for shared state and " - "socket buffers (%d)", __FUNCTION__, rc)); + OO_DEBUG_ERR( + ci_log("%s: failed to alloc shmbuf for shared state and " + "socket buffers (%d)", + __FUNCTION__, rc)); goto fail1; } @@ -2413,7 +2369,7 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, ns->hwport_mask = ni->hwport_mask; memset(ns->intf_i_to_hwport, 0, sizeof(ns->intf_i_to_hwport)); memcpy(ns->hwport_to_intf_i, ni->hwport_to_intf_i, - sizeof(ns->hwport_to_intf_i)); + sizeof(ns->hwport_to_intf_i)); for( i = 0; i < CI_CFG_MAX_HWPORTS; ++i ) if( ns->hwport_to_intf_i[i] >= 0 ) ns->intf_i_to_hwport[(int) ns->hwport_to_intf_i[i]] = i; @@ -2439,7 +2395,7 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, ns->active_wild_pools_n = no_active_wild_pools; ns_ofs += (sizeof(struct oo_p_dllink) * ns->active_wild_table_entries_n * - ns->active_wild_pools_n); + ns->active_wild_pools_n); #endif ns_ofs = CI_ROUND_UP(ns_ofs, __alignof__(ci_tcp_prev_seq_t)); @@ -2476,7 +2432,7 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, #endif /* The last addition to ns_ofs is not really used */ - (void)ns_ofs; + (void) ns_ofs; ns->vi_state_bytes = vi_state_bytes; @@ -2496,15 +2452,15 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, #endif #if CI_CFG_UL_INTERRUPT_HELPER - oo_ringbuffer_state_init(&ns->closed_eps, OO_CLOSED_EPS_RING_SIZE, - sizeof(oo_sp)); + oo_ringbuffer_state_init( + &ns->closed_eps, OO_CLOSED_EPS_RING_SIZE, sizeof(oo_sp)); oo_ringbuffer_init(&ni->closed_eps, &ns->closed_eps, - (void*)((char*) ns + ns->closed_eps_ofs)); + (void*) ((char*) ns + ns->closed_eps_ofs)); oo_ringbuffer_state_init(&ns->sw_filter_ops, OO_SW_FILTER_OPS_SIZE, - sizeof(struct oo_sw_filter_op)); + sizeof(struct oo_sw_filter_op)); oo_ringbuffer_init(&ni->sw_filter_ops, &ns->sw_filter_ops, - (void*)((char*) ns + ns->sw_filter_ofs)); + (void*) ((char*) ns + ns->sw_filter_ofs)); #endif ni->packets->sets_max = ni->pkt_sets_max; @@ -2522,21 +2478,23 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, /* The shared netif-state buffer and EP buffers are part of the mem mmap */ trs->mem_mmap_bytes += ns->netif_mmap_bytes; - OO_DEBUG_MEMSIZE(ci_log( - "added %d (0x%x) bytes for shared netif state and ep buffers, " - "reached %d (0x%x)", ns->netif_mmap_bytes, ns->netif_mmap_bytes, - trs->mem_mmap_bytes, trs->mem_mmap_bytes)); + OO_DEBUG_MEMSIZE( + ci_log("added %d (0x%x) bytes for shared netif state and ep buffers, " + "reached %d (0x%x)", + ns->netif_mmap_bytes, ns->netif_mmap_bytes, trs->mem_mmap_bytes, + trs->mem_mmap_bytes)); if( trs->name[0] == '\0' ) snprintf(ns->pretty_name, sizeof(ns->pretty_name), "%d", ns->stack_id); else - snprintf(ns->pretty_name, sizeof(ns->pretty_name), "%d,%s", - ns->stack_id, trs->name); + snprintf(ns->pretty_name, sizeof(ns->pretty_name), "%d,%s", ns->stack_id, + trs->name); /* Allocate an eplock resource. */ rc = eplock_ctor(ni); if( rc < 0 ) { - OO_DEBUG_ERR(ci_log("tcp_helper_alloc: failed to allocate EPLOCK (%d)", rc)); + OO_DEBUG_ERR( + ci_log("tcp_helper_alloc: failed to allocate EPLOCK (%d)", rc)); goto fail2; } ni->state->lock.lock = CI_EPLOCK_LOCKED; @@ -2549,11 +2507,13 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, init_waitqueue_head(&trs->ulh_waitq); trs->ulh_flags = 0; - { CI_BUILD_ASSERT(CI_CFG_MAX_INTERFACES<=32); } + { + CI_BUILD_ASSERT(CI_CFG_MAX_INTERFACES <= 32); + } ci_atomic_set(&trs->intr_intfs, 0); if( NI_OPTS(&trs->netif).int_driven ) - ci_atomic_set(&trs->wake_intfs, - (1ull << oo_stack_intf_max(&trs->netif)) - 1); + ci_atomic_set( + &trs->wake_intfs, (1ull << oo_stack_intf_max(&trs->netif)) - 1); else ci_atomic_set(&trs->wake_intfs, 0); #endif @@ -2566,9 +2526,9 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, return 0; - fail2: +fail2: oo_shmbuf_free(&ni->shmbuf); - fail1: +fail1: LOG_NC(ci_log("failed to allocate tcp_helper resources (%d)", rc)); return rc; } @@ -2576,7 +2536,7 @@ allocate_netif_resources(ci_resource_onload_alloc_t* alloc, #if CI_CFG_TCP_OFFLOAD_RECYCLER static void destroy_ceph_app(struct efrm_ext* plugin, uint32_t app_id) { - struct xsn_ceph_destroy_app param = {.in_app_id = cpu_to_le32(app_id)}; + struct xsn_ceph_destroy_app param = { .in_app_id = cpu_to_le32(app_id) }; int rc = efrm_ext_msg(plugin, XSN_CEPH_DESTROY_APP, ¶m, sizeof(param)); if( rc ) { OO_DEBUG_ERR(ci_log("%s: Destroy Ceph app failed (%d)", __FUNCTION__, rc)); @@ -2585,8 +2545,7 @@ static void destroy_ceph_app(struct efrm_ext* plugin, uint32_t app_id) } #endif -static int -create_plugin_rx_app(tcp_helper_resource_t* trs) +static int create_plugin_rx_app(tcp_helper_resource_t* trs) { #if CI_CFG_TCP_OFFLOAD_RECYCLER ci_netif* ni = &trs->netif; @@ -2595,12 +2554,13 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) ni->state->plugin_mmap_bytes = 0; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ni->nic_hw[intf_i].plugin_rx = NULL; + ni->nic_hw[intf_i].plugin_rx = NULL; if( NI_OPTS(ni).tcp_offload_plugin != CITP_TCP_OFFLOAD_CEPH ) return 0; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct efrm_pd* pd = efrm_vi_get_pd(tcp_helper_vi(trs, intf_i)); struct xsn_ceph_create_app create; struct ef_vi* tcp_vi; @@ -2625,13 +2585,13 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) rc = efrm_ext_get_meta_global(plugin, &meta); if( rc ) { OO_DEBUG_ERR(ci_log("%s: Failed to get plugin metadata (%d, %d)", - __FUNCTION__, intf_i, rc)); + __FUNCTION__, intf_i, rc)); goto fail_plugin_1; } tcp_vi = &ni->nic_hw[intf_i].vis[CI_Q_ID_TCP_RECYCLER]; ceph_vi = &ni->nic_hw[intf_i].vis[CI_Q_ID_TCP_APP]; - create = (struct xsn_ceph_create_app){ + create = (struct xsn_ceph_create_app) { .tcp.in_vi_id = cpu_to_le16(ef_vi_instance(tcp_vi)), .in_meta_vi_id = cpu_to_le16(ef_vi_instance(ceph_vi)), .in_meta_buflen = cpu_to_le16(ef_vi_receive_buffer_len(ceph_vi) - @@ -2639,8 +2599,8 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) }; rc = efrm_ext_msg(plugin, XSN_CEPH_CREATE_APP, &create, sizeof(create)); if( rc ) { - OO_DEBUG_ERR(ci_log("%s: CEPH_CREATE_APP failed (%d, %d)", - __FUNCTION__, intf_i, rc)); + OO_DEBUG_ERR(ci_log( + "%s: CEPH_CREATE_APP failed (%d, %d)", __FUNCTION__, intf_i, rc)); goto fail_plugin_1; } app_id = le32_to_cpu(create.tcp.out_app_id); @@ -2648,15 +2608,13 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) ni->nic_hw[intf_i].plugin_io = NULL; if( meta.mapped_csr_size ) { size_t bar_off = ef10_tx_dma_page_base(nic->vi_stride, - trs->nic[intf_i].thn_vi_rs[CI_Q_ID_TCP_APP]-> - rs.rs_instance); + trs->nic[intf_i].thn_vi_rs[CI_Q_ID_TCP_APP]->rs.rs_instance); bar_off += meta.mapped_csr_offset; - ni->nic_hw[intf_i].plugin_io = ci_ioremap(nic->ctr_ap_addr + - (bar_off & PAGE_MASK), - meta.mapped_csr_size); + ni->nic_hw[intf_i].plugin_io = ci_ioremap( + nic->ctr_ap_addr + (bar_off & PAGE_MASK), meta.mapped_csr_size); if( ! ni->nic_hw[intf_i].plugin_io ) { OO_DEBUG_ERR(ci_log("%s: Ceph app failed to map VI window (%d)", - __FUNCTION__, intf_i)); + __FUNCTION__, intf_i)); destroy_ceph_app(plugin, app_id); fail_plugin_1: efrm_ext_release(plugin); @@ -2671,8 +2629,8 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) got_nic = true; } if( ! got_nic ) { - OO_DEBUG_ERR(ci_log("%s: no EF100 NICs have the requested plugin", - __FUNCTION__)); + OO_DEBUG_ERR( + ci_log("%s: no EF100 NICs have the requested plugin", __FUNCTION__)); return -ENOTSUPP; } #endif @@ -2680,13 +2638,13 @@ create_plugin_rx_app(tcp_helper_resource_t* trs) } -static void -destroy_plugin_rx_app(tcp_helper_resource_t* trs) +static void destroy_plugin_rx_app(tcp_helper_resource_t* trs) { #if CI_CFG_TCP_OFFLOAD_RECYCLER ci_netif* ni = &trs->netif; int intf_i; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct efrm_ext* plugin = ni->nic_hw[intf_i].plugin_rx; if( ! plugin ) continue; @@ -2699,8 +2657,7 @@ destroy_plugin_rx_app(tcp_helper_resource_t* trs) #if CI_CFG_TX_CRC_OFFLOAD -static ci_uint32 -get_plugin_tx_crc_table_region(struct oo_nic* nic) +static ci_uint32 get_plugin_tx_crc_table_region(struct oo_nic* nic) { ci_uint32 region_id; ci_uint8 first_set_bit; @@ -2721,8 +2678,8 @@ get_plugin_tx_crc_table_region(struct oo_nic* nic) return region_id; } -static void -release_plugin_tx_crc_table_region(struct oo_nic* nic, ci_uint32 region_id) +static void release_plugin_tx_crc_table_region( + struct oo_nic* nic, ci_uint32 region_id) { ci_irqlock_state_t lock_flags; @@ -2732,8 +2689,7 @@ release_plugin_tx_crc_table_region(struct oo_nic* nic, ci_uint32 region_id) } #endif -static int -create_plugin_tx_app(tcp_helper_resource_t* trs) +static int create_plugin_tx_app(tcp_helper_resource_t* trs) { #if CI_CFG_TX_CRC_OFFLOAD ci_netif* ni = &trs->netif; @@ -2741,12 +2697,13 @@ create_plugin_tx_app(tcp_helper_resource_t* trs) bool got_nic = false; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ni->nic_hw[intf_i].plugin_tx = NULL; + ni->nic_hw[intf_i].plugin_tx = NULL; if( NI_OPTS(ni).tcp_offload_plugin != CITP_TCP_OFFLOAD_NVME ) return 0; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { ci_uint32 region_id; #if ! CI_CFG_NVME_LOCAL_CRC_MODE struct efhw_nic* nic; @@ -2766,13 +2723,13 @@ create_plugin_tx_app(tcp_helper_resource_t* trs) continue; tx_vi = &ni->nic_hw[intf_i].vis[CI_Q_ID_NORMAL]; - create = (struct xsn_storage_tx_create_app) { - .vi_id = cpu_to_le16(ef_vi_instance(tx_vi)) - }; - rc = efrm_ext_msg(plugin, XSN_STORAGE_TX_CREATE_APP, &create, sizeof(create)); + create = (struct xsn_storage_tx_create_app) { .vi_id = cpu_to_le16( + ef_vi_instance(tx_vi)) }; + rc = efrm_ext_msg( + plugin, XSN_STORAGE_TX_CREATE_APP, &create, sizeof(create)); if( rc ) { - OO_DEBUG_ERR(ci_log("%s: TX_CREATE_APP failed (%d, %d)", - __FUNCTION__, intf_i, rc)); + OO_DEBUG_ERR(ci_log( + "%s: TX_CREATE_APP failed (%d, %d)", __FUNCTION__, intf_i, rc)); efrm_ext_release(plugin); continue; } @@ -2785,17 +2742,16 @@ create_plugin_tx_app(tcp_helper_resource_t* trs) got_nic = true; } if( ! got_nic ) { - OO_DEBUG_ERR(ci_log("%s: no EF100 NICs have the requested plugin", - __FUNCTION__)); + OO_DEBUG_ERR( + ci_log("%s: no EF100 NICs have the requested plugin", __FUNCTION__)); return -ENOTSUPP; } #endif - return 0; + return 0; } -static void -destroy_plugin_tx_app(tcp_helper_resource_t* trs) +static void destroy_plugin_tx_app(tcp_helper_resource_t* trs) { #if CI_CFG_TX_CRC_OFFLOAD ci_netif* ni = &trs->netif; @@ -2804,7 +2760,8 @@ destroy_plugin_tx_app(tcp_helper_resource_t* trs) if( NI_OPTS(ni).tcp_offload_plugin != CITP_TCP_OFFLOAD_NVME ) return; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { #if ! CI_CFG_NVME_LOCAL_CRC_MODE struct efrm_ext* plugin = ni->nic_hw[intf_i].plugin_tx; if( ! plugin ) @@ -2812,17 +2769,15 @@ destroy_plugin_tx_app(tcp_helper_resource_t* trs) efrm_ext_release(plugin); ni->nic_hw[intf_i].plugin_tx = NULL; #endif - release_plugin_tx_crc_table_region(trs->nic[intf_i].thn_oo_nic, - ni->nic_hw[intf_i].plugin_tx_region_id); + release_plugin_tx_crc_table_region( + trs->nic[intf_i].thn_oo_nic, ni->nic_hw[intf_i].plugin_tx_region_id); } #endif } -static int -allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, - tcp_helper_cluster_t* thc, - tcp_helper_resource_t* trs) +static int allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, + tcp_helper_cluster_t* thc, tcp_helper_resource_t* trs) { ci_netif* ni = &trs->netif; ci_netif_state* ns = ni->state; @@ -2833,9 +2788,10 @@ allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, if( NI_OPTS(ni).prealloc_packets && trs->thc_efct_memfd ) { int n_rxqs = 0; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct efhw_nic* nic = - efrm_client_get_nic(trs->nic[intf_i].thn_oo_nic->efrm_client); + efrm_client_get_nic(trs->nic[intf_i].thn_oo_nic->efrm_client); n_rxqs += efhw_nic_max_shared_rxqs(nic); } if( n_rxqs ) { @@ -2843,37 +2799,42 @@ allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, rc = vfs_fallocate(trs->thc_efct_memfd, 0, 0, bytes); if( rc < 0 ) { if( rc == -ENOSPC ) - OO_DEBUG_ERR(ci_log("tcp_helper_alloc: fallocate hugepage memory " - "for EF_PREALLOC_PACKETS failed (%d queues): " - "ENOSPC. Check /proc/sys/vm/nr_hugepages", - n_rxqs)); + OO_DEBUG_ERR( + ci_log("tcp_helper_alloc: fallocate hugepage memory " + "for EF_PREALLOC_PACKETS failed (%d queues): " + "ENOSPC. Check /proc/sys/vm/nr_hugepages", + n_rxqs)); else - OO_DEBUG_ERR(ci_log("tcp_helper_alloc: fallocate hugepage memory " - "for EF_PREALLOC_PACKETS failed (%d queues): %d", - n_rxqs, rc)); + OO_DEBUG_ERR( + ci_log("tcp_helper_alloc: fallocate hugepage memory " + "for EF_PREALLOC_PACKETS failed (%d queues): %d", + n_rxqs, rc)); goto fail0; } } } rc = allocate_vis(trs, alloc, ns + 1, thc); - if( rc < 0 ) goto fail1; + if( rc < 0 ) + goto fail1; sz = sizeof(ci_pkt_bufs) * ni->pkt_sets_max; if( (ni->pkt_bufs = vmalloc(sz)) == NULL ) { - OO_DEBUG_ERR(ci_log("tcp_helper_alloc: failed to allocate iobufset table")); + OO_DEBUG_ERR( + ci_log("tcp_helper_alloc: failed to allocate iobufset table")); rc = -ENOMEM; goto fail4; } memset(ni->pkt_bufs, 0, sz); OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ni->nic_hw[intf_i].pkt_rs = NULL; + ni->nic_hw[intf_i].pkt_rs = NULL; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { if( (ni->nic_hw[intf_i].pkt_rs = ci_alloc(sz)) == NULL ) { - OO_DEBUG_ERR(ci_log("%s: failed to allocate iobufset tables", - __FUNCTION__)); + OO_DEBUG_ERR( + ci_log("%s: failed to allocate iobufset tables", __FUNCTION__)); rc = -ENOMEM; goto fail5; } @@ -2893,14 +2854,14 @@ allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, ns->efct_shm_mmap_bytes = trs->efct_shm_mmap_bytes; ns->timesync_bytes = PAGE_SIZE; - OO_DEBUG_MEMSIZE(ci_log("helper=%u map_bytes=%u (0x%x)", - trs->id, - trs->mem_mmap_bytes, trs->mem_mmap_bytes)); - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_DEBUG_MEMSIZE(ci_log("helper=%u map_bytes=%u (0x%x)", trs->id, + trs->mem_mmap_bytes, trs->mem_mmap_bytes)); + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { int i; for( i = 0; i < ci_netif_num_vis(ni); ++i ) - LOG_NC(ci_log("VI[%d]=%d", i, - ef_vi_instance(&ni->nic_hw[intf_i].vis[i]))); + LOG_NC( + ci_log("VI[%d]=%d", i, ef_vi_instance(&ni->nic_hw[intf_i].vis[i]))); } rc = create_plugin_rx_app(trs); @@ -2917,23 +2878,22 @@ allocate_netif_hw_resources(ci_resource_onload_alloc_t* alloc, return 0; - fail6: - destroy_plugin_rx_app(trs); - fail5: +fail6: + destroy_plugin_rx_app(trs); +fail5: OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( ni->nic_hw[intf_i].pkt_rs ) - ci_free(ni->nic_hw[intf_i].pkt_rs); + if( ni->nic_hw[intf_i].pkt_rs ) + ci_free(ni->nic_hw[intf_i].pkt_rs); vfree(ni->pkt_bufs); - fail4: +fail4: release_vi(trs); - fail1: - fail0: +fail1: +fail0: return rc; } -static void -release_ep_tbl(tcp_helper_resource_t* trs) +static void release_ep_tbl(tcp_helper_resource_t* trs) { ci_netif* ni = &trs->netif; int i; @@ -2956,11 +2916,9 @@ release_ep_tbl(tcp_helper_resource_t* trs) ci_vfree(ni->ep_tbl); ni->ep_tbl = NULL; } - } -static void -release_netif_resources(tcp_helper_resource_t* trs) +static void release_netif_resources(tcp_helper_resource_t* trs) { ci_netif* ni = &trs->netif; int i; @@ -2975,10 +2933,8 @@ release_netif_resources(tcp_helper_resource_t* trs) oo_shmbuf_free(&ni->shmbuf); } -static void -release_netif_hw_resources(tcp_helper_resource_t* trs) +static void release_netif_hw_resources(tcp_helper_resource_t* trs) { - OO_DEBUG_SHM(ci_log("%s:", __func__)); destroy_plugin_rx_app(trs); @@ -2990,11 +2946,11 @@ release_netif_hw_resources(tcp_helper_resource_t* trs) } -int -oo_version_check(const char* version, const char* uk_intf_ver, int debug_lib) +int oo_version_check( + const char* version, const char* uk_intf_ver, int debug_lib) { - return oo_version_check_impl(version, uk_intf_ver, debug_lib, - oo_uk_intf_ver); + return oo_version_check_impl( + version, uk_intf_ver, debug_lib, oo_uk_intf_ver); } @@ -3007,7 +2963,7 @@ static int /* bool */ oo_nic_is_vf(const struct oo_nic* onic) ci_inline int oo_dev_get_by_name(tcp_helper_resource_t* trs, const char* name) { - struct net_device *nd; + struct net_device* nd; int ifindex; #ifdef EFRM_DEV_GET_BY_NAME_TAKES_NS nd = dev_get_by_name(trs->netif.cplane->cp_netns, name); @@ -3021,9 +2977,10 @@ ci_inline int oo_dev_get_by_name(tcp_helper_resource_t* trs, const char* name) return ifindex; } -static const char IFACELIST_DELIM[] = " \t\n\v\f\r"; /* inspired by isspace() */ +static const char IFACELIST_DELIM[] = + " \t\n\v\f\r"; /* inspired by isspace() */ static int oo_get_listed_hwports(tcp_helper_resource_t* trs, const char* list, - cicp_hwport_mask_t* hwports_out, const char* tag) + cicp_hwport_mask_t* hwports_out, const char* tag) { ci_netif* ni = &trs->netif; cicp_hwport_mask_t listed_hwports = 0; @@ -3035,13 +2992,13 @@ static int oo_get_listed_hwports(tcp_helper_resource_t* trs, const char* list, running = dup = kstrdup(list, GFP_KERNEL); if( dup == NULL ) { ci_log("%s: WARNING no memory to parse interface %s, assuming empty\n", - __FUNCTION__, tag); + __FUNCTION__, tag); return 1; } while( 1 ) { int ifindex; - + token = strsep(&running, IFACELIST_DELIM); if( token == NULL ) break; @@ -3053,20 +3010,20 @@ static int oo_get_listed_hwports(tcp_helper_resource_t* trs, const char* list, cicp_hwport_mask_t hwport_mask = 0; int rc; rc = oo_cp_find_llap(ni->cplane, ifindex, NULL, NULL, - &hwport_mask /* rx_hwports */, NULL, NULL); + &hwport_mask /* rx_hwports */, NULL, NULL); if( rc == 0 && hwport_mask != 0 ) { listed_hwports |= hwport_mask; + } else { + ci_log( + "%s: WARNING interface %s constains %s, which " + " is not identified as Solarflare interface", + __FUNCTION__, tag, token); } - else { - ci_log("%s: WARNING interface %s constains %s, which " - " is not identified as Solarflare interface", - __FUNCTION__, tag, token); - } - } - else { - ci_log("%s: WARNING interface %s contains %s, which " - "is not known an interface", - __FUNCTION__, tag, token); + } else { + ci_log( + "%s: WARNING interface %s contains %s, which " + "is not known an interface", + __FUNCTION__, tag, token); } } *hwports_out = listed_hwports; @@ -3103,30 +3060,28 @@ static int oo_get_nics(tcp_helper_resource_t* trs, int ifindices_len) for( i = 0; i < CI_CFG_MAX_HWPORTS; ++i ) ni->hwport_to_intf_i[i] = (ci_int8) -1; - + for( i = 0; i < CI_CFG_MAX_INTERFACES; ++i ) ni->intf_i_to_hwport[i] = (ci_int8) -1; hwport_mask = oo_cp_get_hwports(ni->cplane); - if( oo_get_listed_hwports(trs, NI_OPTS(ni).iface_whitelist, - &whitelist_mask, "whitelist") == 0 ) - { + if( oo_get_listed_hwports(trs, NI_OPTS(ni).iface_whitelist, &whitelist_mask, + "whitelist") == 0 ) { if( (whitelist_mask & ~hwport_mask) != 0 ) { ci_log("%s: WARNING: interface whitelist specifies unlicensed NICs", - __FUNCTION__); + __FUNCTION__); } /* We only allow whitelist to specify subset of licensed hwports * present in current namespace. */ hwport_mask &= whitelist_mask; } - if( oo_get_listed_hwports(trs, NI_OPTS(ni).iface_blacklist, - &whitelist_mask, "blacklist") == 0 ) - { + if( oo_get_listed_hwports(trs, NI_OPTS(ni).iface_blacklist, &whitelist_mask, + "blacklist") == 0 ) { if( (whitelist_mask & ~hwport_mask) != 0 ) { ci_log("%s: WARNING: interface blacklist specifies unlicensed NICs", - __FUNCTION__); + __FUNCTION__); } hwport_mask &= ~whitelist_mask; } @@ -3161,11 +3116,9 @@ static int oo_get_nics(tcp_helper_resource_t* trs, int ifindices_len) } rtnl_unlock(); - } - else if( ifindices_len == 0 ) { + } else if( ifindices_len == 0 ) { ci_assert_equal(trs->netif.nic_n, 0); - } - else { + } else { /* This code path is not used yet, but this error message will make it * obvious what needs doing if we decide to use it in future... */ @@ -3175,21 +3128,22 @@ static int oo_get_nics(tcp_helper_resource_t* trs, int ifindices_len) } if( trs->netif.nic_n == 0 && ifindices_len != 0 ) { - ci_log("%s: ERROR: No Solarflare network interfaces are active/UP,\n" - "or they are configured with packed stream firmware, disabled,\n" - "or unlicensed for Onload. Please check your configuration.", - __FUNCTION__); + ci_log( + "%s: ERROR: No Solarflare network interfaces are active/UP,\n" + "or they are configured with packed stream firmware, disabled,\n" + "or unlicensed for Onload. Please check your configuration.", + __FUNCTION__); return -ENODEV; } ni->hwport_mask = hwport_mask; return 0; - fail: +fail: return rc; } -ci_inline void efab_notify_stacklist_change(tcp_helper_resource_t *thr) +ci_inline void efab_notify_stacklist_change(tcp_helper_resource_t* thr) { /* here we should notify tcpdump process that the stack list have * changed */ @@ -3204,7 +3158,7 @@ ci_inline void efab_notify_stacklist_change(tcp_helper_resource_t *thr) #if ! CI_CFG_UL_INTERRUPT_HELPER static int tcp_helper_reprime_is_needed(ci_netif* ni) { - ci_assert_equal( NI_OPTS(ni).int_driven, 0); + ci_assert_equal(NI_OPTS(ni).int_driven, 0); if( ci_netif_is_spinner(ni) ) /* Don't reprime if someone is spinning -- let them poll the stack. */ @@ -3227,14 +3181,13 @@ static int tcp_helper_reprime_is_needed(ci_netif* ni) * this function is called, because non-atomic work item might be already * running and using the locks. */ -void -tcp_helper_defer_dl2work(tcp_helper_resource_t* trs, ci_uint32 flag) +void tcp_helper_defer_dl2work(tcp_helper_resource_t* trs, ci_uint32 flag) { - OO_DEBUG_TCPH(ci_log("%s: [%u] defer locks with flag=%x", - __FUNCTION__, trs->id, flag)); + OO_DEBUG_TCPH(ci_log( + "%s: [%u] defer locks with flag=%x", __FUNCTION__, trs->id, flag)); ci_assert(ci_netif_is_locked(&trs->netif)); CITP_STATS_NETIF_INC(&trs->netif, stack_locks_deferred); - trs->netif.flags &=~ CI_NETIF_FLAG_IN_DL_CONTEXT; + trs->netif.flags &= ~CI_NETIF_FLAG_IN_DL_CONTEXT; /* We need write memory barrier here. However, both x86 and ppc * implementations of ci_atomic32_or() include a sort of write memory * barrier at the beginning. @@ -3249,24 +3202,22 @@ tcp_helper_defer_dl2work(tcp_helper_resource_t* trs, ci_uint32 flag) queue_work(trs->wq, &trs->non_atomic_work); } -static void -oo_inject_packets_kernel_force(ci_netif* ni) +static void oo_inject_packets_kernel_force(ci_netif* ni) { ci_assert(ci_netif_is_locked(ni)); if( kernel_packets_pending(ni->state) == 0 ) return; - ef_eplock_holder_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_KERNEL_PACKETS); + ef_eplock_holder_set_flag(&ni->state->lock, CI_EPLOCK_NETIF_KERNEL_PACKETS); } -static void tcp_helper_do_non_atomic(struct work_struct *data) +static void tcp_helper_do_non_atomic(struct work_struct* data) { - tcp_helper_resource_t* trs = container_of(data, tcp_helper_resource_t, - non_atomic_work); - const unsigned handled_aflags = (OO_THR_EP_AFLAG_CLEAR_FILTERS | - OO_THR_EP_AFLAG_NEED_FREE | - OO_THR_EP_AFLAG_TCP_OFFLOAD_ISN); + tcp_helper_resource_t* trs = + container_of(data, tcp_helper_resource_t, non_atomic_work); + const unsigned handled_aflags = + (OO_THR_EP_AFLAG_CLEAR_FILTERS | OO_THR_EP_AFLAG_NEED_FREE | + OO_THR_EP_AFLAG_TCP_OFFLOAD_ISN); ci_irqlock_state_t lock_flags; tcp_helper_endpoint_t* ep; unsigned ep_aflags, new_aflags; @@ -3283,21 +3234,21 @@ static void tcp_helper_do_non_atomic(struct work_struct *data) ci_sllist_init(&trs->non_atomic_list); ci_irqlock_unlock(&trs->lock, &lock_flags); while( (link = ci_sllist_try_pop(&list)) != NULL ) { - ep = CI_CONTAINER(tcp_helper_endpoint_t, non_atomic_link , link); + ep = CI_CONTAINER(tcp_helper_endpoint_t, non_atomic_link, link); again: - do { /* grab and clear flags telling us what to do */ + do { /* grab and clear flags telling us what to do */ ep_aflags = ep->ep_aflags; new_aflags = ep_aflags & ~handled_aflags; } while( ci_cas32_fail(&ep->ep_aflags, ep_aflags, new_aflags) ); OO_DEBUG_TCPH(ci_log("%s: [%u:%d] aflags=%x", __FUNCTION__, trs->id, - OO_SP_FMT(ep->id), ep_aflags)); + OO_SP_FMT(ep->id), ep_aflags)); if( ep_aflags & OO_THR_EP_AFLAG_CLEAR_FILTERS ) tcp_helper_endpoint_clear_filters(ep, 0); if( ep_aflags & OO_THR_EP_AFLAG_NEED_FREE ) { /* make sure that the filters are released: */ tcp_helper_endpoint_clear_filters(ep, 0); - citp_waitable_obj_free_nnl(&trs->netif, - SP_TO_WAITABLE(&trs->netif, ep->id)); + citp_waitable_obj_free_nnl( + &trs->netif, SP_TO_WAITABLE(&trs->netif, ep->id)); } #if CI_CFG_TCP_OFFLOAD_RECYCLER if( ep_aflags & OO_THR_EP_AFLAG_TCP_OFFLOAD_ISN ) { @@ -3327,8 +3278,8 @@ static void tcp_helper_do_non_atomic(struct work_struct *data) * lock. */ if( trs->trs_aflags & OO_THR_AFLAG_DEFERRED_TRUSTED ) { ci_uint32 trs_aflags; - OO_DEBUG_TCPH(ci_log("%s: [%u] deferred locks trs_aflags=%d", - __FUNCTION__, trs->id, trs->trs_aflags)); + OO_DEBUG_TCPH(ci_log("%s: [%u] deferred locks trs_aflags=%d", __FUNCTION__, + trs->id, trs->trs_aflags)); ci_assert(ci_netif_is_locked(&trs->netif)); ci_assert(oo_trusted_lock_is_locked(trs)); @@ -3346,32 +3297,30 @@ static void tcp_helper_do_non_atomic(struct work_struct *data) if( trs_aflags & OO_THR_AFLAG_POLL_AND_PRIME ) { int intf_i; - OO_DEBUG_TCPH(ci_log("%s: [%u] deferred POLL_AND_PRIME", - __FUNCTION__, trs->id)); + OO_DEBUG_TCPH( + ci_log("%s: [%u] deferred POLL_AND_PRIME", __FUNCTION__, trs->id)); trs->netif.state->poll_did_wake = 0; ci_netif_poll(&trs->netif); if( NI_OPTS(&trs->netif).int_driven ) { ci_netif* ni = &trs->netif; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( ci_bit_test_and_clear(&ni->state->evq_prime_deferred, intf_i) ) - tcp_helper_request_wakeup_nic(trs, intf_i); - } - else if( ! trs->netif.state->poll_did_wake && - tcp_helper_reprime_is_needed(&trs->netif) ) { + if( ci_bit_test_and_clear(&ni->state->evq_prime_deferred, intf_i) ) + tcp_helper_request_wakeup_nic(trs, intf_i); + } else if( ! trs->netif.state->poll_did_wake && + tcp_helper_reprime_is_needed(&trs->netif) ) { tcp_helper_request_wakeup(trs); CITP_STATS_NETIF_INC(&trs->netif, interrupt_primes); } } efab_tcp_helper_netif_unlock(trs, 0); - } - else if( need_unlock_shared ) + } else if( need_unlock_shared ) efab_eplock_unlock_and_wake(&trs->netif, 0); } -void tcp_helper_endpoint_queue_non_atomic(tcp_helper_endpoint_t* ep, - unsigned why_aflag) +void tcp_helper_endpoint_queue_non_atomic( + tcp_helper_endpoint_t* ep, unsigned why_aflag) { ci_irqlock_state_t lock_flags; unsigned prev_aflags; @@ -3389,11 +3338,10 @@ void tcp_helper_endpoint_queue_non_atomic(tcp_helper_endpoint_t* ep, /* Woritem routine to handle postponed stack destruction. * Should be run in global workqueue only, not in the stack workqueue * because these functions flush and destroy the stack workqueue. */ -static void -tcp_helper_destroy_work(struct work_struct *data) +static void tcp_helper_destroy_work(struct work_struct* data) { - tcp_helper_resource_t* trs = container_of(data, tcp_helper_resource_t, - work_item_dtor); + tcp_helper_resource_t* trs = + container_of(data, tcp_helper_resource_t, work_item_dtor); if( trs->ref[OO_THR_REF_BASE] == 0 ) { tcp_helper_dtor(trs); @@ -3411,16 +3359,14 @@ ci_inline void tcp_helper_init_max_mss(tcp_helper_resource_t* rs) const int max_prefix = 22; ci_netif* ni = &rs->netif; - ni->state->max_mss = CI_CFG_PKT_BUF_SIZE - 256 - max_prefix - ETH_HLEN - - ETH_VLAN_HLEN - sizeof(ci_ip4_hdr) - sizeof(ci_tcp_hdr); + ni->state->max_mss = CI_CFG_PKT_BUF_SIZE - 256 - max_prefix - ETH_HLEN - + ETH_VLAN_HLEN - sizeof(ci_ip4_hdr) - sizeof(ci_tcp_hdr); } -static int -tcp_helper_rm_alloc_proxy(ci_resource_onload_alloc_t* alloc, - const ci_netif_config_opts* opts, - int ifindices_len, - tcp_helper_resource_t** rs_out) +static int tcp_helper_rm_alloc_proxy(ci_resource_onload_alloc_t* alloc, + const ci_netif_config_opts* opts, int ifindices_len, + tcp_helper_resource_t** rs_out) { int rc; @@ -3442,14 +3388,10 @@ tcp_helper_rm_alloc_proxy(ci_resource_onload_alloc_t* alloc, * Cluster will be created if needed. */ ci_uint16 in_flags = - alloc->in_flags & ~CI_NETIF_FLAG_DO_ALLOCATE_SCALABLE_FILTERS_RSS; - rc = tcp_helper_cluster_alloc_thr(alloc->in_name, - alloc->in_cluster_size, - alloc->in_cluster_restart, - in_flags, - opts, - &rs); - if ( rc != 0 ) + alloc->in_flags & ~CI_NETIF_FLAG_DO_ALLOCATE_SCALABLE_FILTERS_RSS; + rc = tcp_helper_cluster_alloc_thr(alloc->in_name, alloc->in_cluster_size, + alloc->in_cluster_restart, in_flags, opts, &rs); + if( rc != 0 ) return rc; ni = &rs->netif; ci_assert_equal(rs->id, rs->netif.state->stack_id); @@ -3457,19 +3399,16 @@ tcp_helper_rm_alloc_proxy(ci_resource_onload_alloc_t* alloc, alloc->out_nic_set = ni->nic_set; *rs_out = rs; return 0; - } - else + } else #endif { - return tcp_helper_rm_alloc(alloc, opts, ifindices_len, - NULL, rs_out); + return tcp_helper_rm_alloc(alloc, opts, ifindices_len, NULL, rs_out); } } -void -tcp_helper_free_ephemeral_ports(struct efab_ephemeral_port_head* table, - ci_uint32 entries) +void tcp_helper_free_ephemeral_ports( + struct efab_ephemeral_port_head* table, ci_uint32 entries) { ci_uint32 i; for( i = 0; i < entries; ++i ) { @@ -3480,7 +3419,7 @@ tcp_helper_free_ephemeral_ports(struct efab_ephemeral_port_head* table, * These entries are also kept at the locations for their respective IP * addresses, so to avoid double-freeing, we detect the global list by * checking for an IP-address mismatch. */ - if( keeper != NULL && !CI_IPX_ADDR_EQ(keeper->laddr, table[i].laddr) ) { + if( keeper != NULL && ! CI_IPX_ADDR_EQ(keeper->laddr, table[i].laddr) ) { ci_assert(CI_IPX_ADDR_IS_ANY(table[i].laddr)); continue; } @@ -3503,10 +3442,9 @@ tcp_helper_free_ephemeral_ports(struct efab_ephemeral_port_head* table, * into * list_head -> LIST -> new_head -> ... -> new_tail * in a thread-safe manner. */ -static void -donate_ephemeral_ports(struct efab_ephemeral_port_head* list_head, - struct efab_ephemeral_port_keeper* new_head, - struct efab_ephemeral_port_keeper** new_tail_link) +static void donate_ephemeral_ports(struct efab_ephemeral_port_head* list_head, + struct efab_ephemeral_port_keeper* new_head, + struct efab_ephemeral_port_keeper** new_tail_link) { ci_uintptr_t ptr = (ci_uintptr_t) &list_head->head; ci_uintptr_t new = (ci_uintptr_t) new_head; @@ -3536,11 +3474,10 @@ donate_ephemeral_ports(struct efab_ephemeral_port_head* list_head, } -void -tcp_helper_donate_ephemeral_ports(struct efab_ephemeral_port_head* list_head, - struct efab_ephemeral_port_keeper* new_head, - struct efab_ephemeral_port_keeper* new_tail, - int count) +void tcp_helper_donate_ephemeral_ports( + struct efab_ephemeral_port_head* list_head, + struct efab_ephemeral_port_keeper* new_head, + struct efab_ephemeral_port_keeper* new_tail, int count) { /* The addresses of all ports on the list should be equal. */ ci_assert(CI_IPX_ADDR_EQ(list_head->laddr, new_head->laddr)); @@ -3554,11 +3491,10 @@ tcp_helper_donate_ephemeral_ports(struct efab_ephemeral_port_head* list_head, /* Add some ephemeral ports to the list of all ephemeral ports (as opposed to * an IP-specific list). */ -static void -tcp_helper_donate_global_ephemeral_ports( - struct efab_ephemeral_port_head* list_head, - struct efab_ephemeral_port_keeper* new_head, - struct efab_ephemeral_port_keeper* new_tail) +static void tcp_helper_donate_global_ephemeral_ports( + struct efab_ephemeral_port_head* list_head, + struct efab_ephemeral_port_keeper* new_head, + struct efab_ephemeral_port_keeper* new_tail) { /* This is the global list, which is headed at the INADDR_ANY entry in the * table, as that entry is otherwise unused when shared local ports are @@ -3569,10 +3505,9 @@ tcp_helper_donate_global_ephemeral_ports( } -int -tcp_helper_alloc_ephemeral_ports(struct efab_ephemeral_port_head* list_head, - struct efab_ephemeral_port_head* global_head, - ci_addr_t laddr, int count) +int tcp_helper_alloc_ephemeral_ports( + struct efab_ephemeral_port_head* list_head, + struct efab_ephemeral_port_head* global_head, ci_addr_t laddr, int count) { struct efab_ephemeral_port_keeper* new_head = NULL; struct efab_ephemeral_port_keeper* new_global_head = NULL; @@ -3603,11 +3538,12 @@ tcp_helper_alloc_ephemeral_ports(struct efab_ephemeral_port_head* list_head, existing_prev = existing; rc = efab_alloc_ephemeral_port(laddr, existing->port_be16, &keeper); if( rc != 0 && rc != -EADDRINUSE ) - OO_DEBUG_ERR(CI_RLLOG(10, "%s: unexpected failure reusing " - CI_IP_PRINTF_FORMAT":%u for %d-th ephemeral " - "port: rc=%d", __FUNCTION__, - CI_IP_PRINTF_ARGS(&existing->laddr), - CI_BSWAP_BE16(existing->port_be16), i, rc)); + OO_DEBUG_ERR(CI_RLLOG(10, + "%s: unexpected failure reusing " CI_IP_PRINTF_FORMAT + ":%u for %d-th ephemeral " + "port: rc=%d", + __FUNCTION__, CI_IP_PRINTF_ARGS(&existing->laddr), + CI_BSWAP_BE16(existing->port_be16), i, rc)); } /* Remember where we got to in the global list. We can race against other @@ -3623,8 +3559,10 @@ tcp_helper_alloc_ephemeral_ports(struct efab_ephemeral_port_head* list_head, * this IP address. */ if( keeper == NULL ) { if( (rc = efab_alloc_ephemeral_port(laddr, 0, &keeper)) != 0 ) { - OO_DEBUG_ERR(ci_log("%s: failed to allocate %d-th ephemeral port: " - "rc=%d", __FUNCTION__, i, rc)); + OO_DEBUG_ERR( + ci_log("%s: failed to allocate %d-th ephemeral port: " + "rc=%d", + __FUNCTION__, i, rc)); break; } @@ -3661,22 +3599,19 @@ tcp_helper_alloc_ephemeral_ports(struct efab_ephemeral_port_head* list_head, if( new_global_head != NULL ) { ci_assert(global_head); ci_assert(new_global_tail); - tcp_helper_donate_global_ephemeral_ports(global_head, new_global_head, - new_global_tail); + tcp_helper_donate_global_ephemeral_ports( + global_head, new_global_head, new_global_tail); } return i; } -static int -__efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, - struct file* os_file, ci_int32 domain); +static int __efab_create_os_socket(tcp_helper_resource_t* trs, + tcp_helper_endpoint_t* ep, struct file* os_file, ci_int32 domain); #if CI_CFG_TCP_SHARED_LOCAL_PORTS -static -ci_active_wild* tcp_helper_alloc_active_wild( - tcp_helper_resource_t* rs, - struct efab_ephemeral_port_keeper* keeper) +static ci_active_wild* tcp_helper_alloc_active_wild( + tcp_helper_resource_t* rs, struct efab_ephemeral_port_keeper* keeper) { ci_active_wild* aw; ci_netif* netif = &rs->netif; @@ -3686,7 +3621,7 @@ ci_active_wild* tcp_helper_alloc_active_wild( /* Get a sock buf */ aw = ci_active_wild_get_state_buf(netif); - if( !aw ) + if( ! aw ) goto fail; /* Give it an OS backing socket */ @@ -3712,7 +3647,7 @@ ci_active_wild* tcp_helper_alloc_active_wild( return aw; - fail_ep: +fail_ep: /* We are already under stack lock, this ensures that we can * immediately and safely close the endpoint in * efab_tcp_helper_close_endpoint() function. @@ -3724,16 +3659,14 @@ ci_active_wild* tcp_helper_alloc_active_wild( * out-of-resources. */ efab_tcp_helper_close_endpoint(rs, ep->id, 1); - fail: +fail: return NULL; } /* Allocate active wild for the port [port]. */ -static int -tcp_helper_alloc_to_aw_pool(tcp_helper_resource_t* rs, - ci_addr_t laddr, - struct efab_ephemeral_port_keeper* port) +static int tcp_helper_alloc_to_aw_pool(tcp_helper_resource_t* rs, + ci_addr_t laddr, struct efab_ephemeral_port_keeper* port) { ci_netif* ni = &rs->netif; int idx; @@ -3758,9 +3691,10 @@ tcp_helper_alloc_to_aw_pool(tcp_helper_resource_t* rs, * use any of the pools that give us a match for the resulting 4-tuple. */ - idx = ni->state->active_wild_pools_n > 1 ? - ci_netif_active_wild_nic_hash(ni, addr_any, port->port_be16, - addr_any, 0) : 0; + idx = ni->state->active_wild_pools_n > 1 + ? ci_netif_active_wild_nic_hash( + ni, addr_any, port->port_be16, addr_any, 0) + : 0; idx &= ni->state->active_wild_pools_n - 1; list = ci_netif_get_active_wild_list(ni, idx, laddr); @@ -3779,10 +3713,8 @@ tcp_helper_alloc_to_aw_pool(tcp_helper_resource_t* rs, /* Allocate active wilds for all ports in the list [ports]. */ -static int -tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, - ci_addr_t laddr, - struct efab_ephemeral_port_head* ports) +static int tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, + ci_addr_t laddr, struct efab_ephemeral_port_head* ports) { ci_netif* ni = &rs->netif; int i = 0; @@ -3796,10 +3728,8 @@ tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, * need to know that we've consumed these ports. We mark them as consumed * even if we fail to allocate the active wilds: in that case, we have * bigger problems. */ - rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table_consumed, - laddr, - rs->trs_ephem_table_entries, - &consumed); + rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table_consumed, laddr, + rs->trs_ephem_table_entries, &consumed); /* If we're calling this function, we must have a list of ephemeral ports for * the local address. This means that we should also succeed in finding * (storage for) the "consumed" pointer for that address. */ @@ -3813,8 +3743,10 @@ tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, /* Treat the active wild pool as best effort - we can carry on * without it. */ - NI_LOG(&rs->netif, RESOURCE_WARNINGS, "%s: Only alloced %d of active" - " shared", __FUNCTION__, CI_MAX(0, i - 1)); + NI_LOG(&rs->netif, RESOURCE_WARNINGS, + "%s: Only alloced %d of active" + " shared", + __FUNCTION__, CI_MAX(0, i - 1)); return -ENOBUFS; } consumed->head = port; @@ -3824,11 +3756,13 @@ tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, if( ! NI_OPTS(ni).tcp_shared_local_ports_per_ip ) for( i = 0; i < ni->state->active_wild_pools_n; i++ ) { struct oo_p_dllink_state list = - ci_netif_get_active_wild_list(ni, i, addr_any); + ci_netif_get_active_wild_list(ni, i, addr_any); if( list.p != OO_P_NULL && oo_p_dllink_is_empty(ni, list) ) { - NI_LOG(&rs->netif, RESOURCE_WARNINGS, "%s: Current shared local ports " - "don't provide coverage of all possible connections. Allocate " - "more to improve coverage.", __FUNCTION__); + NI_LOG(&rs->netif, RESOURCE_WARNINGS, + "%s: Current shared local ports " + "don't provide coverage of all possible connections. Allocate " + "more to improve coverage.", + __FUNCTION__); break; } } @@ -3852,10 +3786,9 @@ tcp_helper_alloc_list_to_aw_pool(tcp_helper_resource_t* rs, * This function requires no locks and uses atomic operations to ensure * thread-safety. */ -int -tcp_helper_get_ephemeral_port_list(struct efab_ephemeral_port_head* table, - ci_addr_t laddr, ci_uint32 table_entries, - struct efab_ephemeral_port_head** list_out) +int tcp_helper_get_ephemeral_port_list(struct efab_ephemeral_port_head* table, + ci_addr_t laddr, ci_uint32 table_entries, + struct efab_ephemeral_port_head** list_out) { uint32_t bucket, hash1, hash2; @@ -3874,8 +3807,8 @@ tcp_helper_get_ephemeral_port_list(struct efab_ephemeral_port_head* table, * list, but we have to guard against another concurrent instance of this * function trying to do the same thing. */ if( (*list_out)->port_count == EPHEMERAL_PORT_LIST_NO_PORT && - ci_cas32_succeed(&(*list_out)->port_count, - EPHEMERAL_PORT_LIST_NO_PORT, 0) ) { + ci_cas32_succeed( + &(*list_out)->port_count, EPHEMERAL_PORT_LIST_NO_PORT, 0) ) { (*list_out)->laddr = laddr; return 0; } @@ -3894,8 +3827,9 @@ tcp_helper_get_ephemeral_port_list(struct efab_ephemeral_port_head* table, bucket = (bucket + hash2) & (table_entries - 1); } while( bucket != hash1 ); - CI_RLLOG(1, "%s: No space in ephemeral port table for local address " - IPX_FMT, __FUNCTION__, IPX_ARG(AF_IP(laddr))); + CI_RLLOG(1, + "%s: No space in ephemeral port table for local address " IPX_FMT, + __FUNCTION__, IPX_ARG(AF_IP(laddr))); return -ENOSPC; } @@ -3905,10 +3839,8 @@ tcp_helper_get_ephemeral_port_list(struct efab_ephemeral_port_head* table, /* Allocates active wilds for ephemeral ports on the list [list_head]. The * traversal of the list will terminate when a port is reached for which we * have previously allocated an active wild. */ -static int -tcp_helper_alloc_aw_for_ephem_ports(tcp_helper_resource_t* rs, - struct efab_ephemeral_port_head* list_head, - ci_addr_t laddr) +static int tcp_helper_alloc_aw_for_ephem_ports(tcp_helper_resource_t* rs, + struct efab_ephemeral_port_head* list_head, ci_addr_t laddr) { int rc; int count = 0; @@ -3917,10 +3849,8 @@ tcp_helper_alloc_aw_for_ephem_ports(tcp_helper_resource_t* rs, ci_assert(ci_netif_is_locked(&rs->netif)); - rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table_consumed, - laddr, - rs->trs_ephem_table_entries, - &consumed); + rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table_consumed, laddr, + rs->trs_ephem_table_entries, &consumed); /* If we're calling this function, we must have a list of ephemeral ports * for the local address. This means that we should also succeed in * finding (storage for) the "consumed" pointer for that address. */ @@ -3946,8 +3876,8 @@ tcp_helper_alloc_aw_for_ephem_ports(tcp_helper_resource_t* rs, } -int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, - ci_addr_t laddr) +int tcp_helper_increase_active_wild_pool( + tcp_helper_resource_t* rs, ci_addr_t laddr) { struct efab_ephemeral_port_head* list_head; struct efab_ephemeral_port_head* global_head = NULL; @@ -3964,18 +3894,16 @@ int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, if( rs->trs_ephem_table == NULL ) return -EINVAL; - rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table, laddr, - rs->trs_ephem_table_entries, - &list_head); + rc = tcp_helper_get_ephemeral_port_list( + rs->trs_ephem_table, laddr, rs->trs_ephem_table_entries, &list_head); if( rc < 0 ) return rc; /* If we're IP-specific, we also need to get the global list. */ - if( !CI_IPX_ADDR_IS_ANY(laddr) ) { + if( ! CI_IPX_ADDR_IS_ANY(laddr) ) { rc = tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table, addr_any, - rs->trs_ephem_table_entries, - &global_head); + rs->trs_ephem_table_entries, &global_head); if( rc < 0 ) return rc; @@ -3983,7 +3911,7 @@ int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, if( NI_OPTS(&rs->netif).tcp_shared_local_ports_per_ip_max && list_head->port_count >= - NI_OPTS(&rs->netif).tcp_shared_local_ports_per_ip_max ) + NI_OPTS(&rs->netif).tcp_shared_local_ports_per_ip_max ) return -ENOBUFS; /* Consume any ephemeral ports that were allocated since the last time we @@ -3994,8 +3922,8 @@ int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, while( to_alloc > 0 ) { /* Allocate a few more ephemeral ports. */ - rc = tcp_helper_alloc_ephemeral_ports(list_head, global_head, laddr, - CI_MIN(to_alloc, BATCH_SIZE)); + rc = tcp_helper_alloc_ephemeral_ports( + list_head, global_head, laddr, CI_MIN(to_alloc, BATCH_SIZE)); if( rc < 0 ) goto out; @@ -4006,7 +3934,7 @@ int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, to_alloc -= rc; } - out: +out: /* We succeeded as long as we increased the pool at all. */ if( to_alloc < ni_opts->tcp_shared_local_ports_step ) return 0; @@ -4015,13 +3943,12 @@ int tcp_helper_increase_active_wild_pool(tcp_helper_resource_t* rs, #endif -static int -thr_install_tproxy(tcp_helper_resource_t* thr) +static int thr_install_tproxy(tcp_helper_resource_t* thr) { int ifindex_buf_size; const ci_netif_config_opts* ni_opts = &NI_OPTS(&thr->netif); thr->tproxy_ifindex_count = - ci_netif_requested_scalable_intf_count(thr->netif.cplane, ni_opts); + ci_netif_requested_scalable_intf_count(thr->netif.cplane, ni_opts); ifindex_buf_size = sizeof(*thr->tproxy_ifindex) * thr->tproxy_ifindex_count; ci_assert_equal(thr->tproxy_ifindex, NULL); @@ -4029,26 +3956,24 @@ thr_install_tproxy(tcp_helper_resource_t* thr) if( thr->tproxy_ifindex == NULL ) return -ENOMEM; memset(thr->tproxy_ifindex, 0, ifindex_buf_size); - return tcp_helper_install_tproxy(1, thr, NULL, ni_opts, thr->tproxy_ifindex, - thr->tproxy_ifindex_count); + return tcp_helper_install_tproxy( + 1, thr, NULL, ni_opts, thr->tproxy_ifindex, thr->tproxy_ifindex_count); } -static void -thr_uninstall_tproxy(tcp_helper_resource_t* thr) +static void thr_uninstall_tproxy(tcp_helper_resource_t* thr) { if( thr->tproxy_ifindex != NULL ) { - tcp_helper_install_tproxy(0, thr, NULL, NULL, thr->tproxy_ifindex, - thr->tproxy_ifindex_count); + tcp_helper_install_tproxy( + 0, thr, NULL, NULL, thr->tproxy_ifindex, thr->tproxy_ifindex_count); kfree(thr->tproxy_ifindex); thr->tproxy_ifindex = NULL; } } - -static inline void netns_get_identifiers(ci_netif_state* state, - const struct net* ns) +static inline void netns_get_identifiers( + ci_netif_state* state, const struct net* ns) { struct oo_cplane_handle* cp = cp_acquire_from_netns_if_exists(ns); @@ -4057,23 +3982,22 @@ static inline void netns_get_identifiers(ci_netif_state* state, if( cp != NULL ) { state->cplane_pid = oo_cp_get_server_pid(cp); cp_release(cp); - } - else { + } else { state->cplane_pid = 0; } } -void tcp_helper_put_ns_components(struct oo_cplane_handle* cplane, - struct oo_filter_ns* filter_ns) +void tcp_helper_put_ns_components( + struct oo_cplane_handle* cplane, struct oo_filter_ns* filter_ns) { oo_filter_ns_put(&efab_tcp_driver, filter_ns); cp_release(cplane); } -int tcp_helper_get_ns_components(struct oo_cplane_handle** cplane, - struct oo_filter_ns** filter_ns) +int tcp_helper_get_ns_components( + struct oo_cplane_handle** cplane, struct oo_filter_ns** filter_ns) { int oof_preexisted; int rc; @@ -4090,8 +4014,8 @@ int tcp_helper_get_ns_components(struct oo_cplane_handle** cplane, * Although cplane does not hold reference to oof the fact that the stack * does allocates and frees in appropriate order is expected to ensure * the condition is met */ - *filter_ns = oo_filter_ns_get(&efab_tcp_driver, - current->nsproxy->net_ns, &oof_preexisted); + *filter_ns = oo_filter_ns_get( + &efab_tcp_driver, current->nsproxy->net_ns, &oof_preexisted); if( *filter_ns == NULL ) { OO_DEBUG_ERR(ci_log("%s: failed to allocated filter_ns", __func__)); cp_release(*cplane); @@ -4108,7 +4032,7 @@ int tcp_helper_get_ns_components(struct oo_cplane_handle** cplane, return 0; - error: +error: tcp_helper_put_ns_components(*cplane, *filter_ns); return rc; } @@ -4124,8 +4048,8 @@ struct user_namespace* tcp_helper_get_user_ns(tcp_helper_resource_t* trs) } -struct efab_ephemeral_port_head* -tcp_helper_alloc_ephem_table(ci_uint32 min_entries, ci_uint32* entries_out) +struct efab_ephemeral_port_head* tcp_helper_alloc_ephem_table( + ci_uint32 min_entries, ci_uint32* entries_out) { struct efab_ephemeral_port_head* table; ci_uint32 i; @@ -4163,10 +4087,9 @@ tcp_helper_alloc_ephem_table(ci_uint32 min_entries, ci_uint32* entries_out) #if CI_CFG_UL_INTERRUPT_HELPER -static bool -stack_has_events(ci_netif* ni, ci_uint32 intfs) +static bool stack_has_events(ci_netif* ni, ci_uint32 intfs) { - for( ; intfs != 0 ; intfs &= (intfs - 1) ) { + for( ; intfs != 0; intfs &= (intfs - 1) ) { int intf = ffs(intfs) - 1; if( ci_netif_intf_has_event(ni, intf) ) return true; @@ -4174,8 +4097,8 @@ stack_has_events(ci_netif* ni, ci_uint32 intfs) return false; } -static bool -stack_has_ul_job(tcp_helper_resource_t* trs, ci_uint32* intfs, ci_uint32* flags) +static bool stack_has_ul_job( + tcp_helper_resource_t* trs, ci_uint32* intfs, ci_uint32* flags) { *intfs = ci_atomic_xchg(&trs->intr_intfs, 0); do { @@ -4183,12 +4106,11 @@ stack_has_ul_job(tcp_helper_resource_t* trs, ci_uint32* intfs, ci_uint32* flags) if( *flags == 0 ) break; } while( ci_cas32u_fail(&trs->ulh_flags, *flags, 0) ); - + return *intfs != 0 || *flags != 0; } -static void -request_pending_wakeups(tcp_helper_resource_t* trs) +static void request_pending_wakeups(tcp_helper_resource_t* trs) { ci_uint32 intfs = ci_atomic_xchg(&trs->wake_intfs, 0); for( ; intfs != 0; intfs &= intfs - 1 ) { @@ -4211,15 +4133,13 @@ int oo_wait_for_interrupt(ci_private_t* priv, void* argp) timeout = periodic_poll; /* Wait for the next interrupt or timeout */ - while(1) { + while( 1 ) { /* Request wakeups before sleeping. */ request_pending_wakeups(trs); ci_assert_ge(timeout, 1); rc = wait_event_interruptible_timeout( - trs->ulh_waitq, - stack_has_ul_job(trs, &intfs, &arg->flags), - timeout); + trs->ulh_waitq, stack_has_ul_job(trs, &intfs, &arg->flags), timeout); if( NI_OPTS(&trs->netif).int_driven && intfs != 0 ) ci_atomic_or(&trs->wake_intfs, intfs); if( rc < 0 ) @@ -4234,9 +4154,8 @@ int oo_wait_for_interrupt(ci_private_t* priv, void* argp) /* No interrupts, but the stack was not touched for too long. * Fixme: Ideally, we'd like to ensure there are no pending ip timers, * see stack_next_timer_ms(). */ - if( intfs == 0 && - ci_frc64_get() - trs->netif.state->evq_last_prime > - trs->netif.state->timer_prime_cycles * 5 ) + if( intfs == 0 && ci_frc64_get() - trs->netif.state->evq_last_prime > + trs->netif.state->timer_prime_cycles * 5 ) break; if( first ) { @@ -4248,21 +4167,21 @@ int oo_wait_for_interrupt(ci_private_t* priv, void* argp) return 0; } -static int oo_handle_wakeup_in_ul(void* context, int is_timeout, - struct efhw_nic* nic, int budget) +static int oo_handle_wakeup_in_ul( + void* context, int is_timeout, struct efhw_nic* nic, int budget) { struct tcp_helper_nic* tcph_nic = context; tcp_helper_resource_t* trs; ci_uint64 l; - trs = CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], - tcph_nic); + trs = + CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], tcph_nic); ci_atomic_or(&trs->intr_intfs, 1 << tcph_nic->thn_intf_i); /* Request prime if no spinner is not spinning now. */ if( ! NI_OPTS(&trs->netif).int_driven && is_timeout && - ! ci_netif_is_spinner(&trs->netif)) { + ! ci_netif_is_spinner(&trs->netif) ) { ci_atomic_or(&trs->wake_intfs, 1 << tcph_nic->thn_intf_i); } @@ -4275,8 +4194,8 @@ static int oo_handle_wakeup_in_ul(void* context, int is_timeout, l = trs->netif.state->lock.lock; if( l & CI_EPLOCK_NETIF_NEED_POLL ) break; - } while( ci_cas64u_fail(&trs->netif.state->lock.lock, - l, l | CI_EPLOCK_NETIF_NEED_POLL) ); + } while( ci_cas64u_fail( + &trs->netif.state->lock.lock, l, l | CI_EPLOCK_NETIF_NEED_POLL) ); return 1; } @@ -4285,7 +4204,7 @@ static int oo_handle_wakeup_in_ul(void* context, int is_timeout, #if defined(EFRM_DO_NAMESPACES) && defined(EFRM_HAVE_NEW_KALLSYMS) #include /* put_ipc_ns() is not exported */ -static void (*my_put_ipc_ns)(struct ipc_namespace *ns); +static void (*my_put_ipc_ns)(struct ipc_namespace* ns); #endif static void put_namespaces(tcp_helper_resource_t* rs) { @@ -4308,7 +4227,7 @@ static void generate_efct_filter_irqmask(cpumask_t* result) * app and IRQs. */ int cpu; #ifdef EFRM_TASK_HAS_CPUMASK -/* >= 5.3, backported to RHEL8 */ + /* >= 5.3, backported to RHEL8 */ cpumask_t* current_cpus = ¤t->cpus_mask; #else cpumask_t* current_cpus = ¤t->cpus_allowed; @@ -4316,7 +4235,7 @@ static void generate_efct_filter_irqmask(cpumask_t* result) cpumask_clear(result); for_each_cpu(cpu, current_cpus) - cpumask_or(result, result, cpumask_of_node(cpu_to_node(cpu))); + cpumask_or(result, result, cpumask_of_node(cpu_to_node(cpu))); /* If the app is spanned across every CPU on its node(s) then it's better * to have potential contention than to do cross-NUMA stuff. Also covers the * degenerate case of an app being unaffinitised. */ @@ -4325,13 +4244,12 @@ static void generate_efct_filter_irqmask(cpumask_t* result) } int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, - const ci_netif_config_opts* opts, - int ifindices_len, tcp_helper_cluster_t* thc, - tcp_helper_resource_t** rs_out) + const ci_netif_config_opts* opts, int ifindices_len, + tcp_helper_cluster_t* thc, tcp_helper_resource_t** rs_out) { tcp_helper_resource_t* rs; ci_irqlock_state_t lock_flags; - struct efhw_nic *nic; + struct efhw_nic* nic; int rc, intf_i; ci_netif* ni; int hw_resources_allocated = 0; @@ -4346,41 +4264,46 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, alloc->in_name[CI_CFG_STACK_NAME_LEN] = '\0'; if( (opts->packet_buffer_mode & CITP_PKTBUF_MODE_PHYS) && - !ci_in_egroup(phys_mode_gid) ) { - OO_DEBUG_ERR(ci_log("%s: ERROR: EF_PACKET_BUFFER_MODE=%d not permitted " - "(phys_mode_gid=%d egid=%d pid=%d)", __FUNCTION__, - opts->packet_buffer_mode, phys_mode_gid, ci_getegid(), - current->tgid); - ci_log("%s: HINT: See the phys_mode_gid onload module " - "option.", __FUNCTION__)); + ! ci_in_egroup(phys_mode_gid) ) { + OO_DEBUG_ERR( + ci_log("%s: ERROR: EF_PACKET_BUFFER_MODE=%d not permitted " + "(phys_mode_gid=%d egid=%d pid=%d)", + __FUNCTION__, opts->packet_buffer_mode, phys_mode_gid, + ci_getegid(), current->tgid); + ci_log("%s: HINT: See the phys_mode_gid onload module " + "option.", + __FUNCTION__)); rc = -EPERM; goto fail1; } if( opts->packet_buffer_mode & ~CITP_PKTBUF_MODE_PHYS ) { - OO_DEBUG_ERR(ci_log("%s: ERROR: EF_PACKET_BUFFER_MODE=%d not supported. It " - "was used on 6000 series NICs only.", __FUNCTION__, - opts->packet_buffer_mode); - ci_log("%s: HINT: Use EF_PACKET_BUFFER_MODE=0/2 instead.", - __FUNCTION__)); + OO_DEBUG_ERR( + ci_log("%s: ERROR: EF_PACKET_BUFFER_MODE=%d not supported. It " + "was used on 6000 series NICs only.", + __FUNCTION__, opts->packet_buffer_mode); + ci_log( + "%s: HINT: Use EF_PACKET_BUFFER_MODE=0/2 instead.", __FUNCTION__)); rc = -ENOTSUPP; goto fail1; } #if CI_CFG_WANT_BPF_NATIVE && CI_HAVE_BPF_NATIVE if( opts->xdp_mode == EF_XDP_MODE_COMPATIBLE && ! cplane_track_xdp ) { - OO_DEBUG_ERR(ci_log("%s: ERROR: EF_XDP_MODE=compatible but " - "cplane_track_xdp module parameter is off.", - __func__); - ci_log("%s: HINT: enable cplane_track_xdp module " - "parameter.", __func__)); + OO_DEBUG_ERR( + ci_log("%s: ERROR: EF_XDP_MODE=compatible but " + "cplane_track_xdp module parameter is off.", + __func__); + ci_log("%s: HINT: enable cplane_track_xdp module " + "parameter.", + __func__)); rc = -ENOTSUPP; goto fail1; } #endif rs = CI_ALLOC_OBJ(tcp_helper_resource_t); - if( !rs ) { + if( ! rs ) { rc = -ENOMEM; goto fail1; } @@ -4417,13 +4340,12 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, if( ni->cplane_init_net == NULL ) { /* We can tolerate failure to speak to init_net's control plane. Compare * the equivalent case at UL in ci_netif_init(). */ - OO_DEBUG_ERR(ci_log("%s: failed to get init_net control plane handle", - __FUNCTION__)); - OO_DEBUG_ERR(ci_log("%s: support for containers will be limited", - __FUNCTION__)); + OO_DEBUG_ERR(ci_log( + "%s: failed to get init_net control plane handle", __FUNCTION__)); + OO_DEBUG_ERR( + ci_log("%s: support for containers will be limited", __FUNCTION__)); } - } - else { + } else { ni->cplane_init_net = NULL; } @@ -4441,7 +4363,7 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); rs->id = ci_id_pool_alloc(&THR_TABLE.instances); ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); - if (rs->id == CI_ID_POOL_ID_NONE) { + if( rs->id == CI_ID_POOL_ID_NONE ) { OO_DEBUG_ERR(ci_log("%s: out of instances", __FUNCTION__)); rc = -EBUSY; goto fail3; @@ -4466,14 +4388,15 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, rs->usermem = NULL; spin_lock_init(&ni->swf_update_lock); - ni->swf_update_last = ni->swf_update_first = NULL; + ni->swf_update_last = ni->swf_update_first = NULL; /* Allocate buffers for shared state, etc. */ rc = allocate_netif_resources(alloc, rs, thc ? thc->thc_cluster_size : 1); - if( rc < 0 ) goto fail4; + if( rc < 0 ) + goto fail4; - /* Initialise work items. - * Some of them are used in reset handler and in error path. */ + /* Initialise work items. + * Some of them are used in reset handler and in error path. */ #if CI_CFG_NIC_RESET_SUPPORT INIT_DELAYED_WORK(&rs->purge_txq_work, tcp_helper_purge_txq_work); INIT_WORK(&rs->reset_work, tcp_helper_reset_stack_work); @@ -4517,7 +4440,7 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, /* "onload-wq:pretty_name workqueue for non-atomic works */ snprintf(rs->wq_name, sizeof(rs->wq_name), ONLOAD_WQ_NAME, - ni->state->pretty_name); + ni->state->pretty_name); /* This workqueue is used to poll NIC => WQ_CPU_INTENSIVE * This workqueue is used to postpone IRQ hanlder when we are out of NAPI * budget => WQ_HIGHPRI @@ -4526,12 +4449,13 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * Long running CPU intensive workloads which can be better * managed by the system scheduler => WQ_UNBOUND */ - rs->wq = alloc_workqueue(rs->wq_name, - WQ_UNBOUND | WQ_CPU_INTENSIVE | - WQ_HIGHPRI | WQ_SYSFS, 0); + rs->wq = alloc_workqueue( + rs->wq_name, WQ_UNBOUND | WQ_CPU_INTENSIVE | WQ_HIGHPRI | WQ_SYSFS, 0); if( rs->wq == NULL ) { - OO_DEBUG_ERR(ci_log("%s: [%d] Failed to allocate stack due to workqueue " - "allocation failure", __func__, NI_ID(ni))); + OO_DEBUG_ERR( + ci_log("%s: [%d] Failed to allocate stack due to workqueue " + "allocation failure", + __func__, NI_ID(ni))); rc = -ENOMEM; goto fail5; } @@ -4540,16 +4464,18 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, #if CI_CFG_NIC_RESET_SUPPORT /* "onload-wq-reset:pretty_name workqueue for handling resets */ snprintf(rs->reset_wq_name, sizeof(rs->reset_wq_name), ONLOAD_RESET_WQ_NAME, - ni->state->pretty_name); + ni->state->pretty_name); /* Until we've handled a reset, other activities are pointless => WQ_HIGHPRI * Users may want to set cpu affinity => WQ_SYSFS */ - rs->reset_wq = alloc_workqueue(rs->reset_wq_name, WQ_UNBOUND | - WQ_HIGHPRI | WQ_SYSFS, 0); + rs->reset_wq = alloc_workqueue( + rs->reset_wq_name, WQ_UNBOUND | WQ_HIGHPRI | WQ_SYSFS, 0); if( rs->reset_wq == NULL ) { - OO_DEBUG_ERR(ci_log("%s: [%d] Failed to allocate stack due to reset workqueue " - "allocation failure", __func__, NI_ID(ni))); - rc = - ENOMEM; + OO_DEBUG_ERR( + ci_log("%s: [%d] Failed to allocate stack due to reset workqueue " + "allocation failure", + __func__, NI_ID(ni))); + rc = -ENOMEM; goto fail5a; } #endif @@ -4566,8 +4492,8 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, rs->thc_efct_memfd = fget(alloc->in_memfd); if( ! rs->thc_efct_memfd ) { rc = -EBADF; - OO_DEBUG_ERR(ci_log("%s: [%d] Bad fd for efct (%d).", - __func__, NI_ID(ni), alloc->in_memfd)); + OO_DEBUG_ERR(ci_log("%s: [%d] Bad fd for efct (%d).", __func__, + NI_ID(ni), alloc->in_memfd)); goto fail_memfd; } } @@ -4575,9 +4501,10 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, /* Allocate hardware resources */ ni->ep_tbl = NULL; ni->flags = alloc->in_flags; - ci_assert( ! (alloc->in_flags & CI_NETIF_FLAG_IN_DL_CONTEXT) ); + ci_assert(! (alloc->in_flags & CI_NETIF_FLAG_IN_DL_CONTEXT)); rc = allocate_netif_hw_resources(alloc, thc, rs); - if( rc < 0 ) goto fail6; + if( rc < 0 ) + goto fail6; if( ci_in_egroup(inject_kernel_gid) ) { ni->flags |= CI_NETIF_FLAG_MAY_INJECT_TO_KERNEL; @@ -4600,7 +4527,8 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, ni->keuid = ci_geteuid(); ni->error_flags = 0; ci_netif_state_init(&rs->netif, oo_timesync_cpu_khz, alloc->in_name); - OO_STACK_FOR_EACH_INTF_I(&rs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&rs->netif, intf_i) + { nic = efrm_client_get_nic(rs->nic[intf_i].thn_oo_nic->efrm_client); if( nic->devtype.arch == EFHW_ARCH_AF_XDP ) ni->flags |= CI_NETIF_FLAG_AF_XDP; @@ -4637,7 +4565,7 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, rc = thr_install_tproxy(rs); if( rc != 0 ) { OO_DEBUG_ERR(ci_log("%s: [%d] Failed to set scalable filters rc=%d.", - __func__, NI_ID(ni), rc)); + __func__, NI_ID(ni), rc)); goto fail10; } } @@ -4648,21 +4576,18 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * otherwise, we create it ourselves. */ if( thc != NULL ) { rs->trs_ephem_table = thc->thc_ephem_table; - rs->trs_ephem_table_entries = - thc->thc_ephem_table_entries; - } - else if( ci_netif_should_allocate_tcp_shared_local_ports(ni) ) { + rs->trs_ephem_table_entries = thc->thc_ephem_table_entries; + } else if( ci_netif_should_allocate_tcp_shared_local_ports(ni) ) { ci_uint32 entries = CI_MAX(NI_OPTS(ni).tcp_shared_local_ports, - NI_OPTS(ni).tcp_shared_local_ports_max); + NI_OPTS(ni).tcp_shared_local_ports_max); rs->trs_ephem_table = - tcp_helper_alloc_ephem_table(entries, &rs->trs_ephem_table_entries); + tcp_helper_alloc_ephem_table(entries, &rs->trs_ephem_table_entries); if( rs->trs_ephem_table == NULL ) { OO_DEBUG_ERR(ci_log("%s: [%d] Failed to allocate ephemeral port table.", - __func__, NI_ID(ni))); + __func__, NI_ID(ni))); goto fail11; } - } - else { + } else { rs->trs_ephem_table = NULL; } @@ -4671,14 +4596,15 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * has already been consumed. This is always particular to the current * stack, even if the table of ephemeral ports is shared. */ rs->trs_ephem_table_consumed = - tcp_helper_alloc_ephem_table(rs->trs_ephem_table_entries, NULL); + tcp_helper_alloc_ephem_table(rs->trs_ephem_table_entries, NULL); if( rs->trs_ephem_table_consumed == NULL ) { - OO_DEBUG_ERR(ci_log("%s: [%d] Failed to allocate table of consumed " - "ephemeral ports.", __func__, NI_ID(ni))); + OO_DEBUG_ERR( + ci_log("%s: [%d] Failed to allocate table of consumed " + "ephemeral ports.", + __func__, NI_ID(ni))); goto fail12; } - } - else { + } else { rs->trs_ephem_table_consumed = NULL; } #endif @@ -4723,18 +4649,15 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * a separate global table. */ if( thc == NULL ) { tcp_helper_get_ephemeral_port_list(rs->trs_ephem_table, addr_any, - rs->trs_ephem_table_entries, - &ephemeral_ports); - tcp_helper_alloc_ephemeral_ports(ephemeral_ports, NULL, addr_any, - NI_OPTS(ni).tcp_shared_local_ports); + rs->trs_ephem_table_entries, &ephemeral_ports); + tcp_helper_alloc_ephemeral_ports( + ephemeral_ports, NULL, addr_any, NI_OPTS(ni).tcp_shared_local_ports); /* In the event that tcp_helper_alloc_ephemeral_ports() returns an error, * there's nothing to do here: a warning will have been printed, and we * can continue with an empty list of ephemeral ports. */ - } - else { + } else { tcp_helper_get_ephemeral_port_list(thc->thc_ephem_table, addr_any, - thc->thc_ephem_table_entries, - &ephemeral_ports); + thc->thc_ephem_table_entries, &ephemeral_ports); } tcp_helper_alloc_list_to_aw_pool(rs, addr_any, ephemeral_ports); } @@ -4747,20 +4670,18 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * it that other users can start to do things that require these to have * been initialised. */ - OO_STACK_FOR_EACH_INTF_I(&rs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&rs->netif, intf_i) + { #if CI_CFG_UL_INTERRUPT_HELPER - efrm_eventq_register_callback(tcp_helper_vi(rs, intf_i), - &oo_handle_wakeup_in_ul, - &rs->nic[intf_i]); + efrm_eventq_register_callback( + tcp_helper_vi(rs, intf_i), &oo_handle_wakeup_in_ul, &rs->nic[intf_i]); #else if( NI_OPTS(ni).int_driven ) efrm_eventq_register_callback(tcp_helper_vi(rs, intf_i), - &oo_handle_wakeup_int_driven, - &rs->nic[intf_i]); + &oo_handle_wakeup_int_driven, &rs->nic[intf_i]); else efrm_eventq_register_callback(tcp_helper_vi(rs, intf_i), - &oo_handle_wakeup_or_timeout, - &rs->nic[intf_i]); + &oo_handle_wakeup_or_timeout, &rs->nic[intf_i]); #endif } #if ! CI_CFG_UL_INTERRUPT_HELPER @@ -4781,23 +4702,23 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, OO_DEBUG_RES(ci_log("tcp_helper_rm_alloc: allocated %u", rs->id)); return 0; - fail13: +fail13: #if CI_CFG_TCP_SHARED_LOCAL_PORTS vfree(rs->trs_ephem_table_consumed); - fail12: +fail12: /* Free the table of ephemeral ports unless we share it with the cluster. */ if( thc == NULL ) vfree(rs->trs_ephem_table); - fail11: +fail11: #endif - fail10: - fail9: +fail10: +fail9: release_ep_tbl(rs); - fail7: +fail7: /* Do not call release_netif_hw_resources() now - do it later, after * we're out of THR_TABLE. */ hw_resources_allocated = 1; - fail6: +fail6: /* Remove from the THR_TABLE and handle possible reset * before trying to remove VIs. */ @@ -4828,21 +4749,21 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, if( rs->thc_efct_memfd ) fput(rs->thc_efct_memfd); - fail_memfd: +fail_memfd: #if CI_CFG_NIC_RESET_SUPPORT destroy_workqueue(rs->reset_wq); - fail5a: +fail5a: #endif #if ! CI_CFG_UL_INTERRUPT_HELPER destroy_workqueue(rs->wq); - fail5: +fail5: #endif put_namespaces(rs); release_netif_resources(rs); - fail4: +fail4: ci_id_pool_free(&THR_TABLE.instances, rs->id, &THR_TABLE.lock); - fail3: - fail2: +fail3: +fail2: ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); ci_assert(THR_TABLE.stack_count > 0); --THR_TABLE.stack_count; @@ -4854,8 +4775,8 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, * to report EEXIST rather than the other arbitrary error so that UL can * recover. */ if( rc != -EEXIST && alloc->in_name[0] ) { - int rc1 = efab_thr_table_check_name(alloc->in_name, - rs->netif.cplane->cp_netns); + int rc1 = + efab_thr_table_check_name(alloc->in_name, rs->netif.cplane->cp_netns); if( rc1 == -EEXIST ) rc = rc1; } @@ -4863,14 +4784,14 @@ int tcp_helper_rm_alloc(ci_resource_onload_alloc_t* alloc, if( ni->cplane_init_net != NULL ) cp_release(ni->cplane_init_net); tcp_helper_put_ns_components(ni->cplane, rs->filter_ns); - fail1a: +fail1a: CI_FREE_OBJ(rs); - fail1: +fail1: return rc; } -int tcp_helper_alloc_ul(ci_resource_onload_alloc_t* alloc, - int ifindices_len, tcp_helper_resource_t** rs_out) +int tcp_helper_alloc_ul(ci_resource_onload_alloc_t* alloc, int ifindices_len, + tcp_helper_resource_t** rs_out) { ci_netif_config_opts* opts; int rc; @@ -4882,15 +4803,15 @@ int tcp_helper_alloc_ul(ci_resource_onload_alloc_t* alloc, goto out; rc = tcp_helper_rm_alloc_proxy(alloc, opts, ifindices_len, rs_out); - out: +out: kfree(opts); return rc; } int tcp_helper_alloc_kernel(ci_resource_onload_alloc_t* alloc, - const ci_netif_config_opts* opts, - int ifindices_len, tcp_helper_resource_t** rs_out) + const ci_netif_config_opts* opts, int ifindices_len, + tcp_helper_resource_t** rs_out) { return tcp_helper_rm_alloc_proxy(alloc, opts, ifindices_len, rs_out); } @@ -4899,7 +4820,7 @@ int tcp_helper_alloc_kernel(ci_resource_onload_alloc_t* alloc, #if CI_CFG_NIC_RESET_SUPPORT static void thr_reset_stack_rx_cb(ef_request_id id, void* arg) { - tcp_helper_resource_t* thr = (tcp_helper_resource_t*)arg; + tcp_helper_resource_t* thr = (tcp_helper_resource_t*) arg; ci_netif* ni = &thr->netif; oo_pkt_p pp; ci_ip_pkt_fmt* pkt; @@ -4915,9 +4836,9 @@ struct thr_reset_stack_tx_cb_state { tcp_helper_resource_t* thr; }; -static void -thr_reset_stack_tx_cb_state_init(struct thr_reset_stack_tx_cb_state* cb_state, - tcp_helper_resource_t* thr, int intf_i) +static void thr_reset_stack_tx_cb_state_init( + struct thr_reset_stack_tx_cb_state* cb_state, tcp_helper_resource_t* thr, + int intf_i) { cb_state->intf_i = intf_i; cb_state->thr = thr; @@ -4928,7 +4849,7 @@ thr_reset_stack_tx_cb_state_init(struct thr_reset_stack_tx_cb_state* cb_state, static void thr_reset_stack_tx_cb(ef_request_id id, void* arg) { struct thr_reset_stack_tx_cb_state* cb_state = - (struct thr_reset_stack_tx_cb_state*)arg; + (struct thr_reset_stack_tx_cb_state*) arg; ci_netif* ni = &cb_state->thr->netif; oo_pkt_p pp; ci_ip_pkt_fmt* pkt; @@ -4943,11 +4864,9 @@ static void thr_reset_stack_tx_cb(ef_request_id id, void* arg) #if ! CI_CFG_UL_INTERRUPT_HELPER /* All delayed work is now run on the periodic workqueue. */ static inline int thr_queue_delayed_work(tcp_helper_resource_t* thr, - struct delayed_work *dwork, - unsigned long delay) + struct delayed_work* dwork, unsigned long delay) { - return queue_delayed_work_on(thr->periodic_timer_cpu, thr->wq, - dwork, delay); + return queue_delayed_work_on(thr->periodic_timer_cpu, thr->wq, dwork, delay); } #endif @@ -4967,7 +4886,7 @@ static void tcp_helper_purge_txq_locked(tcp_helper_resource_t* thr) int reschedule = 0; OO_DEBUG_VERB(ci_log("%s: [%d] Purging TXQs for suspended interfaces %08x", - __FUNCTION__, thr->id, intfs_suspended)); + __FUNCTION__, thr->id, intfs_suspended)); ci_assert(ci_netif_is_locked(ni)); @@ -5001,13 +4920,12 @@ static void tcp_helper_purge_txq_locked(tcp_helper_resource_t* thr) #endif -static void set_pkt_bufset_hwaddrs(ci_netif* ni, int bufset_id, int intf_i, - const ci_uint64* hw_addrs) +static void set_pkt_bufset_hwaddrs( + ci_netif* ni, int bufset_id, int intf_i, const ci_uint64* hw_addrs) { int i; int page_order = ni->packets->set[bufset_id].page_order; - ef_addr* addr = ni->dma_addrs + - ni->packets->set[bufset_id].dma_addr_base + + ef_addr* addr = ni->dma_addrs + ni->packets->set[bufset_id].dma_addr_base + intf_i * (PKTS_PER_SET >> page_order); for( i = 0; i < PKTS_PER_SET >> page_order; i++ ) { @@ -5027,7 +4945,7 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) ci_netif* ni = &thr->netif; ef_vi* vi; struct thr_reset_stack_tx_cb_state cb_state; - uint64_t *hw_addrs; + uint64_t* hw_addrs; #if CI_CFG_PIO struct efhw_nic* nic; int rc; @@ -5039,7 +4957,7 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) * it might have been invalidated while we were waiting for the lock. */ if( ci_dllink_is_free(&thr->all_stacks_link) ) { OO_DEBUG_TCPH(ci_log("%s: [%d] Stack is being destroyed; not resetting", - __FUNCTION__, thr->id)); + __FUNCTION__, thr->id)); return; } @@ -5048,15 +4966,16 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) thr->intfs_to_reset = 0; /* Prevent any further periodic TXQ-purges, since we're about to bring the * TXQ back up. */ - thr->intfs_suspended &=~ intfs_to_reset; + thr->intfs_suspended &= ~intfs_to_reset; ci_irqlock_unlock(&thr->lock, &lock_flags); #if CI_CFG_ENDPOINT_MOVE if( thr->thc != NULL ) { /* This warning can be removed once Bug43452 is properly addressed */ - ci_log("Stack %s:%d in cluster %s can't restore filters post-NIC-reset.\n" - "This stack will no longer receive packets", - thr->name, thr->id, thr->thc->thc_name); + ci_log( + "Stack %s:%d in cluster %s can't restore filters post-NIC-reset.\n" + "This stack will no longer receive packets", + thr->name, thr->id, thr->thc->thc_name); } #endif @@ -5074,30 +4993,30 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) ci_uint32 old_errors = nsn->nic_error_flags; vi = ci_netif_vi(ni, intf_i); - EFRM_WARN_LIMITED("%s: reset stack %d intf %d (0x%x)", - __FUNCTION__, thr->id, intf_i, intfs_to_reset); + EFRM_WARN_LIMITED("%s: reset stack %d intf %d (0x%x)", __FUNCTION__, + thr->id, intf_i, intfs_to_reset); #if CI_CFG_PIO nic = efrm_client_get_nic(thr->nic[intf_i].thn_oo_nic->efrm_client); - if( NI_OPTS(ni).pio && - (nic->devtype.arch == EFHW_ARCH_EF10) && + if( NI_OPTS(ni).pio && (nic->devtype.arch == EFHW_ARCH_EF10) && (thr->nic[intf_i].thn_pio_io_mmap_bytes != 0) ) { - struct efrm_pd *pd = efrm_vi_get_pd(tcp_helper_vi(thr, intf_i)); + struct efrm_pd* pd = efrm_vi_get_pd(tcp_helper_vi(thr, intf_i)); OO_DEBUG_TCPH(ci_log("%s: realloc PIO", __FUNCTION__)); /* Now try to recreate and link the PIO region */ - rc = efrm_pio_realloc(pd, thr->nic[intf_i].thn_pio_rs, - tcp_helper_vi(thr, intf_i)); + rc = efrm_pio_realloc( + pd, thr->nic[intf_i].thn_pio_rs, tcp_helper_vi(thr, intf_i)); if( rc < 0 ) { - OO_DEBUG_TCPH(ci_log("%s: [%d:%d] pio_realloc failed %d, " - "removing PIO capability", - __FUNCTION__, thr->id, intf_i, rc)); + OO_DEBUG_TCPH( + ci_log("%s: [%d:%d] pio_realloc failed %d, " + "removing PIO capability", + __FUNCTION__, thr->id, intf_i, rc)); thr->pio_mmap_bytes -= thr->nic[intf_i].thn_pio_io_mmap_bytes; /* Expose failure to user-level */ ni->state->pio_mmap_bytes -= thr->nic[intf_i].thn_pio_io_mmap_bytes; thr->nic[intf_i].thn_pio_io_mmap_bytes = 0; thr->netif.nic_hw[intf_i].pio.pio_buffer = NULL; thr->netif.nic_hw[intf_i].pio.pio_len = 0; - nsn->oo_vi_flags &=~ OO_VI_FLAGS_PIO_EN; + nsn->oo_vi_flags &= ~OO_VI_FLAGS_PIO_EN; nsn->pio_io_mmap_bytes = 0; nsn->pio_io_len = 0; ci_pio_buddy_dtor(ni, &nsn->pio_buddy); @@ -5110,12 +5029,12 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) #endif /* Remap packets before using them in RX q */ - nsn->nic_error_flags &=~ CI_NETIF_NIC_ERROR_REMAP; + nsn->nic_error_flags &= ~CI_NETIF_NIC_ERROR_REMAP; for( i = 0; i < pkt_sets_n; ++i ) { int rc; - rc = oo_iobufset_resource_remap_bt(ni->nic_hw[intf_i].pkt_rs[i], - hw_addrs); + rc = oo_iobufset_resource_remap_bt( + ni->nic_hw[intf_i].pkt_rs[i], hw_addrs); if( rc == -ENOSYS ) { /* This PD does not use buffer table; do not update anything and * go away. */ @@ -5129,7 +5048,7 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) * wait for user to kill the app, or for another reset to attempt * to recover things. */ ci_log("ERROR [%d]: failed to remap packet set %d after NIC reset", - thr->id, i); + thr->id, i); memset(hw_addrs, 0, sizeof(uint64_t) * (1 << HW_PAGES_PER_SET_S)); nsn->nic_error_flags |= CI_NETIF_NIC_ERROR_REMAP; } @@ -5139,7 +5058,7 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) if( ~nsn->nic_error_flags & CI_NETIF_NIC_ERROR_REMAP ) { if( old_errors & CI_NETIF_NIC_ERROR_REMAP ) ci_log("[%d]: packets remapped successfully on intf %d", thr->id, - intf_i); + intf_i); } /* Reset sw queues */ @@ -5167,7 +5086,7 @@ static void tcp_helper_reset_stack_locked(tcp_helper_resource_t* thr) ci_netif_pkt_release(ni, pkt); } - if( NI_OPTS(ni).timer_usec != 0 ) + if( NI_OPTS(ni).timer_usec != 0 ) ef_eventq_timer_prime(vi, NI_OPTS(ni).timer_usec); ci_bit_test_and_set(&ni->state->evq_primed, intf_i); @@ -5230,7 +5149,7 @@ void tcp_helper_reset_stack(ci_netif* ni, int intf_i) #if CI_CFG_NIC_RESET_SUPPORT -static void tcp_helper_purge_txq_work(struct work_struct *data) +static void tcp_helper_purge_txq_work(struct work_struct* data) { tcp_helper_resource_t* trs; @@ -5242,17 +5161,17 @@ static void tcp_helper_purge_txq_work(struct work_struct *data) /* If we can get the lock, we purge the queues now; if not, we defer to the * lock-holder. */ - if( efab_tcp_helper_netif_lock_or_set_flags(trs, OO_TRUSTED_LOCK_PURGE_TXQS, - CI_EPLOCK_NETIF_PURGE_TXQS, 0) ) { + if( efab_tcp_helper_netif_lock_or_set_flags( + trs, OO_TRUSTED_LOCK_PURGE_TXQS, CI_EPLOCK_NETIF_PURGE_TXQS, 0) ) { tcp_helper_purge_txq_locked(trs); efab_tcp_helper_netif_unlock(trs, 0); } } -static void tcp_helper_reset_stack_work(struct work_struct *data) +static void tcp_helper_reset_stack_work(struct work_struct* data) { - tcp_helper_resource_t* trs = container_of(data, tcp_helper_resource_t, - reset_work); + tcp_helper_resource_t* trs = + container_of(data, tcp_helper_resource_t, reset_work); /* Before tcp_helper_reset_stack_locked is called, * any stack activity is just silly. So we agressively wait for @@ -5262,7 +5181,7 @@ static void tcp_helper_reset_stack_work(struct work_struct *data) * for a wedged lock. If we know the lock may already be wedged we can * just trylock here. Otherwise block, but allow interruption by a wakeup. */ - while (! (trs->trs_aflags & OO_THR_AFLAG_DONT_BLOCK_SHARED) ) { + while( ! (trs->trs_aflags & OO_THR_AFLAG_DONT_BLOCK_SHARED) ) { int rc = ci_netif_lock_maybe_wedged(&trs->netif); if( rc == 0 ) { goto locked; @@ -5271,8 +5190,7 @@ static void tcp_helper_reset_stack_work(struct work_struct *data) /* In the wedged case, we'll get OO_THR_AFLAG_DONT_BLOCK_SHARED flag * sooner or later. Otherwise it does not harm to try again. */ continue; - } - else { + } else { /* Workqueue was interrupted by a signal - give up */ break; } @@ -5284,11 +5202,11 @@ static void tcp_helper_reset_stack_work(struct work_struct *data) * option, because it is set too late. */ if( ! ci_netif_trylock(&trs->netif) ) { /* It is probably OK, but let's print a warning. */ - ci_log("[%d]: unable to process NIC reset before destroying stack", - trs->id); + ci_log( + "[%d]: unable to process NIC reset before destroying stack", trs->id); return; } - locked: +locked: ci_assert(ci_netif_is_locked(&trs->netif)); tcp_helper_reset_stack_locked(trs); ci_netif_unlock(&trs->netif); @@ -5297,11 +5215,10 @@ static void tcp_helper_reset_stack_work(struct work_struct *data) #if ! CI_CFG_UL_INTERRUPT_HELPER || ! defined(NDEBUG) -static bool -current_is_proper_ul_context(void) +static bool current_is_proper_ul_context(void) { return ! in_interrupt() && - (current->flags & (PF_KTHREAD | PF_WQ_WORKER)) == 0; + (current->flags & (PF_KTHREAD | PF_WQ_WORKER)) == 0; } #endif @@ -5322,8 +5239,7 @@ current_is_proper_ul_context(void) * *--------------------------------------------------------------------*/ -static void -tcp_helper_rm_free(tcp_helper_resource_t* trs) +static void tcp_helper_rm_free(tcp_helper_resource_t* trs) { #if ! CI_CFG_UL_INTERRUPT_HELPER unsigned l, new_l; @@ -5356,7 +5272,7 @@ tcp_helper_rm_free(tcp_helper_resource_t* trs) efab_tcp_helper_rm_schedule_free(trs); else #endif - efab_tcp_helper_rm_free_locked(trs); + efab_tcp_helper_rm_free_locked(trs); OO_DEBUG_TCPH(ci_log("%s: [%u] done", __FUNCTION__, trs->id)); } @@ -5370,11 +5286,10 @@ tcp_helper_rm_free(tcp_helper_resource_t* trs) * *--------------------------------------------------------------------*/ -static void -tcp_helper_dtor_schedule(tcp_helper_resource_t * trs) +static void tcp_helper_dtor_schedule(tcp_helper_resource_t* trs) { OO_DEBUG_TCPH(ci_log("%s [%u]: starting", __FUNCTION__, trs->id)); - ci_verify( queue_work(CI_GLOBAL_WORKQUEUE, &trs->work_item_dtor) != 0); + ci_verify(queue_work(CI_GLOBAL_WORKQUEUE, &trs->work_item_dtor) != 0); } #endif @@ -5386,8 +5301,7 @@ tcp_helper_dtor_schedule(tcp_helper_resource_t * trs) * \param trs TCP helper resource *--------------------------------------------------------------------*/ -static void -efab_tcp_helper_k_ref_count_is_zero(tcp_helper_resource_t* trs) +static void efab_tcp_helper_k_ref_count_is_zero(tcp_helper_resource_t* trs) { /* although we have atomically got to zero we still have to contend * with a possible race from the resource manager destruction @@ -5401,15 +5315,14 @@ efab_tcp_helper_k_ref_count_is_zero(tcp_helper_resource_t* trs) ci_assert_equal(trs->ref[OO_THR_REF_FILE], 0); ci_assert_equal(trs->ref[OO_THR_REF_APP], 0); - OO_DEBUG_TCPH(ci_log("%s: [%u] ref "OO_THR_REF_FMT, - __FUNCTION__, trs->id, OO_THR_REF_ARG(trs->ref))); + OO_DEBUG_TCPH(ci_log("%s: [%u] ref " OO_THR_REF_FMT, __FUNCTION__, trs->id, + OO_THR_REF_ARG(trs->ref))); ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); - if( !ci_dllink_is_free(&trs->all_stacks_link) ) { + if( ! ci_dllink_is_free(&trs->all_stacks_link) ) { ci_dllist_remove(&trs->all_stacks_link); ci_dllink_mark_free(&trs->all_stacks_link); - } - else + } else trs = 0; ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); @@ -5421,29 +5334,27 @@ efab_tcp_helper_k_ref_count_is_zero(tcp_helper_resource_t* trs) tcp_helper_dtor_schedule(trs); else #endif - tcp_helper_dtor(trs); + tcp_helper_dtor(trs); } OO_DEBUG_TCPH(ci_log("%s: finished", __FUNCTION__)); } -static void -tcp_helper_close_cleanup_ep(tcp_helper_resource_t* trs, - tcp_helper_endpoint_t* ep) +static void tcp_helper_close_cleanup_ep( + tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep) { - tcp_helper_endpoint_clear_aflags(ep, OO_THR_EP_AFLAG_PEER_CLOSED); - if( ep->alien_ref != NULL ) { - fput(ep->alien_ref->_filp); - ep->alien_ref = NULL; - } + tcp_helper_endpoint_clear_aflags(ep, OO_THR_EP_AFLAG_PEER_CLOSED); + if( ep->alien_ref != NULL ) { + fput(ep->alien_ref->_filp); + ep->alien_ref = NULL; + } } #if ! CI_CFG_UL_INTERRUPT_HELPER /*! Close sockets. Called with netif lock held. Kernel netif lock may or * may not be held. */ -static void -tcp_helper_close_pending_endpoints(tcp_helper_resource_t* trs) +static void tcp_helper_close_pending_endpoints(tcp_helper_resource_t* trs) { ci_irqlock_state_t lock_flags; tcp_helper_endpoint_t* ep; @@ -5453,7 +5364,7 @@ tcp_helper_close_pending_endpoints(tcp_helper_resource_t* trs) ci_assert(ci_netif_is_locked(&trs->netif)); ci_assert(! in_atomic()); - ci_assert( ~trs->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT ); + ci_assert(~trs->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT); /* Ensure we're up-to-date so we get an ordered response to all packets. ** (eg. ANVL tcp_core 9.18). Do it once here rather than per-socket. @@ -5469,7 +5380,7 @@ tcp_helper_close_pending_endpoints(tcp_helper_resource_t* trs) * NDEBUG build: we are not protected by kernel netif lock, so * we should re-check that ep_tobe_closed is non-empty for security * reasons. */ - ci_assert( ci_sllist_not_empty(&trs->ep_tobe_closed) ); + ci_assert(ci_sllist_not_empty(&trs->ep_tobe_closed)); if( ci_sllist_is_empty(&trs->ep_tobe_closed) ) { ci_irqlock_unlock(&trs->lock, &lock_flags); ci_log("%s: [%d] ERROR: stack lock corrupted", __func__, trs->id); @@ -5478,9 +5389,9 @@ tcp_helper_close_pending_endpoints(tcp_helper_resource_t* trs) link = ci_sllist_pop(&trs->ep_tobe_closed); ci_irqlock_unlock(&trs->lock, &lock_flags); - ep = CI_CONTAINER(tcp_helper_endpoint_t, tobe_closed , link); - OO_DEBUG_TCPH(ci_log("%s: [%u:%d] closing", - __FUNCTION__, trs->id, OO_SP_FMT(ep->id))); + ep = CI_CONTAINER(tcp_helper_endpoint_t, tobe_closed, link); + OO_DEBUG_TCPH(ci_log( + "%s: [%u:%d] closing", __FUNCTION__, trs->id, OO_SP_FMT(ep->id))); tcp_helper_close_cleanup_ep(trs, ep); citp_waitable_all_fds_gone(&trs->netif, ep->id); } @@ -5492,14 +5403,14 @@ int oo_wakeup_waiters(ci_private_t* priv, void* arg) struct oo_wakeup_eps* op = arg; tcp_helper_resource_t* thr = priv->thr; oo_sp ep_id[16]; - oo_sp __user * user_ptr = CI_USER_PTR_GET(op->eps); + oo_sp __user* user_ptr = CI_USER_PTR_GET(op->eps); int n, i; if( thr == NULL ) return -EINVAL; while( op->eps_num > 0 ) { - n = CI_MIN(op->eps_num, (ci_uint32)(sizeof(ep_id) / sizeof(ep_id[0]))); + n = CI_MIN(op->eps_num, (ci_uint32) (sizeof(ep_id) / sizeof(ep_id[0]))); if( copy_from_user(ep_id, user_ptr, n * sizeof(ep_id[0])) ) return -EFAULT; user_ptr += n; @@ -5518,13 +5429,12 @@ int oo_wakeup_waiters(ci_private_t* priv, void* arg) #if ! CI_CFG_UL_INTERRUPT_HELPER -static void -efab_tcp_helper_rm_reset_untrusted(tcp_helper_resource_t* trs) +static void efab_tcp_helper_rm_reset_untrusted(tcp_helper_resource_t* trs) { /* Called when closing a stack and the lock is wedged. Assume that * shared state is borked. */ - ci_netif *netif = &trs->netif; + ci_netif* netif = &trs->netif; int i; for( i = 0; i < netif->ep_tbl_n; ++i ) { @@ -5548,8 +5458,7 @@ efab_tcp_helper_rm_reset_untrusted(tcp_helper_resource_t* trs) } } -static void -efab_tcp_helper_rm_schedule_free(tcp_helper_resource_t* trs) +static void efab_tcp_helper_rm_schedule_free(tcp_helper_resource_t* trs) { OO_DEBUG_TCPH(ci_log("%s [%u]: defer", __FUNCTION__, trs->id)); queue_work(CI_GLOBAL_WORKQUEUE, &trs->work_item_dtor); @@ -5573,8 +5482,7 @@ efab_tcp_helper_rm_schedule_free(tcp_helper_resource_t* trs) #if CI_CFG_NIC_RESET_SUPPORT -static void -efab_tcp_helper_flush_reset_wq(tcp_helper_resource_t* trs) +static void efab_tcp_helper_flush_reset_wq(tcp_helper_resource_t* trs) { /* There may be both work running and work pending. We can wake up the * work currently blocked on the lock, but we don't want a queued @@ -5594,8 +5502,7 @@ void tcp_helper_flush_resets(ci_netif* ni) #endif -static void -efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) +static void efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) { ci_netif* netif; #if ! CI_CFG_UL_INTERRUPT_HELPER @@ -5604,13 +5511,13 @@ efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) ci_assert(NULL != trs); #if ! CI_CFG_UL_INTERRUPT_HELPER - ci_assert(trs->trusted_lock == (OO_TRUSTED_LOCK_LOCKED | - OO_TRUSTED_LOCK_AWAITING_FREE)); + ci_assert(trs->trusted_lock == + (OO_TRUSTED_LOCK_LOCKED | OO_TRUSTED_LOCK_AWAITING_FREE)); #endif netif = &trs->netif; #if ! CI_CFG_UL_INTERRUPT_HELPER - ci_assert(!in_atomic()); + ci_assert(! in_atomic()); /* Make sure all postponed actions are done and endpoints freed */ flush_workqueue(trs->wq); #endif @@ -5660,11 +5567,10 @@ efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) * and we'll wait for the work to complete as we flush the workqueue * again on tcp_helper_stop. */ - if( !ci_netif_trylock(&trs->netif) ) { + if( ! ci_netif_trylock(&trs->netif) ) { /* Cases 1 and 2 */ OO_DEBUG_ERR(ci_log("Stack [%d] released with lock stuck (0x%llx)", - trs->id, - (unsigned long long)trs->netif.state->lock.lock)); + trs->id, (unsigned long long) trs->netif.state->lock.lock)); netif->flags |= CI_NETIF_FLAG_WEDGED; } } @@ -5705,11 +5611,12 @@ efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) /* Who sets n_ep_orphaned to zero, the same code should drop the * associated BASE refcount. */ - if( ci_cas32u_succeed(&netif->n_ep_orphaned, OO_N_EP_ORPHANED_INIT, - n_orphaned) && n_orphaned == 0 ) + if( ci_cas32u_succeed( + &netif->n_ep_orphaned, OO_N_EP_ORPHANED_INIT, n_orphaned) && + n_orphaned == 0 ) oo_thr_ref_drop(trs->ref, OO_THR_REF_BASE); - /* Drop lock so that sockets can proceed towards close. */ + /* Drop lock so that sockets can proceed towards close. */ #if CI_CFG_DESTROY_WEDGED if( ! (netif->flags & CI_NETIF_FLAG_WEDGED) ) #endif @@ -5719,8 +5626,8 @@ efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) /* Don't need atomics here, because only we are permitted to touch * [trusted_lock] when AWAITING_FREE is set. */ - ci_assert(trs->trusted_lock == (OO_TRUSTED_LOCK_LOCKED | - OO_TRUSTED_LOCK_AWAITING_FREE)); + ci_assert(trs->trusted_lock == + (OO_TRUSTED_LOCK_LOCKED | OO_TRUSTED_LOCK_AWAITING_FREE)); trs->trusted_lock = OO_TRUSTED_LOCK_UNLOCKED; #endif /* CI_CFG_UL_INTERRUPT_HELPER*/ oo_thr_ref_drop(trs->ref, OO_THR_REF_BASE); @@ -5740,8 +5647,7 @@ efab_tcp_helper_rm_free_locked(tcp_helper_resource_t* trs) * *--------------------------------------------------------------------*/ -ci_inline void -tcp_helper_stop(tcp_helper_resource_t* trs) +ci_inline void tcp_helper_stop(tcp_helper_resource_t* trs) { int intf_i; @@ -5754,7 +5660,8 @@ tcp_helper_stop(tcp_helper_resource_t* trs) /* stop callbacks from the event queue - wait for any running callback to complete */ - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { ef_eventq_timer_clear(ci_netif_vi(&trs->netif, intf_i)); efrm_eventq_kill_callback(tcp_helper_vi(trs, intf_i)); } @@ -5769,7 +5676,7 @@ tcp_helper_stop(tcp_helper_resource_t* trs) #endif OO_DEBUG_TCPH(ci_log("%s [%d]: finished --- all async processes finished", - __FUNCTION__, trs->id)); + __FUNCTION__, trs->id)); } @@ -5798,8 +5705,7 @@ void tcp_helper_dtor(tcp_helper_resource_t* trs) TCP_HELPER_RESOURCE_ASSERT_VALID(trs, 1); OO_DEBUG_TCPH(ci_log("%s [%u]: starting %s", __FUNCTION__, trs->id, - trs->netif.flags & CI_NETIF_FLAG_WEDGED ? - "wedged" : "gracious")); + trs->netif.flags & CI_NETIF_FLAG_WEDGED ? "wedged" : "gracious")); #if ! CI_CFG_UL_INTERRUPT_HELPER if( trs->netif.flags & CI_NETIF_FLAG_WEDGED ) { @@ -5827,13 +5733,11 @@ void tcp_helper_dtor(tcp_helper_resource_t* trs) if( ~trs->netif.flags & CI_NETIF_FLAG_WEDGED ) { if( efab_tcp_helper_netif_try_lock(trs, 0) ) { oo_netif_dtor_pkts(&trs->netif); - } - else { + } else { /* Pretend to be wedged and do not check for leaks */ trs->netif.flags |= CI_NETIF_FLAG_WEDGED; OO_DEBUG_ERR(ci_log("Stack [%d] destroyed with lock stuck (0x%llx)", - trs->id, - (unsigned long long)trs->netif.state->lock.lock)); + trs->id, (unsigned long long) trs->netif.state->lock.lock)); /* I believe that after tcp_helper_stop() there are no legitimate * lock holders, so assert() in debug build. See bug 67856 comment 2 * for details why it was not so in the past. */ @@ -5867,8 +5771,8 @@ void tcp_helper_dtor(tcp_helper_resource_t* trs) trs->thc == NULL && #endif trs->trs_ephem_table != NULL ) - tcp_helper_free_ephemeral_ports(trs->trs_ephem_table, - trs->trs_ephem_table_entries); + tcp_helper_free_ephemeral_ports( + trs->trs_ephem_table, trs->trs_ephem_table_entries); /* We just vfree() the consumed table, as the pointers that it contains point * straight into the the table of ephemeral ports itself. */ @@ -5904,21 +5808,19 @@ void tcp_helper_dtor(tcp_helper_resource_t* trs) put_namespaces(trs); rc = ci_id_pool_free(&THR_TABLE.instances, trs->id, &THR_TABLE.lock); - OO_DEBUG_ERR(if (rc) - ci_log("%s [%u]: failed to free instance number", - __FUNCTION__, trs->id)); + OO_DEBUG_ERR(if( rc ) ci_log( + "%s [%u]: failed to free instance number", __FUNCTION__, trs->id)); ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); ci_assert(THR_TABLE.stack_count > 0); --THR_TABLE.stack_count; ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); - OO_DEBUG_TCPH(ci_log("%s [%u]: finished", __FUNCTION__, trs->id)); + OO_DEBUG_TCPH(ci_log("%s [%u]: finished", __FUNCTION__, trs->id)); CI_FREE_OBJ(trs); } - /*-------------------------------------------------------------------- *! * TCP driver management -- here for now while it needs a NIC to be around @@ -5946,8 +5848,7 @@ static int efab_is_onloaded(void* ctx, struct net* netns, ci_ifid_t ifindex) #endif -int -efab_tcp_driver_ctor() +int efab_tcp_driver_ctor() { int rc = 0; @@ -5968,13 +5869,13 @@ efab_tcp_driver_ctor() * So, we use bound work queue without any additional flags. */ CI_GLOBAL_WORKQUEUE = alloc_workqueue("onload-wqueue", WQ_SYSFS, 0); - if (CI_GLOBAL_WORKQUEUE == NULL) { + if( CI_GLOBAL_WORKQUEUE == NULL ) { rc = -ENOMEM; goto fail_wq; } - + /* Create TCP helpers table */ - if ((rc = thr_table_ctor(&efab_tcp_driver.thr_table)) < 0) + if( (rc = thr_table_ctor(&efab_tcp_driver.thr_table)) < 0 ) goto fail_thr_table; if( (rc = oo_filter_ns_manager_ctor(&efab_tcp_driver)) < 0 ) @@ -5994,8 +5895,8 @@ efab_tcp_driver_ctor() if( efab_tcp_driver.timesync_page == NULL ) goto fail_timesync_alloc; - efab_tcp_driver.timesync = vmap(&efab_tcp_driver.timesync_page, 1, - VM_USERMAP, PAGE_KERNEL); + efab_tcp_driver.timesync = + vmap(&efab_tcp_driver.timesync_page, 1, VM_USERMAP, PAGE_KERNEL); if( (rc = oo_timesync_ctor(efab_tcp_driver.timesync)) < 0 ) goto fail_timesync; @@ -6036,8 +5937,7 @@ efab_tcp_driver_ctor() } /* Destroy all existing stacks. */ -void -efab_tcp_driver_stop(void) +void efab_tcp_driver_stop(void) { OO_DEBUG_TCPH(ci_log("%s: kill stacks", __FUNCTION__)); @@ -6046,8 +5946,7 @@ efab_tcp_driver_stop(void) flush_workqueue(CI_GLOBAL_WORKQUEUE); } -void -efab_tcp_driver_dtor(void) +void efab_tcp_driver_dtor(void) { OO_DEBUG_TCPH(ci_log("%s: free resources", __FUNCTION__)); @@ -6056,9 +5955,9 @@ efab_tcp_driver_dtor(void) ci_id_pool_dtor(&efab_tcp_driver.thr_table.instances); #ifndef NDEBUG - if (ci_atomic_read(&efab_tcp_driver.sendpage_pinpages_n) != 0) { - ci_log("%s: ERROR: sendpage_pinpages_n is %d at destruction", - __FUNCTION__, ci_atomic_read(&efab_tcp_driver.sendpage_pinpages_n)); + if( ci_atomic_read(&efab_tcp_driver.sendpage_pinpages_n) != 0 ) { + ci_log("%s: ERROR: sendpage_pinpages_n is %d at destruction", __FUNCTION__, + ci_atomic_read(&efab_tcp_driver.sendpage_pinpages_n)); } #endif @@ -6078,13 +5977,14 @@ efab_tcp_driver_dtor(void) } -static int -add_ep(tcp_helper_resource_t* trs, unsigned id, tcp_helper_endpoint_t* ep) +static int add_ep( + tcp_helper_resource_t* trs, unsigned id, tcp_helper_endpoint_t* ep) { ci_netif* ni = &trs->netif; citp_waitable_obj* wo; - if( id < ni->ep_tbl_n ) return -1; + if( id < ni->ep_tbl_n ) + return -1; ci_assert_equal(id, ni->ep_tbl_n); tcp_helper_endpoint_ctor(ep, trs, id); @@ -6095,15 +5995,14 @@ add_ep(tcp_helper_resource_t* trs, unsigned id, tcp_helper_endpoint_t* ep) ni->state->n_ep_bufs = ++ni->ep_tbl_n; wo = SP_TO_WAITABLE_OBJ(ni, ep->id); - CI_ZERO(wo); /* ??fixme */ + CI_ZERO(wo); /* ??fixme */ citp_waitable_init(ni, &wo->waitable, id); wo->waitable.state = CI_TCP_STATE_FREE; citp_waitable_add_free_list(ni, &wo->waitable); return 0; } -static int -install_socks(tcp_helper_resource_t* trs, unsigned id, int num) +static int install_socks(tcp_helper_resource_t* trs, unsigned id, int num) { tcp_helper_endpoint_t** eps; ci_irqlock_state_t lock_flags; @@ -6118,14 +6017,15 @@ install_socks(tcp_helper_resource_t* trs, unsigned id, int num) eps[i] = CI_ALLOC_OBJ(tcp_helper_endpoint_t); if( ! eps[i] ) { OO_DEBUG_ERR(ci_log("%s: allocation failed", __FUNCTION__)); - while( i-- ) ci_free(eps[i]); + while( i-- ) + ci_free(eps[i]); vfree(eps); return -ENOMEM; } } ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); - for( i = 0; i < num; ++i, ++id ){ + for( i = 0; i < num; ++i, ++id ) { OO_DEBUG_SHM(ci_log("%s: add ep %d", __FUNCTION__, id)); if( add_ep(trs, id, eps[i]) == 0 ) eps[i] = NULL; @@ -6148,11 +6048,12 @@ int efab_tcp_helper_more_socks(tcp_helper_resource_t* trs) ci_netif* ni = &trs->netif; int rc; - if( ni->ep_tbl_n >= ni->ep_tbl_max ) return -ENOSPC; + if( ni->ep_tbl_n >= ni->ep_tbl_max ) + return -ENOSPC; if( ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT ) { - ef_eplock_holder_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_NEED_SOCK_BUFS); + ef_eplock_holder_set_flag( + &ni->state->lock, CI_EPLOCK_NETIF_NEED_SOCK_BUFS); return -EBUSY; } @@ -6162,8 +6063,8 @@ int efab_tcp_helper_more_socks(tcp_helper_resource_t* trs) return rc; } - return install_socks(trs, ni->ep_tbl_n, - EP_BUF_PER_PAGE << OO_SHARED_BUFFER_CHUNK_ORDER); + return install_socks( + trs, ni->ep_tbl_n, EP_BUF_PER_PAGE << OO_SHARED_BUFFER_CHUNK_ORDER); } @@ -6176,8 +6077,7 @@ int efab_tcp_helper_clear_epcache(tcp_helper_resource_t* trs) #endif -static void -efab_tcp_helper_no_more_bufs(tcp_helper_resource_t* trs) +static void efab_tcp_helper_no_more_bufs(tcp_helper_resource_t* trs) { /* We've failed to allocate more packet buffers -- we're out of resources * (probably buffer table). We don't want to keep trying to allocate and @@ -6192,35 +6092,35 @@ efab_tcp_helper_no_more_bufs(tcp_helper_resource_t* trs) ci_netif_set_rxq_limit(ni); if( ++ni->state->stats.bufset_alloc_nospace == 1 ) - OO_DEBUG_ERR(ci_log(FN_FMT "Failed to allocate packet buffers: " - "no more buffer table entries. ", - FN_PRI_ARGS(&trs->netif)); - ci_log(FN_FMT "New limits: max_packets=%d rx=%d tx=%d " - "rxq_limit=%d", FN_PRI_ARGS(ni), - NI_OPTS(ni).max_packets, NI_OPTS(ni).max_rx_packets, - NI_OPTS(ni).max_tx_packets, NI_OPTS(ni).rxq_limit)); + OO_DEBUG_ERR( + ci_log(FN_FMT "Failed to allocate packet buffers: " + "no more buffer table entries. ", + FN_PRI_ARGS(&trs->netif)); + ci_log(FN_FMT "New limits: max_packets=%d rx=%d tx=%d " + "rxq_limit=%d", + FN_PRI_ARGS(ni), NI_OPTS(ni).max_packets, + NI_OPTS(ni).max_rx_packets, NI_OPTS(ni).max_tx_packets, + NI_OPTS(ni).rxq_limit)); } /* hw_addrs below is structured as following: * hw_addrs[n_page + intf_i * n_hw_pages] */ -static int -efab_tcp_helper_iobufset_map(tcp_helper_resource_t* trs, - struct oo_buffer_pages* pages, - int n_hw_pages, - struct oo_iobufset** all_out, - uint64_t* hw_addrs, int* page_order) +static int efab_tcp_helper_iobufset_map(tcp_helper_resource_t* trs, + struct oo_buffer_pages* pages, int n_hw_pages, + struct oo_iobufset** all_out, uint64_t* hw_addrs, int* page_order) { ci_netif* ni = &trs->netif; int rc, intf_i; - struct efrm_pd *first_pd = NULL; - struct oo_iobufset *first_iobuf = NULL; + struct efrm_pd* first_pd = NULL; + struct oo_iobufset* first_iobuf = NULL; int map_order = INT_MAX; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { - struct efrm_pd *pd = efrm_vi_get_pd(tcp_helper_vi(trs, intf_i)); - struct oo_iobufset *iobuf; + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { + struct efrm_pd* pd = efrm_vi_get_pd(tcp_helper_vi(trs, intf_i)); + struct oo_iobufset* iobuf; int cur_map_order; if( first_pd != NULL && efrm_pd_share_dma_mapping(first_pd, pd) ) { @@ -6228,14 +6128,13 @@ efab_tcp_helper_iobufset_map(tcp_helper_resource_t* trs, all_out[intf_i] = first_iobuf; o_iobufset_resource_ref(first_iobuf); memcpy(&hw_addrs[intf_i * n_hw_pages], hw_addrs, - sizeof(hw_addrs[0]) * n_hw_pages); + sizeof(hw_addrs[0]) * n_hw_pages); continue; } rc = oo_iobufset_resource_alloc(pages, pd, &iobuf, - &hw_addrs[intf_i * n_hw_pages], - intfs_suspended(trs) & (1 << intf_i), - &cur_map_order); + &hw_addrs[intf_i * n_hw_pages], intfs_suspended(trs) & (1 << intf_i), + &cur_map_order); if( rc < 0 ) { while( --intf_i >= 0 ) oo_iobufset_resource_release(all_out[intf_i], 0); @@ -6254,25 +6153,25 @@ efab_tcp_helper_iobufset_map(tcp_helper_resource_t* trs, } -static int -efab_tcp_helper_min_nics_order(tcp_helper_resource_t* trs) +static int efab_tcp_helper_min_nics_order(tcp_helper_resource_t* trs) { int i, intf_i; int min_nic_order; int min_nics_order = 0; - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { - struct efhw_nic *nic = - efrm_client_get_nic(trs->nic[intf_i].thn_oo_nic->efrm_client); + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { + struct efhw_nic* nic = + efrm_client_get_nic(trs->nic[intf_i].thn_oo_nic->efrm_client); /* If we allocate pages in buffer mode with order less than minimum NIC * page order then we cannot find acceptable NIC buffer table. * Minimum NIC page order in EF10 and production Riverhead is 0. */ min_nic_order = HW_PAGES_PER_SET_S; if( NI_OPTS(&trs->netif).packet_buffer_mode == 0 ) { - for (i = 0; i < efhw_nic_buffer_table_orders_num(nic); i++) - min_nic_order = min(min_nic_order, efhw_nic_buffer_table_orders(nic)[i]); - } - else { + for( i = 0; i < efhw_nic_buffer_table_orders_num(nic); i++ ) + min_nic_order = + min(min_nic_order, efhw_nic_buffer_table_orders(nic)[i]); + } else { min_nic_order = 0; } @@ -6284,21 +6183,18 @@ efab_tcp_helper_min_nics_order(tcp_helper_resource_t* trs) } -static int -efab_tcp_helper_iobufset_alloc(tcp_helper_resource_t* trs, - struct oo_iobufset** all_out, - struct oo_buffer_pages** pages_out, - uint64_t* hw_addrs, - int* page_order) +static int efab_tcp_helper_iobufset_alloc(tcp_helper_resource_t* trs, + struct oo_iobufset** all_out, struct oo_buffer_pages** pages_out, + uint64_t* hw_addrs, int* page_order) { ci_netif* ni = &trs->netif; int rc, intf_i; - struct oo_buffer_pages *pages; + struct oo_buffer_pages* pages; int flags; int min_nics_order = efab_tcp_helper_min_nics_order(trs); OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - all_out[intf_i] = NULL; + all_out[intf_i] = NULL; *pages_out = NULL; #ifdef OO_DO_HUGE_PAGES @@ -6311,9 +6207,9 @@ efab_tcp_helper_iobufset_alloc(tcp_helper_resource_t* trs, * Otherwise, we'll avoid them. */ if( ni->flags & CI_NETIF_FLAG_HUGE_PAGES_FAILED ) flags |= OO_IOBUFSET_FLAG_HUGE_PAGE_FAILED; - if( !in_atomic() && current->mm != NULL ) { + if( ! in_atomic() && current->mm != NULL ) { #ifdef EFRM_DO_NAMESPACES - struct nsproxy *ns; + struct nsproxy* ns; ns = task_nsproxy_start(current); /* Use huge pages if we are in the same namespace only. * ipc_ns has a pointer to user_ns, so we may compare uids @@ -6334,22 +6230,22 @@ efab_tcp_helper_iobufset_alloc(tcp_helper_resource_t* trs, #endif } #endif - rc = oo_iobufset_pages_alloc(HW_PAGES_PER_SET_S, min_nics_order, &flags, - &pages); + rc = oo_iobufset_pages_alloc( + HW_PAGES_PER_SET_S, min_nics_order, &flags, &pages); if( rc != 0 ) return rc; #if CI_CFG_PKTS_AS_HUGE_PAGES - if( (flags & OO_IOBUFSET_FLAG_HUGE_PAGE_FAILED) && - !(ni->flags & CI_NETIF_FLAG_HUGE_PAGES_FAILED) ) { - NI_LOG(ni, RESOURCE_WARNINGS, - "[%s]: unable to allocate huge page, using standard pages instead", - ni->state->pretty_name); - ni->flags |= CI_NETIF_FLAG_HUGE_PAGES_FAILED; - } + if( (flags & OO_IOBUFSET_FLAG_HUGE_PAGE_FAILED) && + ! (ni->flags & CI_NETIF_FLAG_HUGE_PAGES_FAILED) ) { + NI_LOG(ni, RESOURCE_WARNINGS, + "[%s]: unable to allocate huge page, using standard pages instead", + ni->state->pretty_name); + ni->flags |= CI_NETIF_FLAG_HUGE_PAGES_FAILED; + } #endif - rc = efab_tcp_helper_iobufset_map(trs, pages, 1 << HW_PAGES_PER_SET_S, - all_out, hw_addrs, page_order); + rc = efab_tcp_helper_iobufset_map( + trs, pages, 1 << HW_PAGES_PER_SET_S, all_out, hw_addrs, page_order); if( rc < 0 ) { oo_iobufset_pages_release(pages); return rc; @@ -6369,16 +6265,16 @@ static void efab_put_pages(struct page** pages, size_t n) static long efab_get_all_user_pages(unsigned long base, long max_pages, - struct page** pages, unsigned gup_flags) + struct page** pages, unsigned gup_flags) { long n; long rc; mmap_read_lock(current->mm); for( n = 0; n < max_pages; n += rc ) { - rc = pin_user_pages(base + n * PAGE_SIZE, max_pages - n, gup_flags, - pages + n, NULL); - if (rc <= 0) { + rc = pin_user_pages( + base + n * PAGE_SIZE, max_pages - n, gup_flags, pages + n, NULL); + if( rc <= 0 ) { efab_put_pages(pages, n); mmap_read_unlock(current->mm); return rc ? rc : -EFAULT; @@ -6404,8 +6300,8 @@ static long efab_get_all_user_pages(unsigned long base, long max_pages, * users, and if (as they normally would) users pass in correctly mmapped * and aligned hugepages then no splitting happens and they never notice * this fixup code. */ -static long efab_get_unstraddled_user_pages(unsigned long base, long max_pages, - struct page** pages) +static long efab_get_unstraddled_user_pages( + unsigned long base, long max_pages, struct page** pages) { long rc; #ifdef FOLL_SPLIT @@ -6421,7 +6317,8 @@ static long efab_get_unstraddled_user_pages(unsigned long base, long max_pages, /* * From experiments: * It is not needed for linux<=4.9, and it is not needed for linux>=5.4. - * It is definitely needed for linux-4.18 (RHEL 8) and linux-4.19 (Debain 10). + * It is definitely needed for linux-4.18 (RHEL 8) and linux-4.19 (Debain + * 10). * * However let's be on the safe side: FOLL_SPLIT is defined for * 2.6.38 <= linux <= 5.12. @@ -6429,7 +6326,7 @@ static long efab_get_unstraddled_user_pages(unsigned long base, long max_pages, if( PageTail(pages[0]) ) { /* Beginning of the region straddles a hugepage. Put those pages and * re-get them with FOLL_SPLIT */ - for( count = 1; count < max_pages; ++count) + for( count = 1; count < max_pages; ++count ) if( ! PageTail(pages[count]) ) break; efab_put_pages(pages, count); @@ -6450,11 +6347,11 @@ static long efab_get_unstraddled_user_pages(unsigned long base, long max_pages, count = max_pages; while( --count && PageTail(pages[count]) ) ; - ci_assert(!PageTail(pages[count])); + ci_assert(! PageTail(pages[count])); if( count + (1L << compound_order(pages[count])) != max_pages ) { efab_put_pages(pages + count, max_pages - count); rc = efab_get_all_user_pages(base + count * PAGE_SIZE, max_pages - count, - pages + count, FOLL_WRITE | FOLL_SPLIT); + pages + count, FOLL_WRITE | FOLL_SPLIT); if( rc < 0 ) { efab_put_pages(pages, count); return rc; @@ -6472,9 +6369,8 @@ static long efab_get_unstraddled_user_pages(unsigned long base, long max_pages, int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, - struct oo_iobufs_usermem* ioum, - unsigned long user_base, int n_pages, - uint64_t** hw_addrs_out) + struct oo_iobufs_usermem* ioum, unsigned long user_base, int n_pages, + uint64_t** hw_addrs_out) { #if PAGE_SIZE != EFHW_NIC_PAGE_SIZE /* Not implemented, solely for simplicity */ @@ -6502,7 +6398,7 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, mmap_read_unlock(current->mm); if( rc < 0 ) { NI_LOG(ni, RESOURCE_WARNINGS, "[%s]: pin_user_pages(%d) returned %ld", - __FUNCTION__, n_pages, rc); + __FUNCTION__, n_pages, rc); goto fail1; } @@ -6512,7 +6408,7 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, ioum->n_groups = 0; for( i = 0; i < n_pages; ) { int order = compound_order(pages[i]); - ci_assert(!PageTail(pages[i])); + ci_assert(! PageTail(pages[i])); if( order != last_order ) ++ioum->n_groups; last_order = order; @@ -6524,14 +6420,13 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, ci_assert_ge(i, n_pages); #endif - ioum->groups = kmalloc_array(ioum->n_groups, sizeof(*ioum->groups), - GFP_KERNEL); - hw_addrs = kmalloc(sizeof(hw_addrs[0]) * n_pages * oo_stack_intf_max(ni), - GFP_KERNEL); + ioum->groups = + kmalloc_array(ioum->n_groups, sizeof(*ioum->groups), GFP_KERNEL); + hw_addrs = kmalloc( + sizeof(hw_addrs[0]) * n_pages * oo_stack_intf_max(ni), GFP_KERNEL); if( ioum->n_groups > 1 ) - tmp_hw_addrs = kmalloc(sizeof(hw_addrs[0]) * n_pages * - oo_stack_intf_max(ni), - GFP_KERNEL); + tmp_hw_addrs = kmalloc( + sizeof(hw_addrs[0]) * n_pages * oo_stack_intf_max(ni), GFP_KERNEL); else tmp_hw_addrs = hw_addrs; if( ioum->groups == NULL || hw_addrs == NULL || tmp_hw_addrs == NULL ) { @@ -6547,7 +6442,7 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, int intf_i; if( EFHW_GFP_ORDER_TO_NIC_ORDER(order) < min_nics_order ) { - rc = -EMSGSIZE; /* Same as oo_bufpage_alloc() */ + rc = -EMSGSIZE; /* Same as oo_bufpage_alloc() */ goto fail4; } @@ -6562,18 +6457,19 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, for( j = 0; j < group_pages >> order; ++j ) g->pages->pages[j] = pages[i + (j << order)]; - rc = efab_tcp_helper_iobufset_map(trs, g->pages, group_pages, - g->all, tmp_hw_addrs, NULL); + rc = efab_tcp_helper_iobufset_map( + trs, g->pages, group_pages, g->all, tmp_hw_addrs, NULL); if( rc < 0 ) { oo_iobufset_kfree(g->pages); goto fail4; } if( tmp_hw_addrs != hw_addrs ) { - OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(&trs->netif, intf_i) + { memcpy(hw_addrs + i + intf_i * n_pages, - tmp_hw_addrs + intf_i * group_pages, - sizeof(hw_addrs[0]) * CI_MIN(group_pages, n_pages - i)); + tmp_hw_addrs + intf_i * group_pages, + sizeof(hw_addrs[0]) * CI_MIN(group_pages, n_pages - i)); } } @@ -6597,17 +6493,15 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, int order = compound_order(g->pages->pages[0]); int group_pages = g->pages->n_bufs << order; - if (order) { - /* The 2 CI_MIN()s below are needed for ! FOLL_SPLIT case only, - * i.e. for linux >= 5.13. */ + if( order ) { + /* The 2 CI_MIN()s below are needed for ! FOLL_SPLIT case only, + * i.e. for linux >= 5.13. */ int i_max = CI_MIN(n_pages, i + group_pages); while( i < i_max ) { - efab_put_pages(pages + i + 1, - CI_MIN(1 << order, i_max - i) - 1); + efab_put_pages(pages + i + 1, CI_MIN(1 << order, i_max - i) - 1); i += 1 << order; } - } - else { + } else { i += group_pages; } } @@ -6623,30 +6517,30 @@ int efab_tcp_helper_map_usermem(tcp_helper_resource_t* trs, *hw_addrs_out = hw_addrs; return 0; - fail4: +fail4: while( --group_i >= 0 ) { struct oo_iobufs_usermem_group* g = &ioum->groups[group_i]; OO_STACK_FOR_EACH_INTF_I(ni, i) - if( g->all[i] ) - oo_iobufset_resource_release(g->all[i], 0); + if( g->all[i] ) + oo_iobufset_resource_release(g->all[i], 0); oo_iobufset_kfree(g->pages); } - fail3: +fail3: /* kfree() handles NULL, so we do not care to create fail2 */ kfree(hw_addrs); if( tmp_hw_addrs != hw_addrs ) kfree(tmp_hw_addrs); kfree(ioum->groups); efab_put_pages(pages, n_pages); - fail1: +fail1: kfree(pages); return rc; #endif } -void efab_tcp_helper_unmap_usermem(tcp_helper_resource_t* trs, - struct oo_iobufs_usermem* ioum) +void efab_tcp_helper_unmap_usermem( + tcp_helper_resource_t* trs, struct oo_iobufs_usermem* ioum) { ci_netif* ni = &trs->netif; int group_i; @@ -6655,8 +6549,8 @@ void efab_tcp_helper_unmap_usermem(tcp_helper_resource_t* trs, for( group_i = 0; group_i < ioum->n_groups; ++group_i ) { struct oo_iobufs_usermem_group* g = &ioum->groups[group_i]; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( g->all[intf_i] ) - oo_iobufset_resource_release(g->all[intf_i], 0); + if( g->all[intf_i] ) + oo_iobufset_resource_release(g->all[intf_i], 0); efab_put_pages(g->pages->pages, g->pages->n_bufs); oo_iobufset_kfree(g->pages); } @@ -6664,12 +6558,11 @@ void efab_tcp_helper_unmap_usermem(tcp_helper_resource_t* trs, } -int -efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) +int efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) { struct oo_iobufset* iobrs[CI_CFG_MAX_INTERFACES]; struct oo_buffer_pages* pages; - uint64_t *hw_addrs; + uint64_t* hw_addrs; ci_irqlock_state_t lock_flags; ci_netif* ni = &trs->netif; int i, rc, bufset_id, intf_i, page_order; @@ -6683,21 +6576,20 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) return -ENOSPC; if( ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT ) { - ef_eplock_holder_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_NEED_PKT_SET); + ef_eplock_holder_set_flag(&ni->state->lock, CI_EPLOCK_NETIF_NEED_PKT_SET); return -EBUSY; } - hw_addrs = ci_vmalloc(sizeof(uint64_t) * (1 << HW_PAGES_PER_SET_S) * - CI_CFG_MAX_INTERFACES); + hw_addrs = ci_vmalloc( + sizeof(uint64_t) * (1 << HW_PAGES_PER_SET_S) * CI_CFG_MAX_INTERFACES); if( hw_addrs == NULL ) { ci_log("%s: [%d] out of memory", __func__, trs->id); return -ENOMEM; } - rc = efab_tcp_helper_iobufset_alloc(trs, iobrs, &pages, hw_addrs, - &page_order); - if(CI_UNLIKELY( rc < 0 )) { + rc = efab_tcp_helper_iobufset_alloc( + trs, iobrs, &pages, hw_addrs, &page_order); + if( CI_UNLIKELY(rc < 0) ) { /* With highly fragmented memory, iobufset_alloc may fail in * atomic context but succeed later in non-atomic context. * We should somehow differentiate temporary failures (atomic @@ -6709,15 +6601,15 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) else { ++ni->state->stats.bufset_alloc_fails; NI_LOG(ni, RESOURCE_WARNINGS, - FN_FMT "Failed to allocate packet buffers (%d)", - FN_PRI_ARGS(&trs->netif), rc); + FN_FMT "Failed to allocate packet buffers (%d)", + FN_PRI_ARGS(&trs->netif), rc); } ci_vfree(hw_addrs); return rc; } /* check we get the size we are expecting */ OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ci_assert(iobrs[intf_i] != NULL); + ci_assert(iobrs[intf_i] != NULL); ci_assert(pages != NULL); /* Install the new buffer allocation, protecting against multi-threads. */ @@ -6727,7 +6619,7 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) if( ni->pkt_sets_n == ni->pkt_sets_max ) { ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - oo_iobufset_resource_release(iobrs[intf_i], 0); + oo_iobufset_resource_release(iobrs[intf_i], 0); oo_iobufset_pages_release(pages); ci_vfree(hw_addrs); return -ENOSPC; @@ -6742,13 +6634,12 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) CITP_STATS_NETIF_INC(ni, pkt_huge_pages); #endif OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ni->nic_hw[intf_i].pkt_rs[bufset_id] = iobrs[intf_i]; + ni->nic_hw[intf_i].pkt_rs[bufset_id] = iobrs[intf_i]; ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); OO_DEBUG_SHM({ int i; ci_log("[%d] allocated new bufset id %d, current=%d n_freepkts=%d", - NI_ID(ni), bufset_id, ni->packets->id, - ni->packets->n_free); + NI_ID(ni), bufset_id, ni->packets->id, ni->packets->n_free); for( i = 0; i < bufset_id; i++ ) ci_log("\tpkt_set[%i]: n_free=%d", i, ni->packets->set[i].n_free); }); @@ -6765,12 +6656,11 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) #endif ni->packets->set[bufset_id].dma_addr_base = ni->dma_addr_next; if( page_order > CI_CFG_PKTS_PER_SET_S ) { - /* page_order=INT_MAX means that there are no hardware interfaces associated - * with this stack. */ + /* page_order=INT_MAX means that there are no hardware interfaces + * associated with this stack. */ ci_assert_equal(page_order, INT_MAX); page_order = CI_CFG_PKTS_PER_SET_S; - } - else + } else page_order += ci_log2_ge(PAGE_SIZE / CI_CFG_PKT_BUF_SIZE, 0); ni->packets->set[bufset_id].page_order = page_order; ni->dma_addr_next += (PKTS_PER_SET >> page_order) * CI_CFG_MAX_INTERFACES; @@ -6794,9 +6684,10 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) pkt->next = ni->packets->set[bufset_id].free; ni->packets->set[bufset_id].free = OO_PKT_P(pkt); } - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { - set_pkt_bufset_hwaddrs(ni, bufset_id, intf_i, - hw_addrs + intf_i * (1 << HW_PAGES_PER_SET_S)); + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { + set_pkt_bufset_hwaddrs( + ni, bufset_id, intf_i, hw_addrs + intf_i * (1 << HW_PAGES_PER_SET_S)); } ci_vfree(hw_addrs); @@ -6807,27 +6698,27 @@ efab_tcp_helper_more_bufs(tcp_helper_resource_t* trs) #if ! CI_CFG_UL_INTERRUPT_HELPER -void -tcp_helper_rm_dump(oo_fd_flags fd_flags, oo_sp sock_id, - tcp_helper_resource_t* trs, const char *line_prefix) +void tcp_helper_rm_dump(oo_fd_flags fd_flags, oo_sp sock_id, + tcp_helper_resource_t* trs, const char* line_prefix) { ci_netif* ni; int intf_i; unsigned i; if( trs == NULL ) { - ci_dllink *link; - CI_DLLIST_FOR_EACH(link, &THR_TABLE.all_stacks) { + ci_dllink* link; + CI_DLLIST_FOR_EACH(link, &THR_TABLE.all_stacks) + { trs = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); tcp_helper_rm_dump(OO_FDFLAG_STACK, OO_SP_NULL, trs, line_prefix); for( i = 0; i < trs->netif.ep_tbl_n; ++i ) - if (trs->netif.ep_tbl[i]) { - ci_sock_cmn *s = ID_TO_SOCK(&trs->netif, i); - if (s->b.state == CI_TCP_STATE_FREE || s->b.state == CI_TCP_CLOSED) + if( trs->netif.ep_tbl[i] ) { + ci_sock_cmn* s = ID_TO_SOCK(&trs->netif, i); + if( s->b.state == CI_TCP_STATE_FREE || s->b.state == CI_TCP_CLOSED ) continue; - tcp_helper_rm_dump(s->b.state == CI_TCP_STATE_UDP ? - OO_FDFLAG_EP_UDP : OO_FDFLAG_EP_TCP, - OO_SP_FROM_INT(&trs->netif, i), trs, line_prefix); + tcp_helper_rm_dump(s->b.state == CI_TCP_STATE_UDP ? OO_FDFLAG_EP_UDP + : OO_FDFLAG_EP_TCP, + OO_SP_FROM_INT(&trs->netif, i), trs, line_prefix); } } return; @@ -6835,20 +6726,19 @@ tcp_helper_rm_dump(oo_fd_flags fd_flags, oo_sp sock_id, ni = &trs->netif; - ci_log("%sfd "OO_FDFLAG_FMT, line_prefix, OO_FDFLAG_ARG(fd_flags)); + ci_log("%sfd " OO_FDFLAG_FMT, line_prefix, OO_FDFLAG_ARG(fd_flags)); if( fd_flags & OO_FDFLAG_STACK ) { ci_log("%smmap_bytes=%x", line_prefix, trs->mem_mmap_bytes); - } - else if( fd_flags & OO_FDFLAG_EP_MASK ) { + } else if( fd_flags & OO_FDFLAG_EP_MASK ) { ci_log("%sendpoint with id=%u", line_prefix, OO_SP_FMT(sock_id)); citp_waitable_dump(ni, SP_TO_WAITABLE(ni, sock_id), line_prefix); } - ci_log("%sref "OO_THR_REF_FMT, line_prefix, OO_THR_REF_ARG(trs->ref)); + ci_log("%sref " OO_THR_REF_FMT, line_prefix, OO_THR_REF_ARG(trs->ref)); OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ci_log("%svi[%d]: %d", line_prefix, intf_i, - ef_vi_instance(ci_netif_vi(ni, intf_i))); + ci_log("%svi[%d]: %d", line_prefix, intf_i, + ef_vi_instance(ci_netif_vi(ni, intf_i))); } #endif @@ -6869,13 +6759,14 @@ tcp_helper_rm_dump(oo_fd_flags fd_flags, oo_sp sock_id, static void defer_poll_and_prime(tcp_helper_resource_t* trs) { if( efab_tcp_helper_netif_lock_or_set_flags(trs, - OO_TRUSTED_LOCK_NEED_POLL | OO_TRUSTED_LOCK_PRIME_IF_IDLE, - CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_PRIME_IF_IDLE, 1) ) - tcp_helper_defer_dl2work(trs, OO_THR_AFLAG_POLL_AND_PRIME); + OO_TRUSTED_LOCK_NEED_POLL | OO_TRUSTED_LOCK_PRIME_IF_IDLE, + CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_PRIME_IF_IDLE, 1) ) + tcp_helper_defer_dl2work(trs, OO_THR_AFLAG_POLL_AND_PRIME); } -static int tcp_helper_wakeup(tcp_helper_resource_t* trs, int intf_i, int budget) +static int tcp_helper_wakeup( + tcp_helper_resource_t* trs, int intf_i, int budget) { ci_netif* ni = &trs->netif; int n = 0, prime_async; @@ -6926,14 +6817,12 @@ static int tcp_helper_wakeup(tcp_helper_resource_t* trs, int intf_i, int budget) if( ni->state->poll_did_wake ) { prime_async = 0; CITP_STATS_NETIF_INC(ni, interrupt_wakes); - } - else { + } else { oo_inject_packets_kernel_force(ni); } efab_tcp_helper_netif_unlock(trs, 1); - } - else { + } else { /* Couldn't get the lock. We take this as evidence that another thread * is alive and doing stuff, so no need to re-enable interrupts. The * EF_INT_REPRIME option overrides. @@ -6965,8 +6854,7 @@ static int tcp_helper_wakeup(tcp_helper_resource_t* trs, int intf_i, int budget) ! (ni->state->nic[intf_i].oo_vi_flags & OO_VI_FLAGS_RX_SHARED) ) prime_async = 0; } - } - else { + } else { CITP_STATS_NETIF_INC(ni, interrupt_no_events); } @@ -6983,7 +6871,8 @@ static int tcp_helper_wakeup(tcp_helper_resource_t* trs, int intf_i, int budget) } -static int tcp_helper_timeout(tcp_helper_resource_t* trs, int intf_i, int budget) +static int tcp_helper_timeout( + tcp_helper_resource_t* trs, int intf_i, int budget) { int n = 0; #if CI_CFG_HW_TIMER @@ -7008,7 +6897,7 @@ static int tcp_helper_timeout(tcp_helper_resource_t* trs, int intf_i, int budget ci_frc64(&ni->state->evq_last_prime); if( NI_OPTS(ni).timer_usec != 0 ) OO_STACK_FOR_EACH_INTF_I(ni, i) - ef_eventq_timer_prime(ci_netif_vi(ni, i), NI_OPTS(ni).timer_usec); + ef_eventq_timer_prime(ci_netif_vi(ni, i), NI_OPTS(ni).timer_usec); if( ci_netif_intf_has_event(ni, intf_i) ) { if( efab_tcp_helper_netif_try_lock(trs, 1) ) { @@ -7037,25 +6926,23 @@ static int tcp_helper_timeout(tcp_helper_resource_t* trs, int intf_i, int budget } oo_inject_packets_kernel_force(ni); efab_tcp_helper_netif_unlock(trs, 1); - } - else { + } else { CITP_STATS_NETIF_INC(ni, timeout_interrupt_lock_contends); } - } - else { + } else { CITP_STATS_NETIF_INC(ni, timeout_interrupt_no_events); } #endif return n; } -static int oo_handle_wakeup_or_timeout(void* context, int is_timeout, - struct efhw_nic* nic, int budget) +static int oo_handle_wakeup_or_timeout( + void* context, int is_timeout, struct efhw_nic* nic, int budget) { struct tcp_helper_nic* tcph_nic = context; tcp_helper_resource_t* trs; - trs = CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], - tcph_nic); + trs = + CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], tcph_nic); if( trs->trs_aflags & OO_THR_AFLAG_POLL_AND_PRIME ) { /* OO_THR_AFLAG_POLL_AND_PRIME is set - i.e. in some sense the * previous interrupt handler is already running. @@ -7071,16 +6958,16 @@ static int oo_handle_wakeup_or_timeout(void* context, int is_timeout, } -static int oo_handle_wakeup_int_driven(void* context, int is_timeout, - struct efhw_nic* nic_, int budget) +static int oo_handle_wakeup_int_driven( + void* context, int is_timeout, struct efhw_nic* nic_, int budget) { struct tcp_helper_nic* tcph_nic = context; tcp_helper_resource_t* trs; ci_netif* ni; int n = 0; - trs = CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], - tcph_nic); + trs = + CI_CONTAINER(tcp_helper_resource_t, nic[tcph_nic->thn_intf_i], tcph_nic); ni = &trs->netif; if( trs->trs_aflags & OO_THR_AFLAG_POLL_AND_PRIME ) { @@ -7089,13 +6976,13 @@ static int oo_handle_wakeup_int_driven(void* context, int is_timeout, * Workqueue will handle new events if any and will prime if needed. */ ci_bit_set(&ni->state->evq_prime_deferred, tcph_nic->thn_intf_i); if( trs->trs_aflags & OO_THR_AFLAG_POLL_AND_PRIME || - ! ci_bit_test_and_clear(&ni->state->evq_prime_deferred, - tcph_nic->thn_intf_i) ) + ! ci_bit_test_and_clear( + &ni->state->evq_prime_deferred, tcph_nic->thn_intf_i) ) return 0; /* otherwise continue as though POLL_AND_PRIME wasn't initially set */ } - ci_assert( ! is_timeout ); + ci_assert(! is_timeout); TCP_HELPER_RESOURCE_ASSERT_VALID(trs, -1); CITP_STATS_NETIF_INC(ni, interrupts); @@ -7106,10 +6993,11 @@ static int oo_handle_wakeup_int_driven(void* context, int is_timeout, if( ci_netif_intf_has_event(ni, tcph_nic->thn_intf_i) ) { if( efab_tcp_helper_netif_try_lock(trs, 1) ) { CITP_STATS_NETIF(++ni->state->stats.interrupt_polls); - ci_assert( ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT); + ci_assert(ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT); if( ni->flags & CI_NETIF_FLAGS_AVOID_ATOMIC || budget <= 0 ) { - /* Steal the locks and exit: don't attempt AF_XDP in atomic context */ + /* Steal the locks and exit: don't attempt AF_XDP in atomic context + */ ci_bit_set(&ni->state->evq_prime_deferred, tcph_nic->thn_intf_i); tcp_helper_defer_dl2work(trs, OO_THR_AFLAG_POLL_AND_PRIME); return 0; @@ -7144,20 +7032,18 @@ static int oo_handle_wakeup_int_driven(void* context, int is_timeout, tcp_helper_request_wakeup_nic(trs, tcph_nic->thn_intf_i); efab_tcp_helper_netif_unlock(trs, 1); break; - } - else { + } else { CITP_STATS_NETIF_INC(ni, interrupt_lock_contends); /* Drop through to set lock flags or try again... */ } - } - else { + } else { CITP_STATS_NETIF_INC(ni, interrupt_no_events); /* Requesting wakeup is tricky here. Don't want to take the * lock if avoidable as results in user-level seeing lock * contention, but need an accurate value of the evq_ptr to * write to request the wakeup. - * + * * First attempt to set the flags to request lock holder request * wakeup. If this fails, then lock is not held, so evq_ptr is * likely consistent. In case where we get it wrong it will @@ -7165,31 +7051,27 @@ static int oo_handle_wakeup_int_driven(void* context, int is_timeout, * into the feedback loop of repeated wakeups seen in bug42745. */ ci_bit_set(&ni->state->evq_prime_deferred, tcph_nic->thn_intf_i); - if( ef_eplock_set_flag_if_locked(&ni->state->lock, - CI_EPLOCK_NETIF_NEED_PRIME) ) { + if( ef_eplock_set_flag_if_locked( + &ni->state->lock, CI_EPLOCK_NETIF_NEED_PRIME) ) { break; - } - else if( oo_trusted_lock_set_flags_if_locked - (trs, OO_TRUSTED_LOCK_NEED_PRIME) ) { + } else if( oo_trusted_lock_set_flags_if_locked( + trs, OO_TRUSTED_LOCK_NEED_PRIME) ) { break; } - if( ! ci_bit_test_and_clear(&ni->state->evq_prime_deferred, - tcph_nic->thn_intf_i) ) + if( ! ci_bit_test_and_clear( + &ni->state->evq_prime_deferred, tcph_nic->thn_intf_i) ) break; - if( tcp_helper_request_wakeup_nic_from_wakeup(trs, - tcph_nic->thn_intf_i) == 0 ) + if( tcp_helper_request_wakeup_nic_from_wakeup( + trs, tcph_nic->thn_intf_i) == 0 ) break; } ci_bit_set(&ni->state->evq_prime_deferred, tcph_nic->thn_intf_i); if( ef_eplock_set_flags_if_locked(&ni->state->lock, - CI_EPLOCK_NETIF_NEED_POLL | - CI_EPLOCK_NETIF_NEED_PRIME) ) { + CI_EPLOCK_NETIF_NEED_POLL | CI_EPLOCK_NETIF_NEED_PRIME) ) { break; - } - else if( oo_trusted_lock_set_flags_if_locked(trs, - OO_TRUSTED_LOCK_NEED_POLL | - OO_TRUSTED_LOCK_NEED_PRIME) ) { + } else if( oo_trusted_lock_set_flags_if_locked(trs, + OO_TRUSTED_LOCK_NEED_POLL | OO_TRUSTED_LOCK_NEED_PRIME) ) { break; } } @@ -7200,16 +7082,15 @@ static int oo_handle_wakeup_int_driven(void* context, int is_timeout, /*-------------------------------------------------------------------- *! - * TCP helper timer implementation + * TCP helper timer implementation * *--------------------------------------------------------------------*/ #if ! CI_CFG_UL_INTERRUPT_HELPER -static void -linux_set_periodic_timer_restart(tcp_helper_resource_t* rs, - unsigned long timeout) +static void linux_set_periodic_timer_restart( + tcp_helper_resource_t* rs, unsigned long timeout) { - if (atomic_read(&rs->timer_running) == 0) + if( atomic_read(&rs->timer_running) == 0 ) return; /* The timeout is calculated from IP ticks, which are ususally smaller @@ -7226,8 +7107,7 @@ linux_set_periodic_timer_restart(tcp_helper_resource_t* rs, /* Find the delay before the next IP timer will fire, in jiffies. * Can be unreliable if the stack is not locked. */ -static unsigned long -tcp_helper_next_ip_timer(ci_netif* ni) +static unsigned long tcp_helper_next_ip_timer(ci_netif* ni) { unsigned long delay = periodic_poll; ci_ip_timer_state* ipts = IPTIMER_STATE(ni); @@ -7236,14 +7116,14 @@ tcp_helper_next_ip_timer(ci_netif* ni) /* 1 tick is roughly equal to 1ms; we do not care about delay > 1s. * Non-positive delta probably means that something is going on under * our feet, so we ignore it. */ - if( ticks_delay > 1000 || ticks_delay < 1) + if( ticks_delay > 1000 || ticks_delay < 1 ) return delay; /* We have the next IP timer closer than 1s. Let's find the time * in jiffies. */ delay = usecs_to_jiffies( - (ci_uint64)ticks_delay << - (ipts->ci_ip_time_frc2tick - ipts->ci_ip_time_frc2us)); + (ci_uint64) ticks_delay + << (ipts->ci_ip_time_frc2tick - ipts->ci_ip_time_frc2us)); /* The calculations above are imprecise. Imprecision is OK, as long * as the periodic timer fires **after** the IP timer should be * run, otherwise the IP timer subsystem refuses to run the IP @@ -7252,8 +7132,7 @@ tcp_helper_next_ip_timer(ci_netif* ni) return delay + 1; } -void -tcp_helper_request_timer(tcp_helper_resource_t* trs) +void tcp_helper_request_timer(tcp_helper_resource_t* trs) { ci_netif* ni = &trs->netif; unsigned long timer_delay; @@ -7262,7 +7141,7 @@ tcp_helper_request_timer(tcp_helper_resource_t* trs) /* If the current periodic timer expiration is too far from * jiffies + timer_delay, then we want to re-schedule the timer. */ if( TIME_GT(trs->timer.timer.expires, - jiffies + timer_delay + periodic_poll_skew) ) { + jiffies + timer_delay + periodic_poll_skew) ) { /* re-schedule the periodic timer to match the delay */ /* RHEL6 fixme: * We'd better run mod_delayed_work(), but it exists for @@ -7273,14 +7152,13 @@ tcp_helper_request_timer(tcp_helper_resource_t* trs) } } -static void -ci_netif_collect_periodic_metrics(ci_netif* ni) +static void ci_netif_collect_periodic_metrics(ci_netif* ni) { /* We have no lock here however, we are the only modifier * of lowest_free_pkts count */ uint32_t free_pkts = - ((ni->pkt_sets_max - ni->pkt_sets_n) << CI_CFG_PKTS_PER_SET_S) + - ni->packets->n_free; + ((ni->pkt_sets_max - ni->pkt_sets_n) << CI_CFG_PKTS_PER_SET_S) + + ni->packets->n_free; if( free_pkts <= 0 ) free_pkts = 1; /* cannot allow it to be set to 0 */ @@ -7290,8 +7168,8 @@ ci_netif_collect_periodic_metrics(ci_netif* ni) ni->state->stats.lowest_free_pkts = free_pkts; } -static void -linux_tcp_timer_do(tcp_helper_resource_t* rs, unsigned long* next_timer) +static void linux_tcp_timer_do( + tcp_helper_resource_t* rs, unsigned long* next_timer) { ci_netif* ni = &rs->netif; ci_uint64 now_frc; @@ -7310,7 +7188,6 @@ linux_tcp_timer_do(tcp_helper_resource_t* rs, unsigned long* next_timer) if( now_frc - ni->state->evq_last_prime > ni->state->timer_prime_cycles * 5 ) { if( efab_tcp_helper_netif_try_lock(rs, 0) ) { - rc = ci_netif_poll(ni); oo_inject_packets_kernel_force(ni); *next_timer = tcp_helper_next_ip_timer(ni); @@ -7318,23 +7195,21 @@ linux_tcp_timer_do(tcp_helper_resource_t* rs, unsigned long* next_timer) CITP_STATS_NETIF_INC(ni, periodic_polls); if( rc > 0 ) CITP_STATS_NETIF_ADD(ni, periodic_evs, rc); - } - else { + } else { CITP_STATS_NETIF_INC(ni, periodic_lock_contends); } ci_netif_collect_periodic_metrics(ni); } } -static void -linux_tcp_helper_periodic_timer(struct work_struct *work) +static void linux_tcp_helper_periodic_timer(struct work_struct* work) { tcp_helper_resource_t* rs = container_of(work, tcp_helper_resource_t, - timer + timer #ifndef EFX_NEED_WORK_API_WRAPPERS - .work + .work #endif - ); + ); unsigned long next_timer = periodic_poll; ci_assert(NULL != rs); @@ -7345,8 +7220,8 @@ linux_tcp_helper_periodic_timer(struct work_struct *work) linux_set_periodic_timer_restart(rs, next_timer); } -static void -tcp_helper_initialize_and_start_periodic_timer(tcp_helper_resource_t* rs) +static void tcp_helper_initialize_and_start_periodic_timer( + tcp_helper_resource_t* rs) { atomic_set(&rs->timer_running, 1); @@ -7359,8 +7234,7 @@ tcp_helper_initialize_and_start_periodic_timer(tcp_helper_resource_t* rs) /* This function is used when stopping a stack, and also on error paths when * creating a stack fails. The workqueue and the purge_txq_work work item * must be initialised, but the periodic timer need not be initialised. */ -static void -tcp_helper_stop_periodic_work(tcp_helper_resource_t* rs) +static void tcp_helper_stop_periodic_work(tcp_helper_resource_t* rs) { ci_irqlock_state_t lock_flags; int timer_was_running = atomic_read(&rs->timer_running); @@ -7398,9 +7272,8 @@ tcp_helper_stop_periodic_work(tcp_helper_resource_t* rs) * *--------------------------------------------------------------------*/ -static void -efab_tcp_helper_drop_os_socket(tcp_helper_resource_t* trs, - tcp_helper_endpoint_t* ep) +static void efab_tcp_helper_drop_os_socket( + tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep) { unsigned long lock_flags; struct file* os_socket; @@ -7421,9 +7294,8 @@ efab_tcp_helper_drop_os_socket(tcp_helper_resource_t* trs, * (2) tcp_helper_endpoint_clear_filters() will postpone hw filter removal. * See (1) for the result. */ -void -efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, - int already_locked) +void efab_tcp_helper_close_endpoint( + tcp_helper_resource_t* trs, oo_sp ep_id, int already_locked) { ci_netif* ni; tcp_helper_endpoint_t* tep_p; @@ -7437,12 +7309,12 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, w = SP_TO_WAITABLE(ni, ep_id); wo = SP_TO_WAITABLE_OBJ(&trs->netif, tep_p->id); - OO_DEBUG_TCPH(ci_log("%s: [%d:%d] ref "OO_THR_REF_FMT" %s", __FUNCTION__, - trs->id, OO_SP_FMT(ep_id), OO_THR_REF_ARG(trs->ref), - ci_tcp_state_str(wo->waitable.state))); + OO_DEBUG_TCPH(ci_log("%s: [%d:%d] ref " OO_THR_REF_FMT " %s", __FUNCTION__, + trs->id, OO_SP_FMT(ep_id), OO_THR_REF_ARG(trs->ref), + ci_tcp_state_str(wo->waitable.state))); ci_assert_impl(already_locked, ci_netif_is_locked(ni)); - ci_assert(!(w->sb_aflags & CI_SB_AFLAG_ORPHAN)); + ci_assert(! (w->sb_aflags & CI_SB_AFLAG_ORPHAN)); ci_assert(! in_atomic()); /* Drop ref to the OS socket. Won't necessarily be the last reference to it; @@ -7450,7 +7322,7 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, * processes. This needs to be done here rather since fput can block. */ if( tep_p->os_socket != NULL ) { - ci_assert( !(w->sb_flags & CI_SB_FLAG_MOVED) ); + ci_assert(! (w->sb_flags & CI_SB_FLAG_MOVED)); /* Shutdown() the os_socket. This needs to be done in a blocking * context. @@ -7459,7 +7331,6 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, efab_tcp_helper_shutdown_os_sock(tep_p, SHUT_RDWR); efab_tcp_helper_drop_os_socket(trs, tep_p); - } #if ! CI_CFG_UL_INTERRUPT_HELPER @@ -7473,12 +7344,11 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, * (B) When handing socket over, we get here with the stack locked from * the UL, so ci_netif_lock() results in deadlock. */ - if( ! (current->flags & PF_EXITING) && - (w->state & CI_TCP_STATE_TCP) && - w->state != CI_TCP_LISTEN && w->state != CI_TCP_CLOSED && + if( ! (current->flags & PF_EXITING) && (w->state & CI_TCP_STATE_TCP) && + w->state != CI_TCP_LISTEN && w->state != CI_TCP_CLOSED && (wo->sock.s_flags & CI_SOCK_FLAG_LINGER) && wo->sock.so.linger != 0 && ci_netif_lock(&trs->netif) == 0 ) { - ci_assert( !already_locked ); + ci_assert(! already_locked); __ci_tcp_shutdown(&trs->netif, &wo->tcp, SHUT_WR); ci_tcp_linger(&trs->netif, &wo->tcp); /* ci_tcp_linger exits unlocked */ @@ -7491,17 +7361,17 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, #endif /*! Add ep to the list in tcp_helper_resource_t for closing - * - we don't increment the ref count - as we need it to reach 0 when - * the application exits i.e. crashes (even if its holding the netif lock) - */ + * - we don't increment the ref count - as we need it to reach 0 when + * the application exits i.e. crashes (even if its holding the netif lock) + */ ci_irqlock_lock(&trs->lock, &lock_flags); #if ! CI_CFG_UL_INTERRUPT_HELPER if( ! ci_sllink_busy(&tep_p->tobe_closed) ) ci_sllist_push(&trs->ep_tobe_closed, &tep_p->tobe_closed); else { ci_irqlock_unlock(&trs->lock, &lock_flags); - ci_log("%s: [%d:%d] is already closing", __FUNCTION__, - trs->id, OO_SP_FMT(ep_id)); + ci_log("%s: [%d:%d] is already closing", __FUNCTION__, trs->id, + OO_SP_FMT(ep_id)); return; } #else @@ -7523,18 +7393,16 @@ efab_tcp_helper_close_endpoint(tcp_helper_resource_t* trs, oo_sp ep_id, if( (already_locked && (~trs->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT)) || efab_tcp_helper_netif_lock_or_set_flags(trs, - OO_TRUSTED_LOCK_CLOSE_ENDPOINT, - CI_EPLOCK_NETIF_CLOSE_ENDPOINT, - 0) ) { - OO_DEBUG_TCPH(ci_log("%s: [%d:%d] closing now", - __FUNCTION__, trs->id, OO_SP_FMT(ep_id))); + OO_TRUSTED_LOCK_CLOSE_ENDPOINT, CI_EPLOCK_NETIF_CLOSE_ENDPOINT, + 0) ) { + OO_DEBUG_TCPH(ci_log( + "%s: [%d:%d] closing now", __FUNCTION__, trs->id, OO_SP_FMT(ep_id))); tcp_helper_close_pending_endpoints(trs); - if( !already_locked ) + if( ! already_locked ) efab_tcp_helper_netif_unlock(trs, 0); - } - else { + } else { OO_DEBUG_TCPH(ci_log("%s: [%d:%d] closing deferred to lock holder", - __FUNCTION__, trs->id, OO_SP_FMT(ep_id))); + __FUNCTION__, trs->id, OO_SP_FMT(ep_id))); } #else ci_atomic_or(&trs->netif.state->action_flags, OO_ACTION_CLOSE_EP); @@ -7562,12 +7430,12 @@ void generic_tcp_helper_close(ci_private_t* priv) wo = SP_TO_WAITABLE_OBJ(&trs->netif, ep->id); #endif - if (ep->fasync_queue) { + if( ep->fasync_queue ) { OO_DEBUG_SHM(ci_log("generic_tcp_helper_close removing fasync helper")); linux_tcp_helper_fop_fasync(-1, priv->_filp, 0); } - if( priv->fd_flags & OO_FDFLAG_EP_ALIEN ) + if( priv->fd_flags & OO_FDFLAG_EP_ALIEN ) fput(priv->_filp); #if CI_CFG_FD_CACHING @@ -7599,16 +7467,15 @@ void generic_tcp_helper_close(ci_private_t* priv) * cope properly with this, just logging that it occurred. */ if( (priv->fd_flags & OO_FDFLAG_EP_TCP) && - (wo->waitable.sb_aflags & CI_SB_AFLAG_IN_CACHE) ) { + (wo->waitable.sb_aflags & CI_SB_AFLAG_IN_CACHE) ) { /* Clear file_ptr before NO_FD flag to ensure correct behaviour of * efab_tcp_helper_detach_file */ ep->file_ptr = NULL; ci_wmb(); ci_atomic32_or(&wo->waitable.sb_aflags, CI_SB_AFLAG_IN_CACHE_NO_FD); LOG_EP(ci_log("%s: %d:%d fd close while cached - not freeing endpoint", - __FUNCTION__, ep->thr->id, OO_SP_FMT(ep->id))); - } - else + __FUNCTION__, ep->thr->id, OO_SP_FMT(ep->id))); + } else #endif { ep->file_ptr = NULL; @@ -7621,8 +7488,7 @@ void generic_tcp_helper_close(ci_private_t* priv) * CI_RESOURCE_OPs. */ -int -efab_attach_os_socket(tcp_helper_endpoint_t* ep, struct file* os_file) +int efab_attach_os_socket(tcp_helper_endpoint_t* ep, struct file* os_file) { struct file* old_os_socket; struct file* new_os_socket; @@ -7635,15 +7501,14 @@ efab_attach_os_socket(tcp_helper_endpoint_t* ep, struct file* os_file) new_os_socket = os_file; /* Check that this os_socket is really a socket. */ - if( !S_ISSOCK(os_file->f_path.dentry->d_inode->i_mode) || - SOCKET_I(os_file->f_path.dentry->d_inode)->file != os_file) { + if( ! S_ISSOCK(os_file->f_path.dentry->d_inode->i_mode) || + SOCKET_I(os_file->f_path.dentry->d_inode)->file != os_file ) { fput(new_os_socket); - OO_DEBUG_ERR(ci_log("%s: %d:%d os_file=%p is not a socket", - __FUNCTION__, ep->thr->id, OO_SP_FMT(ep->id), - os_file)); + OO_DEBUG_ERR(ci_log("%s: %d:%d os_file=%p is not a socket", __FUNCTION__, + ep->thr->id, OO_SP_FMT(ep->id), os_file)); return -EBUSY; } - + spin_lock_irqsave(&ep->lock, lock_flags); old_os_socket = oo_file_xchg(&ep->os_socket, new_os_socket); new_os_socket = get_file(new_os_socket); @@ -7662,17 +7527,16 @@ efab_attach_os_socket(tcp_helper_endpoint_t* ep, struct file* os_file) } -int -__efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, - struct file* os_file, ci_int32 domain) +int __efab_create_os_socket(tcp_helper_resource_t* trs, + tcp_helper_endpoint_t* ep, struct file* os_file, ci_int32 domain) { int rc; citp_waitable_obj* wo; rc = efab_attach_os_socket(ep, os_file); if( rc < 0 ) { - LOG_E(ci_log("%s: ERROR: efab_attach_os_socket failed (%d)", - __FUNCTION__, rc)); + LOG_E(ci_log( + "%s: ERROR: efab_attach_os_socket failed (%d)", __FUNCTION__, rc)); /* NB. efab_attach_os_socket() consumes [os_file] even on error. */ return rc; } @@ -7680,7 +7544,7 @@ __efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, wo = SP_TO_WAITABLE_OBJ(&trs->netif, ep->id); wo->sock.domain = domain; wo->sock.uuid = ci_from_kuid_munged(tcp_helper_get_user_ns(trs), - __kuid_val(ep->os_socket->f_path.dentry->d_inode->i_uid)); + __kuid_val(ep->os_socket->f_path.dentry->d_inode->i_uid)); /* Advertise the existence of the backing socket to user-level. */ ci_atomic32_or(&wo->waitable.sb_aflags, CI_SB_AFLAG_OS_BACKED); @@ -7689,24 +7553,23 @@ __efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, } -int -efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, - ci_int32 domain, ci_int32 type, int flags) +int efab_create_os_socket(tcp_helper_resource_t* trs, + tcp_helper_endpoint_t* ep, ci_int32 domain, ci_int32 type, int flags) { int rc; - struct socket *sock; - struct file *os_file; + struct socket* sock; + struct file* os_file; rc = sock_create(domain, type, 0, &sock); if( rc < 0 ) { LOG_E(ci_log("%s: ERROR: pid %d: sock_create(%d, %d, 0) failed (%d)", - __FUNCTION__, current->pid, domain, type, rc)); + __FUNCTION__, current->pid, domain, type, rc)); return rc; } os_file = sock_alloc_file(sock, flags, NULL); if( IS_ERR(os_file) ) { - LOG_E(ci_log("%s: ERROR: sock_alloc_file failed (%ld)", - __FUNCTION__, PTR_ERR(os_file))); + LOG_E(ci_log("%s: ERROR: sock_alloc_file failed (%ld)", __FUNCTION__, + PTR_ERR(os_file))); /* sock_alloc_file() releases the socket in case of failure */ return PTR_ERR(os_file); } @@ -7721,8 +7584,8 @@ efab_create_os_socket(tcp_helper_resource_t* trs, tcp_helper_endpoint_t* ep, ***************** Wakeups, callbacks, signals, events. **************** **********************************************************************/ -void tcp_helper_endpoint_wakeup(tcp_helper_resource_t* thr, - tcp_helper_endpoint_t* ep) +void tcp_helper_endpoint_wakeup( + tcp_helper_resource_t* thr, tcp_helper_endpoint_t* ep) { citp_waitable* w = SP_TO_WAITABLE(&thr->netif, ep->id); int wq_active; @@ -7740,7 +7603,7 @@ void tcp_helper_endpoint_wakeup(tcp_helper_resource_t* thr, /* Check to see if application has requested ASYNC notification */ if( ep->fasync_queue ) { LOG_TV(ci_log(NWS_FMT "async notification sigown=%d", - NWS_PRI_ARGS(&thr->netif, w), w->sigown)); + NWS_PRI_ARGS(&thr->netif, w), w->sigown)); kill_fasync(&ep->fasync_queue, SIGIO, POLL_IN); CITP_STATS_NETIF_INC(&thr->netif, sock_wakes_signal); if( w->sigown ) @@ -7751,8 +7614,7 @@ void tcp_helper_endpoint_wakeup(tcp_helper_resource_t* thr, #if CI_CFG_EPOLL3 -static void -get_os_ready_list(tcp_helper_resource_t* thr, int ready_list) +static void get_os_ready_list(tcp_helper_resource_t* thr, int ready_list) { ci_netif* ni = &thr->netif; tcp_helper_endpoint_t* ep; @@ -7766,8 +7628,8 @@ get_os_ready_list(tcp_helper_resource_t* thr, int ready_list) ci_sb_epoll_state* epoll; lnk = ci_dllist_head(&thr->os_ready_lists[ready_list]); - ep = CI_CONTAINER(tcp_helper_endpoint_t, - epoll[ready_list].os_ready_link, lnk); + ep = CI_CONTAINER( + tcp_helper_endpoint_t, epoll[ready_list].os_ready_link, lnk); ci_dllist_remove_safe(&ep->epoll[ready_list].os_ready_link); w = SP_TO_WAITABLE(ni, ep->id); @@ -7781,8 +7643,7 @@ get_os_ready_list(tcp_helper_resource_t* thr, int ready_list) ready_link = ci_sb_epoll_ready_link(ni, epoll, ready_list); oo_p_dllink_del(ni, ready_link); oo_p_dllink_add_tail(ni, - oo_p_dllink_ptr(ni, &ni->state->ready_lists[ready_list]), - ready_link); + oo_p_dllink_ptr(ni, &ni->state->ready_lists[ready_list]), ready_link); } spin_unlock_irqrestore(&thr->os_ready_list_lock, lock_flags); } @@ -7790,28 +7651,27 @@ get_os_ready_list(tcp_helper_resource_t* thr, int ready_list) #if ! CI_CFG_UL_INTERRUPT_HELPER -static void -wakeup_post_poll_list(tcp_helper_resource_t* thr) +static void wakeup_post_poll_list(tcp_helper_resource_t* thr) { ci_netif* ni = &thr->netif; tcp_helper_endpoint_t* ep; int n = ni->ep_tbl_n; struct oo_p_dllink_state post_poll_list = - oo_p_dllink_ptr(ni, &ni->state->post_poll_list); + oo_p_dllink_ptr(ni, &ni->state->post_poll_list); citp_waitable* w; #if CI_CFG_EPOLL3 int tmp; #endif LOG_TV(if( oo_p_dllink_is_empty(ni, post_poll_list) ) - ci_log("netif_lock_callback: need_wake but empty")); + ci_log("netif_lock_callback: need_wake but empty")); /* [n] ensures the loop will terminate in reasonable time no matter how ** badly u/l behaves. */ while( n-- > 0 && ! oo_p_dllink_is_empty(ni, post_poll_list) ) { struct oo_p_dllink_state lnk = - oo_p_dllink_statep(ni, post_poll_list.l->next); + oo_p_dllink_statep(ni, post_poll_list.l->next); oo_p_dllink_del_init(ni, lnk); w = CI_CONTAINER(citp_waitable, post_poll_link, lnk.l); @@ -7820,29 +7680,28 @@ wakeup_post_poll_list(tcp_helper_resource_t* thr) } #if CI_CFG_EPOLL3 - CI_READY_LIST_EACH(ni->state->ready_lists_in_use, tmp, n) { + CI_READY_LIST_EACH(ni->state->ready_lists_in_use, tmp, n) + { get_os_ready_list(thr, n); - if( ! oo_p_dllink_is_empty(ni, oo_p_dllink_ptr(ni, - &ni->state->ready_lists[n])) ) + if( ! oo_p_dllink_is_empty( + ni, oo_p_dllink_ptr(ni, &ni->state->ready_lists[n])) ) efab_tcp_helper_ready_list_wakeup(thr, n); } #endif } #endif -static inline void -tcp_helper_unlock_prime(tcp_helper_resource_t* thr) +static inline void tcp_helper_unlock_prime(tcp_helper_resource_t* thr) { - ci_netif *ni = &thr->netif; + ci_netif* ni = &thr->netif; int intf_i; CITP_STATS_NETIF_INC(ni, unlock_slow_need_prime); if( NI_OPTS(ni).int_driven ) { OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( ci_bit_test_and_clear(&ni->state->evq_prime_deferred, intf_i) ) - tcp_helper_request_wakeup_nic(thr, intf_i); - } - else { + if( ci_bit_test_and_clear(&ni->state->evq_prime_deferred, intf_i) ) + tcp_helper_request_wakeup_nic(thr, intf_i); + } else { tcp_helper_request_wakeup(thr); } } @@ -7868,43 +7727,43 @@ tcp_helper_unlock_prime(tcp_helper_resource_t* thr) * *--------------------------------------------------------------------*/ -ci_uint64 -efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, - int in_dl_context) +ci_uint64 efab_tcp_helper_netif_lock_callback( + eplock_helper_t* epl, ci_uint64 lock_val, int in_dl_context) { - tcp_helper_resource_t* thr = CI_CONTAINER(tcp_helper_resource_t, - netif.eplock_helper, epl); - const ci_uint64 all_after_unlock_flags = (CI_EPLOCK_NETIF_NEED_PRIME | - CI_EPLOCK_NETIF_PKT_WAKE); + tcp_helper_resource_t* thr = + CI_CONTAINER(tcp_helper_resource_t, netif.eplock_helper, epl); + const ci_uint64 all_after_unlock_flags = + (CI_EPLOCK_NETIF_NEED_PRIME | CI_EPLOCK_NETIF_PKT_WAKE); ci_uint64 all_handled_flags = - CI_EPLOCK_NETIF_UNLOCK_FLAGS | - CI_EPLOCK_NETIF_SOCKET_LIST | + CI_EPLOCK_NETIF_UNLOCK_FLAGS | CI_EPLOCK_NETIF_SOCKET_LIST | CI_EPLOCK_NETIF_UL_COMMON_MASK; /* adds PKT_WAITER | DEFERRED_PKTS */ ci_netif* ni = &thr->netif; ci_uint64 flags_set; ci_uint64 after_unlock_flags = 0; ci_uint64 defer_flags = 0; - int/*bool*/ pkt_waiter_retried = 0; + int /*bool*/ pkt_waiter_retried = 0; bool orphaned; ci_assert(ci_netif_is_locked(ni)); - /* from dl context we can only run a subset of work, for other work we need to defer. - * defer_flags contains all work items that will cause us to defer to non-atomic */ + /* from dl context we can only run a subset of work, for other work we need + * to defer. defer_flags contains all work items that will cause us to defer + * to non-atomic */ if( in_dl_context ) { defer_flags = CI_EPLOCK_NETIF_DL_CONTEXT_DEFER_MASK; - if(! oo_avoid_wakeup_from_dl() ) - defer_flags &=~ CI_EPLOCK_NETIF_NEED_WAKE; + if( ! oo_avoid_wakeup_from_dl() ) + defer_flags &= ~CI_EPLOCK_NETIF_NEED_WAKE; } do { if( in_dl_context ) ni->flags |= CI_NETIF_FLAG_IN_DL_CONTEXT; - again: + again: /* We expect this to sort out CI_EPLOCK_NETIF_UL_COMMON flags and clear - * all_handled_flags. Note the flags might have re-emerged. */ - lock_val = ci_netif_unlock_slow_common(ni, lock_val, all_handled_flags & ~defer_flags); + * all_handled_flags. Note the flags might have re-emerged. */ + lock_val = ci_netif_unlock_slow_common( + ni, lock_val, all_handled_flags & ~defer_flags); orphaned = (thr->ref[OO_THR_REF_APP] == 0); @@ -7912,7 +7771,8 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, ** e.g. we tried to unlock the eplock (bottom of loop) but found ** someone had tried to lock it and therefore set the "need wake" bit. */ - flags_set = lock_val & CI_EPLOCK_NETIF_UNLOCK_FLAGS &~ CI_EPLOCK_NETIF_UL_COMMON_MASK; + flags_set = lock_val & CI_EPLOCK_NETIF_UNLOCK_FLAGS & + ~CI_EPLOCK_NETIF_UL_COMMON_MASK; after_unlock_flags |= flags_set & all_after_unlock_flags; /* All code between here and the bottom of the loop should use @@ -7928,14 +7788,14 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, if( flags_set & CI_EPLOCK_NETIF_CLOSE_ENDPOINT ) { /* prevent flag ping pong */ ef_eplock_clear_flags(&ni->state->lock, CI_EPLOCK_NETIF_CLOSE_ENDPOINT); - flags_set &=~ CI_EPLOCK_NETIF_CLOSE_ENDPOINT; - if( oo_trusted_lock_lock_and_set_flags(thr, - OO_TRUSTED_LOCK_CLOSE_ENDPOINT) ) { + flags_set &= ~CI_EPLOCK_NETIF_CLOSE_ENDPOINT; + if( oo_trusted_lock_lock_and_set_flags( + thr, OO_TRUSTED_LOCK_CLOSE_ENDPOINT) ) { /* We've got both locks. If in non-atomic context, do the work, * else defer work and locks to workitem. */ - OO_DEBUG_TCPH(ci_log("%s: [%u] CLOSE_ENDPOINT now", - __FUNCTION__, thr->id)); + OO_DEBUG_TCPH( + ci_log("%s: [%u] CLOSE_ENDPOINT now", __FUNCTION__, thr->id)); /* set flags in case we get deferred */ ef_eplock_holder_set_flags(&ni->state->lock, flags_set); @@ -7944,16 +7804,15 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, if( in_dl_context ) ni->flags &= ~CI_NETIF_FLAG_IN_DL_CONTEXT; /* unlock will take care of CLOSE_ENDPOINT work */ - if( oo_trusted_lock_drop(thr, in_dl_context, 1/*has_shared=1*/) ) + if( oo_trusted_lock_drop(thr, in_dl_context, 1 /*has_shared=1*/) ) return 0; /* unlock has been deferred with both locks */ CITP_STATS_NETIF(++ni->state->stats.unlock_slow_close); /* best to go around to refresh flags_set */ continue; - } - else { + } else { /* Trusted lock holder now responsible for non-atomic work. */ OO_DEBUG_TCPH(ci_log("%s: [%u] defer CLOSE_ENDPOINT to trusted lock", - __FUNCTION__, thr->id)); + __FUNCTION__, thr->id)); } } #endif @@ -7967,7 +7826,7 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, /* We cannot finish this work in DL context, let's defer to work item * immediately without any partial work */ OO_DEBUG_TCPH(ci_log("%s: [%u] defer to workitem, flags %llx", - __FUNCTION__, thr->id, lock_val)); + __FUNCTION__, thr->id, lock_val)); /* set flags so work item can pick up the work */ ef_eplock_holder_set_flags(&ni->state->lock, flags_set); tcp_helper_defer_dl2work(thr, OO_THR_AFLAG_UNLOCK_UNTRUSTED); @@ -7978,15 +7837,15 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, if( flags_set & CI_EPLOCK_NETIF_SWF_UPDATE ) { oof_cb_sw_filter_apply(ni); CITP_STATS_NETIF(++ni->state->stats.unlock_slow_swf_update); - flags_set &=~ CI_EPLOCK_NETIF_SWF_UPDATE; + flags_set &= ~CI_EPLOCK_NETIF_SWF_UPDATE; } if( flags_set & CI_EPLOCK_NETIF_NEED_WAKE ) { - OO_DEBUG_TCPH(ci_log("%s: [%u] wake up endpoints", - __FUNCTION__, thr->id)); + OO_DEBUG_TCPH( + ci_log("%s: [%u] wake up endpoints", __FUNCTION__, thr->id)); wakeup_post_poll_list(thr); CITP_STATS_NETIF(++ni->state->stats.unlock_slow_wake); - flags_set &=~ CI_EPLOCK_NETIF_NEED_WAKE; + flags_set &= ~CI_EPLOCK_NETIF_NEED_WAKE; } /* Monitor the number of free packets: pretend that @@ -7994,22 +7853,21 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, ** short of packets. */ if( (flags_set & CI_EPLOCK_NETIF_NEED_PKT_SET) || - (!orphaned && oo_want_proactive_packet_allocation(ni)) ) { - OO_DEBUG_TCPH(ci_log("%s: [%u] NEED_PKT_SET now", - __FUNCTION__, thr->id)); + (! orphaned && oo_want_proactive_packet_allocation(ni)) ) { + OO_DEBUG_TCPH( + ci_log("%s: [%u] NEED_PKT_SET now", __FUNCTION__, thr->id)); efab_tcp_helper_more_bufs(thr); - flags_set &=~ CI_EPLOCK_NETIF_NEED_PKT_SET; + flags_set &= ~CI_EPLOCK_NETIF_NEED_PKT_SET; } /* Monitor the number of socket buffers. */ if( (flags_set & CI_EPLOCK_NETIF_NEED_SOCK_BUFS) || - (!orphaned && oo_want_proactive_socket_allocation(ni)) ) { - OO_DEBUG_TCPH(ci_log("%s: [%u] NEED_SOCK_BUFS now", - __FUNCTION__, thr->id)); + (! orphaned && oo_want_proactive_socket_allocation(ni)) ) { + OO_DEBUG_TCPH( + ci_log("%s: [%u] NEED_SOCK_BUFS now", __FUNCTION__, thr->id)); efab_tcp_helper_more_socks(thr); - flags_set &=~ CI_EPLOCK_NETIF_NEED_SOCK_BUFS; - + flags_set &= ~CI_EPLOCK_NETIF_NEED_SOCK_BUFS; } #endif @@ -8022,8 +7880,7 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, if( flags_set & CI_EPLOCK_NETIF_KERNEL_PACKETS ) { OO_DEBUG_TCPH(ci_log("%s: [%u] forward %u packets to kernel", - __FUNCTION__, thr->id, - kernel_packets_pending(ni->state))); + __FUNCTION__, thr->id, kernel_packets_pending(ni->state))); oo_inject_packets_kernel(thr, 0); flags_set &= ~CI_EPLOCK_NETIF_KERNEL_PACKETS; } @@ -8064,9 +7921,8 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, if( in_dl_context ) ni->flags &= ~CI_NETIF_FLAG_IN_DL_CONTEXT; - } while ( !ef_eplock_try_unlock(&ni->state->lock, &lock_val, - CI_EPLOCK_NETIF_UNLOCK_FLAGS | - CI_EPLOCK_NETIF_SOCKET_LIST) ); + } while( ! ef_eplock_try_unlock(&ni->state->lock, &lock_val, + CI_EPLOCK_NETIF_UNLOCK_FLAGS | CI_EPLOCK_NETIF_SOCKET_LIST) ); if( after_unlock_flags & CI_EPLOCK_NETIF_NEED_PRIME ) tcp_helper_unlock_prime(thr); @@ -8083,9 +7939,8 @@ efab_tcp_helper_netif_lock_callback(eplock_helper_t* epl, ci_uint64 lock_val, return lock_val; } -#else /* CI_CFG_UL_INTERRUPT_HELPER */ -int -efab_eplock_wake_and_do(ci_netif *ni, ci_uint64 l) +#else /* CI_CFG_UL_INTERRUPT_HELPER */ +int efab_eplock_wake_and_do(ci_netif* ni, ci_uint64 l) { tcp_helper_resource_t* thr = netif2tcp_helper_resource(ni); @@ -8142,45 +7997,44 @@ efab_eplock_wake_and_do(ci_netif *ni, ci_uint64 l) * *--------------------------------------------------------------------*/ -extern int -iterate_netifs_unlocked(ci_netif **p_ni, enum oo_thr_ref_type ref_type, - enum oo_thr_ref_type ref_zero) +extern int iterate_netifs_unlocked(ci_netif** p_ni, + enum oo_thr_ref_type ref_type, enum oo_thr_ref_type ref_zero) { - ci_netif *ni_prev = *p_ni; + ci_netif* ni_prev = *p_ni; ci_irqlock_state_t lock_flags; - tcp_helper_resource_t * thr_prev = NULL; - ci_dllink *link = NULL; + tcp_helper_resource_t* thr_prev = NULL; + ci_dllink* link = NULL; int rc = -ENOENT; ci_assert_lt(ref_type, ref_zero); - if (ni_prev) { + if( ni_prev ) { thr_prev = CI_CONTAINER(tcp_helper_resource_t, netif, ni_prev); TCP_HELPER_RESOURCE_ASSERT_VALID(thr_prev, -1); } - /* We need a lock to protect the link and thr from removing + /* We need a lock to protect the link and thr from removing * after we've got the link and before taking refcount */ ci_irqlock_lock(&THR_TABLE.lock, &lock_flags); - if (ni_prev != NULL) { + if( ni_prev != NULL ) { link = thr_prev->all_stacks_link.next; - if (ci_dllist_end(&THR_TABLE.all_stacks) == link) + if( ci_dllist_end(&THR_TABLE.all_stacks) == link ) link = NULL; - } else if (ci_dllist_not_empty(&THR_TABLE.all_stacks)) + } else if( ci_dllist_not_empty(&THR_TABLE.all_stacks) ) link = ci_dllist_start(&THR_TABLE.all_stacks); - if (link) { - tcp_helper_resource_t * thr; + if( link ) { + tcp_helper_resource_t* thr; /* Skip dead thr's */ -again: + again: thr = CI_CONTAINER(tcp_helper_resource_t, all_stacks_link, link); if( ! oo_thr_ref_is_zero(thr->ref, ref_zero) || oo_thr_ref_get(thr->ref, ref_type) != 0 ) { link = link->next; - if (ci_dllist_end(&THR_TABLE.all_stacks) == link) { + if( ci_dllist_end(&THR_TABLE.all_stacks) == link ) { *p_ni = NULL; goto out; } @@ -8193,21 +8047,20 @@ iterate_netifs_unlocked(ci_netif **p_ni, enum oo_thr_ref_type ref_type, out: ci_irqlock_unlock(&THR_TABLE.lock, &lock_flags); - if (ni_prev != NULL) + if( ni_prev != NULL ) iterate_netifs_unlocked_dropref(&thr_prev->netif, ref_type); return rc; } - static int efab_ipid_alloc(efab_ipid_cb_t* ipid) { int i; int rv; ci_irqlock_state_t lock_flags; - ci_assert( ipid->init == EFAB_IPID_INIT ); - ci_irqlock_lock( &ipid->lock, &lock_flags ); + ci_assert(ipid->init == EFAB_IPID_INIT); + ci_irqlock_lock(&ipid->lock, &lock_flags); /* go find an unused block */ i = ipid->last_block_used; @@ -8215,22 +8068,22 @@ static int efab_ipid_alloc(efab_ipid_cb_t* ipid) i = (i + 1) % CI_IPID_BLOCK_COUNT; if( i == ipid->last_block_used ) break; - if( !ipid->range[i] ) { + if( ! ipid->range[i] ) { ipid->range[i]++; rv = CI_IPID_MIN + (i << CI_IPID_BLOCK_SHIFT); - ci_assert((rv >= CI_IPID_MIN) && + ci_assert((rv >= CI_IPID_MIN) && (rv <= CI_IPID_MAX - CI_IPID_BLOCK_LENGTH + 1)); ipid->last_block_used = i; goto alloc_exit; } else { - ci_assert( ipid->range[i] == 1 ); + ci_assert(ipid->range[i] == 1); } - } while(1); + } while( 1 ); /* !!Out of blocks!! */ rv = -ENOMEM; - alloc_exit: - ci_irqlock_unlock( &ipid->lock, &lock_flags ); +alloc_exit: + ci_irqlock_unlock(&ipid->lock, &lock_flags); return rv; } @@ -8240,26 +8093,25 @@ static int efab_ipid_free(efab_ipid_cb_t* ipid, int base) int i; ci_irqlock_state_t lock_flags; - ci_assert( ipid->init == EFAB_IPID_INIT ); + ci_assert(ipid->init == EFAB_IPID_INIT); - if( (base & CI_IPID_BLOCK_MASK) != 0 ) - return -EINVAL; /* not actually on a block boundary */ + if( (base & CI_IPID_BLOCK_MASK) != 0 ) + return -EINVAL; /* not actually on a block boundary */ - ci_assert((base >= CI_IPID_MIN) && + ci_assert((base >= CI_IPID_MIN) && (base <= CI_IPID_MAX - CI_IPID_BLOCK_LENGTH + 1)); - ci_irqlock_lock( &ipid->lock, &lock_flags ); + ci_irqlock_lock(&ipid->lock, &lock_flags); i = (base - CI_IPID_MIN) >> CI_IPID_BLOCK_SHIFT; - ci_assert( ipid->range[i] == 1 ); + ci_assert(ipid->range[i] == 1); ipid->range[i] = 0; - ci_irqlock_unlock( &ipid->lock, &lock_flags ); + ci_irqlock_unlock(&ipid->lock, &lock_flags); return 0; } -int -efab_tcp_helper_vi_stats_query(tcp_helper_resource_t* trs, unsigned int intf_i, - void* data, size_t data_len, int do_reset) +int efab_tcp_helper_vi_stats_query(tcp_helper_resource_t* trs, + unsigned int intf_i, void* data, size_t data_len, int do_reset) { struct efrm_vi* virs; @@ -8320,9 +8172,8 @@ static int oo_inject_packet_kernel(ci_netif* ni, ci_ip_pkt_fmt* pkt) offbuf_end + offsetof(typeof(*frag), buf) > CI_CFG_PKT_BUF_SIZE ) goto corrupted; - memcpy(skb->data + len, - (void*)((uintptr_t)(&frag->buf) + offbuf_off), - offbuf_end - offbuf_off); + memcpy(skb->data + len, (void*) ((uintptr_t) (&frag->buf) + offbuf_off), + offbuf_end - offbuf_off); len += offbuf_end - offbuf_off; if( OO_PP_IS_NULL(frag->frag_next) ) @@ -8361,13 +8212,13 @@ struct oo_inject_packets_work_data { static void oo_inject_packets_work(struct work_struct* work) { struct oo_inject_packets_work_data* data = - container_of(work, struct oo_inject_packets_work_data, work); + container_of(work, struct oo_inject_packets_work_data, work); ci_netif* ni = &data->trs->netif; ci_ip_pkt_fmt* pkt; int netif_is_locked; /* Part one: inject all packets to the kernel */ - for( pkt = PKT_CHK(ni, data->pkt_head); ; pkt = PKT_CHK(ni, pkt->next) ) { + for( pkt = PKT_CHK(ni, data->pkt_head);; pkt = PKT_CHK(ni, pkt->next) ) { /* No need to check the return value here. If the function fails, the * packet is dropped, and a counter is incremented. */ oo_inject_packet_kernel(ni, pkt); @@ -8378,7 +8229,8 @@ static void oo_inject_packets_work(struct work_struct* work) /* Part two: free Onload packets */ netif_is_locked = 0; - for( pkt = PKT_CHK(ni, data->pkt_head); ; pkt = PKT_CHK(ni, data->pkt_head)) { + for( pkt = PKT_CHK(ni, data->pkt_head);; + pkt = PKT_CHK(ni, data->pkt_head) ) { data->pkt_head = pkt->next; ci_netif_pkt_release_mnl(ni, pkt, &netif_is_locked); if( OO_PP_IS_NULL(data->pkt_head) ) @@ -8407,7 +8259,7 @@ void oo_inject_packets_kernel(tcp_helper_resource_t* trs, int sync) if( ni->state->kernel_packets_pending == 0 ) return; - ci_assert( ! OO_PP_IS_NULL(ni->state->kernel_packets_head) ); + ci_assert(! OO_PP_IS_NULL(ni->state->kernel_packets_head)); /* Are we allowed to inject any packets? */ if( ! (ni->flags & CI_NETIF_FLAG_MAY_INJECT_TO_KERNEL) ) { @@ -8433,8 +8285,7 @@ void oo_inject_packets_kernel(tcp_helper_resource_t* trs, int sync) if( sync ) { oo_inject_packets_work(&data->work); - } - else { + } else { /* Push data to kernel without holding the stack lock */ queue_work(trs->wq, &data->work); } @@ -8455,16 +8306,15 @@ void oo_inject_packets_kernel(tcp_helper_resource_t* trs, int sync) #include -ci_inline int oo_xdp_rx_pkt_locked(ci_netif* ni, - struct net_device* dev, - ci_ip_pkt_fmt* pkt) +ci_inline int oo_xdp_rx_pkt_locked( + ci_netif* ni, struct net_device* dev, ci_ip_pkt_fmt* pkt) { /* TODO: ensure that packet: * * is linear * * has enough headroom (256 bytes) * see netif_receive_generic_xdp in kernel */ - struct bpf_prog* xdp_prog = rcu_dereference( - oo_nics[ni->intf_i_to_hwport[pkt->intf_i] ].prog); + struct bpf_prog* xdp_prog = + rcu_dereference(oo_nics[ni->intf_i_to_hwport[pkt->intf_i]].prog); struct xdp_buff _xdp; struct xdp_buff* xdp = &_xdp; void *orig_data, *orig_data_end; @@ -8474,13 +8324,14 @@ ci_inline int oo_xdp_rx_pkt_locked(ci_netif* ni, int act; if( xdp_prog == NULL ) - return XDP_PASS; + return XDP_PASS; /* The XDP program wants to see the packet starting at the MAC * header. */ xdp->data = oo_ether_hdr(pkt); - xdp->data_meta = xdp->data; /* note: netdriver does not support metadata at all, we could do the same */ + xdp->data_meta = xdp->data; /* note: netdriver does not support metadata at + all, we could do the same */ /* There are two commonly-discussed behaviours for jumbograms: * 1) Drop the packet here (it would be bad to bypass XDP without dropping @@ -8491,7 +8342,8 @@ ci_inline int oo_xdp_rx_pkt_locked(ci_netif* ni, * https://github.com/xdp-project/xdp-project/blob/master/areas/core/xdp-multi-buffer01-design.org */ xdp->data_end = xdp->data + oo_offbuf_left(&pkt->buf); - xdp->data_hard_start = xdp->data; /* no headroom, should be 256 bytes at least */ + xdp->data_hard_start = + xdp->data; /* no headroom, should be 256 bytes at least */ orig_data_end = xdp->data_end; orig_data = xdp->data; @@ -8503,8 +8355,8 @@ ci_inline int oo_xdp_rx_pkt_locked(ci_netif* ni, } -/* bool */ int -efab_tcp_helper_xdp_rx_pkt(tcp_helper_resource_t* trs, ci_ip_pkt_fmt* pkt) +/* bool */ int efab_tcp_helper_xdp_rx_pkt( + tcp_helper_resource_t* trs, ci_ip_pkt_fmt* pkt) { int ret = XDP_PASS; struct tcp_helper_nic* trs_nic = &trs->nic[pkt->intf_i]; @@ -8561,8 +8413,8 @@ efab_tcp_helper_xdp_rx_pkt(tcp_helper_resource_t* trs, ci_ip_pkt_fmt* pkt) } #endif -int efab_tcp_helper_tcp_offload_set_isn(tcp_helper_resource_t* trs, - oo_sp ep_id, ci_uint32 isn) +int efab_tcp_helper_tcp_offload_set_isn( + tcp_helper_resource_t* trs, oo_sp ep_id, ci_uint32 isn) { #if CI_CFG_TCP_OFFLOAD_RECYCLER ci_netif* ni = &trs->netif; @@ -8571,15 +8423,16 @@ int efab_tcp_helper_tcp_offload_set_isn(tcp_helper_resource_t* trs, ci_assert(! in_atomic()); - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { if( ni->nic_hw[intf_i].plugin_rx && tep_p->plugin_stream_id[intf_i] != INVALID_PLUGIN_HANDLE ) { struct xsn_tcp_sync_stream sync = { .in_conn_id = tep_p->plugin_stream_id[intf_i], .in_seq = isn, }; - int rc = efrm_ext_msg(ni->nic_hw[intf_i].plugin_rx, - XSN_CEPH_SYNC_STREAM, &sync, sizeof(sync)); + int rc = efrm_ext_msg(ni->nic_hw[intf_i].plugin_rx, XSN_CEPH_SYNC_STREAM, + &sync, sizeof(sync)); if( rc < 0 ) return rc; } @@ -8591,10 +8444,8 @@ int efab_tcp_helper_tcp_offload_set_isn(tcp_helper_resource_t* trs, } int efab_tcp_helper_tcp_offload_get_stream_id(tcp_helper_resource_t* trs, - oo_sp ep_id, ci_int32 intf_i, - ci_uint32* stream_id, - ci_uint64* ddr_base, - ci_uint64* ddr_size) + oo_sp ep_id, ci_int32 intf_i, ci_uint32* stream_id, ci_uint64* ddr_base, + ci_uint64* ddr_size) { #if CI_CFG_TCP_OFFLOAD_RECYCLER ci_netif* ni = &trs->netif; @@ -8623,8 +8474,7 @@ int efab_tcp_helper_tcp_offload_get_stream_id(tcp_helper_resource_t* trs, } int efab_tcp_helper_efct_superbuf_config_refresh( - tcp_helper_resource_t* trs, - oo_efct_superbuf_config_refresh_t* op) + tcp_helper_resource_t* trs, oo_efct_superbuf_config_refresh_t* op) { struct tcp_helper_nic* nic; if( op->intf_i >= oo_stack_intf_max(&trs->netif) ) @@ -8634,13 +8484,11 @@ int efab_tcp_helper_efct_superbuf_config_refresh( ! nic->thn_efct_rxq[op->qid] ) return -EINVAL; return efrm_rxq_refresh(nic->thn_efct_rxq[op->qid], - (unsigned long)CI_USER_PTR_GET(op->superbufs), - CI_USER_PTR_GET(op->current_mappings), - op->max_superbufs); + (unsigned long) CI_USER_PTR_GET(op->superbufs), + CI_USER_PTR_GET(op->current_mappings), op->max_superbufs); } -static tcp_helper_resource_t* -thr_ref2thr(oo_thr_ref_t ref) +static tcp_helper_resource_t* thr_ref2thr(oo_thr_ref_t ref) { return CI_CONTAINER(tcp_helper_resource_t, ref[0], &ref[0]); } @@ -8648,24 +8496,24 @@ thr_ref2thr(oo_thr_ref_t ref) static void thr_release_base(oo_thr_ref_t ref) { tcp_helper_resource_t* thr = thr_ref2thr(ref); - OO_DEBUG_TCPH(ci_log("%s [%d] "OO_THR_REF_FMT, __func__, thr->id, - OO_THR_REF_ARG(ref))); + OO_DEBUG_TCPH(ci_log( + "%s [%d] " OO_THR_REF_FMT, __func__, thr->id, OO_THR_REF_ARG(ref))); efab_tcp_helper_k_ref_count_is_zero(thr); } static void thr_release_file(oo_thr_ref_t ref) { tcp_helper_resource_t* thr = thr_ref2thr(ref); - OO_DEBUG_TCPH(ci_log("%s [%d] "OO_THR_REF_FMT, __func__, thr->id, - OO_THR_REF_ARG(ref))); + OO_DEBUG_TCPH(ci_log( + "%s [%d] " OO_THR_REF_FMT, __func__, thr->id, OO_THR_REF_ARG(ref))); tcp_helper_rm_free(thr); } static void thr_release_app(oo_thr_ref_t ref) { tcp_helper_resource_t* thr = thr_ref2thr(ref); - OO_DEBUG_TCPH(ci_log("%s [%d] "OO_THR_REF_FMT, __func__, thr->id, - OO_THR_REF_ARG(ref))); + OO_DEBUG_TCPH(ci_log( + "%s [%d] " OO_THR_REF_FMT, __func__, thr->id, OO_THR_REF_ARG(ref))); efab_notify_stacklist_change(thr); /* We could run the most part of efab_tcp_helper_rm_free_locked() here. * But as we don't trust the "services" running in UL, we'll have to @@ -8678,11 +8526,8 @@ static void thr_release_app(oo_thr_ref_t ref) oo_thr_ref_drop(ref, OO_THR_REF_FILE); } -oo_thr_ref_release_fn oo_thr_ref_release[OO_THR_REF_INFTY] = -{ - thr_release_base, - thr_release_file, - thr_release_app +oo_thr_ref_release_fn oo_thr_ref_release[OO_THR_REF_INFTY] = { + thr_release_base, thr_release_file, thr_release_app }; /*! \cidoxg_end */ diff --git a/src/lib/transport/ip/ip_internal.h b/src/lib/transport/ip/ip_internal.h index 4808b64b7..0190dc6d6 100644 --- a/src/lib/transport/ip/ip_internal.h +++ b/src/lib/transport/ip/ip_internal.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author ctk ** \brief Decls & defs for IP library internal to our libraries. @@ -22,10 +22,10 @@ #include #include #ifdef __KERNEL__ -# include -# include +#include +#include #else -# include +#include #endif #include @@ -36,7 +36,7 @@ * the driver. However, the driver compiles code that uses this * definition so just define it to 0. */ -#define ONLOAD_MSG_WARM 0 +#define ONLOAD_MSG_WARM 0 /* ONLOAD_MSG_ONEPKT is only used in user space receive calls, so use * the same trick as for ONLOAD_MSG_WARM above. @@ -63,31 +63,36 @@ **************************** Logging etc. ***************************** **********************************************************************/ -extern unsigned ci_tp_log CI_HV; +extern unsigned ci_tp_log CI_HV; extern unsigned ci_tp_max_dump CI_HV; -#define log ci_log +#define log ci_log -ci_inline unsigned raw_pkt_dump_len(unsigned len) { +ci_inline unsigned raw_pkt_dump_len(unsigned len) +{ #if defined(__ci_driver__) - if( len > 80 ) len = 80; + if( len > 80 ) + len = 80; #else - if( len > ci_tp_max_dump ) len = ci_tp_max_dump; + if( len > ci_tp_max_dump ) + len = ci_tp_max_dump; #endif return len; } -ci_inline unsigned ip_pkt_dump_len(unsigned len) { +ci_inline unsigned ip_pkt_dump_len(unsigned len) +{ len += ETH_HLEN; /* ?? Cout VLAN tag as well ?? */ - if( len > ETH_FRAME_LEN ) len = 80; + if( len > ETH_FRAME_LEN ) + len = 80; return raw_pkt_dump_len(len); } #ifdef __ci_driver__ /* definitions for installing/removing IP filters */ -# include -# include +#include +#include #endif @@ -106,8 +111,8 @@ ci_inline void ci_tcp_update_rtt(ci_netif* netif, ci_tcp_state* ts, int m) /* It's possible to get here if the timestamp has been corrupted. If so * it's probably best not to use it to update the rtt. */ - LOG_TL(ci_log("TCP RX %d:%d ditching bad timestamp echo", - LNT_PRI_ARGS(netif, ts))); + LOG_TL(ci_log( + "TCP RX %d:%d ditching bad timestamp echo", LNT_PRI_ARGS(netif, ts))); return; } m = CI_MAX(1, m); @@ -117,36 +122,35 @@ ci_inline void ci_tcp_update_rtt(ci_netif* netif, ci_tcp_state* ts, int m) ** RFC2988 */ m -= (ts->sa >> 3u); - ts->sa += m; /* SRTT <- SRTT + 0.125*(M-SRTT) */ - if( m < 0 ) m = -m; + ts->sa += m; /* SRTT <- SRTT + 0.125*(M-SRTT) */ + if( m < 0 ) + m = -m; m -= (ts->sv >> 2u); - ts->sv += m; /* RTTVAR <- 0.75*RTTVAR + 0.25*|M-SRTT| */ - ts->rto = tcp_srtt(ts) + ts->sv; /* RTO <- SRTT + 4*RTTVAR */ - } - else { + ts->sv += m; /* RTTVAR <- 0.75*RTTVAR + 0.25*|M-SRTT| */ + ts->rto = tcp_srtt(ts) + ts->sv; /* RTO <- SRTT + 4*RTTVAR */ + } else { /* first rtt estimate so follow (2.2) of RFC2988 */ - ts->sa = (m << 3u); - ts->sv = (m << 1u); + ts->sa = (m << 3u); + ts->sv = (m << 1u); ts->rto = m + ts->sv; } ci_tcp_rto_bound(netif, ts); - CI_IP_SOCK_STATS_VAL_RTT_SRTT_RTO( ts, ts->sv >> 2, ts->sa >> 3, ts->rto ); + CI_IP_SOCK_STATS_VAL_RTT_SRTT_RTO(ts, ts->sv >> 2, ts->sa >> 3, ts->rto); LOG_TR(ci_log("TCP RX %d UPDATE RTT sa=%u sv=%u SRTT=%u RTTVAR=%u RTO=%u", - S_FMT(ts), ts->sa, ts->sv, - tcp_srtt(ts), tcp_rttvar(ts), ts->rto)); + S_FMT(ts), ts->sa, ts->sv, tcp_srtt(ts), tcp_rttvar(ts), ts->rto)); } /* ** Turn timestamps into cmsg entries. */ -void ip_cmsg_recv_timestamp(ci_netif *ni, ci_uint64 timestamp, - struct cmsg_state *cmsg_state); -void ip_cmsg_recv_timestampns(ci_netif *ni, ci_uint64 timestamp, - struct cmsg_state *cmsg_state); -void ip_cmsg_recv_timestamping(ci_netif *ni, const ci_ip_pkt_fmt *pkt, - int flags, struct cmsg_state *cmsg_state); +void ip_cmsg_recv_timestamp( + ci_netif* ni, ci_uint64 timestamp, struct cmsg_state* cmsg_state); +void ip_cmsg_recv_timestampns( + ci_netif* ni, ci_uint64 timestamp, struct cmsg_state* cmsg_state); +void ip_cmsg_recv_timestamping(ci_netif* ni, const ci_ip_pkt_fmt* pkt, + int flags, struct cmsg_state* cmsg_state); /********************************************************************** @@ -155,28 +159,28 @@ void ip_cmsg_recv_timestamping(ci_netif *ni, const ci_ip_pkt_fmt *pkt, /* Macro for sleeping until [cond] is not true (or timeout, or error). */ /* TODO timeout should be re-calculated when looping */ -#define CITP_WAITABLE_SLEEP_WHILE(ni, w, why, timeout, cond, prc) \ - do { \ - ci_uint64 __sleep_seq; \ - ci_uint32 t = (timeout); \ - *(prc) = 0; \ - while( 1 ) { \ - __sleep_seq = (w)->sleep_seq.all; \ - ci_rmb(); \ - if( !(cond) ) break; \ - (*prc) = ci_sock_sleep((ni), (w), (why), \ - CI_SLEEP_NETIF_LOCKED | \ - CI_SLEEP_NETIF_RQ, \ - __sleep_seq, &t); \ - /* TODO (Bug24547) handle case where netif lock fails */ \ - CI_TEST(ci_netif_lock(ni) == 0); \ - if( *(prc) ) break; \ - ci_netif_poll(ni); \ - } \ - } while(0) - - -#define CI_TCP_SLEEP_WHILE(ni, ts, why, timeout, cond, prc) \ +#define CITP_WAITABLE_SLEEP_WHILE(ni, w, why, timeout, cond, prc) \ + do { \ + ci_uint64 __sleep_seq; \ + ci_uint32 t = (timeout); \ + *(prc) = 0; \ + while( 1 ) { \ + __sleep_seq = (w)->sleep_seq.all; \ + ci_rmb(); \ + if( ! (cond) ) \ + break; \ + (*prc) = ci_sock_sleep((ni), (w), (why), \ + CI_SLEEP_NETIF_LOCKED | CI_SLEEP_NETIF_RQ, __sleep_seq, &t); \ + /* TODO (Bug24547) handle case where netif lock fails */ \ + CI_TEST(ci_netif_lock(ni) == 0); \ + if( *(prc) ) \ + break; \ + ci_netif_poll(ni); \ + } \ + } while( 0 ) + + +#define CI_TCP_SLEEP_WHILE(ni, ts, why, timeout, cond, prc) \ CITP_WAITABLE_SLEEP_WHILE((ni), &(ts)->s.b, (why), (timeout), (cond), (prc)) @@ -200,63 +204,55 @@ void ip_cmsg_recv_timestamping(ci_netif *ni, const ci_ip_pkt_fmt *pkt, * *--------------------------------------------------------------------*/ -ci_inline int -ci_tcp_ep_set_filters(ci_netif * ni, - oo_sp sock_id, - ci_ifid_t bindto_ifindex, - oo_sp from_tcp_id) +ci_inline int ci_tcp_ep_set_filters( + ci_netif* ni, oo_sp sock_id, ci_ifid_t bindto_ifindex, oo_sp from_tcp_id) { int rc; ci_assert(ni); - LOG_TC(ci_log("%s: %d:%d bindto_ifindex=%d port_sock=%d", - __FUNCTION__, NI_ID(ni), OO_SP_FMT(sock_id), - (int) bindto_ifindex, OO_SP_FMT(from_tcp_id))); + LOG_TC(ci_log("%s: %d:%d bindto_ifindex=%d port_sock=%d", __FUNCTION__, + NI_ID(ni), OO_SP_FMT(sock_id), (int) bindto_ifindex, + OO_SP_FMT(from_tcp_id))); #ifdef __ci_driver__ - rc = tcp_helper_endpoint_set_filters(ci_netif_get_valid_ep(ni, sock_id), - bindto_ifindex, from_tcp_id); + rc = tcp_helper_endpoint_set_filters( + ci_netif_get_valid_ep(ni, sock_id), bindto_ifindex, from_tcp_id); #else - if( ci_tcp_can_set_filter_in_ul(ni, SP_TO_SOCK(ni, sock_id)) ) + if( ci_tcp_can_set_filter_in_ul(ni, SP_TO_SOCK(ni, sock_id)) ) { rc = ci_tcp_sock_set_stack_filter(ni, SP_TO_SOCK(ni, sock_id)); - else - rc = ci_tcp_helper_ep_set_filters(ci_netif_get_driver_handle(ni), sock_id, - bindto_ifindex, from_tcp_id); + } else + rc = ci_tcp_helper_ep_set_filters( + ci_netif_get_driver_handle(ni), sock_id, bindto_ifindex, from_tcp_id); #endif - LOG_TC( if(rc < 0) - ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc) ); + LOG_U(if( rc < 0 ) ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); return rc; } -#if !defined(__KERNEL__) && CI_CFG_ENDPOINT_MOVE -ci_inline int -ci_tcp_ep_reuseport_bind(ci_fd_t fd, const char* cluster_name, - ci_int32 cluster_size, ci_uint32 cluster_restart_opt, - ci_uint32 cluster_hot_restart_opt, - ci_addr_t addr, ci_uint16 port_be16) +#if ! defined(__KERNEL__) && CI_CFG_ENDPOINT_MOVE +ci_inline int ci_tcp_ep_reuseport_bind(ci_fd_t fd, const char* cluster_name, + ci_int32 cluster_size, ci_uint32 cluster_restart_opt, + ci_uint32 cluster_hot_restart_opt, ci_addr_t addr, ci_uint16 port_be16) { int rc; if( port_be16 == 0 ) { - /* There should be a non-zero port value to perform reuseport bind properly. - * This condition will be violated when socket deferred bind happens, e.g. - * when combining SO_REUSEPORT with EF_TCP_SHARED_LOCAL_PORTS option. */ + /* There should be a non-zero port value to perform reuseport bind + * properly. This condition will be violated when socket deferred bind + * happens, e.g. when combining SO_REUSEPORT with EF_TCP_SHARED_LOCAL_PORTS + * option. */ LOG_TC(ci_log("%s: Trying to perform reuseport bind with 0 port value", - __FUNCTION__)); + __FUNCTION__)); return EINVAL; } LOG_TC(ci_log("%s: %d addr: " IPX_FMT " port: %d", __FUNCTION__, fd, - IPX_ARG(AF_IP_L3(addr)), port_be16)); + IPX_ARG(AF_IP_L3(addr)), port_be16)); rc = ci_tcp_helper_ep_reuseport_bind(fd, cluster_name, cluster_size, - cluster_restart_opt, - cluster_hot_restart_opt, - addr, port_be16); - LOG_TC( if(rc < 0) - ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc) ); + cluster_restart_opt, cluster_hot_restart_opt, addr, port_be16); + LOG_TC(if( rc < 0 ) ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); return rc; } #endif @@ -274,10 +270,8 @@ ci_tcp_ep_reuseport_bind(ci_fd_t fd, const char* cluster_name, * *--------------------------------------------------------------------*/ -ci_inline int -ci_tcp_ep_clear_filters(ci_netif* ni, - oo_sp sock_id, - int need_update) +ci_inline int ci_tcp_ep_clear_filters( + ci_netif* ni, oo_sp sock_id, int need_update) { int rc; #ifdef __ci_driver__ @@ -285,34 +279,32 @@ ci_tcp_ep_clear_filters(ci_netif* ni, #endif ci_assert(ni); - LOG_TC(ci_log("%s: %d:%d (%d)", __FUNCTION__, - ni->state->stack_id, OO_SP_FMT(sock_id), need_update)); + LOG_TC(ci_log("%s: %d:%d (%d)", __FUNCTION__, ni->state->stack_id, + OO_SP_FMT(sock_id), need_update)); ci_assert(ci_netif_is_locked(ni)); #ifdef __ci_driver__ - rc = tcp_helper_endpoint_clear_filters( - ci_netif_get_valid_ep(ni, sock_id), - (supress_hw_ops ? EP_CLEAR_FILTERS_FLAG_SUPRESS_HW : 0) | - (need_update ? EP_CLEAR_FILTERS_FLAG_NEED_UPDATE : 0)); + rc = tcp_helper_endpoint_clear_filters(ci_netif_get_valid_ep(ni, sock_id), + (supress_hw_ops ? EP_CLEAR_FILTERS_FLAG_SUPRESS_HW : 0) | + (need_update ? EP_CLEAR_FILTERS_FLAG_NEED_UPDATE : 0)); #else if( (SP_TO_SOCK(ni, sock_id)->s_flags & CI_SOCK_FLAG_STACK_FILTER) && ci_tcp_can_set_filter_in_ul(ni, SP_TO_SOCK(ni, sock_id)) ) { ci_tcp_sock_clear_stack_filter(ni, SP_TO_TCP(ni, sock_id)); rc = 0; - } - else - rc = ci_tcp_helper_ep_clear_filters(ci_netif_get_driver_handle(ni), sock_id, - need_update); + } else + rc = ci_tcp_helper_ep_clear_filters( + ci_netif_get_driver_handle(ni), sock_id, need_update); #if CI_CFG_UL_INTERRUPT_HELPER - /* When called from stack poll, it is important to remove sw filters - * immediately, before receiving next packets. */ - if( ni->state->in_poll ) - ci_netif_handle_actions(ni); + /* When called from stack poll, it is important to remove sw filters + * immediately, before receiving next packets. */ + if( ni->state->in_poll ) + ci_netif_handle_actions(ni); #endif #endif - LOG_TC( if (rc < 0 && rc != -EAGAIN) - ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc) ); + LOG_TC(if( rc < 0 && rc != -EAGAIN ) + ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); return rc; } @@ -324,7 +316,7 @@ ci_tcp_ep_clear_filters(ci_netif* ni, * address. If the socket is not bound, the function just add multicast * address to the list, and bind() should install the filter. * or - * Delete a multicast address from a socket list of multicast addresses. + * Delete a multicast address from a socket list of multicast addresses. * If the socket is already bound, this function removes filters for this * address. If the socket is not bound, the function just deletes multicast * address from the list. @@ -342,26 +334,20 @@ ci_tcp_ep_clear_filters(ci_netif* ni, *--------------------------------------------------------------------*/ #ifndef __ci_driver__ -ci_inline int -ci_tcp_ep_mcast_add_del(ci_netif* ni, - oo_sp sock_id, - ci_ifid_t ifindex, - ci_uint32 mcast_addr, - int add) +ci_inline int ci_tcp_ep_mcast_add_del(ci_netif* ni, oo_sp sock_id, + ci_ifid_t ifindex, ci_uint32 mcast_addr, int add) { int rc; ci_assert(ni); - LOG_TC(ci_log("%s: id=%d (ifid=%d, maddr=%s)", - __FUNCTION__, OO_SP_FMT(sock_id), ifindex, - ip_addr_str(mcast_addr))); + LOG_TC(ci_log("%s: id=%d (ifid=%d, maddr=%s)", __FUNCTION__, + OO_SP_FMT(sock_id), ifindex, ip_addr_str(mcast_addr))); - rc = ci_tcp_helper_ep_mcast_add_del(ci_netif_get_driver_handle(ni), - sock_id, mcast_addr, ifindex, add); + rc = ci_tcp_helper_ep_mcast_add_del( + ci_netif_get_driver_handle(ni), sock_id, mcast_addr, ifindex, add); - LOG_TC( if(rc < 0) - ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc) ); + LOG_TC(if( rc < 0 ) ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); return rc; } #endif @@ -372,22 +358,22 @@ ci_tcp_ep_mcast_add_del(ci_netif* ni, *********************************************************************/ #ifdef __KERNEL__ -# define verify_fail() return +#define verify_fail() return #else -# define verify_fail() ci_fail(("STOP.")) +#define verify_fail() ci_fail(("STOP.")) #endif -#define verify(exp) \ - do{ \ - if( CI_UNLIKELY(!(exp)) ) { \ +#define verify(exp) \ + do { \ + if( CI_UNLIKELY(! (exp)) ) { \ ci_log("********** verify(%s) at %s:%d", #exp, __FILE__, __LINE__); \ - ci_log("********** from %s:%d", file?file:"", line); \ - verify_fail(); \ - } \ - }while(0) + ci_log("********** from %s:%d", file ? file : "", line); \ + verify_fail(); \ + } \ + } while( 0 ) #undef verify -#define verify(exp) ci_assert(exp) +#define verify(exp) ci_assert(exp) /********************************************************************* @@ -395,18 +381,18 @@ ci_tcp_ep_mcast_add_del(ci_netif* ni, *********************************************************************/ #ifndef SO_TIMESTAMPNS -# define SO_TIMESTAMPNS 35 +#define SO_TIMESTAMPNS 35 #endif #ifndef SO_REUSEPORT -# define SO_REUSEPORT 15 +#define SO_REUSEPORT 15 #endif #if CI_CFG_TIMESTAMPING /* The following value needs to match its counterpart * in kernel headers. */ -#define ONLOAD_SO_TIMESTAMPING 37 +#define ONLOAD_SO_TIMESTAMPING 37 #define ONLOAD_SCM_TIMESTAMPING ONLOAD_SO_TIMESTAMPING #endif @@ -434,48 +420,44 @@ struct oo_sock_extended_err { /* check [ov] is a non-NULL ptr & [ol] indicates the right space for * type [ty] */ -#define opt_ok(ov,ol,ty) ((ov) && (ol) >= sizeof(ty)) -#define opt_not_ok(ov,ol,ty) \ - ((ol) < sizeof(ty) ? -EINVAL : (ov) ? 0 : -EFAULT) +#define opt_ok(ov, ol, ty) ((ov) && (ol) >= sizeof(ty)) +#define opt_not_ok(ov, ol, ty) \ + ((ol) < sizeof(ty) ? -EINVAL : (ov) ? 0 : -EFAULT) -ci_inline unsigned -ci_get_optval(const void *optval, socklen_t optlen) +ci_inline unsigned ci_get_optval(const void* optval, socklen_t optlen) { - if (optlen >= sizeof(unsigned)) - return (*(unsigned*)optval); - else return (unsigned)(*(unsigned char*)optval); + if( optlen >= sizeof(unsigned) ) + return (*(unsigned*) optval); + else + return (unsigned) (*(unsigned char*) optval); } /*! Do not call it, use ci_getsockopt_final(). */ -ci_inline int -ci_getsockopt_final_pre(void *optval, socklen_t *optlen, int level, - void *val, socklen_t val_size) +ci_inline int ci_getsockopt_final_pre( + void* optval, socklen_t* optlen, int level, void* val, socklen_t val_size) { if( *optlen > 0 ) memcpy(optval, val, CI_MIN(*optlen, val_size)); if( *optlen > val_size ) *optlen = val_size; /* TODO AFAIK, Solaris returns error if *optlen < val_size. */ - return 0; + return 0; } /*! Common getsockopt() part - push value to the user according to the * particular OS expectations. Return -1 with errno being set or 0. */ -ci_inline int -ci_getsockopt_final(void *optval, socklen_t *optlen, int level, - void *val, size_t val_size) +ci_inline int ci_getsockopt_final( + void* optval, socklen_t* optlen, int level, void* val, size_t val_size) { - if( (level == SOL_SOCKET || level == SOL_IP) && - val_size == sizeof(int) && + if( (level == SOL_SOCKET || level == SOL_IP) && val_size == sizeof(int) && *optlen >= sizeof(char) && *optlen < sizeof(int) ) { - int ival = *((int *)val); - unsigned char ucval = (unsigned char)ival; - if( ival >=0 && ival <= 255) - return ci_getsockopt_final_pre(optval, optlen, level, - &ucval, sizeof(ucval)); + int ival = *((int*) val); + unsigned char ucval = (unsigned char) ival; + if( ival >= 0 && ival <= 255 ) + return ci_getsockopt_final_pre( + optval, optlen, level, &ucval, sizeof(ucval)); } - return ci_getsockopt_final_pre(optval, optlen, level, - val, val_size); + return ci_getsockopt_final_pre(optval, optlen, level, val, val_size); } @@ -487,9 +469,8 @@ ci_getsockopt_final(void *optval, socklen_t *optlen, int level, * \param optlen [in/out] Length of buffer ref'd by [optval] * \return As for getsockopt() */ -extern int ci_get_sol_tcp(ci_netif* netif, ci_sock_cmn* s, - int optname, void *optval, - socklen_t *optlen) CI_HF; +extern int ci_get_sol_tcp(ci_netif* netif, ci_sock_cmn* s, int optname, + void* optval, socklen_t* optlen) CI_HF; #ifdef __KERNEL__ extern int ci_ip_mtu_discover_from_sflags(int s_flags, int af) CI_HF; @@ -504,9 +485,8 @@ extern int ci_ip_mtu_discover_from_sflags(int s_flags, int af) CI_HF; * \param optlen [in/out] Length of buffer ref'd by [optval] * \return As for getsockopt() */ -extern int ci_get_sol_ip( ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, - int optname, void *optval, - socklen_t *optlen ) CI_HF; +extern int ci_get_sol_ip(ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, + int optname, void* optval, socklen_t* optlen) CI_HF; #endif #if CI_CFG_FAKE_IPV6 @@ -519,9 +499,8 @@ extern int ci_get_sol_ip( ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, * \param optlen [in/out] Length of buffer ref'd by [optval] * \return As for getsockopt() */ -extern int ci_get_sol_ip6( ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, - int optname, void *optval, - socklen_t *optlen ) CI_HF; +extern int ci_get_sol_ip6(ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, + int optname, void* optval, socklen_t* optlen) CI_HF; #endif #if defined(__KERNEL__) && ! defined(EFRM_HAS_STRUCT_TIMEVAL) @@ -538,9 +517,8 @@ extern int ci_get_sol_ip6( ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd, * \param optlen [in/out] Length of buffer ref'd by [optval] * \return As for getsockopt() */ -extern int ci_get_sol_socket( ci_netif* netif, ci_sock_cmn* s, - int optname, void *optval, - socklen_t *optlen ) CI_HF; +extern int ci_get_sol_socket(ci_netif* netif, ci_sock_cmn* s, int optname, + void* optval, socklen_t* optlen) CI_HF; /*! Handler for common setsockopt:SOL_IP handlers. * \param netif [in] Netif context @@ -550,9 +528,8 @@ extern int ci_get_sol_socket( ci_netif* netif, ci_sock_cmn* s, * \param optlen [in] Length of buffer ref'd by [optval] * \return As for setsockopt() */ -extern int -ci_set_sol_ip( ci_netif* netif, ci_sock_cmn* s, - int optname, const void *optval, socklen_t optlen) CI_HF; +extern int ci_set_sol_ip(ci_netif* netif, ci_sock_cmn* s, int optname, + const void* optval, socklen_t optlen) CI_HF; #if CI_CFG_FAKE_IPV6 /*! Handler for common setsockopt:SOL_IPV6 handlers. @@ -563,9 +540,8 @@ ci_set_sol_ip( ci_netif* netif, ci_sock_cmn* s, * \param optlen [in] Length of buffer ref'd by [optval] * \return As for setsockopt() */ -extern int -ci_set_sol_ip6( ci_netif* netif, ci_sock_cmn* s, - int optname, const void *optval, socklen_t optlen) CI_HF; +extern int ci_set_sol_ip6(ci_netif* netif, ci_sock_cmn* s, int optname, + const void* optval, socklen_t optlen) CI_HF; #endif /*! Handler for common setsockopt:SOL_SOCKET handlers. @@ -576,52 +552,71 @@ ci_set_sol_ip6( ci_netif* netif, ci_sock_cmn* s, * \param optlen [in] Length of buffer ref'd by [optval] * \return As for setsockopt() */ -extern int -ci_set_sol_socket( ci_netif* netif, ci_sock_cmn* s, - int optname, const void *optval, socklen_t optlen) CI_HF; +extern int ci_set_sol_socket(ci_netif* netif, ci_sock_cmn* s, int optname, + const void* optval, socklen_t optlen) CI_HF; /*! Handles socket options that don't require the netif lock. */ -extern int -ci_set_sol_socket_nolock(ci_netif*, ci_sock_cmn* s, int optname, - const void *optval, socklen_t optlen) CI_HF; +extern int ci_set_sol_socket_nolock(ci_netif*, ci_sock_cmn* s, int optname, + const void* optval, socklen_t optlen) CI_HF; /********************************************************************* ******************************* Ioctls ****************************** -*********************************************************************/ + *********************************************************************/ #ifdef __KERNEL__ -#define CI_IOCTL_ARG_OK(t,a) ({t _v; int _rc = get_user(_v, (t*)(a)); (void)_v; _rc==0;}) -#define CI_IOCTL_SETARG(a,v) do { put_user(v,a); } while(0) -#define CI_IOCTL_GETARG(t,a) ({t _v; get_user(_v, (t*)(a)); _v; }) +#define CI_IOCTL_ARG_OK(t, a) \ + ({ \ + t _v; \ + int _rc = get_user(_v, (t*) (a)); \ + (void) _v; \ + _rc == 0; \ + }) +#define CI_IOCTL_SETARG(a, v) \ + do { \ + put_user(v, a); \ + } while( 0 ) +#define CI_IOCTL_GETARG(t, a) \ + ({ \ + t _v; \ + get_user(_v, (t*) (a)); \ + _v; \ + }) #else -#define CI_IOCTL_ARG_OK(t,a) ((a) != 0) -#define CI_IOCTL_SETARG(a,v) do { *(a)=(v); } while(0) -#define CI_IOCTL_GETARG(t,v) (*(t*)(v)) +#define CI_IOCTL_ARG_OK(t, a) ((a) != 0) +#define CI_IOCTL_SETARG(a, v) \ + do { \ + *(a) = (v); \ + } while( 0 ) +#define CI_IOCTL_GETARG(t, v) (*(t*) (v)) #endif #if defined(__KERNEL) /* Bug 18959: should be __KERNEL__ */ -/* Common handler for FIONBIO - called in per-protocol handler to +/* Common handler for FIONBIO - called in per-protocol handler to * keep the request efficient */ -#define CI_CMN_IOCTL_FIONBIO(s, arg) do { \ - int v, _rc = get_user(v, arg); \ - if( v ) { \ - LOG_SV( ci_log("%s: set non-blocking mode", __FUNCTION__ ) ); \ - ci_bit_set(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ - } else { \ - LOG_SV( ci_log("%s: clear non-blocking mode", __FUNCTION__ ) ); \ - ci_bit_clear(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ - } } while (0) +#define CI_CMN_IOCTL_FIONBIO(s, arg) \ + do { \ + int v, _rc = get_user(v, arg); \ + if( v ) { \ + LOG_SV(ci_log("%s: set non-blocking mode", __FUNCTION__)); \ + ci_bit_set(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ + } else { \ + LOG_SV(ci_log("%s: clear non-blocking mode", __FUNCTION__)); \ + ci_bit_clear(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ + } \ + } while( 0 ) #else -/* Common handler for FIONBIO - called in per-protocol handler to +/* Common handler for FIONBIO - called in per-protocol handler to * keep the request efficient */ -#define CI_CMN_IOCTL_FIONBIO(s, arg) do { \ - if( *(int*)(arg) ) { \ - LOG_SV( ci_log("%s: set non-blocking mode", __FUNCTION__ ) ); \ - ci_bit_set(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ - } else { \ - LOG_SV( ci_log("%s: clear non-blocking mode", __FUNCTION__ ) ); \ - ci_bit_clear(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ - } } while (0) +#define CI_CMN_IOCTL_FIONBIO(s, arg) \ + do { \ + if( *(int*) (arg) ) { \ + LOG_SV(ci_log("%s: set non-blocking mode", __FUNCTION__)); \ + ci_bit_set(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ + } else { \ + LOG_SV(ci_log("%s: clear non-blocking mode", __FUNCTION__)); \ + ci_bit_clear(&(s)->b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_BIT); \ + } \ + } while( 0 ) #endif /*! Common handler for IOCTL calls. @@ -633,22 +628,22 @@ ci_set_sol_socket_nolock(ci_netif*, ci_sock_cmn* s, int optname, * \param os_socket_exists Non-zero if OS socket extsts * \return As for ioctl() */ -extern int ci_cmn_ioctl(ci_netif* netif, ci_sock_cmn* s, int request, - void* arg, int os_rc, int os_socket_exists); +extern int ci_cmn_ioctl(ci_netif* netif, ci_sock_cmn* s, int request, + void* arg, int os_rc, int os_socket_exists); /*! Compute the time stamp delta for the given packet time stamp and * return in in ts */ -extern void ci_udp_compute_stamp(ci_netif *netif, ci_uint64 stamp, - struct timespec *ts); +extern void ci_udp_compute_stamp( + ci_netif* netif, ci_uint64 stamp, struct timespec* ts); /* Return from getsockopt(level=SOL_INVALID) with appropriate errno */ -# define SOCKOPT_RET_INVALID_LEVEL(s) \ - if ((s)->domain == AF_INET6 ) \ - RET_WITH_ERRNO(ENOPROTOOPT); \ - else \ - RET_WITH_ERRNO(EOPNOTSUPP) +#define SOCKOPT_RET_INVALID_LEVEL(s) \ + if( (s)->domain == AF_INET6 ) \ + RET_WITH_ERRNO(ENOPROTOOPT); \ + else \ + RET_WITH_ERRNO(EOPNOTSUPP) /********************************************************************* ***************************** Async IO ****************************** @@ -661,14 +656,13 @@ extern void ci_udp_compute_stamp(ci_netif *netif, ci_uint64 stamp, #if defined(__KERNEL__) -extern void ci_ip_queue_enqueue_nnl(ci_netif* netif, ci_ip_pkt_queue*qu, - ci_ip_pkt_fmt* pkt) CI_HF; +extern void ci_ip_queue_enqueue_nnl( + ci_netif* netif, ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* pkt) CI_HF; #endif extern ci_ip_pkt_fmt* ci_pkt_alloc_n(ci_netif* ni, int n) CI_HF; extern ci_ip_pkt_fmt* ci_pkt_alloc_n_nnl(ci_netif* ni, int n) CI_HF; - /********************************************************************* ******************************** UDP ******************************** *********************************************************************/ @@ -677,20 +671,21 @@ extern ci_ip_pkt_fmt* ci_pkt_alloc_n_nnl(ci_netif* ni, int n) CI_HF; * boundary requirements (multiple of 64 bits) */ /* How much payload space in a first fragment packet */ -#define UDP_PAYLOAD1_SPACE_PMTU(af, pmtu) \ - (((pmtu) - CI_IPX_HDR_SIZE(af) - CI_IPX_FRAG_HDR_SIZE(af) - \ - sizeof(ci_udp_hdr)) & 0xfff8) +#define UDP_PAYLOAD1_SPACE_PMTU(af, pmtu) \ + (((pmtu) -CI_IPX_HDR_SIZE(af) - CI_IPX_FRAG_HDR_SIZE(af) - \ + sizeof(ci_udp_hdr)) & \ + 0xfff8) /* How much space in a second fragment packet */ #define UDP_PAYLOAD2_SPACE_PMTU(af, pmtu) \ - (((pmtu) - CI_IPX_HDR_SIZE(af) + CI_IPX_FRAG_HDR_SIZE(af)) & 0xfff8) + (((pmtu) -CI_IPX_HDR_SIZE(af) + CI_IPX_FRAG_HDR_SIZE(af)) & 0xfff8) -#define UDP_HAS_SENDQ_SPACE(us,l) \ - ((us)->s.so.sndbuf >= (int)((us)->tx_count + (l))) +#define UDP_HAS_SENDQ_SPACE(us, l) \ + ((us)->s.so.sndbuf >= (int) ((us)->tx_count + (l))) /* Linux sets twice the buffer size that the application requests. */ -#define oo_adjust_SO_XBUF(v) ((v) * 2) +#define oo_adjust_SO_XBUF(v) ((v) *2) /********************************************************************** @@ -699,49 +694,45 @@ extern ci_ip_pkt_fmt* ci_pkt_alloc_n_nnl(ci_netif* ni, int n) CI_HF; #ifdef __KERNEL__ -ci_inline int -oo_spinloop_pause_check_signals(ci_netif* ni, ci_uint64 now_frc, - ci_uint64* schedule_frc, int have_timeout) +ci_inline int oo_spinloop_pause_check_signals( + ci_netif* ni, ci_uint64 now_frc, ci_uint64* schedule_frc, int have_timeout) { - if(CI_UNLIKELY( signal_pending(current) )) + if( CI_UNLIKELY(signal_pending(current)) ) return have_timeout ? -EINTR : -ERESTARTSYS; if( now_frc - *schedule_frc > IPTIMER_STATE(ni)->khz ) { - schedule(); /* schedule() every 1ms */ + schedule(); /* schedule() every 1ms */ *schedule_frc = now_frc; } return 0; } -#define OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, schedule_frc, \ - have_timeout, w, si) \ +#define OO_SPINLOOP_PAUSE_CHECK_SIGNALS( \ + ni, now_frc, schedule_frc, have_timeout, w, si) \ oo_spinloop_pause_check_signals(ni, now_frc, schedule_frc, have_timeout) #else #include "ci/internal/ip_signal.h" -extern int oo_spinloop_run_pending_sigs(ci_netif*, citp_waitable*, - citp_signal_info*, int) CI_HF; - -ci_inline int -oo_spinloop_pause_check_signals(ci_netif* ni, - ci_uint64 now_frc /*unused*/, - ci_uint64* schedule_frc /*unused*/, - int have_timeout, - citp_waitable* w, citp_signal_info* si) +extern int oo_spinloop_run_pending_sigs( + ci_netif*, citp_waitable*, citp_signal_info*, int) CI_HF; + +ci_inline int oo_spinloop_pause_check_signals(ci_netif* ni, + ci_uint64 now_frc /*unused*/, ci_uint64* schedule_frc /*unused*/, + int have_timeout, citp_waitable* w, citp_signal_info* si) { ci_assert_gt(si->c.inside_lib, 0); ci_assert(~si->c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED); - if(CI_LIKELY( ! (si->c.aflags & OO_SIGNAL_FLAG_HAVE_PENDING) )) + if( CI_LIKELY(! (si->c.aflags & OO_SIGNAL_FLAG_HAVE_PENDING)) ) return 0; else return oo_spinloop_run_pending_sigs(ni, w, si, have_timeout); } -#define OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, schedule_frc, \ - have_timeout, w, si) \ - oo_spinloop_pause_check_signals(ni, now_frc, schedule_frc, \ - have_timeout, w, si) +#define OO_SPINLOOP_PAUSE_CHECK_SIGNALS( \ + ni, now_frc, schedule_frc, have_timeout, w, si) \ + oo_spinloop_pause_check_signals( \ + ni, now_frc, schedule_frc, have_timeout, w, si) #endif @@ -752,7 +743,7 @@ oo_spinloop_pause_check_signals(ci_netif* ni, #ifndef __KERNEL__ extern citp_init_thread_callback init_thread_callback CI_HV; -extern oo_signal_terminate_fn signal_terminate_fn CI_HV; +extern oo_signal_terminate_fn signal_terminate_fn CI_HV; #endif @@ -779,9 +770,9 @@ static inline int ci_intf_i_to_ifindex(ci_netif* ni, int intf_i) *********************************************************************/ /* Returns true if the packet is freed. */ -ci_inline int/*bool*/ -ci_netif_pkt_release_in_poll(ci_netif* netif, ci_ip_pkt_fmt* pkt, - struct ci_netif_poll_state* ps) +ci_inline int /*bool*/ +ci_netif_pkt_release_in_poll( + ci_netif* netif, ci_ip_pkt_fmt* pkt, struct ci_netif_poll_state* ps) { if( pkt->refcount == 1 ) { /* We are going to free the packet, so it is not in use @@ -794,57 +785,55 @@ ci_netif_pkt_release_in_poll(ci_netif* netif, ci_ip_pkt_fmt* pkt, __ci_netif_pkt_clean(pkt); if( ! (pkt->flags & CI_PKT_FLAG_NONB_POOL) ) { ci_netif_pkt_put(netif, pkt); - } - else if( ps != NULL ) { + } else if( ps != NULL ) { *ps->tx_pkt_free_list_insert = OO_PKT_P(pkt); - ps->tx_pkt_free_list_insert = &pkt->next; + ps->tx_pkt_free_list_insert = &pkt->next; ++ps->tx_pkt_free_list_n; - } - else { + } else { ci_netif_pkt_free_nonb_list(netif, OO_PKT_P(pkt), pkt); - netif->state->n_async_pkts ++; + netif->state->n_async_pkts++; } return CI_TRUE; - } - else { + } else { ci_assert_gt(pkt->refcount, 1); --pkt->refcount; return CI_FALSE; } } - + #ifdef __KERNEL__ extern void ci_netif_set_merge_atomic_flag(ci_netif* ni); -#define CI_NETIF_STATE_MOD(ni, is_locked, field, mod) \ - do { \ - if( is_locked ) { \ - mod##mod ni->state->field; \ - } \ - else { \ - ci_int32 val; \ - do { \ - val = ni->state->atomic_##field; \ - } while( ci_cas32u_fail(&ni->state->atomic_##field, val, val mod 1) );\ - } \ - } while(0) +#define CI_NETIF_STATE_MOD(ni, is_locked, field, mod) \ + do { \ + if( is_locked ) { \ + mod##mod ni->state->field; \ + } else { \ + ci_int32 val; \ + do { \ + val = ni->state->atomic_##field; \ + } while( ci_cas32u_fail(&ni->state->atomic_##field, val, val mod 1) ); \ + } \ + } while( 0 ) #else #define CI_NETIF_STATE_MOD(ni, is_locked, field, mod) \ - do { mod##mod ni->state->field; } while(0) + do { \ + mod##mod ni->state->field; \ + } while( 0 ) #endif -void oo_pkt_calc_checksums(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct iovec* host_iov); +void oo_pkt_calc_checksums( + ci_netif* ni, ci_ip_pkt_fmt* pkt, struct iovec* host_iov); #ifndef __KERNEL__ -ci_inline void ci_pkt_zc_free_clean(ci_ip_pkt_fmt* pkt, - enum onload_zc_callback_rc cb_rc) +ci_inline void ci_pkt_zc_free_clean( + ci_ip_pkt_fmt* pkt, enum onload_zc_callback_rc cb_rc) { if( ! (cb_rc & ONLOAD_ZC_KEEP) ) { /* Remove the ref we added earlier iff the user didn't retain it */ - pkt->rx_flags &=~ CI_PKT_RX_FLAG_KEEP; - pkt->pio_addr = -1; /* Reset to normal after user_refcount overwrote it */ + pkt->rx_flags &= ~CI_PKT_RX_FLAG_KEEP; + pkt->pio_addr = -1; /* Reset to normal after user_refcount overwrote it */ } } #endif @@ -854,14 +843,10 @@ ci_inline void ci_pkt_zc_free_clean(ci_ip_pkt_fmt* pkt, ****************************** ZC send offloads ********************* *********************************************************************/ -ci_int8 -ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct ci_pkt_zc_payload* zcp, - unsigned payload_offset, void* prefix); -ci_uint8 -ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct ci_pkt_zc_payload* zcp, - unsigned payload_offset, void* prefix); +ci_int8 ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, + struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix); +ci_uint8 ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, + struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix); #endif /* __CI_LIB_IP_INTERNAL_H__ */ /*! \cidoxg_end */ diff --git a/src/lib/transport/ip/netif.c b/src/lib/transport/ip/netif.c index 9fcddcfbd..291dc5554 100644 --- a/src/lib/transport/ip/netif.c +++ b/src/lib/transport/ip/netif.c @@ -37,21 +37,21 @@ char* CI_NETIF_PTR(ci_netif* ni, oo_p off) ci_inline void ci_netif_timeout_set_timer(ci_netif* ni, ci_iptime_t prev_time) { ci_iptime_t time = 0; /* shut up gcc */ - int i, found = 0; + int i, found = 0; for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { - ci_tcp_state* ts; + ci_tcp_state* ts; struct oo_p_dllink_state timeout_q = - oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); + oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); if( oo_p_dllink_is_empty(ni, timeout_q) ) continue; ts = TCP_STATE_FROM_LINK(oo_p_dllink_statep(ni, timeout_q.l->next).l); if( TIME_LE(ts->t_last_sent, prev_time) ) return; - if( !found || TIME_LT(ts->t_last_sent, time) ) { + if( ! found || TIME_LT(ts->t_last_sent, time) ) { found = 1; - time = ts->t_last_sent; + time = ts->t_last_sent; } } /* We can be called both from timer handler (when the timer is not @@ -69,13 +69,13 @@ ci_inline void ci_netif_timeout_set_timer(ci_netif* ni, ci_iptime_t prev_time) /*! add a state to the timeout list */ ci_inline void ci_netif_timeout_add(ci_netif* ni, ci_tcp_state* ts, int idx) { - int is_first; + int is_first; struct oo_p_dllink_state my_list = - oo_p_dllink_ptr(ni, &ni->state->timeout_q[idx]); + oo_p_dllink_ptr(ni, &ni->state->timeout_q[idx]); struct oo_p_dllink_state other_list = - oo_p_dllink_ptr(ni, &ni->state->timeout_q[1-idx]); + oo_p_dllink_ptr(ni, &ni->state->timeout_q[1 - idx]); struct oo_p_dllink_state link = - oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); + oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); ci_tcp_state* other_ts; OO_P_DLLINK_ASSERT_EMPTY(ni, link); @@ -102,13 +102,13 @@ ci_inline void ci_netif_timeout_add(ci_netif* ni, ci_tcp_state* ts, int idx) /*! remove a state from the timeout list */ void ci_netif_timeout_remove(ci_netif* ni, ci_tcp_state* ts) { - int is_first, idx; + int is_first, idx; struct oo_p_dllink_state link = - oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); + oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); - ci_assert( (ts->s.b.state == CI_TCP_TIME_WAIT) || - ci_tcp_is_timeout_orphan(ts)); - ci_assert( !oo_p_dllink_is_empty(ni, link) ); + ci_assert( + (ts->s.b.state == CI_TCP_TIME_WAIT) || ci_tcp_is_timeout_orphan(ts)); + ci_assert(! oo_p_dllink_is_empty(ni, link)); if( ts->s.b.state == CI_TCP_TIME_WAIT ) idx = OO_TIMEOUT_Q_TIMEWAIT; @@ -131,14 +131,14 @@ void ci_netif_timeout_leave(ci_netif* netif, ci_tcp_state* ts) { ci_assert(netif); ci_assert(ts); - ci_assert( (ts->s.b.state == CI_TCP_TIME_WAIT) || - ci_tcp_is_timeout_orphan(ts) ); + ci_assert( + (ts->s.b.state == CI_TCP_TIME_WAIT) || ci_tcp_is_timeout_orphan(ts)); #ifndef NDEBUG - if (ts->s.b.state == CI_TCP_TIME_WAIT) - LOG_TC(log(LPF "%d TIME_WAIT->CLOSED (2MSL expired)", S_FMT(ts))); + if( ts->s.b.state == CI_TCP_TIME_WAIT ) + LOG_TC(log(LPF "%d TIME_WAIT->CLOSED (2MSL expired)", S_FMT(ts))); else - LOG_TC(log(LPF "%d Droping ORPHANed %s", S_FMT(ts), state_str(ts))); + LOG_TC(log(LPF "%d Droping ORPHANed %s", S_FMT(ts), state_str(ts))); #endif /* drop will call ci_netif_timeout_remove; @@ -161,10 +161,11 @@ void ci_netif_timeout_reap(ci_netif* ni) for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { struct oo_p_dllink_state list = - oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); + oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); struct oo_p_dllink_state l, tmp; - oo_p_dllink_for_each_safe(ni, l, tmp, list) { + oo_p_dllink_for_each_safe(ni, l, tmp, list) + { ci_tcp_state* ts = TCP_STATE_FROM_LINK(l.l); #if CI_CFG_FD_CACHING @@ -190,8 +191,7 @@ void ci_netif_timeout_reap(ci_netif* ni) } /*! this is the timeout timer callback function */ -void -ci_netif_timeout_state(ci_netif* ni) +void ci_netif_timeout_state(ci_netif* ni) { int i; @@ -200,14 +200,14 @@ ci_netif_timeout_state(ci_netif* ni) /* check last active state of each connection in TIME_WAIT */ for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { - ci_tcp_state* ts; + ci_tcp_state* ts; struct oo_p_dllink_state list = - oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); + oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); while( ! oo_p_dllink_is_empty(ni, list) ) { ts = TCP_STATE_FROM_LINK(oo_p_dllink_statep(ni, list.l->next).l); - ci_assert( (ts->s.b.state == CI_TCP_TIME_WAIT) || - ci_tcp_is_timeout_orphan(ts) ); + ci_assert( + (ts->s.b.state == CI_TCP_TIME_WAIT) || ci_tcp_is_timeout_orphan(ts)); if( TIME_GT(ts->t_last_sent, ci_ip_time_now(ni)) ) break; /* break from the inner loop */ @@ -231,22 +231,21 @@ ci_netif_timeout_state(ci_netif* ni) * - add back onto timeout list */ -void ci_netif_timeout_restart(ci_netif *ni, ci_tcp_state *ts) +void ci_netif_timeout_restart(ci_netif* ni, ci_tcp_state* ts) { int is_tw = (ts->s.b.state == CI_TCP_TIME_WAIT); ci_assert(ts); - ci_assert( is_tw || ci_tcp_is_timeout_orphan(ts)); + ci_assert(is_tw || ci_tcp_is_timeout_orphan(ts)); /* take it off the list */ ci_netif_timeout_remove(ni, ts); /* store time to leave TIMEWAIT state */ - ts->t_last_sent = ci_ip_time_now(ni) + - ( is_tw ? - NI_CONF(ni).tconst_2msl_time : NI_CONF(ni).tconst_fin_timeout ); + ts->t_last_sent = + ci_ip_time_now(ni) + + (is_tw ? NI_CONF(ni).tconst_2msl_time : NI_CONF(ni).tconst_fin_timeout); /* add to list */ ci_netif_timeout_add( - ni, ts, - is_tw ? OO_TIMEOUT_Q_TIMEWAIT : OO_TIMEOUT_Q_FINWAIT); + ni, ts, is_tw ? OO_TIMEOUT_Q_TIMEWAIT : OO_TIMEOUT_Q_FINWAIT); } @@ -270,7 +269,7 @@ void ci_netif_timewait_enter(ci_netif* ni, ci_tcp_state* ts) /* called before the state is changed to TIME_WAIT */ ci_assert(ts->s.b.state != CI_TCP_TIME_WAIT); /* if already in the timeout list */ - if ( ci_tcp_is_timeout_orphan(ts) ) { + if( ci_tcp_is_timeout_orphan(ts) ) { ci_netif_timeout_remove(ni, ts); } OO_P_DLLINK_ASSERT_EMPTY_SB(ni, &ts->s.b, &ts->timeout_q_link); @@ -292,17 +291,19 @@ int ci_netif_timewait_try_to_free_filter(ci_netif* ni) ci_assert(ci_netif_is_locked(ni)); for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { - struct oo_p_dllink_state list = oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); + struct oo_p_dllink_state list = + oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); struct oo_p_dllink_state l, tmp; - oo_p_dllink_for_each_safe(ni, l, tmp, list) { + oo_p_dllink_for_each_safe(ni, l, tmp, list) + { ci_tcp_state* ts = TCP_STATE_FROM_LINK(l.l); if( ts->s.s_flags & CI_SOCK_FLAG_FILTER ) { /* No cached sockets here: orphaned or timewait only. * They really free the hw filter when we drop them. */ - ci_assert( (ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) || - ts->s.b.state == CI_TCP_TIME_WAIT ); + ci_assert((ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) || + ts->s.b.state == CI_TCP_TIME_WAIT); ci_netif_timeout_leave(ni, ts); CITP_STATS_NETIF(++ni->state->stats.timewait_reap_filter); @@ -335,11 +336,11 @@ int ci_netif_timewait_try_to_free_filter(ci_netif* ni) void ci_netif_fin_timeout_enter(ci_netif* ni, ci_tcp_state* ts) { struct oo_p_dllink_state link = - oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); + oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); /* check endpoint is an orphan */ #if CI_CFG_FD_CACHING - ci_assert(ts->s.b.sb_aflags & (CI_SB_AFLAG_ORPHAN|CI_SB_AFLAG_IN_CACHE)); + ci_assert(ts->s.b.sb_aflags & (CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_IN_CACHE)); #else ci_assert(ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN); #endif @@ -368,11 +369,10 @@ void ci_netif_fin_timeout_enter(ci_netif* ni, ci_tcp_state* ts) } -static int ci_netif_try_to_reap_udp_recv_q(ci_netif* ni, - ci_udp_recv_q* recv_q, - int* add_to_reap_list) +static int ci_netif_try_to_reap_udp_recv_q( + ci_netif* ni, ci_udp_recv_q* recv_q, int* add_to_reap_list) { - int freed_n; + int freed_n; ci_uint32 reaped_b4 = recv_q->pkts_reaped; ci_udp_recv_q_reap(ni, recv_q); freed_n = recv_q->pkts_reaped - reaped_b4; @@ -387,14 +387,14 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) /* Look for packet buffers that can be reaped. */ struct oo_p_dllink_state reap_list = - oo_p_dllink_ptr(ni, &ni->state->reap_list); + oo_p_dllink_ptr(ni, &ni->state->reap_list); struct oo_p_dllink_state lnk, tmp; - oo_p lnk_to_stop = OO_P_NULL; - citp_waitable_obj* wo; - int freed_n = 0; - int add_to_reap_list; - int reap_harder = ni->packets->sets_n == ni->packets->sets_max - || ni->state->mem_pressure; + oo_p lnk_to_stop = OO_P_NULL; + citp_waitable_obj* wo; + int freed_n = 0; + int add_to_reap_list; + int reap_harder = + ni->packets->sets_n == ni->packets->sets_max || ni->state->mem_pressure; if( oo_p_dllink_is_empty(ni, reap_list) ) return; @@ -405,7 +405,8 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) */ stop_once_freed_n <<= 1u; - oo_p_dllink_for_each_safe(ni, lnk, tmp, reap_list) { + oo_p_dllink_for_each_safe(ni, lnk, tmp, reap_list) + { add_to_reap_list = 0; if( lnk.p == lnk_to_stop ) @@ -416,14 +417,14 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) wo = CI_CONTAINER(citp_waitable_obj, sock.reap_link, lnk.l); if( wo->waitable.state & CI_TCP_STATE_TCP_CONN ) { - ci_tcp_state* ts = &wo->tcp; - ci_int32 q_num_b4 = ts->recv1.num; + ci_tcp_state* ts = &wo->tcp; + ci_int32 q_num_b4 = ts->recv1.num; ci_tcp_rx_reap_rxq_bufs(ni, ts); freed_n += q_num_b4 - ts->recv1.num; #if CI_CFG_TIMESTAMPING - freed_n += ci_netif_try_to_reap_udp_recv_q(ni, &ts->timestamp_q, - &add_to_reap_list); + freed_n += ci_netif_try_to_reap_udp_recv_q( + ni, &ts->timestamp_q, &add_to_reap_list); #endif /* Try to reap the last packet */ @@ -436,18 +437,17 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) } if( ts->recv1.num > 1 ) add_to_reap_list = 1; - } - else if( wo->waitable.state == CI_TCP_STATE_UDP ) { + } else if( wo->waitable.state == CI_TCP_STATE_UDP ) { ci_udp_state* us = &wo->udp; - freed_n += ci_netif_try_to_reap_udp_recv_q(ni, &us->recv_q, - &add_to_reap_list); + freed_n += + ci_netif_try_to_reap_udp_recv_q(ni, &us->recv_q, &add_to_reap_list); #if CI_CFG_TIMESTAMPING - freed_n += ci_netif_try_to_reap_udp_recv_q(ni, &us->timestamp_q, - &add_to_reap_list); + freed_n += ci_netif_try_to_reap_udp_recv_q( + ni, &us->timestamp_q, &add_to_reap_list); #endif } - if( add_to_reap_list) { + if( add_to_reap_list ) { oo_p_dllink_add_tail(ni, reap_list, lnk); if( OO_P_IS_NULL(lnk_to_stop) ) lnk_to_stop = lnk.p; @@ -461,8 +461,7 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) * because it uses stop_once_freed_n=1. */ freed_n += ci_netif_pkt_try_to_free(ni, 0, stop_once_freed_n - freed_n); if( freed_n < (stop_once_freed_n >> 1) && reap_harder ) { - freed_n += ci_netif_pkt_try_to_free(ni, 1, - stop_once_freed_n - freed_n); + freed_n += ci_netif_pkt_try_to_free(ni, 1, stop_once_freed_n - freed_n); } } @@ -470,8 +469,7 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) } -void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, - int bytes_freed) +void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, int bytes_freed) { /* Called by the recv() paths when [ni->state->rxq_low] is non-zero. It * is moderately hard to track exactly how many packet buffers were freed @@ -505,8 +503,7 @@ void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, #if CI_CFG_TIMESTAMPING ci_udp_recv_q_reap(ni, &SOCK_TO_UDP(s)->timestamp_q); #endif - } - else if( s->b.state & CI_TCP_STATE_TCP_CONN ) { + } else if( s->b.state & CI_TCP_STATE_TCP_CONN ) { ci_tcp_rx_reap_rxq_bufs(ni, SOCK_TO_TCP(s)); #if CI_CFG_TIMESTAMPING ci_udp_recv_q_reap(ni, &SOCK_TO_TCP(s)->timestamp_q); @@ -521,7 +518,7 @@ void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, CITP_STATS_NETIF_INC(ni, memory_pressure_exit_recv); OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ci_netif_rx_post_all_batch(ni, intf_i); + ci_netif_rx_post_all_batch(ni, intf_i); CITP_STATS_NETIF_INC(ni, rx_refill_recv); ci_netif_unlock(ni); } @@ -531,16 +528,16 @@ void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, void ci_netif_mem_pressure_pkt_pool_fill(ci_netif* ni) { ci_ip_pkt_fmt* pkt; - int intf_i, n = 0; + int intf_i, n = 0; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - n += (2*CI_CFG_RX_DESC_BATCH); + n += (2 * CI_CFG_RX_DESC_BATCH); while( ni->state->mem_pressure_pkt_pool_n < n && (pkt = ci_netif_pkt_alloc(ni, 0)) != NULL ) { pkt->flags |= CI_PKT_FLAG_RX; ++ni->state->n_rx_pkts; ++ni->state->mem_pressure_pkt_pool_n; - pkt->refcount = 0; - pkt->next = ni->state->mem_pressure_pkt_pool; + pkt->refcount = 0; + pkt->next = ni->state->mem_pressure_pkt_pool; ni->state->mem_pressure_pkt_pool = OO_PKT_P(pkt); } } @@ -572,7 +569,7 @@ static void ci_netif_mem_pressure_enter_critical(ci_netif* ni, int intf_i) CITP_STATS_NETIF_INC(ni, memory_pressure_enter); ni->state->mem_pressure |= OO_MEM_PRESSURE_CRITICAL; - ni->state->rxq_limit = 2*CI_CFG_RX_DESC_BATCH; + ni->state->rxq_limit = 2 * CI_CFG_RX_DESC_BATCH; ci_netif_mem_pressure_pkt_pool_use(ni); ci_netif_rx_post_all_batch(ni, intf_i); } @@ -594,10 +591,11 @@ int ci_netif_mem_pressure_try_exit(ci_netif* ni) * * Returns true if we do exit critical memory pressure. */ - int intf_i, pkts_needed = 0; + int intf_i, pkts_needed = 0; ci_ip_pkt_fmt* pkt; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { ef_vi* vi = ci_netif_vi(ni, intf_i); pkts_needed += NI_OPTS(ni).rxq_limit - ef_vi_receive_fill_level(vi); } @@ -639,12 +637,12 @@ int ci_netif_mem_pressure_try_exit(ci_netif* ni) * *--------------------------------------------------------------------*/ -static int __ci_netif_rx_post(ci_netif* ni, ef_vi* vi, int intf_i, - int bufset_id, int max) +static int __ci_netif_rx_post( + ci_netif* ni, ef_vi* vi, int intf_i, int bufset_id, int max) { ci_ip_pkt_fmt* pkt; - int i; - int posted = 0; + int i; + int posted = 0; oo_pktbuf_set* bufset = &ni->packets->set[bufset_id]; ci_assert_ge(max, CI_CFG_RX_DESC_BATCH); @@ -659,14 +657,14 @@ static int __ci_netif_rx_post(ci_netif* ni, ef_vi* vi, int intf_i, ci_assert(OO_PP_NOT_NULL(bufset->free)); pkt = PKT(ni, bufset->free); ci_assert(OO_PP_EQ(bufset->free, OO_PKT_P(pkt))); - bufset->free = pkt->next; + bufset->free = pkt->next; pkt->refcount = 1; pkt->flags |= CI_PKT_FLAG_RX; - pkt->intf_i = intf_i; + pkt->intf_i = intf_i; pkt->pkt_start_off = ef_vi_receive_prefix_len(vi); ci_netif_poison_rx_pkt(pkt); - ef_vi_receive_init(vi, pkt_dma_addr_bufset(ni, pkt, intf_i, bufset), - OO_PKT_ID(pkt)); + ef_vi_receive_init( + vi, pkt_dma_addr_bufset(ni, pkt, intf_i, bufset), OO_PKT_ID(pkt)); #ifdef __powerpc__ { /* Flush RX buffer from cache. This saves significant latency when @@ -692,7 +690,7 @@ static int __ci_netif_rx_post(ci_netif* ni, ef_vi* vi, int intf_i, } ni->packets->set[bufset_id].n_free -= CI_CFG_RX_DESC_BATCH; ni->packets->n_free -= CI_CFG_RX_DESC_BATCH; - ni->state->n_rx_pkts += CI_CFG_RX_DESC_BATCH; + ni->state->n_rx_pkts += CI_CFG_RX_DESC_BATCH; ef_vi_receive_push(vi); posted += CI_CFG_RX_DESC_BATCH; } while( max - posted >= CI_CFG_RX_DESC_BATCH ); @@ -701,7 +699,7 @@ static int __ci_netif_rx_post(ci_netif* ni, ef_vi* vi, int intf_i, } -#define low_thresh(ni) ((ni)->state->rxq_limit / 2) +#define low_thresh(ni) ((ni)->state->rxq_limit / 2) int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) @@ -715,9 +713,9 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) ** reduce resource consumption for apps that have few sockets. */ ci_ip_pkt_fmt* pkt; - int max_n_to_post, rx_allowed, n_to_post, n_posted = 0; - int bufset_id = NI_PKT_SET(netif); - int ask_for_more_packets = 0; + int max_n_to_post, rx_allowed, n_to_post, n_posted = 0; + int bufset_id = NI_PKT_SET(netif); + int ask_for_more_packets = 0; if( vi->nic_type.arch == EF_VI_ARCH_EFCT ) return 0; @@ -726,10 +724,10 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) ci_assert(ci_netif_rx_vi_space(netif, vi) >= CI_CFG_RX_DESC_BATCH); max_n_to_post = ci_netif_rx_vi_space(netif, vi); - rx_allowed = NI_OPTS(netif).max_rx_packets - netif->state->n_rx_pkts; + rx_allowed = NI_OPTS(netif).max_rx_packets - netif->state->n_rx_pkts; if( max_n_to_post > rx_allowed ) goto rx_limited; - not_rx_limited: +not_rx_limited: ci_assert_ge(max_n_to_post, CI_CFG_RX_DESC_BATCH); /* We could have enough packets in all sets together, but we need them @@ -737,36 +735,34 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) if( netif->packets->set[bufset_id].n_free < CI_CFG_RX_DESC_BATCH ) goto find_new_bufset; - good_bufset: +good_bufset: do { int n; n_to_post = CI_MIN(max_n_to_post, netif->packets->set[bufset_id].n_free); - n = __ci_netif_rx_post(netif, vi, intf_i, bufset_id, n_to_post); + n = __ci_netif_rx_post(netif, vi, intf_i, bufset_id, n_to_post); max_n_to_post -= n; n_posted += n; ci_assert_ge(max_n_to_post, 0); if( max_n_to_post < CI_CFG_RX_DESC_BATCH ) { if( bufset_id != netif->packets->id ) { - ci_netif_pkt_set_change(netif, bufset_id, - ask_for_more_packets); + ci_netif_pkt_set_change(netif, bufset_id, ask_for_more_packets); } CHECK_FREEPKTS(netif); return n_posted; } - find_new_bufset: + find_new_bufset: bufset_id = ci_netif_pktset_best(netif); if( bufset_id == -1 || netif->packets->set[bufset_id].n_free < CI_CFG_RX_DESC_BATCH ) goto not_enough_pkts; - ask_for_more_packets = ci_netif_pkt_set_is_underfilled(netif, - bufset_id); + ask_for_more_packets = ci_netif_pkt_set_is_underfilled(netif, bufset_id); } while( 1 ); /* unreachable */ - rx_limited: +rx_limited: /* [rx_allowed] can go negative. */ if( rx_allowed < 0 ) rx_allowed = 0; @@ -794,12 +790,12 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) * buffers for exactly this purpose, so make sure we can use them * here. */ - rx_allowed = CI_CFG_RX_DESC_BATCH; + rx_allowed = CI_CFG_RX_DESC_BATCH; max_n_to_post = ci_netif_rx_vi_space(netif, vi); } #endif max_n_to_post = CI_MIN(max_n_to_post, rx_allowed); - if(CI_LIKELY( max_n_to_post >= CI_CFG_RX_DESC_BATCH )) + if( CI_LIKELY(max_n_to_post >= CI_CFG_RX_DESC_BATCH) ) goto not_rx_limited; CITP_STATS_NETIF_INC(netif, refill_rx_limited); #if OO_DO_STACK_POLL @@ -808,7 +804,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) #endif return n_posted; - not_enough_pkts: +not_enough_pkts: /* The best packet set has less than CI_CFG_RX_DESC_BATCH packets. * We should free some packets or allocate a new set. */ @@ -831,8 +827,8 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) if( netif->packets->sets_n < netif->packets->sets_max && ci_tcp_helper_more_bufs(netif) == 0 ) { bufset_id = netif->packets->sets_n - 1; - ci_assert_equal(netif->packets->set[bufset_id].n_free, - 1 << CI_CFG_PKTS_PER_SET_S); + ci_assert_equal( + netif->packets->set[bufset_id].n_free, 1 << CI_CFG_PKTS_PER_SET_S); ask_for_more_packets = 0; goto good_bufset; } @@ -842,7 +838,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) CITP_STATS_NETIF_INC(netif, reap_buf_limited); ci_netif_try_to_reap(netif, max_n_to_post); max_n_to_post = CI_MIN(max_n_to_post, netif->packets->n_free); - bufset_id = ci_netif_pktset_best(netif); + bufset_id = ci_netif_pktset_best(netif); if( bufset_id != -1 && netif->packets->set[bufset_id].n_free >= CI_CFG_RX_DESC_BATCH ) goto good_bufset; @@ -871,24 +867,25 @@ static void citp_waitable_deferred_work(ci_netif* ni, citp_waitable* w) /* This happens when we move socket and continue to use it from another * thread or signal handler */ ci_log("%s: unexpected status %s for socket [%d:%d]", __func__, - ci_tcp_state_str(wo->waitable.state), NI_ID(ni), w->bufid); + ci_tcp_state_str(wo->waitable.state), NI_ID(ni), w->bufid); } } int ci_netif_lock_or_defer_work(ci_netif* ni, citp_waitable* w) { -#if CI_CFG_FD_CACHING && !defined(NDEBUG) - /* Cached sockets should not be deferring work - there are no user references +#if CI_CFG_FD_CACHING && ! defined(NDEBUG) + /* Cached sockets should not be deferring work - there are no user + * references */ - if( (w->state & CI_TCP_STATE_TCP) && !(w->state == CI_TCP_LISTEN) ) - ci_assert(!ci_tcp_is_cached(&CI_CONTAINER(citp_waitable_obj, - waitable, w)->tcp)); + if( (w->state & CI_TCP_STATE_TCP) && ! (w->state == CI_TCP_LISTEN) ) + ci_assert(! ci_tcp_is_cached( + &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp)); #endif - /* Orphaned sockets should not be deferring work - no-one has a reference to - * them, and the queue link can be used for other things. + /* Orphaned sockets should not be deferring work - no-one has a reference + * to them, and the queue link can be used for other things. */ - ci_assert(!(w->sb_aflags & CI_SB_AFLAG_ORPHAN)); + ci_assert(! (w->sb_aflags & CI_SB_AFLAG_ORPHAN)); if( ni->state->defer_work_count >= NI_OPTS(ni).defer_work_limit ) { int rc = ci_netif_lock(ni); @@ -945,10 +942,9 @@ int ci_netif_lock_or_defer_work(ci_netif* ni, citp_waitable* w) citp_waitable_deferred_work(ni, w); return 1; } - } - else { + } else { w->next_id = v & CI_EPLOCK_NETIF_SOCKET_LIST; - new_v = (v & ~CI_EPLOCK_NETIF_SOCKET_LIST) | (W_ID(w) + 1); + new_v = (v & ~CI_EPLOCK_NETIF_SOCKET_LIST) | (W_ID(w) + 1); if( ci_cas64u_succeed(&ni->state->lock.lock, v, new_v) ) { ++ni->state->defer_work_count; return 0; @@ -958,26 +954,25 @@ int ci_netif_lock_or_defer_work(ci_netif* ni, citp_waitable* w) } -static void ci_netif_perform_deferred_socket_work(ci_netif* ni, - unsigned sock_id) +static void ci_netif_perform_deferred_socket_work( + ci_netif* ni, unsigned sock_id) { citp_waitable* w; - oo_sp sockp; + oo_sp sockp; ci_assert(ci_netif_is_locked(ni)); do { ci_assert(sock_id > 0); --sock_id; - sockp = OO_SP_FROM_INT(ni, sock_id); - w = SP_TO_WAITABLE(ni, sockp); + sockp = OO_SP_FROM_INT(ni, sock_id); + w = SP_TO_WAITABLE(ni, sockp); sock_id = w->next_id; ci_bit_clear(&w->sb_aflags, CI_SB_AFLAG_DEFERRED_BIT); CITP_STATS_NETIF(++ni->state->stats.deferred_work); citp_waitable_deferred_work(ni, w); - } - while( sock_id > 0 ); + } while( sock_id > 0 ); } @@ -988,10 +983,10 @@ ci_uint64 ci_netif_purge_deferred_socket_list(ci_netif* ni) ci_assert(ci_netif_is_locked(ni)); while( (l = ni->state->lock.lock) & CI_EPLOCK_NETIF_SOCKET_LIST ) { - if( ci_cas64u_succeed(&ni->state->lock.lock, l, - l &~ CI_EPLOCK_NETIF_SOCKET_LIST) ) - ci_netif_perform_deferred_socket_work(ni, - l & CI_EPLOCK_NETIF_SOCKET_LIST); + if( ci_cas64u_succeed( + &ni->state->lock.lock, l, l & ~CI_EPLOCK_NETIF_SOCKET_LIST) ) + ci_netif_perform_deferred_socket_work( + ni, l & CI_EPLOCK_NETIF_SOCKET_LIST); /* It is not possible to clear defer_work_count atomically together * with NETIF_SOCKET_LIST. We can do it before or after. @@ -1007,10 +1002,10 @@ ci_uint64 ci_netif_purge_deferred_socket_list(ci_netif* ni) void ci_netif_merge_atomic_counters(ci_netif* ni) { ci_int32 val; -#define merge(ni, field) \ +#define merge(ni, field) \ do { \ val = ni->state->atomic_##field; \ - } while( ci_cas32_fail(&ni->state->atomic_##field, val, 0) );\ + } while( ci_cas32_fail(&ni->state->atomic_##field, val, 0) ); \ ni->state->field += val; merge(ni, n_rx_pkts); @@ -1022,7 +1017,8 @@ void ci_netif_merge_atomic_counters(ci_netif* ni) #if CI_CFG_UL_INTERRUPT_HELPER static #endif -int oo_want_proactive_packet_allocation(ci_netif* ni) + int + oo_want_proactive_packet_allocation(ci_netif* ni) { ci_uint32 current_free; @@ -1063,11 +1059,12 @@ int oo_want_proactive_packet_allocation(ci_netif* ni) } CITP_STATS_NETIF_INC(ni, proactive_packet_allocation); - LOG_NC(ci_log("%s: [%d] proactive packet allocation: " - "%d sets n_freepkts=%d free_packets_low=%d " - "current_set.n_free=%d", __func__, NI_ID(ni), - pkt_sets_n(ni), ni->packets->n_free, - NI_OPTS(ni).free_packets_low, current_free)); + LOG_NC( + ci_log("%s: [%d] proactive packet allocation: " + "%d sets n_freepkts=%d free_packets_low=%d " + "current_set.n_free=%d", + __func__, NI_ID(ni), pkt_sets_n(ni), ni->packets->n_free, + NI_OPTS(ni).free_packets_low, current_free)); return 1; } @@ -1077,8 +1074,8 @@ int oo_want_proactive_packet_allocation(ci_netif* ni) * flags_to_handle will be cleared from lock and return value * unless work failed/need redoing. */ -ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, - ci_uint64 flags_to_handle) +ci_uint64 ci_netif_unlock_slow_common( + ci_netif* ni, ci_uint64 lock_val, ci_uint64 flags_to_handle) { ci_uint64 set_flags = 0; ci_uint64 test_val; @@ -1095,8 +1092,8 @@ ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, /* Clear all flags before we handle them, to avoid racing against other * threads that set those flags. (note: SOCKET_LIST got handled above) */ - lock_val = ef_eplock_clear_flags(&ni->state->lock, - flags_to_handle & ~CI_EPLOCK_NETIF_SOCKET_LIST); + lock_val = ef_eplock_clear_flags( + &ni->state->lock, flags_to_handle & ~CI_EPLOCK_NETIF_SOCKET_LIST); /* Restrict work below to what has been requested */ test_val = lock_val & flags_to_handle; @@ -1105,8 +1102,7 @@ ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, if( ci_netif_pkt_tx_can_alloc_now(ni) ) { set_flags |= CI_EPLOCK_NETIF_PKT_WAKE; CITP_STATS_NETIF_INC(ni, unlock_slow_pkt_waiter); - } - else { + } else { set_flags |= CI_EPLOCK_NETIF_IS_PKT_WAITER; } } @@ -1125,7 +1121,7 @@ ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, set_flags |= CI_EPLOCK_NETIF_NEED_PRIME; } -#if CI_CFG_UL_INTERRUPT_HELPER && ! defined (__KERNEL__) +#if CI_CFG_UL_INTERRUPT_HELPER && ! defined(__KERNEL__) if( test_val & CI_EPLOCK_NETIF_CLOSE_ENDPOINT ) { ci_netif_close_pending(ni); } @@ -1133,19 +1129,20 @@ ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, if( test_val & CI_EPLOCK_NETIF_NEED_WAKE ) { /* Tell kernel to wake up endpoints */ struct oo_p_dllink_state post_poll_list = - oo_p_dllink_ptr(ni, &ni->state->post_poll_list); + oo_p_dllink_ptr(ni, &ni->state->post_poll_list); struct oo_p_dllink_state lnk, tmp_lnk; - citp_waitable* w; - struct oo_wakeup_eps op; - oo_sp eps[64]; + citp_waitable* w; + struct oo_wakeup_eps op; + oo_sp eps[64]; op.eps_num = 0; CI_USER_PTR_SET(op.eps, eps); - oo_p_dllink_for_each_safe(ni, lnk, tmp_lnk, post_poll_list) { + oo_p_dllink_for_each_safe(ni, lnk, tmp_lnk, post_poll_list) + { oo_p_dllink_del_init(ni, lnk); - w = CI_CONTAINER(citp_waitable, post_poll_link, lnk.l); + w = CI_CONTAINER(citp_waitable, post_poll_link, lnk.l); eps[op.eps_num++] = w->bufid; /* Todo: we'd better allocate larger eps and wake up all @@ -1153,17 +1150,15 @@ ci_uint64 ci_netif_unlock_slow_common(ci_netif* ni, ci_uint64 lock_val, * one go. */ if( op.eps_num == sizeof(eps) / sizeof(eps[0]) ) { - oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_WAKEUP_WAITERS, &op); + oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_WAKEUP_WAITERS, &op); op.eps_num = 0; - } } if( op.eps_num != 0 ) - oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_WAKEUP_WAITERS, &op); - + oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_WAKEUP_WAITERS, &op); } if( test_val & CI_EPLOCK_NETIF_NEED_PKT_SET || @@ -1212,12 +1207,12 @@ static void ci_netif_unlock_slow(ci_netif* ni) int intf_i; int rc = 0; ci_uint64 all_handled_flags = - CI_EPLOCK_NETIF_UL_MASK | CI_EPLOCK_NETIF_SOCKET_LIST; + CI_EPLOCK_NETIF_UL_MASK | CI_EPLOCK_NETIF_SOCKET_LIST; if( ~ni->state->flags & CI_NETIF_FLAG_EVQ_KERNEL_PRIME_ONLY ) all_handled_flags |= CI_EPLOCK_NETIF_NEED_PRIME; - ci_assert(ci_netif_is_locked(ni)); /* double unlock? */ + ci_assert(ci_netif_is_locked(ni)); /* double unlock? */ CITP_STATS_NETIF_INC(ni, unlock_slow); @@ -1231,31 +1226,30 @@ static void ci_netif_unlock_slow(ci_netif* ni) CITP_STATS_NETIF_INC(ni, unlock_slow_prime_ul); ci_assert(NI_OPTS(ni).int_driven); /* TODO: When interrupt driven, evq_primed is never cleared, so we - * don't know here which subset of interfaces needs to be primed. - * Would be more efficient if we did. - */ + * don't know here which subset of interfaces needs to be primed. + * Would be more efficient if we did. + */ OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - ef_eventq_prime(ci_netif_vi(ni, intf_i)); + ef_eventq_prime(ci_netif_vi(ni, intf_i)); } /* If some flags should be handled in kernel, then there is no point in * looping here. Dive! */ - k_flags |= l & ((CI_EPLOCK_NETIF_UNLOCK_FLAGS & ~all_handled_flags) | CI_EPLOCK_FL_NEED_WAKE); + k_flags |= l & ((CI_EPLOCK_NETIF_UNLOCK_FLAGS & ~all_handled_flags) | + CI_EPLOCK_FL_NEED_WAKE); #if ! CI_CFG_UL_INTERRUPT_HELPER if( k_flags != 0 ) break; #else /* In kernel we can handle following flags only: */ - ci_assert_nflags(k_flags, - ~(CI_EPLOCK_NETIF_PKT_WAKE | - CI_EPLOCK_NETIF_NEED_PRIME | - CI_EPLOCK_FL_NEED_WAKE)); + ci_assert_nflags( + k_flags, ~(CI_EPLOCK_NETIF_PKT_WAKE | CI_EPLOCK_NETIF_NEED_PRIME | + CI_EPLOCK_FL_NEED_WAKE)); l = ef_eplock_clear_flags(&ni->state->lock, k_flags); #endif - } while ( !ef_eplock_try_unlock(&ni->state->lock, &l, - CI_EPLOCK_NETIF_UNLOCK_FLAGS | - CI_EPLOCK_NETIF_SOCKET_LIST | - CI_EPLOCK_FL_NEED_WAKE) ); + } while( ! ef_eplock_try_unlock(&ni->state->lock, &l, + CI_EPLOCK_NETIF_UNLOCK_FLAGS | CI_EPLOCK_NETIF_SOCKET_LIST | + CI_EPLOCK_FL_NEED_WAKE) ); /* We've handled everything we needed to, so can return without * dropping to the kernel. @@ -1265,14 +1259,15 @@ static void ci_netif_unlock_slow(ci_netif* ni) CITP_STATS_NETIF_INC(ni, unlock_slow_syscall); #if ! CI_CFG_UL_INTERRUPT_HELPER - rc = oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_EPLOCK_WAKE, NULL); + rc = + oo_resource_op(ci_netif_get_driver_handle(ni), OO_IOC_EPLOCK_WAKE, NULL); #else - rc = oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_EPLOCK_WAKE_AND_DO, &k_flags); + rc = oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_EPLOCK_WAKE_AND_DO, &k_flags); #endif - if( rc < 0 ) LOG_NV(ci_log("%s: rc=%d", __FUNCTION__, rc)); + if( rc < 0 ) + LOG_NV(ci_log("%s: rc=%d", __FUNCTION__, rc)); } #endif /* __KERNEL__ */ @@ -1287,9 +1282,9 @@ void ci_netif_unlock(ci_netif* ni) ci_assert_nflags(ni->state->flags, CI_NETIF_FLAG_PKT_ACCOUNT_PENDING); ci_assert_equal(ni->state->in_poll, 0); - if(CI_LIKELY( ni->state->lock.lock == CI_EPLOCK_LOCKED && - ci_cas64u_succeed(&ni->state->lock.lock, - CI_EPLOCK_LOCKED, 0) )) + if( CI_LIKELY( + ni->state->lock.lock == CI_EPLOCK_LOCKED && + ci_cas64u_succeed(&ni->state->lock.lock, CI_EPLOCK_LOCKED, 0)) ) return; ci_netif_unlock_slow(ni); @@ -1298,7 +1293,7 @@ void ci_netif_unlock(ci_netif* ni) ci_assert_equal(saved_errno, errno); #endif } -#else /* OO_DO_STACK_POLL */ +#else /* OO_DO_STACK_POLL */ /* FIXME Sort it out somehow. * This call is used from: * (1) efab_tcp_helper_sock_sleep() when CI_SLEEP_NETIF_LOCKED is set; @@ -1317,16 +1312,16 @@ void ci_netif_unlock(ci_netif* ni) #endif /* OO_DO_STACK_POLL */ -void ci_netif_error_detected(ci_netif* ni, unsigned error_flag, - const char* caller) +void ci_netif_error_detected( + ci_netif* ni, unsigned error_flag, const char* caller) { if( ni->error_flags & error_flag ) return; - ci_log("%s: ERROR: [%d] runtime error %x detected in %s()", - __FUNCTION__, NI_ID(ni), error_flag, caller); - ci_log("%s: ERROR: [%d] errors detected: %x %x "CI_NETIF_ERRORS_FMT, - __FUNCTION__, NI_ID(ni), ni->error_flags, ni->state->error_flags, - CI_NETIF_ERRORS_PRI_ARG(ni->error_flags | ni->state->error_flags)); + ci_log("%s: ERROR: [%d] runtime error %x detected in %s()", __FUNCTION__, + NI_ID(ni), error_flag, caller); + ci_log("%s: ERROR: [%d] errors detected: %x %x " CI_NETIF_ERRORS_FMT, + __FUNCTION__, NI_ID(ni), ni->error_flags, ni->state->error_flags, + CI_NETIF_ERRORS_PRI_ARG(ni->error_flags | ni->state->error_flags)); ni->error_flags |= error_flag; ni->state->error_flags |= ni->error_flags; } @@ -1341,7 +1336,7 @@ int ci_netif_get_ready_list(ci_netif* ni) ci_netif_lock(ni); do { - if( !((ni->state->ready_lists_in_use >> i) & 1) ) { + if( ! ((ni->state->ready_lists_in_use >> i) & 1) ) { ni->state->ready_list_pid[i] = getpid(); ni->state->ready_lists_in_use |= 1 << i; break; @@ -1353,27 +1348,26 @@ int ci_netif_get_ready_list(ci_netif* ni) } #endif -static inline void -ci_netif_put_ready_list_one(ci_netif* ni, struct oo_p_dllink_state list, - int id) +static inline void ci_netif_put_ready_list_one( + ci_netif* ni, struct oo_p_dllink_state list, int id) { while( ! oo_p_dllink_is_empty(ni, list) ) { struct oo_p_dllink_state lnk = oo_p_dllink_statep(ni, list.l->next); - ci_sb_epoll_state* epoll = CI_CONTAINER(ci_sb_epoll_state, - e[id].ready_link, lnk.l); + ci_sb_epoll_state* epoll = + CI_CONTAINER(ci_sb_epoll_state, e[id].ready_link, lnk.l); oo_p_dllink_del(ni, lnk); oo_p_dllink_init(ni, lnk); - SP_TO_WAITABLE(ni, epoll->sock_id)->ready_lists_in_use &=~ (1 << id); + SP_TO_WAITABLE(ni, epoll->sock_id)->ready_lists_in_use &= ~(1 << id); } } static void ci_netif_put_ready_list_locked(ci_netif* ni, int id) { - ci_netif_put_ready_list_one(ni, oo_p_dllink_ptr(ni, - &ni->state->ready_lists[id]), id); - ci_netif_put_ready_list_one(ni, oo_p_dllink_ptr(ni, - &ni->state->unready_lists[id]), id); + ci_netif_put_ready_list_one( + ni, oo_p_dllink_ptr(ni, &ni->state->ready_lists[id]), id); + ci_netif_put_ready_list_one( + ni, oo_p_dllink_ptr(ni, &ni->state->unready_lists[id]), id); ni->state->ready_lists_in_use &= ~(1 << id); ni->state->ready_list_pid[id] = 0; } @@ -1382,9 +1376,10 @@ void ci_netif_free_ready_lists(ci_netif* ni) { int i; for( i = 0; i < CI_CFG_N_READY_LISTS; i++ ) { - if( (ni->state->ready_list_flags[i] & CI_NI_READY_LIST_FLAG_PENDING_FREE) ) { + if( (ni->state->ready_list_flags[i] & + CI_NI_READY_LIST_FLAG_PENDING_FREE) ) { ci_atomic32_and(&ni->state->ready_list_flags[i], - ~CI_NI_READY_LIST_FLAG_PENDING_FREE); + ~CI_NI_READY_LIST_FLAG_PENDING_FREE); ci_netif_put_ready_list_locked(ni, i); } } @@ -1392,22 +1387,21 @@ void ci_netif_free_ready_lists(ci_netif* ni) void ci_netif_put_ready_list(ci_netif* ni, int id) { - ci_assert(ni->state->ready_lists_in_use & (1 << id)); #ifdef __KERNEL__ ci_assert(current); - if( current->flags & PF_EXITING ? ! ci_netif_trylock(ni) : - ci_netif_lock(ni) ) { - ci_atomic32_or(&ni->state->ready_list_flags[id], - CI_NI_READY_LIST_FLAG_PENDING_FREE); - if(! ef_eplock_lock_or_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_FREE_READY_LIST) ) { + if( current->flags & PF_EXITING ? ! ci_netif_trylock(ni) + : ci_netif_lock(ni) ) { + ci_atomic32_or( + &ni->state->ready_list_flags[id], CI_NI_READY_LIST_FLAG_PENDING_FREE); + if( ! ef_eplock_lock_or_set_flag( + &ni->state->lock, CI_EPLOCK_NETIF_FREE_READY_LIST) ) { /* lock holder will release the ready list */ return; } - ci_atomic32_and(&ni->state->ready_list_flags[id], - ~CI_NI_READY_LIST_FLAG_PENDING_FREE); + ci_atomic32_and( + &ni->state->ready_list_flags[id], ~CI_NI_READY_LIST_FLAG_PENDING_FREE); } #else ci_netif_lock(ni); @@ -1419,12 +1413,12 @@ void ci_netif_put_ready_list(ci_netif* ni, int id) #ifndef __KERNEL__ -int ci_netif_raw_send(ci_netif* ni, int intf_i, - const ci_iovec *iov, int iovlen) +int ci_netif_raw_send( + ci_netif* ni, int intf_i, const ci_iovec* iov, int iovlen) { ci_ip_pkt_fmt* pkt; - ci_uint8* p; - int i; + ci_uint8* p; + int i; ci_netif_lock(ni); pkt = ci_netif_pkt_alloc(ni, 0); @@ -1436,8 +1430,8 @@ int ci_netif_raw_send(ci_netif* ni, int intf_i, return -ENETDOWN; pkt->pkt_start_off = 0; - pkt->buf_len = 0; - p = pkt->dma_start; + pkt->buf_len = 0; + p = pkt->dma_start; for( i = 0; i < iovlen; i++ ) { if( p + CI_IOVEC_LEN(iov) - (ci_uint8*) pkt > CI_CFG_PKT_BUF_SIZE ) { ci_netif_pkt_release(ni, pkt); @@ -1457,7 +1451,7 @@ int ci_netif_raw_send(ci_netif* ni, int intf_i, pkt->pkt_eth_payload_off = pkt->pkt_start_off + ETH_HLEN + ETH_VLAN_HLEN; #if CI_CFG_IPV6 if( oo_pkt_ether_type(pkt) == CI_ETHERTYPE_IP ) - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; else pkt->flags |= CI_PKT_FLAG_IS_IP6; #endif @@ -1475,29 +1469,98 @@ int ci_netif_raw_send(ci_netif* ni, int intf_i, #if CI_CFG_TCP_SHARED_LOCAL_PORTS -static ci_uint32 __ci_netif_active_wild_hash(ci_netif *ni, - ci_addr_t laddr, ci_uint16 lport, - ci_addr_t raddr, ci_uint16 rport) +static ci_uint32 __ci_netif_active_wild_hash(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport, ci_addr_t raddr, ci_uint16 rport) { /* FIXME lots of insights into efrm */ /* FIXME this is copy of hash in efrm_vi_set.c */ static const uint8_t rx_hash_key[40] = { - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, + 0x6d, + 0x5a, }; #ifndef __KERNEL__ /* We use a transformed key for our optimised Toeplitz hash. */ - __attribute__((aligned(sizeof(ci_uint32)))) - static const uint8_t rx_hash_key_sse[40] = { - 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, - 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, - 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, - 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, - 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, 0xb5, 0x6c, + __attribute__(( + aligned(sizeof(ci_uint32)))) static const uint8_t rx_hash_key_sse[40] = { + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, + 0xb5, + 0x6c, }; #endif @@ -1506,8 +1569,8 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif *ni, struct { ci_ip6_addr_t raddr; ci_ip6_addr_t laddr; - ci_uint16 rport_be16; - ci_uint16 lport_be16; + ci_uint16 rport_be16; + ci_uint16 lport_be16; } __attribute__((packed)) data; int data_size = sizeof(data); memcpy(data.raddr, raddr.ip6, sizeof(ci_ip6_addr_t)); @@ -1516,8 +1579,8 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif *ni, data.lport_be16 = lport; #ifndef __KERNEL__ - return ci_toeplitz_hash_ul(rx_hash_key, rx_hash_key_sse, (ci_uint8*) &data, - data_size); + return ci_toeplitz_hash_ul( + rx_hash_key, rx_hash_key_sse, (ci_uint8*) &data, data_size); #endif return ci_toeplitz_hash(rx_hash_key, (ci_uint8*) &data, data_size); } @@ -1528,15 +1591,14 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif *ni, ci_uint32 laddr_be32; ci_uint16 rport_be16; ci_uint16 lport_be16; - } __attribute__((packed)) data = { - raddr.ip4, laddr.ip4, rport, lport }; - int data_size = sizeof(data); + } __attribute__((packed)) data = { raddr.ip4, laddr.ip4, rport, lport }; + int data_size = sizeof(data); #ifndef __KERNEL__ - /* N.B.: Only the lower byte is guaranteed to be accurate here, but this is - * good enough for our purposes. */ - return ci_toeplitz_hash_ul(rx_hash_key, rx_hash_key_sse, (ci_uint8*) &data, - data_size); + /* N.B.: Only the lower byte is guaranteed to be accurate here, but this + * is good enough for our purposes. */ + return ci_toeplitz_hash_ul( + rx_hash_key, rx_hash_key_sse, (ci_uint8*) &data, data_size); #endif return ci_toeplitz_hash(rx_hash_key, (ci_uint8*) &data, data_size); } @@ -1545,9 +1607,8 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif *ni, /* Returns the index in the NIC's RSS indirection table to which the supplied * four-tuple would be hashed. */ -int ci_netif_active_wild_nic_hash(ci_netif *ni, - ci_addr_t laddr, ci_uint16 lport, - ci_addr_t raddr, ci_uint16 rport) +int ci_netif_active_wild_nic_hash(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport, ci_addr_t raddr, ci_uint16 rport) { return __ci_netif_active_wild_hash(ni, laddr, lport, raddr, rport) & RSS_HASH_MASK; @@ -1555,8 +1616,8 @@ int ci_netif_active_wild_nic_hash(ci_netif *ni, /* Returns the hash table of active wilds for the specified pool. */ -ci_inline struct oo_p_dllink* -ci_netif_active_wild_pool_table(ci_netif* ni, int aw_pool) +ci_inline struct oo_p_dllink* ci_netif_active_wild_pool_table( + ci_netif* ni, int aw_pool) { ci_assert(ci_netif_is_locked(ni)); ci_assert_lt(aw_pool, ni->state->active_wild_pools_n); @@ -1566,55 +1627,56 @@ ci_netif_active_wild_pool_table(ci_netif* ni, int aw_pool) } -/* Returns the list of active wilds in a specified pool for the specified local - * address. If such a list does not exist, an empty list is returned, into - * which new active wilds for that IP address may be inserted. The list does - * not become 'owned' by that address until it becomes non-empty. This means - * that the stack lock must not be dropped between retrieving the address of a - * list using this function and ceasing to use the returned pointer to that - * list. - * Returns link state with .p==OO_P_NULL in case of failure. */ -struct oo_p_dllink_state -ci_netif_get_active_wild_list(ci_netif* ni, int aw_pool, ci_addr_t laddr) +/* Returns the list of active wilds in a specified pool for the specified + * local address. If such a list does not exist, an empty list is returned, + * into which new active wilds for that IP address may be inserted. The list + * does not become 'owned' by that address until it becomes non-empty. This + * means that the stack lock must not be dropped between retrieving the + * address of a list using this function and ceasing to use the returned + * pointer to that list. Returns link state with .p==OO_P_NULL in case of + * failure. */ +struct oo_p_dllink_state ci_netif_get_active_wild_list( + ci_netif* ni, int aw_pool, ci_addr_t laddr) { struct oo_p_dllink* table = ci_netif_active_wild_pool_table(ni, aw_pool); struct oo_p_dllink_state list; - ci_uint32 bucket, hash1, hash2; + ci_uint32 bucket, hash1, hash2; ci_assert(ci_netif_is_locked(ni)); - ci_addr_simple_hash(laddr, ni->state->active_wild_table_entries_n, - &hash1, &hash2); + ci_addr_simple_hash( + laddr, ni->state->active_wild_table_entries_n, &hash1, &hash2); bucket = hash1; list.p = OO_P_NULL; do { - ci_active_wild* aw; + ci_active_wild* aw; struct oo_p_dllink_state link; list = oo_p_dllink_ptr(ni, &table[bucket]); - /* If we've found an empty list, it means there's no entry in the table for - * the specified IP address. This empty list is also at the correct - * location for the insertion of a new list for that IP address, and so we - * return it. */ + /* If we've found an empty list, it means there's no entry in the table + * for the specified IP address. This empty list is also at the correct + * location for the insertion of a new list for that IP address, and so + * we return it. */ if( oo_p_dllink_is_empty(ni, list) ) return list; /* The list is non-empty, so look at one of the active wilds contained in * it in order to determine and check the local address. */ link = oo_p_dllink_statep(ni, list.l->next); - aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); + aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); if( CI_IPX_ADDR_EQ(sock_ipx_laddr(&aw->s), laddr) ) return list; - /* This list is for the wrong IP address, so advance to the next bucket. */ + /* This list is for the wrong IP address, so advance to the next bucket. + */ bucket = (bucket + hash2) & (ni->state->active_wild_table_entries_n - 1); } while( bucket != hash1 ); NI_LOG_ONCE(ni, RESOURCE_WARNINGS, - "No space in active wild table %d for local address " - IPX_FMT, aw_pool, IPX_ARG(AF_IP_L3(laddr))); + "No space in active wild table %d for local address " IPX_FMT, aw_pool, + IPX_ARG(AF_IP_L3(laddr))); return list; } @@ -1622,9 +1684,8 @@ ci_netif_get_active_wild_list(ci_netif* ni, int aw_pool, ci_addr_t laddr) #ifndef __KERNEL__ #ifndef NDEBUG -static int __ci_netif_active_wild_rss_ok(ci_netif* ni, - ci_addr_t laddr, ci_uint16 lport, - ci_addr_t raddr, ci_uint16 rport) +static int __ci_netif_active_wild_rss_ok(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport, ci_addr_t raddr, ci_uint16 rport) { /* This function checks the compatability of a 4-tuple with this stack. * To do so implies we have a destination address and port, have selected @@ -1633,26 +1694,25 @@ static int __ci_netif_active_wild_rss_ok(ci_netif* ni, */ ci_assert_nequal(lport, 0); ci_assert_nequal(rport, 0); - ci_assert(!CI_IPX_ADDR_IS_ANY(laddr)); - ci_assert(!CI_IPX_ADDR_IS_ANY(raddr)); + ci_assert(! CI_IPX_ADDR_IS_ANY(laddr)); + ci_assert(! CI_IPX_ADDR_IS_ANY(raddr)); /* It's always ok if we don't have a multi-instance cluster */ if( ni->state->cluster_size < 2 ) return 1; - if( ci_netif_active_wild_nic_hash(ni, laddr, lport, raddr, rport) - % ni->state->cluster_size == ni->state->rss_instance ) + if( ci_netif_active_wild_nic_hash(ni, laddr, lport, raddr, rport) % + ni->state->cluster_size == + ni->state->rss_instance ) return 1; else return 0; - } #endif static int __ci_netif_active_wild_pool_select(ci_netif* ni, ci_addr_t laddr, - ci_addr_t raddr, ci_uint16 rport, - int offset) + ci_addr_t raddr, ci_uint16 rport, int offset) { ci_uint32 pool_index = 0; ci_uint32 select_hash; @@ -1676,10 +1736,10 @@ static int __ci_netif_active_wild_pool_select(ci_netif* ni, ci_addr_t laddr, * we need to ensure that we don't cause the peer to think we're reopening * that connection. * - * To do that we record the details of the last closed connection on this port - * in a way that would leave the peer in TIME-WAIT (if we're in TIME-WAIT we - * won't re-use the port, as we still have a sw filter for the 4-tuple, if - * the connection is reset then we're ok). + * To do that we record the details of the last closed connection on this + * port in a way that would leave the peer in TIME-WAIT (if we're in + * TIME-WAIT we won't re-use the port, as we still have a sw filter for the + * 4-tuple, if the connection is reset then we're ok). * * When we assign a new port we check if we expect the peer to be out of * TIME-WAIT by now (assuming they're using the same length of timer as us). @@ -1687,31 +1747,28 @@ static int __ci_netif_active_wild_pool_select(ci_netif* ni, ci_addr_t laddr, * keep looking (potentially increasing the pool). */ static int __ci_netif_active_wild_allow_reuse(ci_netif* ni, ci_active_wild* aw, - ci_addr_t laddr, ci_addr_t raddr, - unsigned rport) + ci_addr_t laddr, ci_addr_t raddr, unsigned rport) { if( ci_ip_time_now(ni) > aw->expiry || NI_OPTS(ni).tcp_shared_local_ports_reuse_fast ) return 1; else - return !CI_IPX_ADDR_EQ(aw->last_laddr, laddr) || - !CI_IPX_ADDR_EQ(aw->last_raddr, raddr) || + return ! CI_IPX_ADDR_EQ(aw->last_laddr, laddr) || + ! CI_IPX_ADDR_EQ(aw->last_raddr, raddr) || (aw->last_rport != rport); } static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, - ci_addr_t laddr, ci_addr_t raddr, - unsigned rport, - ci_uint16* port_out, - ci_uint32* prev_seq_out) + ci_addr_t laddr, ci_addr_t raddr, unsigned rport, ci_uint16* port_out, + ci_uint32* prev_seq_out) { ci_active_wild* aw; - ci_uint16 lport; - ci_addr_t laddr_aw = - NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; - int af_space = AF_SPACE_FLAG_IP4; - oo_sp sp; + ci_uint16 lport; + ci_addr_t laddr_aw = + NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; + int af_space = AF_SPACE_FLAG_IP4; + oo_sp sp; struct oo_p_dllink_state list; struct oo_p_dllink_state link, tmp; struct oo_p_dllink_state last; @@ -1727,23 +1784,25 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, *prev_seq_out = 0; - list = ci_netif_get_active_wild_list(ni, aw_pool, laddr_aw); + list = ci_netif_get_active_wild_list(ni, aw_pool, laddr_aw); if( list.p == OO_P_NULL ) return OO_SP_NULL; - /* This can happen if active wilds are configured, but we failed to allocate - * any at stack creation time, for example because there were no filters - * available, or if none of them give a valid hash for this 4-tuple. + /* This can happen if active wilds are configured, but we failed to + * allocate any at stack creation time, for example because there were no + * filters available, or if none of them give a valid hash for this + * 4-tuple. */ if( oo_p_dllink_is_empty(ni, list) ) return OO_SP_NULL; last = oo_p_dllink_statep(ni, list.l->prev); - oo_p_dllink_for_each_safe(ni, link, tmp, list) { + oo_p_dllink_for_each_safe(ni, link, tmp, list) + { oo_p_dllink_del(ni, link); oo_p_dllink_add_tail(ni, list, link); - aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); + aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); lport = sock_lport_be16(&aw->s); @@ -1753,25 +1812,26 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, */ ci_assert(__ci_netif_active_wild_rss_ok(ni, laddr, lport, raddr, rport)); - sp = ci_netif_filter_lookup(ni, af_space, laddr, lport, raddr, rport, - sock_protocol(&aw->s)); + sp = ci_netif_filter_lookup( + ni, af_space, laddr, lport, raddr, rport, sock_protocol(&aw->s)); if( OO_SP_NOT_NULL(sp) ) { ci_sock_cmn* s = ID_TO_SOCK(ni, sp); if( s->b.state == CI_TCP_TIME_WAIT ) { - ci_uint32 seq; + ci_uint32 seq; /* This 4-tuple is in use as TIME_WAIT, but it is safe to re-use * TIME_WAIT for active open. We ensure we use an initial sequence * number that is a long way from the one used by the old socket. */ ci_tcp_state* ts = SOCK_TO_TCP(s); CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_reused_tw); - /* Setting *prev_seq_out to zero indicates to the caller that it should - * fall back to the clock-driven ISN. However, sometimes we really do - * want to report a previous sequence number of zero. To work around - * this, report a value of 1 in such cases. This is valid in practice, - * as the purpose of this is to allow the selection of an ISN for the - * next connection that is greater in sequence space than the old one. + /* Setting *prev_seq_out to zero indicates to the caller that it + * should fall back to the clock-driven ISN. However, sometimes we + * really do want to report a previous sequence number of zero. To + * work around this, report a value of 1 in such cases. This is + * valid in practice, as the purpose of this is to allow the + * selection of an ISN for the next connection that is greater in + * sequence space than the old one. */ seq = ts->snd_nxt + NI_OPTS(ni).tcp_isn_offset; if( seq == 0 ) @@ -1797,9 +1857,8 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, } CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_skipped_in_use); - } - else if( __ci_netif_active_wild_allow_reuse(ni, aw, laddr, - raddr, rport) ) { + } else if( __ci_netif_active_wild_allow_reuse( + ni, aw, laddr, raddr, rport) ) { /* If no-one's using this 4-tuple we can let the caller share this * active wild. */ @@ -1820,12 +1879,11 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, static oo_sp __ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, - ci_addr_t raddr, unsigned rport, - ci_uint16* port_out, - ci_uint32* prev_seq_out) + ci_addr_t raddr, unsigned rport, ci_uint16* port_out, + ci_uint32* prev_seq_out) { - int aw_pool; - int offset; + int aw_pool; + int offset; oo_sp aw = OO_SP_NULL; ci_assert(ci_netif_is_locked(ni)); @@ -1833,10 +1891,10 @@ static oo_sp __ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, for( offset = ni->state->rss_instance; offset < ni->state->active_wild_pools_n; offset += ni->state->cluster_size ) { - aw_pool = __ci_netif_active_wild_pool_select(ni, laddr, raddr, rport, - offset); - aw = __ci_netif_active_wild_pool_get(ni, aw_pool, laddr, raddr, rport, - port_out, prev_seq_out); + aw_pool = + __ci_netif_active_wild_pool_select(ni, laddr, raddr, rport, offset); + aw = __ci_netif_active_wild_pool_get( + ni, aw_pool, laddr, raddr, rport, port_out, prev_seq_out); if( aw != OO_SP_NULL ) break; } @@ -1845,9 +1903,8 @@ static oo_sp __ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, } -oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, - ci_addr_t raddr, unsigned rport, - ci_uint16* port_out, ci_uint32* prev_seq_out) +oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, ci_addr_t raddr, + unsigned rport, ci_uint16* port_out, ci_uint32* prev_seq_out) { oo_sp active_wild; @@ -1856,31 +1913,29 @@ oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, if( ! ci_netif_should_allocate_tcp_shared_local_ports(ni) ) return OO_SP_NULL; - active_wild = __ci_netif_active_wild_get(ni, laddr, raddr, rport, - port_out, prev_seq_out); + active_wild = __ci_netif_active_wild_get( + ni, laddr, raddr, rport, port_out, prev_seq_out); /* If we failed to get an active wild try and grow the pool */ while( active_wild == OO_SP_NULL && ni->state->active_wild_n < NI_OPTS(ni).tcp_shared_local_ports_max ) { - int rc; + int rc; ci_addr_t laddr_aw = - NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; - LOG_TC(ci_log(FN_FMT "Didn't get active wild, getting more", - FN_PRI_ARGS(ni))); + NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; + LOG_TC(ci_log( + FN_FMT "Didn't get active wild, getting more", FN_PRI_ARGS(ni))); rc = ci_tcp_helper_alloc_active_wild(ni, laddr_aw); if( rc >= 0 ) { CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_grow); - active_wild = __ci_netif_active_wild_get(ni, laddr, raddr, rport, - port_out, prev_seq_out); - } - else if( rc == -ENOBUFS ) { + active_wild = __ci_netif_active_wild_get( + ni, laddr, raddr, rport, port_out, prev_seq_out); + } else if( rc == -ENOBUFS ) { break; - } - else { - LOG_TC(ci_log(FN_FMT "Alloc active wild for "IPX_FMT":0 " - IPX_FMT":%u FAILED - rc %d", - FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), - IPX_ARG(AF_IP(raddr)), htons(rport), rc)); + } else { + LOG_TC(ci_log(FN_FMT "Alloc active wild for " IPX_FMT ":0 " IPX_FMT + ":%u FAILED - rc %d", + FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), IPX_ARG(AF_IP(raddr)), + htons(rport), rc)); CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_grow_failed); break; } @@ -1888,18 +1943,16 @@ oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, if( active_wild != OO_SP_NULL ) { CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_used); - LOG_TC(ci_log(FN_FMT "Lookup active wild for "IPX_FMT":0 " - IPX_FMT":%u FOUND - lport %u", - FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), - IPX_ARG(AF_IP(raddr)), - htons(rport), htons(*port_out))); - } - else { + LOG_TC(ci_log(FN_FMT "Lookup active wild for " IPX_FMT ":0 " IPX_FMT + ":%u FOUND - lport %u", + FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), IPX_ARG(AF_IP(raddr)), + htons(rport), htons(*port_out))); + } else { CITP_STATS_NETIF_INC(ni, tcp_shared_local_ports_exhausted); - LOG_TC(ci_log(FN_FMT "Lookup active wild for "IPX_FMT":0 " - IPX_FMT":%u NOT AVAILABLE", - FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), - IPX_ARG(AF_IP(raddr)), htons(rport))); + LOG_TC(ci_log(FN_FMT "Lookup active wild for " IPX_FMT ":0 " IPX_FMT + ":%u NOT AVAILABLE", + FN_PRI_ARGS(ni), IPX_ARG(AF_IP(laddr)), IPX_ARG(AF_IP(raddr)), + htons(rport))); } return active_wild; } @@ -1910,17 +1963,16 @@ oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, */ void ci_netif_active_wild_sharer_closed(ci_netif* ni, ci_sock_cmn* s) { - oo_sp id; + oo_sp id; ci_active_wild* aw; - id = ci_netif_filter_lookup(ni, sock_af_space(s), - sock_ipx_laddr(s), sock_lport_be16(s), - addr_any, 0, sock_protocol(s)); + id = ci_netif_filter_lookup(ni, sock_af_space(s), sock_ipx_laddr(s), + sock_lport_be16(s), addr_any, 0, sock_protocol(s)); if( OO_SP_NOT_NULL(id) ) { aw = SP_TO_ACTIVE_WILD(ni, id); ci_assert(aw->s.b.state == CI_TCP_STATE_ACTIVE_WILD); - aw->expiry = ci_ip_time_now(ni) + NI_CONF(ni).tconst_2msl_time; + aw->expiry = ci_ip_time_now(ni) + NI_CONF(ni).tconst_2msl_time; aw->last_laddr = sock_ipx_laddr(s); aw->last_raddr = sock_ipx_raddr(s); aw->last_rport = sock_rport_be16(s); @@ -1942,7 +1994,7 @@ void oo_tcpdump_free_pkts(ci_netif* ni, ci_uint16 i) do { oo_pkt_p id = ni->state->dump_queue[i % CI_CFG_DUMPQUEUE_LEN]; if( id != OO_PP_NULL ) { - ci_ip_pkt_fmt* pkt = PKT_CHK(ni, id); + ci_ip_pkt_fmt* pkt = PKT_CHK(ni, id); ni->state->dump_queue[i % CI_CFG_DUMPQUEUE_LEN] = OO_PP_NULL; ci_wmb(); ci_netif_pkt_release(ni, pkt); @@ -1956,7 +2008,7 @@ void oo_tcpdump_free_pkts(ci_netif* ni, ci_uint16 i) static void sw_update_cb(void* arg, void* data) { - ci_netif* ni = arg; + ci_netif* ni = arg; struct oo_sw_filter_op* op = data; ci_assert(ci_netif_is_locked(ni)); @@ -1978,8 +2030,7 @@ void ci_netif_handle_actions(ci_netif* ni) /* Poll to process incoming FIN, and close endpoint from unlock hook. */ if( val & OO_ACTION_CLOSE_EP ) ef_eplock_holder_set_flags(&ni->state->lock, - CI_EPLOCK_NETIF_CLOSE_ENDPOINT | - CI_EPLOCK_NETIF_NEED_POLL); + CI_EPLOCK_NETIF_CLOSE_ENDPOINT | CI_EPLOCK_NETIF_NEED_POLL); if( val & OO_ACTION_SWF_UPDATE ) oo_ringbuffer_iterate(&ni->sw_filter_ops, sw_update_cb, ni); @@ -1987,8 +2038,8 @@ void ci_netif_handle_actions(ci_netif* ni) static void close_cb(void* arg, void* data) { - ci_netif* ni = arg; - oo_sp* id_p = data; + ci_netif* ni = arg; + oo_sp* id_p = data; ci_assert(ci_netif_is_locked(ni)); ci_assert(IS_VALID_SOCK_P(ni, *id_p)); diff --git a/src/lib/transport/ip/netif_event.c b/src/lib/transport/ip/netif_event.c index 722d2311f..f5cb70763 100644 --- a/src/lib/transport/ip/netif_event.c +++ b/src/lib/transport/ip/netif_event.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief Event handling @@ -41,7 +41,7 @@ #define SAMPLE(n) (n) -#define LPF "netif: " +#define LPF "netif: " #ifndef __KERNEL__ enum { @@ -80,7 +80,7 @@ struct oo_rx_state { static int ci_ip_csum_correct(ci_ip4_hdr* ip, int max_ip_len) { unsigned csum; - int ip_len; + int ip_len; if( max_ip_len < CI_IP4_IHL(ip) ) return 0; @@ -96,10 +96,10 @@ static int ci_ip_csum_correct(ci_ip4_hdr* ip, int max_ip_len) static int ci_tcp_csum_correct(ci_ip_pkt_fmt* pkt, int ip_paylen) { - int af = oo_pkt_af(pkt); - ci_ipx_hdr_t* ipx = oo_ipx_hdr(pkt); - ci_tcp_hdr* tcp = ipx_hdr_data(af, ipx); - int tcp_hlen = CI_TCP_HDR_LEN(tcp); + int af = oo_pkt_af(pkt); + ci_ipx_hdr_t* ipx = oo_ipx_hdr(pkt); + ci_tcp_hdr* tcp = ipx_hdr_data(af, ipx); + int tcp_hlen = CI_TCP_HDR_LEN(tcp); if( tcp_hlen < sizeof(ci_tcp_hdr) ) return 0; @@ -121,61 +121,62 @@ static void ci_parse_rx_vlan(ci_ip_pkt_fmt* pkt) p_ether_type = &(oo_ether_hdr(pkt)->ether_type); if( *p_ether_type != CI_ETHERTYPE_8021Q ) { pkt->pkt_eth_payload_off = pkt->pkt_start_off + ETH_HLEN; - pkt->vlan = 0; - } - else { + pkt->vlan = 0; + } else { pkt->pkt_eth_payload_off = pkt->pkt_start_off + ETH_HLEN + ETH_VLAN_HLEN; - pkt->vlan = CI_BSWAP_BE16(p_ether_type[1]) & 0xfff; + pkt->vlan = CI_BSWAP_BE16(p_ether_type[1]) & 0xfff; } } int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size) { - int error = 0; + int error = 0; char* options = (char*) ip + sizeof(ci_ip4_hdr); char* opt_end = (char*) ip + hdr_size; while( *options != IPOPT_EOL && options < opt_end && ! error ) { switch( (ci_uint8) *options ) { - case IPOPT_NOP: - ++options; - break; - case IPOPT_RR: /* Record Packet Route */ - case IPOPT_TS: /* Time-stamp */ - case IPOPT_SEC: /* Security */ - case IPOPT_SID: /* Stream ID */ - if( options[1] < IPOPT_MINOFF || options[1] > opt_end - options ) { - LOG_U( log(LPF "[%d] IP Option invalid offset; type=%u(op:%u), " - "offset=%u", netif->state->stack_id, (ci_uint8) *options, - (ci_uint8) (0x1f & *options), (ci_uint8) options[1]) ); + case IPOPT_NOP: + ++options; + break; + case IPOPT_RR: /* Record Packet Route */ + case IPOPT_TS: /* Time-stamp */ + case IPOPT_SEC: /* Security */ + case IPOPT_SID: /* Stream ID */ + if( options[1] < IPOPT_MINOFF || options[1] > opt_end - options ) { + LOG_U( + log(LPF "[%d] IP Option invalid offset; type=%u(op:%u), " + "offset=%u", + netif->state->stack_id, (ci_uint8) *options, + (ci_uint8) (0x1f & *options), (ci_uint8) options[1])); + error = 1; + } else { + options += options[1]; + } + break; + case IPOPT_SSRR: /* Strict Source Routing */ + case IPOPT_LSRR: /* Loose Source Routing */ + LOG_U( + log(LPF "[%d] IP Options: Source Routing unsupported; " + "type=%u(op:%u)", + netif->state->stack_id, (ci_uint8) *options, + (ci_uint8) (0x1f & *options))); error = 1; - } - else { - options += options[1]; - } - break; - case IPOPT_SSRR: /* Strict Source Routing */ - case IPOPT_LSRR: /* Loose Source Routing */ - LOG_U( log(LPF "[%d] IP Options: Source Routing unsupported; " - "type=%u(op:%u)", netif->state->stack_id, (ci_uint8) *options, - (ci_uint8) (0x1f & *options)) ); - error = 1; - break; - default: - LOG_U( log(LPF "[%d] IP Option unsupported; type=%u(op:%u)", - netif->state->stack_id, (ci_uint8) *options, - (ci_uint8) (0x1f & *options)) ); - error = 1; - break; + break; + default: + LOG_U(log(LPF "[%d] IP Option unsupported; type=%u(op:%u)", + netif->state->stack_id, (ci_uint8) *options, + (ci_uint8) (0x1f & *options))); + error = 1; + break; } } if( error ) { CITP_STATS_NETIF_INC(netif, rx_discard_ip_options_bad); CI_IPV4_STATS_INC_IN_HDR_ERRS(netif); - } - else { + } else { CITP_STATS_NETIF_INC(netif, ip_options); } @@ -183,36 +184,35 @@ int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size) } static void record_rx_timestamp(ci_netif* netif, ci_netif_state_nic_t* nsn, - ci_ip_pkt_fmt* pkt, - ef_timespec stamp, unsigned sync_flags) + ci_ip_pkt_fmt* pkt, ef_timespec stamp, unsigned sync_flags) { - int tsf = (NI_OPTS(netif).timestamping_reporting & - CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) ? - EF_VI_SYNC_FLAG_CLOCK_IN_SYNC : - EF_VI_SYNC_FLAG_CLOCK_SET; - pkt->hw_stamp.tv_sec = stamp.tv_sec; + int tsf = (NI_OPTS(netif).timestamping_reporting & + CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) + ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC + : EF_VI_SYNC_FLAG_CLOCK_SET; + pkt->hw_stamp.tv_sec = stamp.tv_sec; pkt->hw_stamp.tv_nsec = stamp.tv_nsec = - (stamp.tv_nsec & ~CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC) | - ((sync_flags & tsf) ? CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC : 0); + (stamp.tv_nsec & ~CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC) | + ((sync_flags & tsf) ? CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC : 0); nsn->last_rx_timestamp = pkt->hw_stamp; - nsn->last_sync_flags = sync_flags; + nsn->last_sync_flags = sync_flags; - LOG_NR(log(LPF "RX id=%d timestamp: %lu.%09lu sync %d", - OO_PKT_FMT(pkt), (long)stamp.tv_sec, stamp.tv_nsec, sync_flags)); + LOG_NR(log(LPF "RX id=%d timestamp: %lu.%09lu sync %d", OO_PKT_FMT(pkt), + (long) stamp.tv_sec, stamp.tv_nsec, sync_flags)); } static void get_rx_timestamp(ci_netif* netif, ci_ip_pkt_fmt* pkt) { #if CI_CFG_TIMESTAMPING ci_netif_state_nic_t* nsn = &netif->state->nic[pkt->intf_i]; - ef_vi* vi = ci_netif_vi(netif, pkt->intf_i); + ef_vi* vi = ci_netif_vi(netif, pkt->intf_i); if( (vi->nic_type.arch != EF_VI_ARCH_EFCT) && (nsn->oo_vi_flags & OO_VI_FLAGS_RX_HW_TS_EN) ) { - unsigned sync_flags; + unsigned sync_flags; ef_timespec stamp; - int rc = ef_vi_receive_get_timestamp_with_sync_flags( - vi, PKT_START(pkt) - nsn->rx_prefix_len, &stamp, &sync_flags); + int rc = ef_vi_receive_get_timestamp_with_sync_flags( + vi, PKT_START(pkt) - nsn->rx_prefix_len, &stamp, &sync_flags); if( rc == 0 ) record_rx_timestamp(netif, nsn, pkt, stamp, sync_flags); @@ -220,8 +220,8 @@ static void get_rx_timestamp(ci_netif* netif, ci_ip_pkt_fmt* pkt) LOG_NR(log(LPF "RX id=%d missing timestamp", OO_PKT_FMT(pkt))); } #else - (void)netif; - (void)pkt; + (void) netif; + (void) pkt; #endif } @@ -229,15 +229,14 @@ static void get_rx_timestamp(ci_netif* netif, ci_ip_pkt_fmt* pkt) #if CI_CFG_TCP_OFFLOAD_RECYCLER /* Process a packet which has been received on a 'secondary' VI about which * we know nothing - they may not even have Ethernet headers */ -static void handle_rx_plugin_data(ci_netif* netif, - struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt) +static void handle_rx_plugin_data( + ci_netif* netif, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { /* Since we don't know anything about this packet, we can't use the * ip_pkt_dump_len function (which adds ETH_HLEN) to calculate length to * dump.*/ LOG_DR(ci_hex_dump(ci_log_fn, PKT_START(pkt), - raw_pkt_dump_len(oo_offbuf_left(&pkt->buf)), 0)); + raw_pkt_dump_len(oo_offbuf_left(&pkt->buf)), 0)); /* Writing these things to the pcap will confuse Wireshark, but it's an * important debugging feature so let's do it anyway */ @@ -250,69 +249,70 @@ static void handle_rx_plugin_data(ci_netif* netif, static inline unsigned unexpected_rx_log_flag(ci_ip_pkt_fmt* pkt) { - return (pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED) ? - CI_TP_LOG_NR : CI_TP_LOG_U; + return (pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED) ? CI_TP_LOG_NR + : CI_TP_LOG_U; } -static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt) +static void handle_rx_pkt( + ci_netif* netif, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { /* On entry: [pkt] may be a whole packet, or a linked list of scatter * fragments linked by [pkt->frag_next]. [pkt->pay_len] contains the * length of the whole frame. Each scatter fragment has its [buf] field * initialised with the delivered frame payload. */ - int not_fast, ip_paylen, hdr_size; + int not_fast, ip_paylen, hdr_size; - ci_uint16 ether_type = *((ci_uint16*)oo_l3_hdr(pkt) - 1); + ci_uint16 ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); ci_assert_nequal(pkt->pkt_eth_payload_off, PKT_START_OFF_BAD); -#if CI_CFG_RANDOM_DROP && !defined(__KERNEL__) - if( CI_UNLIKELY(rand() < NI_OPTS(netif).rx_drop_rate) ) goto drop; +#if CI_CFG_RANDOM_DROP && ! defined(__KERNEL__) + if( CI_UNLIKELY(rand() < NI_OPTS(netif).rx_drop_rate) ) + goto drop; #endif pkt->tstamp_frc = IPTIMER_STATE(netif)->frc; /* Is this an IP packet? */ - if(CI_LIKELY( ether_type == CI_ETHERTYPE_IP )) { - int ip_tot_len; - ci_ip4_hdr *ip = oo_ip_hdr(pkt); + if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP) ) { + int ip_tot_len; + ci_ip4_hdr* ip = oo_ip_hdr(pkt); #if CI_CFG_IPV6 - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; #endif LOG_NR(log(LPF "RX id=%d ip_proto=0x%x", OO_PKT_FMT(pkt), - (unsigned) ip->ip_protocol)); + (unsigned) ip->ip_protocol)); LOG_AR(ci_analyse_pkt(PKT_START(pkt), pkt->pay_len)); - CI_IPV4_STATS_INC_IN_RECVS( netif ); + CI_IPV4_STATS_INC_IN_RECVS(netif); /* Do the byte-swap just once! */ ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - LOG_DR(ci_hex_dump(ci_log_fn, PKT_START(pkt), - ip_pkt_dump_len(ip_tot_len), 0)); + LOG_DR(ci_hex_dump( + ci_log_fn, PKT_START(pkt), ip_pkt_dump_len(ip_tot_len), 0)); /* Hardware should not deliver us fragments when using scalable * filters, but it happens in some corner cases. We can't handle them. * Also check for valid IP length for non-fragmented packets.*/ - not_fast = (ip->ip_frag_off_be16 & - (CI_IP4_OFFSET_MASK | CI_IP4_FRAG_MORE)) | - (ip_tot_len > pkt->pay_len - oo_pre_l3_len(pkt)) + not_fast = + (ip->ip_frag_off_be16 & (CI_IP4_OFFSET_MASK | CI_IP4_FRAG_MORE)) | + (ip_tot_len > pkt->pay_len - oo_pre_l3_len(pkt)) #if CI_CFG_TCP_OFFLOAD_RECYCLER - /* All plugins are assumed to have done sufficient checks that - * their mangled packets are fast-path */ - && pkt->q_id == CI_Q_ID_NORMAL; + /* All plugins are assumed to have done sufficient checks that + * their mangled packets are fast-path */ + && pkt->q_id == CI_Q_ID_NORMAL; #endif - ; + ; hdr_size = CI_IP4_IHL(ip); /* Accepting but ignoring IP options. ** Quick parse to check there is no badness - */ - if(CI_UNLIKELY( hdr_size > sizeof(ci_ip4_hdr) && ! not_fast )) + */ + if( CI_UNLIKELY(hdr_size > sizeof(ci_ip4_hdr) && ! not_fast) ) not_fast = ci_ip_options_parse(netif, ip, hdr_size); /* We are not checking for certain other illegalities here (invalid @@ -324,7 +324,7 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, if( CI_LIKELY(not_fast == 0) ) { char* payload = (char*) ip + hdr_size; - ip_paylen = ip_tot_len - hdr_size; + ip_paylen = ip_tot_len - hdr_size; /* This will go negative if the ip_tot_len was too small even ** for the IP header. The ULP is expected to notice... */ @@ -337,39 +337,37 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, /* Demux to appropriate protocol. */ if( ip->ip_protocol == IPPROTO_TCP ) { ci_tcp_handle_rx(netif, ps, pkt, (ci_tcp_hdr*) payload, ip_paylen); - CI_IPV4_STATS_INC_IN_DELIVERS( netif ); + CI_IPV4_STATS_INC_IN_DELIVERS(netif); return; - } - else if(CI_LIKELY( ip->ip_protocol == IPPROTO_UDP )) { + } else if( CI_LIKELY(ip->ip_protocol == IPPROTO_UDP) ) { ci_udp_handle_rx(netif, pkt, (ci_udp_hdr*) payload, ip_paylen); - CI_IPV4_STATS_INC_IN_DELIVERS( netif ); + CI_IPV4_STATS_INC_IN_DELIVERS(netif); return; } LOG_FL(unexpected_rx_log_flag(pkt), - CI_RLLOG(10, LPF "IGNORE IP protocol=%d", (int) ip->ip_protocol)); - } - else if( ~pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { + CI_RLLOG(10, LPF "IGNORE IP protocol=%d", (int) ip->ip_protocol)); + } else if( ~pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { /*! \todo IP slow path. Don't want to deal with this yet. - * + * * It is probably bad idea to print all IP fragments, but we should * not receive them in the first place. */ - LOG_U(CI_RLLOG(10, LPF "[%d] IP HARD " - "(ihl_ver=%x ihl=%d frag=%x ip_len=%d frame_len=%d)" - PKT_DBG_FMT, - netif->state->stack_id, - (int) ip->ip_ihl_version, (int) CI_IP4_IHL(ip), - (unsigned) ip->ip_frag_off_be16, - ip_tot_len, pkt->pay_len, PKT_DBG_ARGS(pkt))); + LOG_U(CI_RLLOG(10, + LPF + "[%d] IP HARD " + "(ihl_ver=%x ihl=%d frag=%x ip_len=%d frame_len=%d)" PKT_DBG_FMT, + netif->state->stack_id, (int) ip->ip_ihl_version, + (int) CI_IP4_IHL(ip), (unsigned) ip->ip_frag_off_be16, ip_tot_len, + pkt->pay_len, PKT_DBG_ARGS(pkt))); LOG_DU(ci_hex_dump(ci_log_fn, PKT_START(pkt), 64, 0)); } - CI_IPV4_STATS_INC_IN_DISCARDS( netif ); + CI_IPV4_STATS_INC_IN_DISCARDS(netif); - /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to show up - * as the queue is shared with kernel stack and potentially other onload/ef_vi stacks, - * we need to ignore those packets. */ + /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to + * show up as the queue is shared with kernel stack and potentially other + * onload/ef_vi stacks, we need to ignore those packets. */ if( pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { CITP_STATS_NETIF_INC(netif, no_match_pass_to_kernel_ip_other); ci_netif_pkt_release_rx_1ref(netif, pkt); @@ -386,15 +384,15 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, return; } #if CI_CFG_IPV6 - else if(CI_LIKELY( ether_type == CI_ETHERTYPE_IP6 )) { - ci_ip6_hdr *ip6_hdr = oo_ip6_hdr(pkt); - void *payload = ip6_hdr + 1; + else if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP6) ) { + ci_ip6_hdr* ip6_hdr = oo_ip6_hdr(pkt); + void* payload = ip6_hdr + 1; - LOG_NR(log(LPF "RX id=%d ip6_proto=0x%x", OO_PKT_FMT(pkt), - ip6_hdr->next_hdr)); + LOG_NR(log( + LPF "RX id=%d ip6_proto=0x%x", OO_PKT_FMT(pkt), ip6_hdr->next_hdr)); pkt->flags |= CI_PKT_FLAG_IS_IP6; - CI_IP_STATS_INC_IN6_RECVS( netif ); + CI_IP_STATS_INC_IN6_RECVS(netif); get_rx_timestamp(netif, pkt); @@ -403,22 +401,21 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, if( ip6_hdr->next_hdr == IPPROTO_TCP ) { ci_tcp_handle_rx(netif, ps, pkt, (ci_tcp_hdr*) payload, - CI_BSWAP_BE16(ip6_hdr->payload_len)); - CI_IP_STATS_INC_IN6_DELIVERS( netif ); + CI_BSWAP_BE16(ip6_hdr->payload_len)); + CI_IP_STATS_INC_IN6_DELIVERS(netif); return; - } - else if( ip6_hdr->next_hdr == IPPROTO_UDP ) { + } else if( ip6_hdr->next_hdr == IPPROTO_UDP ) { ci_udp_handle_rx(netif, pkt, (ci_udp_hdr*) payload, - CI_BSWAP_BE16(ip6_hdr->payload_len)); - CI_IP_STATS_INC_IN6_DELIVERS( netif ); + CI_BSWAP_BE16(ip6_hdr->payload_len)); + CI_IP_STATS_INC_IN6_DELIVERS(netif); return; } - CI_IP_STATS_INC_IN6_DISCARDS( netif ); + CI_IP_STATS_INC_IN6_DISCARDS(netif); - /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to show up - * as the queue is shared with kernel stack and potentially other onload/ef_vi stacks, - * we need to ignore those packets. */ + /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to + * show up as the queue is shared with kernel stack and potentially other + * onload/ef_vi stacks, we need to ignore those packets. */ if( pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { CITP_STATS_NETIF_INC(netif, no_match_pass_to_kernel_ip6_other); ci_netif_pkt_release_rx_1ref(netif, pkt); @@ -433,9 +430,9 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, } #endif - /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to show up - * as the queue is shared with kernel stack and potentially other onload/ef_vi stacks, - * we need to ignore those packets. */ + /* On architectures with RX_SHARED (EFCT), we expect unexpected packets to + * show up as the queue is shared with kernel stack and potentially other + * onload/ef_vi stacks, we need to ignore those packets. */ if( pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { CITP_STATS_NETIF_INC(netif, no_match_pass_to_kernel_non_ip); ci_netif_pkt_release_rx_1ref(netif, pkt); @@ -447,18 +444,16 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, ci_assert_equal(pkt->q_id, CI_Q_ID_NORMAL); if( ci_netif_pkt_pass_to_kernel(netif, pkt) ) { CITP_STATS_NETIF_INC(netif, no_match_pass_to_kernel_non_ip); - } - else - { - LOG_U(CI_RLLOG(10, LPF "UNEXPECTED ether_type "PKT_DBG_FMT, - PKT_DBG_ARGS(pkt))); + } else { + LOG_U(CI_RLLOG( + 10, LPF "UNEXPECTED ether_type " PKT_DBG_FMT, PKT_DBG_ARGS(pkt))); LOG_DU(ci_hex_dump(ci_log_fn, PKT_START(pkt), 64, 0)); ci_netif_pkt_release_rx_1ref(netif, pkt); } return; -#if CI_CFG_RANDOM_DROP && !defined(__ci_driver__) - drop: +#if CI_CFG_RANDOM_DROP && ! defined(__ci_driver__) +drop: LOG_NR(log(LPF "DROP")); LOG_DR(ci_hex_dump(ci_log_fn, pkt, 40, 0)); ci_netif_pkt_release_rx_1ref(netif, pkt); @@ -470,28 +465,28 @@ static void handle_rx_pkt(ci_netif* netif, struct ci_netif_poll_state* ps, static ci_ip_pkt_fmt* alloc_rx_efct_pkt(ci_netif* ni, int intf_i, int pay_len) { ci_ip_pkt_fmt* pkt = ci_netif_pkt_alloc(ni, 0); - if(CI_UNLIKELY( ! pkt )) + if( CI_UNLIKELY(! pkt) ) return NULL; pkt->pkt_start_off = 0; - pkt->intf_i = intf_i; + pkt->intf_i = intf_i; pkt->flags |= CI_PKT_FLAG_RX; ci_assert_equal(pkt->rx_flags, 0); ci_assert_flags(ni->state->nic[intf_i].oo_vi_flags, OO_VI_FLAGS_RX_SHARED); pkt->rx_flags = CI_PKT_RX_FLAG_RX_SHARED; pkt->refcount = 1; - pkt->pay_len = pay_len; + pkt->pay_len = pay_len; ++ni->state->n_rx_pkts; return pkt; } -static void get_efct_timestamp(ci_netif* netif, ef_vi* vi, - uint32_t pkt_id, ci_ip_pkt_fmt* pkt) +static void get_efct_timestamp( + ci_netif* netif, ef_vi* vi, uint32_t pkt_id, ci_ip_pkt_fmt* pkt) { #if CI_CFG_TIMESTAMPING ci_netif_state_nic_t* nsn = &netif->state->nic[pkt->intf_i]; if( nsn->oo_vi_flags & OO_VI_FLAGS_RX_HW_TS_EN ) { - unsigned sync_flags; + unsigned sync_flags; ef_timespec stamp; int rc = efct_vi_rxpkt_get_timestamp(vi, pkt_id, &stamp, &sync_flags); @@ -499,18 +494,18 @@ static void get_efct_timestamp(ci_netif* netif, ef_vi* vi, record_rx_timestamp(netif, nsn, pkt, stamp, sync_flags); else LOG_NR(log(LPF "RX pkt=%d efct_id=%08x missing timestamp", - OO_PKT_FMT(pkt), pkt_id)); + OO_PKT_FMT(pkt), pkt_id)); } #else - (void)netif; - (void)vi; - (void)pkt_id; - (void)pkt; + (void) netif; + (void) vi; + (void) pkt_id; + (void) pkt; #endif } -static void copy_efct_to_pkt(ci_netif* netif, ef_vi* vi, - uint32_t pkt_id, ci_ip_pkt_fmt* pkt) +static void copy_efct_to_pkt( + ci_netif* netif, ef_vi* vi, uint32_t pkt_id, ci_ip_pkt_fmt* pkt) { const void* payload = efct_vi_rxpkt_get(vi, pkt_id); memcpy(pkt->dma_start, payload, pkt->pay_len); @@ -538,25 +533,23 @@ static unsigned convert_discard_flags_efct_ef10(unsigned flags) return 0; } -static int convert_efct_to_pkts(ci_netif* ni, int intf_i, ef_event* evs, - int n_evs) +static int convert_efct_to_pkts( + ci_netif* ni, int intf_i, ef_event* evs, int n_evs) { - int i; + int i; ef_vi* evq = ci_netif_vi(ni, intf_i); for( i = 0; i < n_evs; ++i ) { - ef_event new_ev; + ef_event new_ev; ci_ip_pkt_fmt* pkt; if( EF_EVENT_TYPE(evs[i]) == EF_EVENT_TYPE_RX_REF ) { new_ev.rx.type = EF_EVENT_TYPE_RX; - } - else if( EF_EVENT_TYPE(evs[i]) == EF_EVENT_TYPE_RX_REF_DISCARD ) { + } else if( EF_EVENT_TYPE(evs[i]) == EF_EVENT_TYPE_RX_REF_DISCARD ) { new_ev.rx_discard.type = EF_EVENT_TYPE_RX_DISCARD; new_ev.rx_discard.subtype = - convert_discard_flags_efct_ef10(evs[i].rx_ref_discard.flags); - } - else { + convert_discard_flags_efct_ef10(evs[i].rx_ref_discard.flags); + } else { continue; } @@ -573,12 +566,12 @@ static int convert_efct_to_pkts(ci_netif* ni, int intf_i, ef_event* evs, copy_efct_to_pkt(ni, evq, evs[i].rx_ref.pkt_id, pkt); efct_vi_rxpkt_release(evq, evs[i].rx_ref.pkt_id); - new_ev.rx.q_id = evs[i].rx_ref.q_id; + new_ev.rx.q_id = evs[i].rx_ref.q_id; new_ev.rx.rq_id = OO_PKT_ID(pkt); - new_ev.rx.len = evs[i].rx_ref.len; + new_ev.rx.len = evs[i].rx_ref.len; new_ev.rx.flags = EF_EVENT_FLAG_SOP; - new_ev.rx.ofs = 0; - evs[i] = new_ev; + new_ev.rx.ofs = 0; + evs[i] = new_ev; } return n_evs; } @@ -587,16 +580,17 @@ static int convert_efct_to_pkts(ci_netif* ni, int intf_i, ef_event* evs, int ci_netif_evq_poll(ci_netif* ni, int intf_i) { ef_vi* evq = ci_netif_vi(ni, intf_i); - int n_evs; - size_t evs_per_poll = ef_vi_flags(evq) & EF_VI_RX_EVENT_MERGE ? - NI_OPTS(ni).evs_per_poll / 4 : NI_OPTS(ni).evs_per_poll; + int n_evs; + size_t evs_per_poll = ef_vi_flags(evq) & EF_VI_RX_EVENT_MERGE + ? NI_OPTS(ni).evs_per_poll / 4 + : NI_OPTS(ni).evs_per_poll; #if CI_CFG_WANT_BPF_NATIVE && CI_HAVE_BPF_NATIVE - ef_event *ev = ni->state->events; + ef_event* ev = ni->state->events; #endif ci_assert_lt(intf_i, CI_CFG_MAX_INTERFACES); if( intf_i >= oo_stack_intf_max(ni) ) - return 0; /* for simplicity no error reported */ + return 0; /* for simplicity no error reported */ /* The 4 below is empirical: with rx merging we generally see 8ish packets * per rx_multi; we assume that another half are tx events, hence on average * a VI with merging is 4 times more efficient than one without. We don't @@ -606,8 +600,8 @@ int ci_netif_evq_poll(ci_netif* ni, int intf_i) * mode, so by default we tune evs_per_poll to be notably larger than the * normal default. */ n_evs = ef_eventq_poll(evq, ni->state->events, - CI_MIN(sizeof(ni->state->events) / sizeof(ni->state->events[0]), - evs_per_poll)); + CI_MIN(sizeof(ni->state->events) / sizeof(ni->state->events[0]), + evs_per_poll)); /* Converting EVENT_TYPE_RX_REF to EVENT_TYPE_RX is a dirty trick, but we're * faced with two problems with X3: @@ -630,13 +624,13 @@ int ci_netif_evq_poll(ci_netif* ni, int intf_i) { struct ef_vi_rvq_rx_iter ri; - uint32_t id; - size_t len = 0; /* placate compiler */ + uint32_t id; + size_t len = 0; /* placate compiler */ ef_vi_evq_rx_iter_set(&ri, evq, ev, n_evs); while( (id = ef_vi_evq_rx_iter_next(&ri, &id, &len)) != 0 ) { - oo_pkt_p pp; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; OO_PP_INIT(ni, pp, id); @@ -651,12 +645,11 @@ int ci_netif_evq_poll(ci_netif* ni, int intf_i) uint16_t pay_len; ef_vi_receive_get_bytes(evq, pkt->dma_start, &pay_len); pkt->pay_len = pay_len; - } - else + } else pkt->pay_len = len - evq->rx_prefix_len; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->pay_len); ci_parse_rx_vlan(pkt); - if( !efab_tcp_helper_xdp_rx_pkt(netif2tcp_helper_resource(ni), pkt) ) + if( ! efab_tcp_helper_xdp_rx_pkt(netif2tcp_helper_resource(ni), pkt) ) pkt->flags |= CI_PKT_FLAG_XDP_DROP; /* schedule drop */ /* We called ci_parse_rx_vlan() above, which initialised * pkt_eth_payload_off. However, the main RX loop will call that @@ -667,7 +660,7 @@ int ci_netif_evq_poll(ci_netif* ni, int intf_i) } #endif - return n_evs; + return n_evs; } #endif @@ -693,8 +686,7 @@ ci_inline int oo_xdp_check_pkt(ci_netif* ni, ci_ip_pkt_fmt** pkt) #if ! defined(__KERNEL__) && CI_CFG_WANT_BPF_NATIVE ci_inline int oo_xdp_check_pkt(ci_netif* ni, ci_ip_pkt_fmt** pkt) { - if( NI_OPTS(ni).xdp_mode != 0 && - ((*pkt)->flags & CI_PKT_FLAG_XDP_DROP) ) { + if( NI_OPTS(ni).xdp_mode != 0 && ((*pkt)->flags & CI_PKT_FLAG_XDP_DROP) ) { /* just drop */ (*pkt)->flags &= ~CI_PKT_FLAG_XDP_DROP; ci_netif_pkt_release_rx_1ref(ni, *pkt); @@ -712,8 +704,8 @@ ci_inline int oo_xdp_check_pkt(ci_netif* ni, ci_ip_pkt_fmt** pkt) #endif -ci_inline void __handle_rx_pkt(ci_netif* ni, struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt** pkt) +ci_inline void __handle_rx_pkt( + ci_netif* ni, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt** pkt) { if( *pkt ) { #if CI_CFG_TCP_OFFLOAD_RECYCLER @@ -734,17 +726,17 @@ ci_inline void __handle_rx_pkt(ci_netif* ni, struct ci_netif_poll_state* ps, /* Partially handle an incoming packet before its completion event. * As much work as possible should be done here, before waiting for the packet * to arrive, to minimise work done on the critical path after arrival. */ -ci_inline int handle_rx_pre_future(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct oo_rx_future* future) +ci_inline int handle_rx_pre_future( + ci_netif* ni, ci_ip_pkt_fmt* pkt, struct oo_rx_future* future) { /* On entry: [pkt] contains the first cache line of an incoming packet. * [pkt->frag_next] and [pkt->pay_len] may be invalid. */ ci_uint16 ether_type; - int valid_bytes = CI_CACHE_LINE_SIZE - pkt->pkt_start_off; + int valid_bytes = CI_CACHE_LINE_SIZE - pkt->pkt_start_off; -#if CI_CFG_RANDOM_DROP && !defined(__KERNEL__) - if(CI_UNLIKELY( rand() < NI_OPTS(ni).rx_drop_rate )) { +#if CI_CFG_RANDOM_DROP && ! defined(__KERNEL__) + if( CI_UNLIKELY(rand() < NI_OPTS(ni).rx_drop_rate) ) { LOG_NR(log(LPF "DROP")); LOG_DR(ci_hex_dump(ci_log_fn, pkt, 40, 0)); return FUTURE_DROP; @@ -755,42 +747,42 @@ ci_inline int handle_rx_pre_future(ci_netif* ni, ci_ip_pkt_fmt* pkt, ci_parse_rx_vlan(pkt); ci_assert_le(pkt->pkt_eth_payload_off, valid_bytes); - ether_type = *((ci_uint16*)oo_l3_hdr(pkt) - 1); + ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); pkt->tstamp_frc = IPTIMER_STATE(ni)->frc; if( ether_type == CI_ETHERTYPE_IP ) { - ci_ip4_hdr *ip = oo_ip_hdr(pkt); - int hdr_size = CI_IP4_IHL(ip); - int ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - int ip_paylen = ip_tot_len - hdr_size; - int ip_payload_offset = pkt->pkt_eth_payload_off + hdr_size; - void* payload = (char*)ip + hdr_size; + ci_ip4_hdr* ip = oo_ip_hdr(pkt); + int hdr_size = CI_IP4_IHL(ip); + int ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); + int ip_paylen = ip_tot_len - hdr_size; + int ip_payload_offset = pkt->pkt_eth_payload_off + hdr_size; + void* payload = (char*) ip + hdr_size; if( ip_payload_offset > valid_bytes || (hdr_size > sizeof(ci_ip4_hdr) && - ci_ip_options_parse(ni, ip, hdr_size)) ) + ci_ip_options_parse(ni, ip, hdr_size)) ) goto no_future; - CI_IPV4_STATS_INC_IN_RECVS( ni ); + CI_IPV4_STATS_INC_IN_RECVS(ni); #if CI_CFG_IPV6 - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; #endif get_rx_timestamp(ni, pkt); if( ip->ip_protocol == IPPROTO_TCP ) { - CI_IPV4_STATS_INC_IN_DELIVERS( ni ); + CI_IPV4_STATS_INC_IN_DELIVERS(ni); if( ip_payload_offset + sizeof(ci_tcp_hdr) <= valid_bytes ) ci_tcp_handle_rx_pre_future(ni, pkt, payload, ip_paylen, &future->tcp); else future->tcp.socket = NULL; return FUTURE_TCP4; } - if(CI_LIKELY( ip->ip_protocol == IPPROTO_UDP )) { - CI_IPV4_STATS_INC_IN_DELIVERS( ni ); + if( CI_LIKELY(ip->ip_protocol == IPPROTO_UDP) ) { + CI_IPV4_STATS_INC_IN_DELIVERS(ni); if( ip_payload_offset + sizeof(ci_udp_hdr) <= valid_bytes ) - ci_udp_handle_rx_pre_future(ni, pkt, payload, ip_paylen, - CI_ETHERTYPE_IP, &future->udp); + ci_udp_handle_rx_pre_future( + ni, pkt, payload, ip_paylen, CI_ETHERTYPE_IP, &future->udp); else future->udp.socket = NULL; return FUTURE_UDP4; @@ -805,8 +797,8 @@ ci_inline int handle_rx_pre_future(ci_netif* ni, ci_ip_pkt_fmt* pkt, /* Undo partial handling of a packet which did not complete successfully. */ -ci_inline void rollback_rx_future(ci_netif* ni, ci_ip_pkt_fmt* pkt, int status, - struct oo_rx_future* future) +ci_inline void rollback_rx_future( + ci_netif* ni, ci_ip_pkt_fmt* pkt, int status, struct oo_rx_future* future) { CITP_STATS_NETIF_INC(ni, rx_future_rollback); @@ -831,26 +823,25 @@ ci_inline void rollback_rx_future(ci_netif* ni, ci_ip_pkt_fmt* pkt, int status, * here. Any work which doesn't require the complete packet should be done * in handle_rx_pre_future if possible. */ ci_inline void handle_rx_post_future(ci_netif* ni, - struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt, int status, - struct oo_rx_future* future) + struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt, int status, + struct oo_rx_future* future) { /* On entry: see handle_rx_pkt */ ci_assert_nequal(status, FUTURE_NONE); - if(CI_LIKELY( status & FUTURE_IP4 )) { - int ip_tot_len; - ci_ip4_hdr *ip = oo_ip_hdr(pkt); + if( CI_LIKELY(status & FUTURE_IP4) ) { + int ip_tot_len; + ci_ip4_hdr* ip = oo_ip_hdr(pkt); LOG_NR(log(LPF "RX id=%d ip_proto=0x%x", OO_PKT_FMT(pkt), - (unsigned) ip->ip_protocol)); + (unsigned) ip->ip_protocol)); LOG_AR(ci_analyse_pkt(PKT_START(pkt), pkt->pay_len)); /* Do the byte-swap just once! */ ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - LOG_DR(ci_hex_dump(ci_log_fn, PKT_START(pkt), - ip_pkt_dump_len(ip_tot_len), 0)); + LOG_DR(ci_hex_dump( + ci_log_fn, PKT_START(pkt), ip_pkt_dump_len(ip_tot_len), 0)); if( oo_tcpdump_check(ni, pkt, pkt->intf_i) ) oo_tcpdump_dump_pkt(ni, pkt); @@ -865,32 +856,30 @@ ci_inline void handle_rx_post_future(ci_netif* ni, ** they can be checked for free in the transport. It is the ** transport's responsibility to check these as necessary. */ - if(CI_LIKELY( ip_tot_len <= pkt->pay_len - oo_pre_l3_len(pkt) )) { - int hdr_size = CI_IP4_IHL(ip); - void* payload = (char*) ip + hdr_size; - int len = ip_tot_len - hdr_size; + if( CI_LIKELY(ip_tot_len <= pkt->pay_len - oo_pre_l3_len(pkt)) ) { + int hdr_size = CI_IP4_IHL(ip); + void* payload = (char*) ip + hdr_size; + int len = ip_tot_len - hdr_size; /* This will go negative if the ip_tot_len was too small even ** for the IP header. The ULP is expected to notice... */ /* Demux to appropriate protocol. */ - if(CI_LIKELY( status & FUTURE_TCP )) + if( CI_LIKELY(status & FUTURE_TCP) ) ci_tcp_handle_rx_post_future(ni, ps, pkt, payload, len, &future->tcp); else ci_udp_handle_rx_post_future(ni, pkt, payload, len, &future->udp); - } - else { + } else { CITP_STATS_NETIF_INC(ni, rx_future_rollback_pkt); rollback_rx_future(ni, pkt, status, future); - LOG_U(log(LPF "[%d] IP HARD " - "(ihl_ver=%x ihl=%d frag=%x ip_len=%d frame_len=%d)" - PKT_DBG_FMT, - ni->state->stack_id, - (int) ip->ip_ihl_version, (int) CI_IP4_IHL(ip), - (unsigned) ip->ip_frag_off_be16, - ip_tot_len, pkt->pay_len, PKT_DBG_ARGS(pkt))); + LOG_U(log(LPF + "[%d] IP HARD " + "(ihl_ver=%x ihl=%d frag=%x ip_len=%d frame_len=%d)" PKT_DBG_FMT, + ni->state->stack_id, (int) ip->ip_ihl_version, (int) CI_IP4_IHL(ip), + (unsigned) ip->ip_frag_off_be16, ip_tot_len, pkt->pay_len, + PKT_DBG_ARGS(pkt))); LOG_DU(ci_hex_dump(ci_log_fn, PKT_START(pkt), 64, 0)); - CI_IPV4_STATS_INC_IN_DISCARDS( ni ); + CI_IPV4_STATS_INC_IN_DISCARDS(ni); if( pkt->rx_flags & CI_PKT_RX_FLAG_RX_SHARED ) { CITP_STATS_NETIF_INC(ni, no_match_pass_to_kernel_ip_other); @@ -902,8 +891,7 @@ ci_inline void handle_rx_post_future(ci_netif* ni, else ci_netif_pkt_release_rx_1ref(ni, pkt); } - } - else { + } else { ci_assert_equal(status, FUTURE_DROP); ci_netif_pkt_release_rx_1ref(ni, pkt); } @@ -918,8 +906,8 @@ ci_inline void handle_rx_post_future(ci_netif* ni, * This function takes the accumulated state, together with the final fragment, * and sorts that out. */ -static void handle_rx_scatter_last_frag(ci_netif* ni, struct oo_rx_state* s, - ci_ip_pkt_fmt* pkt) +static void handle_rx_scatter_last_frag( + ci_netif* ni, struct oo_rx_state* s, ci_ip_pkt_fmt* pkt) { oo_pkt_p next_p; @@ -928,18 +916,18 @@ static void handle_rx_scatter_last_frag(ci_netif* ni, struct oo_rx_state* s, ci_assert(OO_PP_IS_NULL(pkt->frag_next)); pkt->n_buffers = 1; - while( 1 ) { /* reverse the chain of fragments */ - next_p = s->frag_pkt->frag_next; + while( 1 ) { /* reverse the chain of fragments */ + next_p = s->frag_pkt->frag_next; s->frag_pkt->frag_next = OO_PKT_P(pkt); s->frag_pkt->n_buffers = pkt->n_buffers + 1; if( OO_PP_IS_NULL(next_p) ) break; - pkt = s->frag_pkt; + pkt = s->frag_pkt; s->frag_pkt = PKT(ni, next_p); } - s->rx_pkt = s->frag_pkt; + s->rx_pkt = s->frag_pkt; s->rx_pkt->pay_len = s->frag_bytes; - s->frag_pkt = NULL; + s->frag_pkt = NULL; ASSERT_VALID_PKT(ni, s->rx_pkt); } @@ -947,25 +935,24 @@ static void handle_rx_scatter_last_frag(ci_netif* ni, struct oo_rx_state* s, /* When not using RX event merging we get a running total of bytes accumulated * in the jumbo. * - * In this case s->frag_bytes tracks the accumulated length from received frags. + * In this case s->frag_bytes tracks the accumulated length from received + * frags. */ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, - ci_ip_pkt_fmt* pkt, int frame_bytes, - unsigned flags) + ci_ip_pkt_fmt* pkt, int frame_bytes, unsigned flags) { s->rx_pkt = NULL; if( flags & EF_EVENT_FLAG_SOP ) { /* First fragment. */ ci_assert(s->frag_pkt == NULL); - ci_assert_le(frame_bytes, - (int) (CI_CFG_PKT_BUF_SIZE - - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))); - s->frag_pkt = pkt; + ci_assert_le( + frame_bytes, (int) (CI_CFG_PKT_BUF_SIZE - + CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))); + s->frag_pkt = pkt; pkt->buf_len = s->frag_bytes = frame_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), s->frag_bytes); - } - else { + } else { ci_assert(s->frag_pkt != NULL); ci_assert_gt(s->frag_bytes, 0); ci_assert_gt(frame_bytes, s->frag_bytes); @@ -976,9 +963,8 @@ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, if( flags & EF_EVENT_FLAG_CONT ) { /* Middle fragment. */ pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; - } - else { + s->frag_pkt = pkt; + } else { /* Last fragment. */ handle_rx_scatter_last_frag(ni, s, pkt); } @@ -994,10 +980,9 @@ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, * when we receive the SOP. */ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, - ci_ip_pkt_fmt* pkt, int prefix_bytes, - ef_vi* vi, unsigned flags) + ci_ip_pkt_fmt* pkt, int prefix_bytes, ef_vi* vi, unsigned flags) { - int full_buffer = ef_vi_receive_buffer_len(vi); + int full_buffer = ef_vi_receive_buffer_len(vi); uint16_t pkt_bytes; s->rx_pkt = NULL; @@ -1011,10 +996,9 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, /* The packet prefix is present in the first buffer */ pkt->buf_len = full_buffer - prefix_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->buf_len); - s->frag_pkt = pkt; + s->frag_pkt = pkt; s->frag_bytes = pkt_bytes; - } - else { + } else { ci_assert(s->frag_pkt != NULL); ci_assert_gt(s->frag_bytes, full_buffer - prefix_bytes); @@ -1026,9 +1010,8 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, CI_DEBUG(pkt->pay_len = -1); pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; - } - else { + s->frag_pkt = pkt; + } else { /* Last fragment. */ /* The first buffer contains a prefix, but all intervening buffers are * are filled, so this contains whatever's leftover. @@ -1043,12 +1026,11 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, } - static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt, int frame_len) + ci_ip_pkt_fmt* pkt, int frame_len) { - int ip_paylen; - int ip_proto; + int ip_paylen; + int ip_proto; ci_uint16 ether_type; /* Packet reached onload -- so must be IP and must at least reach the TCP @@ -1062,25 +1044,24 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, * start touching it. */ if( pkt->pay_len < oo_pre_l3_len(pkt) + sizeof(ci_ip4_hdr) ) { CI_IPV4_STATS_INC_IN_HDR_ERRS(ni); - LOG_U(log(FN_FMT "BAD frame_len=%d", - FN_PRI_ARGS(ni), pkt->pay_len)); + LOG_U(log(FN_FMT "BAD frame_len=%d", FN_PRI_ARGS(ni), pkt->pay_len)); goto drop; } - ether_type = *((ci_uint16*)oo_l3_hdr(pkt) - 1); + ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); - if(CI_LIKELY( ether_type == CI_ETHERTYPE_IP )) { - ci_ip4_hdr *ip = oo_ip_hdr(pkt); - int ip_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - ip_paylen = ip_len - CI_IP4_IHL(ip); - ip_proto = ip->ip_protocol; + if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP) ) { + ci_ip4_hdr* ip = oo_ip_hdr(pkt); + int ip_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); + ip_paylen = ip_len - CI_IP4_IHL(ip); + ip_proto = ip->ip_protocol; #if CI_CFG_IPV6 - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; #endif - if( ip_paylen <= 0 || pkt->pay_len < oo_pre_l3_len(pkt) + ip_len ){ + if( ip_paylen <= 0 || pkt->pay_len < oo_pre_l3_len(pkt) + ip_len ) { CI_IPV4_STATS_INC_IN_HDR_ERRS(ni); - LOG_U(log(FN_FMT "BAD ip_len=%d frame_len=%d", - FN_PRI_ARGS(ni), ip_len, pkt->pay_len)); + LOG_U(log(FN_FMT "BAD ip_len=%d frame_len=%d", FN_PRI_ARGS(ni), ip_len, + pkt->pay_len)); goto drop; } @@ -1092,16 +1073,16 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, } #if CI_CFG_IPV6 else if( ether_type == CI_ETHERTYPE_IP6 ) { - ci_ip6_hdr *ip = oo_ip6_hdr(pkt); - ip_paylen = CI_BSWAP_BE16(ip->payload_len); - ip_proto = ip->next_hdr; + ci_ip6_hdr* ip = oo_ip6_hdr(pkt); + ip_paylen = CI_BSWAP_BE16(ip->payload_len); + ip_proto = ip->next_hdr; pkt->flags |= CI_PKT_FLAG_IS_IP6; if( ip_paylen <= 0 || pkt->pay_len < oo_pre_l3_len(pkt) + sizeof(ci_ip6_hdr) + ip_paylen ) { CI_IP_STATS_INC_IN6_HDR_ERRS(ni); - LOG_U(log(FN_FMT "BAD frame_len=%d or IPv6 paylen=%d", - FN_PRI_ARGS(ni), pkt->pay_len, ip_paylen)); + LOG_U(log(FN_FMT "BAD frame_len=%d or IPv6 paylen=%d", FN_PRI_ARGS(ni), + pkt->pay_len, ip_paylen)); goto drop; } @@ -1110,7 +1091,7 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, #endif else { LOG_FL(unexpected_rx_log_flag(pkt), - log(FN_FMT "BAD frame ether_type=%d", FN_PRI_ARGS(ni), ether_type)); + log(FN_FMT "BAD frame ether_type=%d", FN_PRI_ARGS(ni), ether_type)); goto drop; } @@ -1120,35 +1101,31 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, if( ip_paylen < sizeof(ci_tcp_hdr) ) { LOG_U(log(FN_FMT "BAD TCP ip_paylen=%d", FN_PRI_ARGS(ni), ip_paylen)); goto drop; - } - else if( ci_tcp_csum_correct(pkt, ip_paylen) ) { + } else if( ci_tcp_csum_correct(pkt, ip_paylen) ) { CI_DEBUG(pkt->pkt_eth_payload_off = PKT_START_OFF_BAD); __handle_rx_pkt(ni, ps, &pkt); return 1; - } - else { - LOG_U(log(FN_FMT "BAD TCP CHECKSUM %04x "PKT_DBG_FMT, FN_PRI_ARGS(ni), - (unsigned) PKT_IPX_TCP_HDR(oo_pkt_af(pkt), pkt)->tcp_check_be16, - PKT_DBG_ARGS(pkt))); + } else { + LOG_U(log(FN_FMT "BAD TCP CHECKSUM %04x " PKT_DBG_FMT, FN_PRI_ARGS(ni), + (unsigned) PKT_IPX_TCP_HDR(oo_pkt_af(pkt), pkt)->tcp_check_be16, + PKT_DBG_ARGS(pkt))); goto drop; } - } - else if( ip_proto == IPPROTO_UDP ) { + } else if( ip_proto == IPPROTO_UDP ) { ci_udp_hdr* udp = PKT_IPX_UDP_HDR(oo_pkt_af(pkt), pkt); - pkt->pf.udp.pay_len = CI_BSWAP_BE16(udp->udp_len_be16) - sizeof(ci_udp_hdr); + pkt->pf.udp.pay_len = + CI_BSWAP_BE16(udp->udp_len_be16) - sizeof(ci_udp_hdr); if( ip_paylen < sizeof(ci_udp_hdr) ) { LOG_U(log(FN_FMT "BAD UDP ip_paylen=%d", FN_PRI_ARGS(ni), ip_paylen)); goto drop; - } - else if( ci_udp_csum_correct(pkt, udp) ) { + } else if( ci_udp_csum_correct(pkt, udp) ) { CI_DEBUG(pkt->pkt_eth_payload_off = PKT_START_OFF_BAD); __handle_rx_pkt(ni, ps, &pkt); return 1; - } - else { + } else { CI_UDP_STATS_INC_IN_ERRS(ni); LOG_U(log(FN_FMT "BAD UDP CHECKSUM %04x", FN_PRI_ARGS(ni), - (unsigned) udp->udp_check_be16)); + (unsigned) udp->udp_check_be16)); goto drop; } } @@ -1162,16 +1139,15 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, static void discard_rx_multi_pkts(ci_netif* ni, struct ci_netif_poll_state* ps, - int intf_i, struct oo_rx_state* s, - int frame_len, unsigned discard_flags, - ci_ip_pkt_fmt* pkt) + int intf_i, struct oo_rx_state* s, int frame_len, unsigned discard_flags, + ci_ip_pkt_fmt* pkt) { int is_frag = OO_PP_NOT_NULL(pkt->frag_next); int handled = 0; LOG_FL(unexpected_rx_log_flag(pkt), - log(LPF "[%d] intf %d discard RX_MULTI_PKTS 0x%x", - NI_ID(ni), intf_i, discard_flags)); + log(LPF "[%d] intf %d discard RX_MULTI_PKTS 0x%x", NI_ID(ni), intf_i, + discard_flags)); /* Previous packet is already handled, s->rx_pkt can contain only current * packet. Fragmented packet must be processed and linked, i.e. it is in @@ -1182,23 +1158,23 @@ static void discard_rx_multi_pkts(ci_netif* ni, struct ci_netif_poll_state* ps, /* Fragmented packets cannot be processed by handle_rx_csum_bad(). * See also comment in __handle_rx_discard(). */ - if( (discard_flags & (EF_VI_DISCARD_RX_L3_CSUM_ERR | - EF_VI_DISCARD_RX_L4_CSUM_ERR)) && - !is_frag ) + if( (discard_flags & + (EF_VI_DISCARD_RX_L3_CSUM_ERR | EF_VI_DISCARD_RX_L4_CSUM_ERR)) && + ! is_frag ) handled = handle_rx_csum_bad(ni, ps, pkt, frame_len); if( discard_flags & EF_VI_DISCARD_RX_ETH_LEN_ERR ) CITP_STATS_NETIF_INC(ni, rx_discard_len_err); else if( discard_flags & EF_VI_DISCARD_RX_ETH_FCS_ERR ) CITP_STATS_NETIF_INC(ni, rx_discard_crc_bad); - else if( discard_flags & (EF_VI_DISCARD_RX_L3_CSUM_ERR | - EF_VI_DISCARD_RX_L4_CSUM_ERR) ) + else if( discard_flags & + (EF_VI_DISCARD_RX_L3_CSUM_ERR | EF_VI_DISCARD_RX_L4_CSUM_ERR) ) CITP_STATS_NETIF_INC(ni, rx_discard_csum_bad); - if( !handled ) { + if( ! handled ) { if( oo_tcpdump_check(ni, pkt, pkt->intf_i) ) { - pkt->pay_len = frame_len; - oo_tcpdump_dump_pkt(ni, pkt); + pkt->pay_len = frame_len; + oo_tcpdump_dump_pkt(ni, pkt); } ci_netif_pkt_release_rx_1ref(ni, pkt); @@ -1206,10 +1182,11 @@ static void discard_rx_multi_pkts(ci_netif* ni, struct ci_netif_poll_state* ps, } -static ci_ip_pkt_fmt* rx_multi_get_next_desc(ci_netif* ni, ef_vi* vi, int intf_i) +static ci_ip_pkt_fmt* rx_multi_get_next_desc( + ci_netif* ni, ef_vi* vi, int intf_i) { - ef_request_id di; - oo_pkt_p pp; + ef_request_id di; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; di = ef_vi_rxq_next_desc_id(vi); @@ -1221,14 +1198,13 @@ static ci_ip_pkt_fmt* rx_multi_get_next_desc(ci_netif* ni, ef_vi* vi, int intf_i static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, - int prefix_bytes, - ef_vi* vi, int intf_i, - struct ci_netif_poll_state* ps, int q_id) + int prefix_bytes, ef_vi* vi, int intf_i, struct ci_netif_poll_state* ps, + int q_id) { - int full_buffer = ef_vi_receive_buffer_len(vi); - uint16_t pkt_bytes, total_bytes, cur_bytes; + int full_buffer = ef_vi_receive_buffer_len(vi); + uint16_t pkt_bytes, total_bytes, cur_bytes; ci_ip_pkt_fmt* pkt; - unsigned discard_flags; + unsigned discard_flags; pkt = rx_multi_get_next_desc(ni, vi, intf_i); @@ -1239,7 +1215,7 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, pkt->q_id = q_id; { uint32_t mark; - uint8_t flag; + uint8_t flag; ef_vi_receive_get_user_data(vi, pkt->dma_start, &mark, &flag); pkt->pf.tcp_rx.lo.rx_sock = mark; /* Asserting this solely so that a more efficient assignment can be done. @@ -1250,7 +1226,8 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, * this is OK, because the plugin itself verified the checksum before * handling the packet, and the path from the plugin to Onload is assumed * to be error-free. */ - if( ci_tcp_plugin_elided_payload(pkt) || ci_tcp_plugin_tcp_app_packet(pkt) ) + if( ci_tcp_plugin_elided_payload(pkt) || + ci_tcp_plugin_tcp_app_packet(pkt) ) discard_flags = 0; } #endif @@ -1258,7 +1235,7 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, /* if 1 pkt = 1 desc */ if( total_bytes <= full_buffer ) { /* Whole packet in a single buffer. */ - if(CI_UNLIKELY( discard_flags != 0 )) { + if( CI_UNLIKELY(discard_flags != 0) ) { discard_rx_multi_pkts(ni, ps, intf_i, s, pkt_bytes, discard_flags, pkt); return; } @@ -1271,30 +1248,30 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, s->rx_pkt = NULL; /* - First fragment of packet - */ ci_assert(s->frag_pkt == NULL); - ci_assert_gt(total_bytes, full_buffer ); + ci_assert_gt(total_bytes, full_buffer); /* The packet prefix is present in the first buffer */ pkt->buf_len = full_buffer - prefix_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->buf_len); - s->frag_pkt = pkt; + s->frag_pkt = pkt; s->frag_bytes = pkt_bytes; - cur_bytes = full_buffer; + cur_bytes = full_buffer; while( total_bytes - cur_bytes > full_buffer ) { /* - Middle fragments - */ - pkt = rx_multi_get_next_desc(ni, vi, intf_i); + pkt = rx_multi_get_next_desc(ni, vi, intf_i); /* Middle fragments are completely filled, and don't contain a prefix */ pkt->buf_len = full_buffer; oo_offbuf_init(&pkt->buf, pkt->dma_start, pkt->buf_len); CI_DEBUG(pkt->pay_len = -1); pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; + s->frag_pkt = pkt; cur_bytes += full_buffer; } /* - Last fragment - */ - pkt = rx_multi_get_next_desc(ni, vi, intf_i); + pkt = rx_multi_get_next_desc(ni, vi, intf_i); /* The first buffer contains a prefix, but all intervening buffers are * are filled, so this contains whatever's leftover. */ @@ -1304,25 +1281,26 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, handle_rx_scatter_last_frag(ni, s, pkt); - if(CI_UNLIKELY( discard_flags != 0 )) { - /* Discard the fragmented packet in the end of processing to unbundle RxQ */ - discard_rx_multi_pkts(ni, ps, intf_i, s, pkt_bytes, discard_flags, s->rx_pkt); + if( CI_UNLIKELY(discard_flags != 0) ) { + /* Discard the fragmented packet in the end of processing to unbundle RxQ + */ + discard_rx_multi_pkts( + ni, ps, intf_i, s, pkt_bytes, discard_flags, s->rx_pkt); } } static void handle_rx_no_desc_trunc(ci_netif* ni, - struct ci_netif_poll_state* ps, - int intf_i, - struct oo_rx_state* s, ef_event ev) + struct ci_netif_poll_state* ps, int intf_i, struct oo_rx_state* s, + ef_event ev) { - LOG_U(log(LPF "[%d] intf %d RX_NO_DESC_TRUNC "EF_EVENT_FMT, - NI_ID(ni), intf_i, EF_EVENT_PRI_ARG(ev))); + LOG_U(log(LPF "[%d] intf %d RX_NO_DESC_TRUNC " EF_EVENT_FMT, NI_ID(ni), + intf_i, EF_EVENT_PRI_ARG(ev))); __handle_rx_pkt(ni, ps, &s->rx_pkt); s->rx_pkt = NULL; ci_assert(s->frag_pkt != NULL); - if( s->frag_pkt != NULL ) { /* belt and braces! */ + if( s->frag_pkt != NULL ) { /* belt and braces! */ ci_netif_pkt_release_rx_1ref(ni, s->frag_pkt); s->frag_pkt = NULL; } @@ -1330,16 +1308,15 @@ static void handle_rx_no_desc_trunc(ci_netif* ni, static void __handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, - int intf_i, struct oo_rx_state* s, ef_event ev, - int frame_len, int discard_type, oo_pkt_p pp) + int intf_i, struct oo_rx_state* s, ef_event ev, int frame_len, + int discard_type, oo_pkt_p pp) { - int is_frag; + int is_frag; ci_ip_pkt_fmt* pkt; - int handled = 0; + int handled = 0; - LOG_U(log(LPF "[%d] intf %d RX_DISCARD %d "EF_EVENT_FMT, - NI_ID(ni), intf_i, - (int) discard_type, EF_EVENT_PRI_ARG(ev))); + LOG_U(log(LPF "[%d] intf %d RX_DISCARD %d " EF_EVENT_FMT, NI_ID(ni), intf_i, + (int) discard_type, EF_EVENT_PRI_ARG(ev))); __handle_rx_pkt(ni, ps, &s->rx_pkt); s->rx_pkt = NULL; @@ -1360,43 +1337,43 @@ static void __handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, pkt = PKT_CHK(ni, pp); - if( discard_type == EF_EVENT_RX_DISCARD_CSUM_BAD && !is_frag ) + if( discard_type == EF_EVENT_RX_DISCARD_CSUM_BAD && ! is_frag ) handled = handle_rx_csum_bad(ni, ps, pkt, frame_len); - + switch( discard_type ) { - case EF_EVENT_RX_DISCARD_CSUM_BAD: - CITP_STATS_NETIF_INC(ni, rx_discard_csum_bad); - break; - case EF_EVENT_RX_DISCARD_INNER_CSUM_BAD: - CITP_STATS_NETIF_INC(ni, rx_discard_inner_csum_bad); - break; - case EF_EVENT_RX_DISCARD_MCAST_MISMATCH: - CITP_STATS_NETIF_INC(ni, rx_discard_mcast_mismatch); - break; - case EF_EVENT_RX_DISCARD_CRC_BAD: - CITP_STATS_NETIF_INC(ni, rx_discard_crc_bad); - break; - case EF_EVENT_RX_DISCARD_TRUNC: - CITP_STATS_NETIF_INC(ni, rx_discard_trunc); - break; - case EF_EVENT_RX_DISCARD_RIGHTS: - CITP_STATS_NETIF_INC(ni, rx_discard_rights); - break; - case EF_EVENT_RX_DISCARD_OTHER: - CITP_STATS_NETIF_INC(ni, rx_discard_other); - break; + case EF_EVENT_RX_DISCARD_CSUM_BAD: + CITP_STATS_NETIF_INC(ni, rx_discard_csum_bad); + break; + case EF_EVENT_RX_DISCARD_INNER_CSUM_BAD: + CITP_STATS_NETIF_INC(ni, rx_discard_inner_csum_bad); + break; + case EF_EVENT_RX_DISCARD_MCAST_MISMATCH: + CITP_STATS_NETIF_INC(ni, rx_discard_mcast_mismatch); + break; + case EF_EVENT_RX_DISCARD_CRC_BAD: + CITP_STATS_NETIF_INC(ni, rx_discard_crc_bad); + break; + case EF_EVENT_RX_DISCARD_TRUNC: + CITP_STATS_NETIF_INC(ni, rx_discard_trunc); + break; + case EF_EVENT_RX_DISCARD_RIGHTS: + CITP_STATS_NETIF_INC(ni, rx_discard_rights); + break; + case EF_EVENT_RX_DISCARD_OTHER: + CITP_STATS_NETIF_INC(ni, rx_discard_other); + break; } - if( !handled ) { + if( ! handled ) { /* Only dump the packet if the NIC actually delivered it */ if( (discard_type == EF_EVENT_RX_DISCARD_CSUM_BAD || - discard_type == EF_EVENT_RX_DISCARD_MCAST_MISMATCH || - discard_type == EF_EVENT_RX_DISCARD_CRC_BAD || - discard_type == EF_EVENT_RX_DISCARD_TRUNC || - discard_type == EF_EVENT_RX_DISCARD_OTHER) && + discard_type == EF_EVENT_RX_DISCARD_MCAST_MISMATCH || + discard_type == EF_EVENT_RX_DISCARD_CRC_BAD || + discard_type == EF_EVENT_RX_DISCARD_TRUNC || + discard_type == EF_EVENT_RX_DISCARD_OTHER) && oo_tcpdump_check(ni, pkt, pkt->intf_i) ) { - pkt->pay_len = frame_len; - oo_tcpdump_dump_pkt(ni, pkt); + pkt->pay_len = frame_len; + oo_tcpdump_dump_pkt(ni, pkt); } ci_netif_pkt_release_rx_1ref(ni, pkt); @@ -1405,11 +1382,11 @@ static void __handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, static void handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, - int intf_i, struct oo_rx_state* s, ef_event ev) + int intf_i, struct oo_rx_state* s, ef_event ev) { int discard_type = EF_EVENT_RX_DISCARD_TYPE(ev); - int frame_len = EF_EVENT_RX_DISCARD_BYTES(ev) - - ci_netif_vi(ni, intf_i)->rx_prefix_len; + int frame_len = + EF_EVENT_RX_DISCARD_BYTES(ev) - ci_netif_vi(ni, intf_i)->rx_prefix_len; oo_pkt_p pp; OO_PP_INIT(ni, pp, EF_EVENT_RX_DISCARD_RQ_ID(ev)); @@ -1418,13 +1395,12 @@ static void handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, static void handle_rx_multi_discard(ci_netif* ni, - struct ci_netif_poll_state* ps, int intf_i, - struct oo_rx_state* s, ef_event ev, - ef_request_id id, ef_vi* vi) + struct ci_netif_poll_state* ps, int intf_i, struct oo_rx_state* s, + ef_event ev, ef_request_id id, ef_vi* vi) { - int discard_type = EF_EVENT_RX_MULTI_DISCARD_TYPE(ev); - uint16_t frame_len; - oo_pkt_p pp; + int discard_type = EF_EVENT_RX_MULTI_DISCARD_TYPE(ev); + uint16_t frame_len; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; OO_PP_INIT(ni, pp, id); @@ -1449,8 +1425,8 @@ static void process_post_poll_list(ci_netif* ni) struct oo_p_dllink_state lnk; struct oo_p_dllink_state tmp_lnk; struct oo_p_dllink_state post_poll_list = - oo_p_dllink_ptr(ni, &ni->state->post_poll_list); - int need_wake = 0; + oo_p_dllink_ptr(ni, &ni->state->post_poll_list); + int need_wake = 0; citp_waitable* sb; #if CI_CFG_EPOLL3 int lists_need_wake = 0; @@ -1459,9 +1435,10 @@ static void process_post_poll_list(ci_netif* ni) int i = 0; #endif - oo_p_dllink_for_each_safe(ni, lnk, tmp_lnk, post_poll_list) { + oo_p_dllink_for_each_safe(ni, lnk, tmp_lnk, post_poll_list) + { #ifdef __KERNEL__ - if(CI_UNLIKELY( i++ > ni->ep_tbl_n )) { + if( CI_UNLIKELY(i++ > ni->ep_tbl_n) ) { ci_netif_error_detected(ni, CI_NETIF_ERROR_POST_POLL_LIST, __FUNCTION__); return; } @@ -1487,16 +1464,14 @@ static void process_post_poll_list(ci_netif* ni) if( ! (sb->sb_flags & sb->wake_request) ) { sb->sb_flags = 0; - } - else { + } else { #ifdef __KERNEL__ /* In realtime kernel, citp_waitable_wakeup() from NAPI context is * harmful */ - if( !((ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT) && - oo_avoid_wakeup_from_dl()) ) { + if( ! ((ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT) && + oo_avoid_wakeup_from_dl()) ) { citp_waitable_wakeup(ni, sb); - } - else + } else #endif { /* Leave endpoints that need waking on the post-poll list so they can @@ -1524,14 +1499,15 @@ static void process_post_poll_list(ci_netif* ni) #if CI_CFG_EPOLL3 /* Shouldn't have had a wake for a list we don't think exists */ - ci_assert_equal(lists_need_wake & ~((1 << CI_CFG_N_READY_LISTS)-1), 0); + ci_assert_equal(lists_need_wake & ~((1 << CI_CFG_N_READY_LISTS) - 1), 0); #ifndef __KERNEL__ /* See if any of the ready lists need a wake. We only bother checking if * we're not going to do a wake anyway. */ if( need_wake == 0 && lists_need_wake != 0 ) { - CI_READY_LIST_EACH(lists_need_wake, lists_need_wake, i) { + CI_READY_LIST_EACH(lists_need_wake, lists_need_wake, i) + { if( ni->state->ready_list_flags[i] & CI_NI_READY_LIST_FLAG_WAKE ) { need_wake = 1; break; @@ -1548,7 +1524,8 @@ static void process_post_poll_list(ci_netif* ni) #ifdef __KERNEL__ /* Check whether any ready lists associated with a set need to be woken. */ - CI_READY_LIST_EACH(lists_need_wake, lists_need_wake, i) { + CI_READY_LIST_EACH(lists_need_wake, lists_need_wake, i) + { if( (lists_need_wake & (1 << i)) && (ni->state->ready_list_flags[i] & CI_NI_READY_LIST_FLAG_WAKE) ) efab_tcp_helper_ready_list_wakeup(netif2tcp_helper_resource(ni), i); @@ -1558,7 +1535,7 @@ static void process_post_poll_list(ci_netif* ni) } -#define UDP_CAN_FREE(us) ((us)->tx_count == 0) +#define UDP_CAN_FREE(us) ((us)->tx_count == 0) #if CI_CFG_TCP_OFFLOAD_RECYCLER #define CI_NETIF_RX_VI(ni, nic_i, label) (&(ni)->nic_hw[(nic_i)].vis[(label)]) @@ -1567,15 +1544,14 @@ static void process_post_poll_list(ci_netif* ni) * vi index known to be a constant so it's more optimisable */ #define CI_NETIF_RX_VI(ni, nic_i, label) (&(ni)->nic_hw[(nic_i)].vis[0]) #endif -#define CI_NETIF_TX_VI CI_NETIF_RX_VI +#define CI_NETIF_TX_VI CI_NETIF_RX_VI -static void ci_netif_tx_pkt_complete_udp(ci_netif* netif, - struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt) +static void ci_netif_tx_pkt_complete_udp( + ci_netif* netif, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { ci_udp_state* us; - oo_pkt_p frag_next; + oo_pkt_p frag_next; #ifndef NDEBUG { @@ -1598,10 +1574,9 @@ static void ci_netif_tx_pkt_complete_udp(ci_netif* netif, * and we do the same. */ ci_udp_wake_possibly_not_in_poll(netif, us, CI_SB_FLAG_WAKE_TX); ci_netif_put_on_post_poll(netif, &us->s.b); - } - else if( UDP_CAN_FREE(us) ) { - oo_p_dllink_del_init(netif, oo_p_dllink_sb(netif, &us->s.b, - &us->s.b.post_poll_link)); + } else if( UDP_CAN_FREE(us) ) { + oo_p_dllink_del_init( + netif, oo_p_dllink_sb(netif, &us->s.b, &us->s.b.post_poll_link)); ci_udp_state_free(netif, us); } } @@ -1633,9 +1608,8 @@ static void ci_netif_tx_pkt_complete_udp(ci_netif* netif, } -static void ci_netif_rx_pkt_complete_tcp(ci_netif* ni, - struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt) +static void ci_netif_rx_pkt_complete_tcp( + ci_netif* ni, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { #if CI_CFG_TIMESTAMPING if( pkt->flags & (CI_PKT_FLAG_TX_TIMESTAMPED | CI_PKT_FLAG_INDIRECT) ) { @@ -1644,11 +1618,11 @@ static void ci_netif_rx_pkt_complete_tcp(ci_netif* ni, * ci_tcp_poll_timestamp_q_nonempty() to have changed. If so, we need to * wake. The above if() is technically lax, but it's a very quick way of * detecting when we can avoid the rest of this code. */ - oo_sp sp = pkt->pf.tcp_tx.sock_id; + oo_sp sp = pkt->pf.tcp_tx.sock_id; citp_waitable_obj* wo = SP_TO_WAITABLE_OBJ(ni, sp); if( wo->waitable.state & CI_TCP_STATE_TCP_CONN ) { - ci_tcp_state* ts = &wo->tcp; - unsigned n_bufs = 0; + ci_tcp_state* ts = &wo->tcp; + unsigned n_bufs = 0; ci_ip_pkt_fmt* pp; /* The socket may have been closed (and even reopened) by the time we @@ -1676,14 +1650,13 @@ static void ci_netif_rx_pkt_complete_tcp(ci_netif* ni, ci_inline void __ci_netif_tx_pkt_complete(ci_netif* ni, - struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt, ef_event* ev) + struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt, ef_event* ev) { ci_netif_state_nic_t* nic = &ni->state->nic[pkt->intf_i]; /* debug check - take back ownership of buffer from NIC */ ci_assert(pkt->flags & CI_PKT_FLAG_TX_PENDING); nic->tx_bytes_removed += TX_PKT_LEN(pkt); - ci_assert((int) (nic->tx_bytes_added - nic->tx_bytes_removed) >=0); + ci_assert((int) (nic->tx_bytes_added - nic->tx_bytes_removed) >= 0); #if CI_CFG_PIO if( pkt->pio_addr >= 0 ) { ci_pio_buddy_free(ni, &nic->pio_buddy, pkt->pio_addr, pkt->pio_order); @@ -1693,32 +1666,30 @@ ci_inline void __ci_netif_tx_pkt_complete(ci_netif* ni, #if CI_CFG_TIMESTAMPING if( pkt->flags & CI_PKT_FLAG_TX_TIMESTAMPED ) { if( ev != NULL && EF_EVENT_TYPE(*ev) == EF_EVENT_TYPE_TX_WITH_TIMESTAMP ) { - int opt_tsf = ((NI_OPTS(ni).timestamping_reporting) & - CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) ? - EF_VI_SYNC_FLAG_CLOCK_IN_SYNC : - EF_VI_SYNC_FLAG_CLOCK_SET; - int pkt_tsf = EF_EVENT_TX_WITH_TIMESTAMP_SYNC_FLAGS(*ev); + int opt_tsf = ((NI_OPTS(ni).timestamping_reporting) & + CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) + ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC + : EF_VI_SYNC_FLAG_CLOCK_SET; + int pkt_tsf = EF_EVENT_TX_WITH_TIMESTAMP_SYNC_FLAGS(*ev); pkt->hw_stamp.tv_sec = EF_EVENT_TX_WITH_TIMESTAMP_SEC(*ev); pkt->hw_stamp.tv_nsec = - (EF_EVENT_TX_WITH_TIMESTAMP_NSEC(*ev) & - (~CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC)) | - ((pkt_tsf & opt_tsf) ? - CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC : 0); - } - else if( ev == NULL ) { + (EF_EVENT_TX_WITH_TIMESTAMP_NSEC(*ev) & + (~CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC)) | + ((pkt_tsf & opt_tsf) ? CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC : 0); + } else if( ev == NULL ) { /* This is NIC reset. The TIMESTAMPED flag needs to stay * to ensure client is notified of missing timestamp - * important to keep TCP timestamps in sync with * TCP stream */ - pkt->hw_stamp.tv_sec = 0; + pkt->hw_stamp.tv_sec = 0; pkt->hw_stamp.tv_nsec = 0; - } - else { + } else { if( CI_NETIF_TX_VI(ni, pkt->intf_i, ev->tx_timestamp.q_id)->vi_flags & EF_VI_TX_TIMESTAMPS ) { - ci_log("ERROR: TX timestamp requested, but non-timestamped " - "TX complete event received."); + ci_log( + "ERROR: TX timestamp requested, but non-timestamped " + "TX complete event received."); } pkt->flags &= ~CI_PKT_FLAG_TX_TIMESTAMPED; } @@ -1741,43 +1712,42 @@ ci_inline void __ci_netif_tx_pkt_complete(ci_netif* ni, } #endif - pkt->flags &=~ CI_PKT_FLAG_TX_PENDING; + pkt->flags &= ~CI_PKT_FLAG_TX_PENDING; if( pkt->flags & CI_PKT_FLAG_UDP ) ci_netif_tx_pkt_complete_udp(ni, ps, pkt); else ci_netif_rx_pkt_complete_tcp(ni, ps, pkt); - } -void ci_netif_tx_pkt_complete(ci_netif* ni, struct ci_netif_poll_state* ps, - ci_ip_pkt_fmt* pkt) +void ci_netif_tx_pkt_complete( + ci_netif* ni, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { __ci_netif_tx_pkt_complete(ni, ps, pkt, NULL); } -static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, - int intf_i, int n_evs) +static int ci_netif_poll_evq( + ci_netif* ni, struct ci_netif_poll_state* ps, int intf_i, int n_evs) { struct oo_rx_state s; - ef_vi* evq = ci_netif_vi(ni, intf_i); - unsigned total_evs = 0; - ci_ip_pkt_fmt* pkt; - ef_event *ev = ni->state->events; - int i; - oo_pkt_p pp; - int completed_tx = 0; + ef_vi* evq = ci_netif_vi(ni, intf_i); + unsigned total_evs = 0; + ci_ip_pkt_fmt* pkt; + ef_event* ev = ni->state->events; + int i; + oo_pkt_p pp; + int completed_tx = 0; #ifdef OO_HAS_POLL_IN_KERNEL int poll_in_kernel; #endif - s.frag_pkt = NULL; - s.frag_bytes = 0; /*??*/ + s.frag_pkt = NULL; + s.frag_bytes = 0; /*??*/ if( OO_PP_NOT_NULL(ni->state->nic[intf_i].rx_frags) ) { pkt = PKT_CHK(ni, ni->state->nic[intf_i].rx_frags); ni->state->nic[intf_i].rx_frags = OO_PP_NULL; - s.frag_pkt = pkt; - s.frag_bytes = pkt->pay_len; + s.frag_pkt = pkt; + s.frag_bytes = pkt->pay_len; CI_DEBUG(pkt->pay_len = -1); } @@ -1794,8 +1764,7 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, n_evs = 0; if( ci_netif_intf_has_event(ni, intf_i) ) n_evs = ci_netif_evq_poll_k(ni, intf_i); - } - else + } else #endif n_evs = ef_eventq_poll(evq, ev, 16); /* The 16 above is a heuristic. We want a big number for efficiency, but @@ -1808,7 +1777,7 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, if( n_evs == 0 ) break; -have_events: + have_events: /* This loop is implemented with a 1 packet lag on processing (i.e. * __handle_rx_pkt() is called for the packet from the previous loop * iteration just as the next packet is being picked up, due to a @@ -1821,26 +1790,29 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, CITP_STATS_NETIF_INC(ni, rx_evs); OO_PP_INIT(ni, pp, EF_EVENT_RX_RQ_ID(ev[i])); pkt = PKT_CHK(ni, pp); - /* AF_XDP has potentially variable offset and this is taken it into account here, - * but we shouldn't touch pkt_start_off for ef10 case as it is used to calculate - * pkt_eth_payload_off properly. */ + /* AF_XDP has potentially variable offset and this is taken it into + * account here, but we shouldn't touch pkt_start_off for ef10 case as + * it is used to calculate pkt_eth_payload_off properly. */ if( evq->nic_type.arch == EF_VI_ARCH_AF_XDP ) { - pkt->pkt_start_off = ev[i].rx.ofs - - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start); + pkt->pkt_start_off = + ev[i].rx.ofs - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start); } ci_assert_equal(pkt->intf_i, intf_i); __handle_rx_pkt(ni, ps, &s.rx_pkt); - if( (ev[i].rx.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) - == EF_EVENT_FLAG_SOP ) { + if( (ev[i].rx.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) == + EF_EVENT_FLAG_SOP ) { /* Whole packet in a single buffer. */ pkt->pay_len = EF_EVENT_RX_BYTES(ev[i]) - evq->rx_prefix_len; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->pay_len); s.rx_pkt = pkt; - } - else { +#ifndef __KERNEL__ + /* This is a temporary hack to convert dpdk mbufs into the + * descriptors that onload expects. */ + ef_fill_rx_data(evq, PKT_START(pkt), i); +#endif + } else { handle_rx_scatter(ni, &s, pkt, - EF_EVENT_RX_BYTES(ev[i]) - evq->rx_prefix_len, - ev[i].rx.flags); + EF_EVENT_RX_BYTES(ev[i]) - evq->rx_prefix_len, ev[i].rx.flags); } } @@ -1857,10 +1829,10 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, efct_vi_rxpkt_release(evq, ev[i].rx_ref.pkt_id); } - else if(CI_LIKELY( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_TX )) { - ef_request_id *ids = ni->tx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_TX_VI(ni, intf_i, ev[i].tx.q_id); + else if( CI_LIKELY(EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_TX) ) { + ef_request_id* ids = ni->tx_events; + int n_ids, j; + ef_vi* vi = CI_NETIF_TX_VI(ni, intf_i, ev[i].tx.q_id); CITP_STATS_NETIF_INC(ni, tx_evs); n_ids = ef_vi_transmit_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); @@ -1875,9 +1847,9 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, } else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI ) { - ef_request_id *ids = ni->rx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); + ef_request_id* ids = ni->rx_events; + int n_ids, j; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); CITP_STATS_NETIF_INC(ni, rx_evs); n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); @@ -1890,32 +1862,32 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, ci_prefetch_ppc(pkt); ci_assert_equal(pkt->intf_i, intf_i); __handle_rx_pkt(ni, ps, &s.rx_pkt); - if( (ev[i].rx_multi.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) - == EF_EVENT_FLAG_SOP ) { + if( (ev[i].rx_multi.flags & + (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) == + EF_EVENT_FLAG_SOP ) { /* Whole packet in a single buffer. */ uint16_t len; ef_vi_receive_get_bytes(vi, pkt->dma_start, &len); pkt->pay_len = len; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->pay_len); s.rx_pkt = pkt; - } - else { - handle_rx_scatter_merge(ni, &s, pkt, evq->rx_prefix_len, vi, - ev[i].rx_multi.flags); + } else { + handle_rx_scatter_merge( + ni, &s, pkt, evq->rx_prefix_len, vi, ev[i].rx_multi.flags); } } } else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI_PKTS ) { - int j, n_pkts; - int q_id = ev[i].rx_multi_pkts.q_id; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, q_id); + int j, n_pkts; + int q_id = ev[i].rx_multi_pkts.q_id; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, q_id); CITP_STATS_NETIF_INC(ni, rx_evs); n_pkts = ev[i].rx_multi_pkts.n_pkts; for( j = 0; j < n_pkts; ++j ) { __handle_rx_pkt(ni, ps, &s.rx_pkt); - handle_rx_multi_pkts(ni, &s, evq->rx_prefix_len, vi, intf_i, ps, - q_id); + handle_rx_multi_pkts( + ni, &s, evq->rx_prefix_len, vi, intf_i, ps, q_id); } } @@ -1937,10 +1909,10 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, } else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI_DISCARD ) { - ef_request_id *ids = ni->rx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); - n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); + ef_request_id* ids = ni->rx_events; + int n_ids, j; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); + n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); ci_assert_le(n_ids, sizeof(ni->rx_events) / sizeof(ids[0])); total_evs += n_ids - 1; @@ -1951,22 +1923,21 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_REF_DISCARD ) { int pay_len = ev[i].rx_ref_discard.len; - pkt = alloc_rx_efct_pkt(ni, intf_i, pay_len); + pkt = alloc_rx_efct_pkt(ni, intf_i, pay_len); if( pkt ) { __handle_rx_pkt(ni, ps, &s.rx_pkt); copy_efct_to_pkt(ni, evq, ev[i].rx_ref.pkt_id, pkt); oo_offbuf_init(&pkt->buf, pkt->dma_start, pay_len); - discard_rx_multi_pkts(ni, ps, intf_i, &s, pay_len, - ev[i].rx_ref_discard.flags, pkt); + discard_rx_multi_pkts( + ni, ps, intf_i, &s, pay_len, ev[i].rx_ref_discard.flags, pkt); } efct_vi_rxpkt_release(evq, ev[i].rx_ref.pkt_id); } else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_TX_ERROR ) { - LOG_U(log(LPF "[%d] intf %d TX_ERROR %d "EF_EVENT_FMT, - NI_ID(ni), intf_i, - (int) EF_EVENT_TX_ERROR_TYPE(ev[i]), - EF_EVENT_PRI_ARG(ev[i]))); + LOG_U(log(LPF "[%d] intf %d TX_ERROR %d " EF_EVENT_FMT, NI_ID(ni), + intf_i, (int) EF_EVENT_TX_ERROR_TYPE(ev[i]), + EF_EVENT_PRI_ARG(ev[i]))); CITP_STATS_NETIF_INC(ni, tx_error_events); } @@ -1978,10 +1949,11 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, else { /* NB. If you see this for an RX event, then perhaps some code * which I thought was obsolete is needed. */ - ci_assert( EF_EVENT_TYPE(ev[i]) != EF_EVENT_TYPE_RX ); - LOG_E(log(LPF "***** UNKNOWN EVENT "EF_EVENT_FMT" (abstracted type:%d)" - " *****", - EF_EVENT_PRI_ARG(ev[i]), EF_EVENT_TYPE(ev[i]))); + ci_assert(EF_EVENT_TYPE(ev[i]) != EF_EVENT_TYPE_RX); + LOG_E( + log(LPF "***** UNKNOWN EVENT " EF_EVENT_FMT " (abstracted type:%d)" + " *****", + EF_EVENT_PRI_ARG(ev[i]), EF_EVENT_TYPE(ev[i]))); } } @@ -1989,12 +1961,12 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, if( CI_NETIF_TX_VI(ni, intf_i, 0)->nic_type.arch != EF_VI_ARCH_AF_XDP ) { int vi_i; int txq_level = 0; - for( vi_i = 0; vi_i < ci_netif_num_vis(ni); ++vi_i) + for( vi_i = 0; vi_i < ci_netif_num_vis(ni); ++vi_i ) txq_level += ef_vi_transmit_fill_level(&ni->nic_hw[intf_i].vis[vi_i]) + ni->state->nic[intf_i].dmaq[vi_i].num; - ci_assert_equiv(txq_level == 0, - (ni->state->nic[intf_i].tx_dmaq_insert_seq == - ni->state->nic[intf_i].tx_dmaq_done_seq)); + ci_assert_equiv( + txq_level == 0, (ni->state->nic[intf_i].tx_dmaq_insert_seq == + ni->state->nic[intf_i].tx_dmaq_done_seq)); } #endif @@ -2004,12 +1976,11 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, } while( total_evs < NI_OPTS(ni).evs_per_poll ); /* If we've drained the TXQ, we can start trying CTPIO again. */ - if( completed_tx && - ef_vi_transmit_fill_level(ci_netif_vi(ni, intf_i)) == 0 ) + if( completed_tx && ef_vi_transmit_fill_level(ci_netif_vi(ni, intf_i)) == 0 ) ci_netif_ctpio_resume(ni, intf_i); if( s.frag_pkt != NULL ) { - s.frag_pkt->pay_len = s.frag_bytes; + s.frag_pkt->pay_len = s.frag_bytes; ni->state->nic[intf_i].rx_frags = OO_PKT_P(s.frag_pkt); } @@ -2020,8 +1991,8 @@ static int ci_netif_poll_evq(ci_netif* ni, struct ci_netif_poll_state* ps, static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) { struct ci_netif_poll_state ps; - int total_evs = 0; - int rc; + int total_evs = 0; + int rc; #if defined(__KERNEL__) || ! defined(NDEBUG) if( ! ci_netif_may_poll_in_kernel(ni, intf_i) ) @@ -2030,15 +2001,14 @@ static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) ci_assert(ci_netif_is_locked(ni)); ps.tx_pkt_free_list_insert = &ps.tx_pkt_free_list; - ps.tx_pkt_free_list_n = 0; + ps.tx_pkt_free_list_n = 0; do { rc = ci_netif_poll_evq(ni, &ps, intf_i, 0); if( rc > 0 ) { total_evs += rc; process_post_poll_list(ni); - } - else + } else break; } while( total_evs < max_evs ); @@ -2068,20 +2038,22 @@ static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) #ifndef __KERNEL__ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) { - int i, rc = 0, status; - bool handle_future = false; - struct oo_rx_future future; - ci_uint64 now_frc, max_spin; - ef_vi* evq = ci_netif_vi(ni, intf_i); - ef_event* ev = ni->state->events; + int i, rc = 0, status; + bool handle_future = false; + struct oo_rx_future future; + ci_uint64 now_frc, max_spin; + ef_vi* evq = ci_netif_vi(ni, intf_i); + ef_event* ev = ni->state->events; struct ci_netif_poll_state ps; - ci_ip_pkt_fmt* pkt; - const uint8_t* dma; - int (*future_poll)(ef_vi* vi, ef_event* evs, int evs_len) = evq->ops.eventq_poll; + ci_ip_pkt_fmt* pkt; + const uint8_t* dma; + int (*future_poll)(ef_vi * vi, ef_event * evs, int evs_len) = + evq->ops.eventq_poll; /* Number of data bytes in the first cache line of efct packets */ - static const size_t efct_begin_len = CI_CACHE_LINE_SIZE - - (EFCT_RX_HEADER_NEXT_FRAME_LOC_1 & (CI_CACHE_LINE_SIZE - 1)); + static const size_t efct_begin_len = + CI_CACHE_LINE_SIZE - + (EFCT_RX_HEADER_NEXT_FRAME_LOC_1 & (CI_CACHE_LINE_SIZE - 1)); ci_assert(ci_netif_is_locked(ni)); ci_assert(ni->state->in_poll == 0); @@ -2098,8 +2070,7 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) return 0; memcpy(pkt->dma_start, dma, efct_begin_len); future_poll = efct_vi_rx_future_poll; - } - else { + } else { pkt = ci_netif_intf_next_rx_pkt(ni, evq); dma = pkt->dma_start; if( pkt == NULL ) @@ -2132,13 +2103,13 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) CITP_STATS_NETIF_INC(ni, rx_evs); ps.tx_pkt_free_list_insert = &ps.tx_pkt_free_list; - ps.tx_pkt_free_list_n = 0; + ps.tx_pkt_free_list_n = 0; /* We expect the completion event within a microsecond or so. The timeout * of 100us is to avoid wedging the stack in the case of hardware * failure/removal or a bug which prevents us getting the event. */ - max_spin = IPTIMER_STATE(ni)->khz / 10000; + max_spin = IPTIMER_STATE(ni)->khz / 10000; ci_prefetch(pkt->dma_start + CI_CACHE_LINE_SIZE); while( (rc = future_poll(evq, ev, EF_VI_EVENT_POLL_MIN_EVS)) == 0 ) { ci_frc64(&now_frc); @@ -2153,19 +2124,17 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) * platforms, there seems to be a small advantage to prefetching a couple * more at this point, ahead of copying the packet data. */ - for( i = 2; i < 5; ++i ) - ci_prefetch(dma + i * CI_CACHE_LINE_SIZE); + for( i = 2; i < 5; ++i ) ci_prefetch(dma + i * CI_CACHE_LINE_SIZE); ++ni->state->in_poll; if( EF_EVENT_TYPE(ev[0]) == EF_EVENT_TYPE_RX ) { ci_assert_equal(OO_PP_ID(OO_PKT_P(pkt)), EF_EVENT_RX_RQ_ID(ev[0])); - if( (ev[0].rx.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) - == EF_EVENT_FLAG_SOP ) { - pkt->pay_len = EF_EVENT_RX_BYTES(ev[0]) - evq->rx_prefix_len; + if( (ev[0].rx.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) == + EF_EVENT_FLAG_SOP ) { + pkt->pay_len = EF_EVENT_RX_BYTES(ev[0]) - evq->rx_prefix_len; handle_future = true; } - } - else if( EF_EVENT_TYPE(ev[0]) == EF_EVENT_TYPE_RX_REF ) { + } else if( EF_EVENT_TYPE(ev[0]) == EF_EVENT_TYPE_RX_REF ) { #ifndef NDEBUG { const void* pkt_start = efct_vi_rxpkt_get(evq, ev[0].rx_ref.pkt_id); @@ -2175,7 +2144,7 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) pkt->pay_len = ev[0].rx_ref.len; if( pkt->pay_len > efct_begin_len ) memcpy(pkt->dma_start + efct_begin_len, dma + efct_begin_len, - pkt->pay_len - efct_begin_len); + pkt->pay_len - efct_begin_len); get_efct_timestamp(ni, evq, ev[0].rx_ref.pkt_id, pkt); efct_vi_rxpkt_release(evq, ev[0].rx_ref.pkt_id); handle_future = true; @@ -2186,17 +2155,15 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->pay_len); handle_rx_post_future(ni, &ps, pkt, status, &future); - if(CI_UNLIKELY( rc > 1 )) { + if( CI_UNLIKELY(rc > 1) ) { /* We have handled the first event, so remove it from the array and * handle the rest normally. Add one to the returned count to include * the one handled here. */ - for( i = 1; i < rc; ++i ) - ev[i - 1] = ev[i]; + for( i = 1; i < rc; ++i ) ev[i - 1] = ev[i]; rc = 1 + ci_netif_poll_evq(ni, &ps, intf_i, rc - 1); } - } - else { + } else { CITP_STATS_NETIF_INC(ni, rx_future_rollback_event); rollback_rx_future(ni, pkt, status, &future); if( evq->nic_type.arch == EF_VI_ARCH_EFCT ) @@ -2224,42 +2191,39 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) void ci_netif_loopback_pkts_send(ci_netif* ni) { ci_ip_pkt_fmt* pkt; - oo_pkt_p send_list = OO_PP_ID_NULL; - ci_ipx_hdr_t* ip; - int af; + oo_pkt_p send_list = OO_PP_ID_NULL; + ci_ipx_hdr_t* ip; + int af; #ifdef __KERNEL__ int i = 0; #endif - CI_BUILD_ASSERT( - CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_tx.lo.rx_sock) == - CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_rx.lo.rx_sock) ); - CI_BUILD_ASSERT( - CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_tx.lo.tx_sock) == - CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_rx.lo.tx_sock) ); + CI_BUILD_ASSERT(CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_tx.lo.rx_sock) == + CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_rx.lo.rx_sock)); + CI_BUILD_ASSERT(CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_tx.lo.tx_sock) == + CI_MEMBER_OFFSET(ci_ip_pkt_fmt_prefix, tcp_rx.lo.tx_sock)); while( OO_PP_NOT_NULL(ni->state->looppkts) ) { #ifdef __KERNEL__ - if(CI_UNLIKELY( i++ > ni->pkt_sets_n * PKTS_PER_SET )) { + if( CI_UNLIKELY(i++ > ni->pkt_sets_n * PKTS_PER_SET) ) { ci_netif_error_detected(ni, CI_NETIF_ERROR_LOOP_PKTS_LIST, __FUNCTION__); return; } #endif - pkt = PKT_CHK(ni, ni->state->looppkts); + pkt = PKT_CHK(ni, ni->state->looppkts); ni->state->looppkts = pkt->next; - pkt->next = send_list; - send_list = OO_PKT_ID(pkt); + pkt->next = send_list; + send_list = OO_PKT_ID(pkt); } while( OO_PP_NOT_NULL(send_list) ) { - pkt = PKT_CHK(ni, send_list); + pkt = PKT_CHK(ni, send_list); send_list = pkt->next; ni->state->n_looppkts--; LOG_NR(ci_log(N_FMT "loopback RX pkt %d: %d->%d", N_PRI_ARGS(ni), - OO_PKT_FMT(pkt), - OO_SP_FMT(pkt->pf.tcp_tx.lo.tx_sock), - OO_SP_FMT(pkt->pf.tcp_tx.lo.rx_sock))); + OO_PKT_FMT(pkt), OO_SP_FMT(pkt->pf.tcp_tx.lo.tx_sock), + OO_SP_FMT(pkt->pf.tcp_tx.lo.rx_sock))); oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->buf_len); pkt->intf_i = OO_INTF_I_LOOPBACK; @@ -2272,16 +2236,16 @@ void ci_netif_loopback_pkts_send(ci_netif* ni) oo_tcpdump_dump_pkt(ni, pkt); pkt->next = OO_PP_NULL; #if CI_CFG_IPV6 - if( oo_pkt_ether_type(pkt) == CI_ETHERTYPE_IP6 ) - pkt->flags |= CI_PKT_FLAG_IS_IP6; - else - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + if( oo_pkt_ether_type(pkt) == CI_ETHERTYPE_IP6 ) + pkt->flags |= CI_PKT_FLAG_IS_IP6; + else + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; #endif ip = oo_ipx_hdr(pkt); af = oo_pkt_af(pkt); ci_tcp_handle_rx(ni, NULL, pkt, PKT_IPX_TCP_HDR(af, pkt), - ipx_hdr_tot_len(af, ip) - CI_IPX_IHL(af, ip)); + ipx_hdr_tot_len(af, ip) - CI_IPX_IHL(af, ip)); } } @@ -2313,15 +2277,16 @@ int ci_netif_poll_n(ci_netif* netif, int max_evs) if( ci_netif_need_timer_prime(netif, IPTIMER_STATE(netif)->frc) ) { if( NI_OPTS(netif).timer_usec != 0 ) OO_STACK_FOR_EACH_INTF_I(netif, intf_i) - ef_eventq_timer_prime(ci_netif_vi(netif, intf_i), - NI_OPTS(netif).timer_usec); + ef_eventq_timer_prime( + ci_netif_vi(netif, intf_i), NI_OPTS(netif).timer_usec); netif->state->evq_last_prime = IPTIMER_STATE(netif)->frc; } #endif ci_assert(netif->state->in_poll == 0); ++netif->state->in_poll; - OO_STACK_FOR_EACH_INTF_I(netif, intf_i) { + OO_STACK_FOR_EACH_INTF_I(netif, intf_i) + { int n = ci_netif_poll_intf(netif, intf_i, max_evs); ci_assert(n >= 0); n_evs_handled += n; @@ -2345,11 +2310,11 @@ int ci_netif_poll_n(ci_netif* netif, int max_evs) ci_assert_gt(netif->state->kernel_packets_pending, 0); if( netif->state->kernel_packets_pending >= - NI_OPTS(netif).kernel_packets_batch_size || + NI_OPTS(netif).kernel_packets_batch_size || frc - netif->state->kernel_packets_last_forwarded >= - netif->state->kernel_packets_cycles ) - ef_eplock_holder_set_flag(&netif->state->lock, - CI_EPLOCK_NETIF_KERNEL_PACKETS); + netif->state->kernel_packets_cycles ) + ef_eplock_holder_set_flag( + &netif->state->lock, CI_EPLOCK_NETIF_KERNEL_PACKETS); } #endif @@ -2365,16 +2330,16 @@ int ci_netif_poll_n(ci_netif* netif, int max_evs) * from the unlock hook only. */ if( oo_want_proactive_socket_allocation(netif) ) - ef_eplock_holder_set_flag(&netif->state->lock, - CI_EPLOCK_NETIF_NEED_SOCK_BUFS); + ef_eplock_holder_set_flag( + &netif->state->lock, CI_EPLOCK_NETIF_NEED_SOCK_BUFS); - if(CI_LIKELY( netif->state->rxq_low <= 1 )) + if( CI_LIKELY(netif->state->rxq_low <= 1) ) netif->state->mem_pressure &= ~OO_MEM_PRESSURE_LOW; else netif->state->mem_pressure |= OO_MEM_PRESSURE_LOW; /* ?? TODO: move this into an unlock flag. */ - if(CI_UNLIKELY( netif->state->mem_pressure & OO_MEM_PRESSURE_CRITICAL )) + if( CI_UNLIKELY(netif->state->mem_pressure & OO_MEM_PRESSURE_CRITICAL) ) if( ci_netif_mem_pressure_try_exit(netif) ) CITP_STATS_NETIF_INC(netif, memory_pressure_exit_poll); diff --git a/src/lib/transport/ip/netif_init.c b/src/lib/transport/ip/netif_init.c index dddda7ce1..9fd122142 100644 --- a/src/lib/transport/ip/netif_init.c +++ b/src/lib/transport/ip/netif_init.c @@ -45,24 +45,23 @@ const char* oo_uk_intf_ver = OO_UK_INTF_VER; *****************************************************************************/ - - #ifdef __KERNEL__ -#define assert_zero(x) ci_assert_equal((x), 0) +#define assert_zero(x) ci_assert_equal((x), 0) void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) { - ci_netif_state_nic_t* nn; - ci_netif_state* nis = ni->state; + ci_netif_state_nic_t* nn; + ci_netif_state* nis = ni->state; struct oo_p_dllink_state list; - int nic_i; - int i; + int nic_i; + int i; nis->opts = ni->opts; /* TX DMA overflow queue and id allocator init for nvme plugin */ - OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { nn = &nis->nic[nic_i]; for( i = 0; i < sizeof(nn->dmaq) / sizeof(nn->dmaq[0]); ++i ) oo_pktq_init(&nn->dmaq[i]); @@ -74,10 +73,10 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) nn->rx_frags = OO_PP_NULL; #if CI_CFG_TX_CRC_OFFLOAD - if( NI_OPTS(ni).tcp_offload_plugin == CITP_TCP_OFFLOAD_NVME ) - ci_nvme_plugin_crc_id_init(&nis->nvme_crc_plugin_idp[nic_i], - ni->nic_hw[nic_i].plugin_tx_region_id, - NI_OPTS(ni).nvme_crc_table_cap); + if( NI_OPTS(ni).tcp_offload_plugin == CITP_TCP_OFFLOAD_NVME ) + ci_nvme_plugin_crc_id_init(&nis->nvme_crc_plugin_idp[nic_i], + ni->nic_hw[nic_i].plugin_tx_region_id, + NI_OPTS(ni).nvme_crc_table_cap); #endif } @@ -88,7 +87,7 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) assert_zero(nis->mem_pressure); nis->mem_pressure_pkt_pool = OO_PP_NULL; assert_zero(nis->mem_pressure_pkt_pool_n); - nis->looppkts = OO_PP_NULL; + nis->looppkts = OO_PP_NULL; nis->n_looppkts = 0; /* Pool of packet buffers for transmit. */ @@ -96,46 +95,43 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) nis->nonb_pkt_pool = CI_ILL_END; /* Deferred packets */ - list = oo_p_dllink_ptr(ni, &nis->deferred_list); + list = oo_p_dllink_ptr(ni, &nis->deferred_list); oo_p_dllink_init(ni, list); list = oo_p_dllink_ptr(ni, &nis->deferred_list_free); oo_p_dllink_init(ni, list); for( i = 0; i < NI_OPTS(ni).defer_arp_pkts; i++ ) { struct oo_p_dllink_state link = - oo_p_dllink_ptr(ni, &ni->deferred_pkts[i].link); + oo_p_dllink_ptr(ni, &ni->deferred_pkts[i].link); oo_p_dllink_init(ni, link); oo_p_dllink_add(ni, list, link); } ci_netif_filter_init(ni, ci_log2_le(ci_netif_filter_table_size(ni))); #if CI_CFG_IPV6 - ci_ip6_netif_filter_init(ni->ip6_filter_table, - ci_log2_le(NI_OPTS(ni).max_ep_bufs) + 1); + ci_ip6_netif_filter_init( + ni->ip6_filter_table, ci_log2_le(NI_OPTS(ni).max_ep_bufs) + 1); #endif - oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, - &nis->timeout_q[OO_TIMEOUT_Q_TIMEWAIT])); - oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, - &nis->timeout_q[OO_TIMEOUT_Q_FINWAIT])); - ci_ip_timer_init(ni, &nis->timeout_tid, - oo_ptr_to_statep(ni, &nis->timeout_tid), - "ttid"); + oo_p_dllink_init( + ni, oo_p_dllink_ptr(ni, &nis->timeout_q[OO_TIMEOUT_Q_TIMEWAIT])); + oo_p_dllink_init( + ni, oo_p_dllink_ptr(ni, &nis->timeout_q[OO_TIMEOUT_Q_FINWAIT])); + ci_ip_timer_init( + ni, &nis->timeout_tid, oo_ptr_to_statep(ni, &nis->timeout_tid), "ttid"); nis->timeout_tid.fn = CI_IP_TIMER_NETIF_TIMEOUT; #if CI_CFG_TCP_OFFLOAD_RECYCLER - ci_ip_timer_init(ni, &nis->recycle_tid, - oo_ptr_to_statep(ni, &nis->recycle_tid), - "rctq"); + ci_ip_timer_init( + ni, &nis->recycle_tid, oo_ptr_to_statep(ni, &nis->recycle_tid), "rctq"); nis->recycle_tid.fn = CI_IP_TIMER_NETIF_TCP_RECYCLE; oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, &nis->recycle_retry_q)); #endif #if CI_CFG_SUPPORT_STATS_COLLECTION - ci_ip_timer_init(ni, &nis->stats_tid, - oo_ptr_to_statep(ni, &nis->stats_tid), - "stat"); + ci_ip_timer_init( + ni, &nis->stats_tid, oo_ptr_to_statep(ni, &nis->stats_tid), "stat"); nis->stats_tid.fn = CI_IP_TIMER_NETIF_STATS; ci_ip_stats_clear(&nis->stats_snapshot); @@ -144,8 +140,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, &nis->reap_list)); - nis->free_eps_head = OO_SP_NULL; - nis->free_eps_num = 0; + nis->free_eps_head = OO_SP_NULL; + nis->free_eps_num = 0; nis->deferred_free_eps_head = CI_ILL_END; assert_zero(nis->n_ep_bufs); nis->max_ep_bufs = NI_OPTS(ni).max_ep_bufs; @@ -154,8 +150,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) ni->packets->sets_max = ni->pkt_sets_max; /* Fragmented packet re-assembly list */ - nis->rx_defrag_head = OO_PP_NULL; - nis->rx_defrag_tail = OO_PP_NULL; + nis->rx_defrag_head = OO_PP_NULL; + nis->rx_defrag_tail = OO_PP_NULL; assert_zero(nis->send_may_poll); @@ -166,27 +162,25 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, &nis->post_poll_list)); nis->sock_spin_cycles = - __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).spin_usec); - nis->buzz_cycles = - __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).buzz_usec); + __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).spin_usec); + nis->buzz_cycles = __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).buzz_usec); nis->timer_prime_cycles = - __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).timer_prime_usec); + __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).timer_prime_usec); #if CI_CFG_INJECT_PACKETS nis->kernel_packets_cycles = - __oo_usec_to_cycles64(cpu_khz, - NI_OPTS(ni).kernel_packets_timer_usec); + __oo_usec_to_cycles64(cpu_khz, NI_OPTS(ni).kernel_packets_timer_usec); #endif ci_ip_timer_state_init(ni, cpu_khz); nis->last_spin_poll_frc = IPTIMER_STATE(ni)->frc; - nis->last_sleep_frc = IPTIMER_STATE(ni)->frc; - + nis->last_sleep_frc = IPTIMER_STATE(ni)->frc; + oo_timesync_update(efab_tcp_driver.timesync); assert_zero(nis->defer_work_count); #if CI_CFG_TCPDUMP - nis->dump_read_i = 0; + nis->dump_read_i = 0; nis->dump_write_i = 0; memset(nis->dump_intf, 0, sizeof(nis->dump_intf)); #endif @@ -219,8 +213,7 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) #endif #if CI_CFG_TCP_SHARED_LOCAL_PORTS - for( i = 0; - i < nis->active_wild_table_entries_n * nis->active_wild_pools_n; + for( i = 0; i < nis->active_wild_table_entries_n * nis->active_wild_pools_n; ++i ) { oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, &ni->active_wild_table[i])); } @@ -231,10 +224,10 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) assert_zero(ni->seq_table[i].route_count); nis->packet_alloc_numa_nodes = 0; - nis->sock_alloc_numa_nodes = 0; - nis->interrupt_numa_nodes = 0; - nis->creation_numa_node = numa_node_id(); - nis->load_numa_node = efab_tcp_driver.load_numa_node; + nis->sock_alloc_numa_nodes = 0; + nis->interrupt_numa_nodes = 0; + nis->creation_numa_node = numa_node_id(); + nis->load_numa_node = efab_tcp_driver.load_numa_node; #if CI_CFG_FD_CACHING list = oo_p_dllink_ptr(ni, &nis->active_cache.cache); @@ -244,8 +237,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) list = oo_p_dllink_ptr(ni, &nis->active_cache.fd_states); oo_p_dllink_init(ni, list); - nis->active_cache.avail_stack = oo_ptr_to_statep(ni, - &nis->active_cache_avail_stack); + nis->active_cache.avail_stack = + oo_ptr_to_statep(ni, &nis->active_cache_avail_stack); nis->active_cache_avail_stack = nis->opts.sock_cache_max; list = oo_p_dllink_ptr(ni, &nis->passive_scalable_cache.cache); @@ -255,8 +248,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) list = oo_p_dllink_ptr(ni, &nis->passive_scalable_cache.fd_states); oo_p_dllink_init(ni, list); - nis->passive_scalable_cache.avail_stack = oo_ptr_to_statep - (ni, &ni->state->passive_cache_avail_stack); + nis->passive_scalable_cache.avail_stack = + oo_ptr_to_statep(ni, &ni->state->passive_cache_avail_stack); #endif #if CI_CFG_INJECT_PACKETS @@ -264,43 +257,42 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) assert_zero(nis->kernel_packets_last_forwarded); assert_zero(nis->kernel_packets_pending); #endif - } #endif -static int citp_ipstack_params_inited = 0; -static ci_uint32 citp_tcp_sndbuf_min = CI_CFG_TCP_SNDBUF_MIN; -static ci_uint32 citp_tcp_sndbuf_def = CI_CFG_TCP_SNDBUF_DEFAULT; -static ci_uint32 citp_tcp_sndbuf_max = CI_CFG_TCP_SNDBUF_MAX; -static ci_uint32 citp_tcp_rcvbuf_min = CI_CFG_TCP_RCVBUF_MIN; -static ci_uint32 citp_tcp_rcvbuf_def = CI_CFG_TCP_RCVBUF_DEFAULT; -static ci_uint32 citp_tcp_rcvbuf_max = CI_CFG_TCP_RCVBUF_MAX; -static ci_uint32 citp_udp_sndbuf_max = CI_CFG_UDP_SNDBUF_MAX; -static ci_uint32 citp_udp_sndbuf_def = CI_CFG_UDP_SNDBUF_DEFAULT; -static ci_uint32 citp_udp_rcvbuf_max = CI_CFG_UDP_RCVBUF_MAX; -static ci_uint32 citp_udp_rcvbuf_def = CI_CFG_UDP_RCVBUF_DEFAULT; -static ci_uint32 citp_tcp_backlog_max = CI_TCP_LISTENQ_MAX; +static int citp_ipstack_params_inited = 0; +static ci_uint32 citp_tcp_sndbuf_min = CI_CFG_TCP_SNDBUF_MIN; +static ci_uint32 citp_tcp_sndbuf_def = CI_CFG_TCP_SNDBUF_DEFAULT; +static ci_uint32 citp_tcp_sndbuf_max = CI_CFG_TCP_SNDBUF_MAX; +static ci_uint32 citp_tcp_rcvbuf_min = CI_CFG_TCP_RCVBUF_MIN; +static ci_uint32 citp_tcp_rcvbuf_def = CI_CFG_TCP_RCVBUF_DEFAULT; +static ci_uint32 citp_tcp_rcvbuf_max = CI_CFG_TCP_RCVBUF_MAX; +static ci_uint32 citp_udp_sndbuf_max = CI_CFG_UDP_SNDBUF_MAX; +static ci_uint32 citp_udp_sndbuf_def = CI_CFG_UDP_SNDBUF_DEFAULT; +static ci_uint32 citp_udp_rcvbuf_max = CI_CFG_UDP_RCVBUF_MAX; +static ci_uint32 citp_udp_rcvbuf_def = CI_CFG_UDP_RCVBUF_DEFAULT; +static ci_uint32 citp_tcp_backlog_max = CI_TCP_LISTENQ_MAX; static ci_uint32 citp_tcp_adv_win_scale_max = CI_TCP_WSCL_MAX; -static ci_uint32 citp_fin_timeout = CI_CFG_TCP_FIN_TIMEOUT; -static ci_uint32 citp_retransmit_threshold = CI_TCP_RETRANSMIT_THRESHOLD; +static ci_uint32 citp_fin_timeout = CI_CFG_TCP_FIN_TIMEOUT; +static ci_uint32 citp_retransmit_threshold = CI_TCP_RETRANSMIT_THRESHOLD; static ci_uint32 citp_retransmit_threshold_orphan = - CI_TCP_RETRANSMIT_THRESHOLD_ORPHAN; + CI_TCP_RETRANSMIT_THRESHOLD_ORPHAN; static ci_uint32 citp_retransmit_threshold_syn = - CI_TCP_RETRANSMIT_THRESHOLD_SYN; + CI_TCP_RETRANSMIT_THRESHOLD_SYN; static ci_uint32 citp_retransmit_threshold_synack = - CI_TCP_RETRANSMIT_THRESHOLD_SYN; + CI_TCP_RETRANSMIT_THRESHOLD_SYN; static ci_uint32 citp_keepalive_probes = CI_TCP_KEEPALIVE_PROBES; -static ci_uint32 citp_keepalive_time = CI_TCP_TCONST_KEEPALIVE_TIME; -static ci_uint32 citp_keepalive_intvl = CI_TCP_TCONST_KEEPALIVE_INTVL; -static ci_uint32 citp_syn_opts = CI_TCPT_SYN_FLAGS; -static ci_uint32 citp_tcp_dsack = CI_CFG_TCP_DSACK; +static ci_uint32 citp_keepalive_time = CI_TCP_TCONST_KEEPALIVE_TIME; +static ci_uint32 citp_keepalive_intvl = CI_TCP_TCONST_KEEPALIVE_INTVL; +static ci_uint32 citp_syn_opts = CI_TCPT_SYN_FLAGS; +static ci_uint32 citp_tcp_dsack = CI_CFG_TCP_DSACK; static ci_uint32 citp_tcp_time_wait_assassinate = CI_CFG_TIME_WAIT_ASSASSINATE; -static ci_uint32 citp_tcp_early_retransmit = 3; /* default as of 3.10 */ -static ci_uint32 citp_challenge_ack_limit = CI_CFG_CHALLENGE_ACK_LIMIT; +static ci_uint32 citp_tcp_early_retransmit = 3; /* default as of 3.10 */ +static ci_uint32 citp_challenge_ack_limit = CI_CFG_CHALLENGE_ACK_LIMIT; static ci_uint32 citp_tcp_invalid_ratelimit = - CI_CFG_TCP_OUT_OF_WINDOW_ACK_RATELIMIT; + CI_CFG_TCP_OUT_OF_WINDOW_ACK_RATELIMIT; #if CI_CFG_IPV6 static ci_uint32 citp_auto_flowlabels = CI_AUTO_FLOWLABELS_DEFAULT; @@ -308,19 +300,19 @@ static ci_uint32 citp_auto_flowlabels = CI_AUTO_FLOWLABELS_DEFAULT; #ifndef __KERNEL__ /* Interface for sysctl. */ -ci_inline int ci_sysctl_get_values(char *path, ci_uint32 *ret, int n) +ci_inline int ci_sysctl_get_values(char* path, ci_uint32* ret, int n) { - char name[CI_CFG_PROC_PATH_LEN_MAX + strlen(CI_CFG_PROC_PATH)]; - char buf[CI_CFG_PROC_LINE_LEN_MAX]; - int buflen; - char *p = buf; - int fd; - int i = 0; + char name[CI_CFG_PROC_PATH_LEN_MAX + strlen(CI_CFG_PROC_PATH)]; + char buf[CI_CFG_PROC_LINE_LEN_MAX]; + int buflen; + char* p = buf; + int fd; + int i = 0; strcpy(name, CI_CFG_PROC_PATH); strncpy(name + strlen(CI_CFG_PROC_PATH), path, CI_CFG_PROC_PATH_LEN_MAX); fd = ci_sys_open(name, O_RDONLY); - if (fd < 0) { + if( fd < 0 ) { /* There are a lot of reasons to fail: * - too old kernel does not know this parameter; * - we are in chroot, and/or /proc is not mounted; @@ -349,8 +341,7 @@ ci_inline int ci_sysctl_get_values(char *path, ci_uint32 *ret, int n) * passive mode, when they call listen(), accept(), chroot() and listen(). */ -int -ci_setup_ipstack_params(void) +int ci_setup_ipstack_params(void) { ci_uint32 opt[3]; @@ -358,13 +349,13 @@ ci_setup_ipstack_params(void) * - we have 2 netifs in one application; * - chroot() was called after another intercepted call. */ - if (citp_ipstack_params_inited) + if( citp_ipstack_params_inited ) return 0; { - int fd = ci_sys_open(CI_CFG_PROC_PATH"net/ipv4", O_RDONLY | O_DIRECTORY); + int fd = ci_sys_open(CI_CFG_PROC_PATH "net/ipv4", O_RDONLY | O_DIRECTORY); if( fd < 0 ) { - ci_log("ERROR: failed to open "CI_CFG_PROC_PATH"net/ipv4"); + ci_log("ERROR: failed to open " CI_CFG_PROC_PATH "net/ipv4"); return -1; } ci_sys_close(fd); @@ -390,75 +381,75 @@ ci_setup_ipstack_params(void) if( ci_sysctl_get_values("net/core/rmem_default", opt, 1) == 0 ) citp_udp_rcvbuf_def = opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_max_syn_backlog", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_max_syn_backlog", opt, 1) == 0 ) citp_tcp_backlog_max = opt[0]; /* We should not use non-zero winscale if tcp_window_scaling == 0 */ - if (ci_sysctl_get_values("net/ipv4/tcp_window_scaling", opt, 1) == 0 && - opt[0] == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_window_scaling", opt, 1) == 0 && + opt[0] == 0 ) citp_tcp_adv_win_scale_max = 0; /* Get fin_timeout value from Linux if it is possible */ - if (ci_sysctl_get_values("net/ipv4/tcp_fin_timeout", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_fin_timeout", opt, 1) == 0 ) citp_fin_timeout = opt[0]; /* Number of retransmits */ - if (ci_sysctl_get_values("net/ipv4/tcp_retries2", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_retries2", opt, 1) == 0 ) citp_retransmit_threshold = opt[0]; /* tcp_orphan_retries is usually 0, but Linux uses value 8 internally in * such a case. See linux/net/ipv4/tcp_timer.c: tcp_orphan_retries() * for details. */ - if (ci_sysctl_get_values("net/ipv4/tcp_orphan_retries", opt, 1) == 0 && + if( ci_sysctl_get_values("net/ipv4/tcp_orphan_retries", opt, 1) == 0 && opt[0] > 0 ) { citp_retransmit_threshold_orphan = opt[0]; } - if (ci_sysctl_get_values("net/ipv4/tcp_syn_retries", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_syn_retries", opt, 1) == 0 ) citp_retransmit_threshold_syn = opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_synack_retries", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_synack_retries", opt, 1) == 0 ) citp_retransmit_threshold_synack = opt[0]; /* Keepalive parameters */ - if (ci_sysctl_get_values("net/ipv4/tcp_keepalive_probes", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_keepalive_probes", opt, 1) == 0 ) citp_keepalive_probes = opt[0]; /* These values are stored in secs, we scale to ms here */ - if (ci_sysctl_get_values("net/ipv4/tcp_keepalive_time", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_keepalive_time", opt, 1) == 0 ) citp_keepalive_time = opt[0] * 1000; - if (ci_sysctl_get_values("net/ipv4/tcp_keepalive_intvl", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_keepalive_intvl", opt, 1) == 0 ) citp_keepalive_intvl = opt[0] * 1000; /* SYN options */ - if (ci_sysctl_get_values("net/ipv4/tcp_sack", opt, 1) == 0) { + if( ci_sysctl_get_values("net/ipv4/tcp_sack", opt, 1) == 0 ) { if( opt[0] ) citp_syn_opts |= CI_TCPT_FLAG_SACK; else - citp_syn_opts &=~ CI_TCPT_FLAG_SACK; + citp_syn_opts &= ~CI_TCPT_FLAG_SACK; } - if (ci_sysctl_get_values("net/ipv4/tcp_timestamps", opt, 1) == 0) { + if( ci_sysctl_get_values("net/ipv4/tcp_timestamps", opt, 1) == 0 ) { if( opt[0] ) citp_syn_opts |= CI_TCPT_FLAG_TSO; else - citp_syn_opts &=~ CI_TCPT_FLAG_TSO; + citp_syn_opts &= ~CI_TCPT_FLAG_TSO; } - if (ci_sysctl_get_values("net/ipv4/tcp_window_scaling", opt, 1) == 0) { + if( ci_sysctl_get_values("net/ipv4/tcp_window_scaling", opt, 1) == 0 ) { if( opt[0] ) citp_syn_opts |= CI_TCPT_FLAG_WSCL; else - citp_syn_opts &=~ CI_TCPT_FLAG_WSCL; + citp_syn_opts &= ~CI_TCPT_FLAG_WSCL; } - if (ci_sysctl_get_values("net/ipv4/tcp_dsack", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_dsack", opt, 1) == 0 ) citp_tcp_dsack = opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_rfc1337", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_rfc1337", opt, 1) == 0 ) citp_tcp_time_wait_assassinate = ! opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_early_retrans", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_early_retrans", opt, 1) == 0 ) citp_tcp_early_retransmit = opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_challenge_ack_limit", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_challenge_ack_limit", opt, 1) == 0 ) citp_challenge_ack_limit = opt[0]; - if (ci_sysctl_get_values("net/ipv4/tcp_invalid_ratelimit", opt, 1) == 0) + if( ci_sysctl_get_values("net/ipv4/tcp_invalid_ratelimit", opt, 1) == 0 ) citp_tcp_invalid_ratelimit = opt[0]; #if CI_CFG_IPV6 @@ -472,8 +463,7 @@ ci_setup_ipstack_params(void) #else -int -ci_setup_ipstack_params(void) +int ci_setup_ipstack_params(void) { citp_ipstack_params_inited = 0; return 0; @@ -483,61 +473,60 @@ ci_setup_ipstack_params(void) void ci_netif_config_opts_defaults(ci_netif_config_opts* opts) { -# undef CI_CFG_OPTFILE_VERSION -# undef CI_CFG_OPTGROUP -# undef CI_CFG_OPT -# undef CI_CFG_STR_OPT -# define CI_CFG_OPT(env, name, type, doc, type_modifider, group, \ - default, minimum, maximum, presentation) \ +#undef CI_CFG_OPTFILE_VERSION +#undef CI_CFG_OPTGROUP +#undef CI_CFG_OPT +#undef CI_CFG_STR_OPT +#define CI_CFG_OPT(env, name, type, doc, type_modifider, group, default, \ + minimum, maximum, presentation) \ opts->name = default; -# define CI_CFG_STR_OPT(env, name, type, doc, type_modifider, group, \ - default, minimum, maximum, presentation) \ - strncpy(opts->name, default, sizeof(opts->name)); \ +#define CI_CFG_STR_OPT(env, name, type, doc, type_modifider, group, default, \ + minimum, maximum, presentation) \ + strncpy(opts->name, default, sizeof(opts->name)); \ opts->name[sizeof(opts->name) - 1] = 0; -# include +#include /* now modify defaults with information from the operating system */ ci_setup_ipstack_params(); - if (citp_ipstack_params_inited) { - opts->tcp_sndbuf_min = citp_tcp_sndbuf_min; - opts->tcp_sndbuf_def = citp_tcp_sndbuf_def; - opts->tcp_sndbuf_max = citp_tcp_sndbuf_max; - opts->tcp_rcvbuf_min = citp_tcp_rcvbuf_min; - opts->tcp_rcvbuf_def = citp_tcp_rcvbuf_def; - opts->tcp_rcvbuf_max = citp_tcp_rcvbuf_max; - - opts->udp_sndbuf_max = citp_udp_sndbuf_max; - opts->udp_sndbuf_def = citp_udp_sndbuf_def; - opts->udp_rcvbuf_max = citp_udp_rcvbuf_max; - opts->udp_rcvbuf_def = citp_udp_rcvbuf_def; + if( citp_ipstack_params_inited ) { + opts->tcp_sndbuf_min = citp_tcp_sndbuf_min; + opts->tcp_sndbuf_def = citp_tcp_sndbuf_def; + opts->tcp_sndbuf_max = citp_tcp_sndbuf_max; + opts->tcp_rcvbuf_min = citp_tcp_rcvbuf_min; + opts->tcp_rcvbuf_def = citp_tcp_rcvbuf_def; + opts->tcp_rcvbuf_max = citp_tcp_rcvbuf_max; + + opts->udp_sndbuf_max = citp_udp_sndbuf_max; + opts->udp_sndbuf_def = citp_udp_sndbuf_def; + opts->udp_rcvbuf_max = citp_udp_rcvbuf_max; + opts->udp_rcvbuf_def = citp_udp_rcvbuf_def; opts->tcp_backlog_max = citp_tcp_backlog_max; - opts->tcp_synrecv_max = citp_tcp_backlog_max * - CI_CFG_ASSUME_LISTEN_SOCKS; - opts->tcp_adv_win_scale_max = citp_tcp_adv_win_scale_max; - opts->fin_timeout = citp_fin_timeout; + opts->tcp_synrecv_max = citp_tcp_backlog_max * CI_CFG_ASSUME_LISTEN_SOCKS; + opts->tcp_adv_win_scale_max = citp_tcp_adv_win_scale_max; + opts->fin_timeout = citp_fin_timeout; - opts->retransmit_threshold = citp_retransmit_threshold; + opts->retransmit_threshold = citp_retransmit_threshold; opts->retransmit_threshold_orphan = citp_retransmit_threshold_orphan; - opts->retransmit_threshold_syn = citp_retransmit_threshold_syn; + opts->retransmit_threshold_syn = citp_retransmit_threshold_syn; opts->retransmit_threshold_synack = citp_retransmit_threshold_synack; - opts->keepalive_probes = citp_keepalive_probes; - opts->keepalive_time = citp_keepalive_time; - opts->keepalive_intvl = citp_keepalive_intvl; + opts->keepalive_probes = citp_keepalive_probes; + opts->keepalive_time = citp_keepalive_time; + opts->keepalive_intvl = citp_keepalive_intvl; - opts->syn_opts = citp_syn_opts; - opts->use_dsack = citp_tcp_dsack; - opts->time_wait_assassinate = citp_tcp_time_wait_assassinate; + opts->syn_opts = citp_syn_opts; + opts->use_dsack = citp_tcp_dsack; + opts->time_wait_assassinate = citp_tcp_time_wait_assassinate; /* Early retransmit itself has gone from modern kernels, so look in an * old kernel's ip-sysctl.txt for the meaning of these values. */ - opts->tcp_early_retransmit = citp_tcp_early_retransmit > 0 && - citp_tcp_early_retransmit < 4; - opts->tail_drop_probe = citp_tcp_early_retransmit >= 3; + opts->tcp_early_retransmit = + citp_tcp_early_retransmit > 0 && citp_tcp_early_retransmit < 4; + opts->tail_drop_probe = citp_tcp_early_retransmit >= 3; opts->challenge_ack_limit = citp_challenge_ack_limit; - opts->oow_ack_ratelimit = citp_tcp_invalid_ratelimit; + opts->oow_ack_ratelimit = citp_tcp_invalid_ratelimit; #if CI_CFG_IPV6 opts->auto_flowlabels = citp_auto_flowlabels; #endif @@ -551,17 +540,21 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) ci_uint64 MAX; ci_int64 SMIN; ci_int64 SMAX; - int _optbits; - int _bitwidth; + int _optbits; + int _bitwidth; /* stop compiler complaining if these values are not used */ - (void)MIN; (void)MAX; (void)SMIN; (void)SMAX; - (void)_optbits; (void)_bitwidth; - -#undef CI_CFG_OPTFILE_VERSION -#undef CI_CFG_OPTGROUP -#undef CI_CFG_OPT -#undef CI_CFG_STR_OPT + (void) MIN; + (void) MAX; + (void) SMIN; + (void) SMAX; + (void) _optbits; + (void) _bitwidth; + +#undef CI_CFG_OPTFILE_VERSION +#undef CI_CFG_OPTGROUP +#undef CI_CFG_OPT +#undef CI_CFG_STR_OPT #define _CI_CFG_BITVAL _optbits #define _CI_CFG_BITVAL1 1 @@ -577,55 +570,58 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) #undef MAX #undef SMIN #undef SMAX - + #define CI_CFG_REDRESS(opt, val) opt = val; -#define CI_CFG_MSG "ERROR" +#define CI_CFG_MSG "ERROR" #define CI_CFG_STR_OPT(...) -#define CI_CFG_OPT(env, name, type, doc, bits, group, default, minimum, maximum, pres) \ -{ type _val = opts->name; \ - type _max; \ - type _min; \ - _optbits=sizeof(type)*8; \ - _bitwidth=_CI_CFG_BITVAL##bits; \ - MIN = 0; \ - MAX = ((1ull<<(_bitwidth-1))<<1) - 1ull; \ - SMAX = MAX >> 1; SMIN = -SMAX-1; \ - _max = (type)(maximum); /* try to stop the compiler warning */ \ - _min = (type)(minimum); /* about silly comparisons */ \ - if (_val > _max) { \ - ci_log("config: "CI_CFG_MSG" - option " #name \ - " (%"CI_PRIu64") larger than maximum " #maximum" (%"CI_PRIu64")", \ - (ci_uint64)_val, (ci_uint64) _max); \ - CI_CFG_REDRESS(opts->name, _max); \ - } \ - if (_val < _min) { \ - ci_log("config: "CI_CFG_MSG" - option " #name \ - " (%"CI_PRIu64") smaller than minimum " #minimum, \ - (ci_uint64)_val); \ - CI_CFG_REDRESS(opts->name, _min); \ - } \ -} - -# include +#define CI_CFG_OPT( \ + env, name, type, doc, bits, group, default, minimum, maximum, pres) \ + { \ + type _val = opts->name; \ + type _max; \ + type _min; \ + _optbits = sizeof(type) * 8; \ + _bitwidth = _CI_CFG_BITVAL##bits; \ + MIN = 0; \ + MAX = ((1ull << (_bitwidth - 1)) << 1) - 1ull; \ + SMAX = MAX >> 1; \ + SMIN = -SMAX - 1; \ + _max = (type) (maximum); /* try to stop the compiler warning */ \ + _min = (type) (minimum); /* about silly comparisons */ \ + if( _val > _max ) { \ + ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ + ") larger than maximum " #maximum " (%" CI_PRIu64 ")", \ + (ci_uint64) _val, (ci_uint64) _max); \ + CI_CFG_REDRESS(opts->name, _max); \ + } \ + if( _val < _min ) { \ + ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ + ") smaller than minimum " #minimum, \ + (ci_uint64) _val); \ + CI_CFG_REDRESS(opts->name, _min); \ + } \ + } + +#include /* EF_MAX_ENDPOINTS should must be divisible by 2048 */ if( opts->max_ep_bufs % EP_BUF_PER_CHUNK != 0 ) { unsigned new_max = opts->max_ep_bufs; - new_max = CI_ROUND_UP(new_max, EP_BUF_PER_CHUNK); - ci_log("config: EF_MAX_ENDPOINTS is rounded up from %u to %u", opts->max_ep_bufs, new_max); + new_max = CI_ROUND_UP(new_max, EP_BUF_PER_CHUNK); + ci_log("config: EF_MAX_ENDPOINTS is rounded up from %u to %u", + opts->max_ep_bufs, new_max); opts->max_ep_bufs = new_max; } } - #ifndef __KERNEL__ struct string_to_bitmask { int stb_index; - const char*const stb_str; + const char* const stb_str; }; @@ -635,8 +631,7 @@ struct string_to_bitmask { * in str turns it off by using '-' or some option in str enables it. */ static void convert_string_to_bitmask(const char* str, - const struct string_to_bitmask* opts, - int opts_len, ci_uint32* bitmask_out) + const struct string_to_bitmask* opts, int opts_len, ci_uint32* bitmask_out) { int len, i, opt_found, negate; @@ -656,8 +651,7 @@ static void convert_string_to_bitmask(const char* str, negate = 1; ++str; --len; - } - else { + } else { negate = 0; } @@ -686,32 +680,29 @@ static void convert_string_to_bitmask(const char* str, static void ci_netif_config_opts_getenv_ef_log(ci_netif_config_opts* opts) { struct string_to_bitmask options[EF_LOG_MAX] = { - {EF_LOG_BANNER, "banner"}, - {EF_LOG_RESOURCE_WARNINGS, "resource_warnings"}, - {EF_LOG_CONN_DROP, "conn_drop"}, - {EF_LOG_CONFIG_WARNINGS, "config_warnings"}, - {EF_LOG_USAGE_WARNINGS, "usage_warnings"}, + { EF_LOG_BANNER, "banner" }, + { EF_LOG_RESOURCE_WARNINGS, "resource_warnings" }, + { EF_LOG_CONN_DROP, "conn_drop" }, + { EF_LOG_CONFIG_WARNINGS, "config_warnings" }, + { EF_LOG_USAGE_WARNINGS, "usage_warnings" }, }; - convert_string_to_bitmask(getenv("EF_LOG"), options, EF_LOG_MAX, - &opts->log_category); + convert_string_to_bitmask( + getenv("EF_LOG"), options, EF_LOG_MAX, &opts->log_category); } -static void -ci_netif_config_opts_getenv_ef_scalable_filters(ci_netif_config_opts* opts); +static void ci_netif_config_opts_getenv_ef_scalable_filters( + ci_netif_config_opts* opts); -static int -handle_str_opt(ci_netif_config_opts* opts, - const char* optname, char* optval_buf, size_t optval_buflen); +static int handle_str_opt(ci_netif_config_opts* opts, const char* optname, + char* optval_buf, size_t optval_buflen); -static int -parse_enum(ci_netif_config_opts* opts, - const char* name, const char* const* options, - const char* default_val); +static int parse_enum(ci_netif_config_opts* opts, const char* name, + const char* const* options, const char* default_val); -void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) +void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) { const char* s; @@ -727,7 +718,7 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->spin_usec = atoi(s); if( opts->spin_usec != 0 ) { /* Don't buzz for too long by default! */ - opts->buzz_usec = CI_MIN(opts->spin_usec, 100); + opts->buzz_usec = CI_MIN(opts->spin_usec, 100); /* Disable EF_INT_DRIVEN by default when spinning. */ opts->int_driven = 0; /* These are only here to expose defaults through stackdump. FIXME: @@ -751,7 +742,8 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) static const char* const xdp_mode_opts[] = { "disabled", "compatible", 0 }; opts->xdp_mode = parse_enum(opts, "EF_XDP_MODE", xdp_mode_opts, "disabled"); if( opts->xdp_mode ) { - /* for now only in-kernel XDP is supported - enabling in-kernel mode implicitly */ + /* for now only in-kernel XDP is supported - enabling in-kernel mode + * implicitly */ opts->poll_in_kernel = 1; } #endif @@ -776,12 +768,14 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) */ #if CI_CFG_POISON_BUFS - if( (s = getenv("EF_POISON")) ) opts->poison_rx_buf = atoi(s); + if( (s = getenv("EF_POISON")) ) + opts->poison_rx_buf = atoi(s); #endif #if CI_CFG_RANDOM_DROP if( (s = getenv("EF_RX_DROP_RATE")) ) { int r = atoi(s); - if( r ) opts->rx_drop_rate = RAND_MAX / r; + if( r ) + opts->rx_drop_rate = RAND_MAX / r; } #endif if( (s = getenv("EF_URG_RFC")) ) @@ -813,7 +807,7 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->evs_per_poll = atoi(s); #if CI_CFG_WANT_BPF_NATIVE else if( opts->poll_in_kernel ) - opts->evs_per_poll = 192; /* See EF_EVS_PER_POLL documentation */ + opts->evs_per_poll = 192; /* See EF_EVS_PER_POLL documentation */ #endif if( (s = getenv("EF_TCP_TCONST_MSL")) ) opts->msl_seconds = atoi(s); @@ -828,68 +822,69 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->syn_opts = citp_syn_opts = v; } - if ( (s = getenv("EF_MAX_PACKETS")) ) { + if( (s = getenv("EF_MAX_PACKETS")) ) { int max_packets_rq = atoi(s); - opts->max_packets = (max_packets_rq + PKTS_PER_SET - 1) & - ~(PKTS_PER_SET - 1); + opts->max_packets = + (max_packets_rq + PKTS_PER_SET - 1) & ~(PKTS_PER_SET - 1); if( opts->max_packets != max_packets_rq ) /* ?? TODO: log message */ ; opts->max_rx_packets = opts->max_packets * 3 / 4; opts->max_tx_packets = opts->max_packets * 3 / 4; } - if ( (s = getenv("EF_MAX_RX_PACKETS")) ) { + if( (s = getenv("EF_MAX_RX_PACKETS")) ) { opts->max_rx_packets = atoi(s); if( opts->max_rx_packets > opts->max_packets ) opts->max_rx_packets = opts->max_packets; } - if ( (s = getenv("EF_MAX_TX_PACKETS")) ) { + if( (s = getenv("EF_MAX_TX_PACKETS")) ) { opts->max_tx_packets = atoi(s); if( opts->max_tx_packets > opts->max_packets ) opts->max_tx_packets = opts->max_packets; } - if ( (s = getenv("EF_PREALLOC_PACKETS")) ) + if( (s = getenv("EF_PREALLOC_PACKETS")) ) opts->prealloc_packets = atoi(s); - if ( (s = getenv("EF_RXQ_MIN")) ) + if( (s = getenv("EF_RXQ_MIN")) ) opts->rxq_min = atoi(s); - if ( (s = getenv("EF_MIN_FREE_PACKETS")) ) + if( (s = getenv("EF_MIN_FREE_PACKETS")) ) opts->min_free_packets = atoi(s); if( (s = getenv("EF_PREFAULT_PACKETS")) ) opts->prefault_packets = atoi(s); - if ( (s = getenv("EF_MAX_ENDPOINTS")) ) + if( (s = getenv("EF_MAX_ENDPOINTS")) ) opts->max_ep_bufs = atoi(s); - if ( (s = getenv("EF_ENDPOINT_PACKET_RESERVE")) ) + if( (s = getenv("EF_ENDPOINT_PACKET_RESERVE")) ) opts->endpoint_packet_reserve = atoi(s); - if ( (s = getenv("EF_DEFER_ARP_MAX")) ) + if( (s = getenv("EF_DEFER_ARP_MAX")) ) opts->defer_arp_pkts = atoi(s); - if ( (s = getenv("EF_DEFER_ARP_TIMEOUT")) ) + if( (s = getenv("EF_DEFER_ARP_TIMEOUT")) ) opts->defer_arp_timeout = atoi(s); - if ( (s = getenv("EF_SHARE_WITH")) ) + if( (s = getenv("EF_SHARE_WITH")) ) opts->share_with = atoi(s); #if CI_CFG_PKTS_AS_HUGE_PAGES if( (s = getenv("EF_USE_HUGE_PAGES")) ) opts->huge_pages = atoi(s); if( opts->huge_pages != 0 && opts->share_with != 0 ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "Turning huge pages off because the " - "stack is going to be used by multiple users"); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "Turning huge pages off because the " + "stack is going to be used by multiple users"); opts->huge_pages = 0; } #endif - if ( (s = getenv("EF_COMPOUND_PAGES_MODE")) ) + if( (s = getenv("EF_COMPOUND_PAGES_MODE")) ) opts->compound_pages = atoi(s); - if ( (s = getenv("EF_RXQ_SIZE")) ) + if( (s = getenv("EF_RXQ_SIZE")) ) opts->rxq_size = atoi(s); - if ( (s = getenv("EF_RXQ_LIMIT")) ) + if( (s = getenv("EF_RXQ_LIMIT")) ) opts->rxq_limit = atoi(s); - if ( (s = getenv("EF_SHARED_RXQ_NUM")) ) + if( (s = getenv("EF_SHARED_RXQ_NUM")) ) opts->shared_rxq_num = atoi(s); - if ( (s = getenv("EF_TXQ_SIZE")) ) + if( (s = getenv("EF_TXQ_SIZE")) ) opts->txq_size = atoi(s); - if ( (s = getenv("EF_SEND_POLL_THRESH")) ) + if( (s = getenv("EF_SEND_POLL_THRESH")) ) opts->send_poll_thresh = atoi(s); - if ( (s = getenv("EF_SEND_POLL_MAX_EVS")) ) + if( (s = getenv("EF_SEND_POLL_MAX_EVS")) ) opts->send_poll_max_events = atoi(s); - if ( (s = getenv("EF_DEFER_WORK_LIMIT")) ) + if( (s = getenv("EF_DEFER_WORK_LIMIT")) ) opts->defer_work_limit = atoi(s); if( (s = getenv("EF_UDP_SEND_UNLOCK_THRESH")) ) opts->udp_send_unlock_thresh = atoi(s); @@ -905,25 +900,25 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->udp_port_handover3_min = atoi(s); if( (s = getenv("EF_UDP_PORT_HANDOVER3_MAX")) ) opts->udp_port_handover3_max = atoi(s); - if ( (s = getenv("EF_DELACK_THRESH")) ) + if( (s = getenv("EF_DELACK_THRESH")) ) opts->delack_thresh = atoi(s); #if CI_CFG_DYNAMIC_ACK_RATE - if ( (s = getenv("EF_DYNAMIC_ACK_THRESH")) ) + if( (s = getenv("EF_DYNAMIC_ACK_THRESH")) ) opts->dynack_thresh = atoi(s); /* Always want this value to be >= delack_thresh to simplify code - * that uses it + * that uses it */ opts->dynack_thresh = CI_MAX(opts->dynack_thresh, opts->delack_thresh); #endif - if ( (s = getenv("EF_CHALLENGE_ACK_LIMIT")) ) + if( (s = getenv("EF_CHALLENGE_ACK_LIMIT")) ) opts->challenge_ack_limit = atoi(s); - if ( (s = getenv("EF_INVALID_ACK_RATELIMIT")) ) + if( (s = getenv("EF_INVALID_ACK_RATELIMIT")) ) opts->oow_ack_ratelimit = atoi(s); #if CI_CFG_FD_CACHING - if ( (s = getenv("EF_SOCKET_CACHE_MAX")) ) + if( (s = getenv("EF_SOCKET_CACHE_MAX")) ) opts->sock_cache_max = atoi(s); - if ( (s = getenv("EF_PER_SOCKET_CACHE_MAX")) ) + if( (s = getenv("EF_PER_SOCKET_CACHE_MAX")) ) opts->per_sock_cache_max = atoi(s); if( opts->per_sock_cache_max < 0 ) opts->per_sock_cache_max = opts->sock_cache_max; @@ -931,18 +926,18 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) #if CI_CFG_PORT_STRIPING /* configuration opttions for striping */ - if ( (s = getenv("EF_STRIPE_NETMASK")) ) { + if( (s = getenv("EF_STRIPE_NETMASK")) ) { int a1, a2, a3, a4; sscanf(s, "%d.%d.%d.%d", &a1, &a2, &a3, &a4); opts->stripe_netmask_be32 = (a1 << 24) | (a2 << 16) | (a3 << 8) | a4; opts->stripe_netmask_be32 = CI_BSWAP_BE32(opts->stripe_netmask_be32); } - if ( (s = getenv("EF_STRIPE_DUPACK_THRESH")) ) { + if( (s = getenv("EF_STRIPE_DUPACK_THRESH")) ) { opts->stripe_dupack_threshold = atoi(s); opts->stripe_dupack_threshold = - CI_MAX(opts->stripe_dupack_threshold, CI_CFG_TCP_DUPACK_THRESH_BASE); - opts->stripe_dupack_threshold = - CI_MIN(opts->stripe_dupack_threshold, CI_CFG_TCP_DUPACK_THRESH_MAX); + CI_MAX(opts->stripe_dupack_threshold, CI_CFG_TCP_DUPACK_THRESH_BASE); + opts->stripe_dupack_threshold = + CI_MIN(opts->stripe_dupack_threshold, CI_CFG_TCP_DUPACK_THRESH_MAX); } if( (s = getenv("EF_STRIPE_TCP_OPT")) ) opts->stripe_tcp_opt = atoi(s); @@ -1020,13 +1015,13 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) if( (s = getenv("EF_ACCEPTQ_MIN_BACKLOG")) ) opts->acceptq_min_backlog = atoi(s); - if ( (s = getenv("EF_TCP_SNDBUF")) ) + if( (s = getenv("EF_TCP_SNDBUF")) ) opts->tcp_sndbuf_user = atoi(s); - if ( (s = getenv("EF_TCP_RCVBUF")) ) + if( (s = getenv("EF_TCP_RCVBUF")) ) opts->tcp_rcvbuf_user = atoi(s); - if ( (s = getenv("EF_UDP_SNDBUF")) ) + if( (s = getenv("EF_UDP_SNDBUF")) ) opts->udp_sndbuf_user = atoi(s); - if ( (s = getenv("EF_UDP_RCVBUF")) ) + if( (s = getenv("EF_UDP_RCVBUF")) ) opts->udp_rcvbuf_user = atoi(s); if( (s = getenv("EF_TCP_SNDBUF_ESTABLISHED_DEFAULT")) ) @@ -1051,23 +1046,23 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->udp_rcvbuf_def = oo_adjust_SO_XBUF(opts->udp_rcvbuf_user); } - if ( (s = getenv("EF_RETRANSMIT_THRESHOLD_SYNACK")) ) + if( (s = getenv("EF_RETRANSMIT_THRESHOLD_SYNACK")) ) opts->retransmit_threshold_synack = atoi(s); - if ( (s = getenv("EF_RETRANSMIT_THRESHOLD_SYN")) ) + if( (s = getenv("EF_RETRANSMIT_THRESHOLD_SYN")) ) opts->retransmit_threshold_syn = atoi(s); - if ( (s = getenv("EF_RETRANSMIT_THRESHOLD")) ) + if( (s = getenv("EF_RETRANSMIT_THRESHOLD")) ) opts->retransmit_threshold = atoi(s); - if ( (s = getenv("EF_TCP_BACKLOG_MAX")) ) { + if( (s = getenv("EF_TCP_BACKLOG_MAX")) ) { opts->tcp_backlog_max = atoi(s); - if ( getenv("EF_TCP_SYNRECV_MAX") == NULL ) { - opts->tcp_synrecv_max = opts->tcp_backlog_max * - CI_CFG_ASSUME_LISTEN_SOCKS; + if( getenv("EF_TCP_SYNRECV_MAX") == NULL ) { + opts->tcp_synrecv_max = + opts->tcp_backlog_max * CI_CFG_ASSUME_LISTEN_SOCKS; } } - if ( (s = getenv("EF_TCP_SYNRECV_MAX")) ) { + if( (s = getenv("EF_TCP_SYNRECV_MAX")) ) { opts->tcp_synrecv_max = atoi(s); } /* Number of aux buffers is tcp_synrecv_max * 2. @@ -1075,94 +1070,97 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) * tcp_synrecv_max * 2 / 7. * And we need some space for real endpoints. */ if( opts->tcp_synrecv_max * 4 > opts->max_ep_bufs * 7 ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "%s: EF_TCP_SYNRECV_MAX=%d and " - "EF_MAX_ENDPOINTS=%d are inconsistent.", - opts->tcp_synrecv_max * 2 > opts->max_ep_bufs * 7 ? - "ERROR" : "WARNING", - opts->tcp_synrecv_max, opts->max_ep_bufs); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "%s: EF_TCP_SYNRECV_MAX=%d and " + "EF_MAX_ENDPOINTS=%d are inconsistent.", + opts->tcp_synrecv_max * 2 > opts->max_ep_bufs * 7 ? "ERROR" + : "WARNING", + opts->tcp_synrecv_max, opts->max_ep_bufs); if( getenv("EF_TCP_SYNRECV_MAX") == NULL ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "EF_TCP_SYNRECV_MAX is set to %d " - "based on %s value and assuming up to %d listening " - "sockets in the Onload stack", - opts->tcp_synrecv_max, - getenv("EF_TCP_BACKLOG_MAX") == NULL ? - "/proc/sys/net/ipv4/tcp_max_syn_backlog" : - "EF_TCP_BACKLOG_MAX", - CI_CFG_ASSUME_LISTEN_SOCKS); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "EF_TCP_SYNRECV_MAX is set to %d " + "based on %s value and assuming up to %d listening " + "sockets in the Onload stack", + opts->tcp_synrecv_max, + getenv("EF_TCP_BACKLOG_MAX") == NULL + ? "/proc/sys/net/ipv4/tcp_max_syn_backlog" + : "EF_TCP_BACKLOG_MAX", + CI_CFG_ASSUME_LISTEN_SOCKS); } - CONFIG_LOG(opts, CONFIG_WARNINGS, "Too few endpoints requested: ~4 " - "syn-receive states consume one endpoint. "); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "Too few endpoints requested: ~4 " + "syn-receive states consume one endpoint. "); } - if ( (s = getenv("EF_TCP_INITIAL_CWND")) ) + if( (s = getenv("EF_TCP_INITIAL_CWND")) ) opts->initial_cwnd = atoi(s); - if ( (s = getenv("EF_TCP_LOSS_MIN_CWND")) ) + if( (s = getenv("EF_TCP_LOSS_MIN_CWND")) ) opts->loss_min_cwnd = atoi(s); - if ( (s = getenv("EF_TCP_MIN_CWND")) ) + if( (s = getenv("EF_TCP_MIN_CWND")) ) opts->min_cwnd = atoi(s); #if CI_CFG_TCP_FASTSTART - if ( (s = getenv("EF_TCP_FASTSTART_INIT")) ) + if( (s = getenv("EF_TCP_FASTSTART_INIT")) ) opts->tcp_faststart_init = atoi(s); - if ( (s = getenv("EF_TCP_FASTSTART_IDLE")) ) + if( (s = getenv("EF_TCP_FASTSTART_IDLE")) ) opts->tcp_faststart_idle = atoi(s); - if ( (s = getenv("EF_TCP_FASTSTART_LOSS")) ) + if( (s = getenv("EF_TCP_FASTSTART_LOSS")) ) opts->tcp_faststart_loss = atoi(s); #endif - if ( (s = getenv("EF_RFC_RTO_INITIAL"))) + if( (s = getenv("EF_RFC_RTO_INITIAL")) ) opts->rto_initial = atoi(s); - if ( (s = getenv("EF_RFC_RTO_MIN"))) + if( (s = getenv("EF_RFC_RTO_MIN")) ) opts->rto_min = atoi(s); - if ( (s = getenv("EF_RFC_RTO_MAX"))) + if( (s = getenv("EF_RFC_RTO_MAX")) ) opts->rto_max = atoi(s); - if ( (s = getenv("EF_KEEPALIVE_TIME"))) + if( (s = getenv("EF_KEEPALIVE_TIME")) ) opts->keepalive_time = atoi(s); - if ( (s = getenv("EF_KEEPALIVE_INTVL"))) + if( (s = getenv("EF_KEEPALIVE_INTVL")) ) opts->keepalive_intvl = atoi(s); - if ( (s = getenv("EF_KEEPALIVE_PROBES"))) + if( (s = getenv("EF_KEEPALIVE_PROBES")) ) opts->keepalive_probes = atoi(s); #ifndef NDEBUG - if( (s = getenv("EF_TCP_MAX_SEQERR_MSGS"))) + if( (s = getenv("EF_TCP_MAX_SEQERR_MSGS")) ) opts->tcp_max_seqerr_msg = atoi(s); #endif #if CI_CFG_BURST_CONTROL - if ( (s = getenv("EF_BURST_CONTROL_LIMIT"))) + if( (s = getenv("EF_BURST_CONTROL_LIMIT")) ) opts->burst_control_limit = atoi(s); #endif #if CI_CFG_CONG_AVOID_NOTIFIED - if ( (s = getenv("EF_CONG_NOTIFY_THRESH"))) + if( (s = getenv("EF_CONG_NOTIFY_THRESH")) ) opts->cong_notify_thresh = atoi(s); #endif #if CI_CFG_TAIL_DROP_PROBE - if ( (s = getenv("EF_TAIL_DROP_PROBE"))) + if( (s = getenv("EF_TAIL_DROP_PROBE")) ) opts->tail_drop_probe = atoi(s); #endif #if CI_CFG_CONG_AVOID_SCALE_BACK - if ( (s = getenv("EF_CONG_AVOID_SCALE_BACK"))) + if( (s = getenv("EF_CONG_AVOID_SCALE_BACK")) ) opts->cong_avoid_scale_back = atoi(s); #endif - if ( (s = getenv("EF_TCP_TIME_WAIT_ASSASSINATION"))) + if( (s = getenv("EF_TCP_TIME_WAIT_ASSASSINATION")) ) opts->time_wait_assassinate = atoi(s); /* Get our netifs to inherit flags if the O/S is being forced to */ - if (CITP_OPTS.accept_force_inherit_nonblock) + if( CITP_OPTS.accept_force_inherit_nonblock ) opts->accept_inherit_nonblock = 1; - if ( (s = getenv("EF_FREE_PACKETS_LOW_WATERMARK")) ) + if( (s = getenv("EF_FREE_PACKETS_LOW_WATERMARK")) ) opts->free_packets_low = atoi(s); if( opts->free_packets_low == 0 ) opts->free_packets_low = opts->rxq_size / 2; #if CI_CFG_PIO - if ( (s = getenv("EF_PIO")) ) + if( (s = getenv("EF_PIO")) ) opts->pio = atoi(s); if( opts->pio == 0 ) /* Makes for more efficient checking on fast data path */ opts->pio_thresh = 0; - else if ( (s = getenv("EF_PIO_THRESHOLD")) ) + else if( (s = getenv("EF_PIO_THRESHOLD")) ) opts->pio_thresh = atoi(s); #endif @@ -1170,8 +1168,8 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->rx_timestamping = atoi(s); static const char* const timestamping_opts[] = { "nic", "cpacket", 0 }; - opts->rx_timestamping_ordering = - parse_enum(opts, "EF_RX_TIMESTAMPING_ORDERING", timestamping_opts, "nic"); + opts->rx_timestamping_ordering = parse_enum( + opts, "EF_RX_TIMESTAMPING_ORDERING", timestamping_opts, "nic"); if( (s = getenv("EF_TX_TIMESTAMPING")) ) opts->tx_timestamping = atoi(s); @@ -1181,8 +1179,8 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) if( (s = getenv("EF_TCP_TSOPT_MODE")) ) { opts->tcp_tsopt_mode = atoi(s); - if( !(opts->tcp_tsopt_mode == 2) ) { - citp_syn_opts &=~ CI_TCPT_FLAG_TSO; + if( ! (opts->tcp_tsopt_mode == 2) ) { + citp_syn_opts &= ~CI_TCPT_FLAG_TSO; citp_syn_opts |= (opts->tcp_tsopt_mode ? CI_TCPT_FLAG_TSO : 0); opts->syn_opts = citp_syn_opts; } @@ -1194,8 +1192,9 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) if( (s = getenv("EF_PERIODIC_TIMER_CPU")) ) { int cpu = atoi(s); if( cpu >= sysconf(_SC_NPROCESSORS_ONLN) ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "Value of EF_PERIODIC_TIMER_CPU is " - "invalid. Periodic work will not be affinitised."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "Value of EF_PERIODIC_TIMER_CPU is " + "invalid. Periodic work will not be affinitised."); cpu = -1; } opts->periodic_timer_cpu = cpu; @@ -1207,11 +1206,9 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) if( (s = getenv("EF_CLUSTER_IGNORE")) ) { ci_log("EF_CLUSTER_IGNORE is deprecated use EF_CLUSTER_SIZE instead"); opts->cluster_ignore = atoi(s); - } - else if( (s = getenv("EF_CLUSTER_SIZE")) ) { + } else if( (s = getenv("EF_CLUSTER_SIZE")) ) { opts->cluster_ignore = (atoi(s) == 0); - } - else + } else opts->cluster_ignore = 1; #if CI_CFG_TCP_SHARED_LOCAL_PORTS @@ -1222,8 +1219,8 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) if( (s = getenv("EF_TCP_SHARED_LOCAL_PORTS_MAX")) ) opts->tcp_shared_local_ports_max = atoi(s); if( (s = getenv("EF_TCP_SHARED_LOCAL_PORTS_NO_FALLBACK")) ) - opts->tcp_shared_local_no_fallback = atoi(s) && - opts->tcp_shared_local_ports > 0; + opts->tcp_shared_local_no_fallback = + atoi(s) && opts->tcp_shared_local_ports > 0; if( (s = getenv("EF_TCP_SHARED_LOCAL_PORTS_PER_IP")) ) opts->tcp_shared_local_ports_per_ip = atoi(s); if( (s = getenv("EF_TCP_SHARED_LOCAL_PORTS_PER_IP_MAX")) ) @@ -1236,9 +1233,9 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->rx_merge_mode = atoi(s); handle_str_opt(opts, "EF_INTERFACE_WHITELIST", opts->iface_whitelist, - sizeof(opts->iface_whitelist)); + sizeof(opts->iface_whitelist)); handle_str_opt(opts, "EF_INTERFACE_BLACKLIST", opts->iface_blacklist, - sizeof(opts->iface_blacklist)); + sizeof(opts->iface_blacklist)); if( (s = getenv("EF_KERNEL_PACKETS_BATCH_SIZE")) ) opts->kernel_packets_batch_size = atoi(s); @@ -1248,7 +1245,7 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) static const char* const tcp_isn_opts[] = { "clocked", "clocked+cache", 0 }; opts->tcp_isn_mode = - parse_enum(opts, "EF_TCP_ISN_MODE", tcp_isn_opts, "clocked+cache"); + parse_enum(opts, "EF_TCP_ISN_MODE", tcp_isn_opts, "clocked+cache"); if( (s = getenv("EF_TCP_ISN_2MSL")) ) opts->tcp_isn_2msl = atoi(s); if( (s = getenv("EF_TCP_ISN_CACHE_SIZE")) ) @@ -1294,9 +1291,10 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->icmp_msg_max = atoi(s); #if CI_CFG_TCP_OFFLOAD_RECYCLER || CI_CFG_TX_CRC_OFFLOAD - static const char* const tcp_offload_opts[] = { "off", "tcp", "ceph", "nvme", 0 }; - opts->tcp_offload_plugin = parse_enum(opts, "EF_TCP_OFFLOAD", - tcp_offload_opts, "off"); + static const char* const tcp_offload_opts[] = { "off", "tcp", "ceph", "nvme", + 0 }; + opts->tcp_offload_plugin = + parse_enum(opts, "EF_TCP_OFFLOAD", tcp_offload_opts, "off"); if( (s = getenv("EF_CEPH_DATA_BUF_BYTES")) ) opts->ceph_data_buf_bytes = atoi(s); @@ -1306,33 +1304,31 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) #endif } -static int -handle_str_opt(ci_netif_config_opts* opts, - const char* optname, char* optval_buf, size_t optval_buflen) +static int handle_str_opt(ci_netif_config_opts* opts, const char* optname, + char* optval_buf, size_t optval_buflen) { - char* s; + char* s; if( (s = getenv(optname)) ) { if( strlen(s) >= optval_buflen ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "Value of %s" - "too long - truncating. ", optname); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "Value of %s" + "too long - truncating. ", + optname); } strncpy(optval_buf, s, optval_buflen); optval_buf[optval_buflen - 1] = 0; return 1; - } - else { + } else { return 0; } } -static int -parse_enum(ci_netif_config_opts* opts, - const char* name, const char* const* options, - const char* default_val) +static int parse_enum(ci_netif_config_opts* opts, const char* name, + const char* const* options, const char* default_val) { const char* value; - int i; + int i; if( (value = getenv(name)) == NULL ) value = default_val; @@ -1343,20 +1339,20 @@ parse_enum(ci_netif_config_opts* opts, return i; CONFIG_LOG(opts, CONFIG_WARNINGS, - "%s='%s' not recognised, defaulting to '%s'", - name, value, default_val); + "%s='%s' not recognised, defaulting to '%s'", name, value, + default_val); value = default_val; } } -static const char* strmchrnul(const char *s, const char* delims) +static const char* strmchrnul(const char* s, const char* delims) { const char* r = NULL; while( *delims ) { - const char * t = strchrnul(s, *delims); - if( !r || t < r ) - r = t; - ++delims; + const char* t = strchrnul(s, *delims); + if( ! r || t < r ) + r = t; + ++delims; } return r; } @@ -1365,23 +1361,21 @@ static const char* strmchrnul(const char *s, const char* delims) /* Note that all ifindices in this function must be signed to allow for the * extra magic values such as CITP_SCALABLE_FILTERS_ALL. */ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, - const char** spec_in_out, - int* mode_out, - ci_int32* ifindex_out) + const char** spec_in_out, int* mode_out, ci_int32* ifindex_out) { - char ifname[IFNAMSIZ] = {}; - const char* s = *spec_in_out; + char ifname[IFNAMSIZ] = {}; + const char* s = *spec_in_out; const char* modestr; - ci_int32 ifindex = 0; - int mode = -1; - int rc = 0; + ci_int32 ifindex = 0; + int mode = -1; + int rc = 0; - modestr = strmchrnul(s, "=,"); + modestr = strmchrnul(s, "=,"); strncpy(ifname, s, CI_MIN(modestr - s, sizeof(ifname) - 1)); ifindex = if_nametoindex(ifname); - if( ifindex == CI_IFID_BAD && (strcmp(ifname, "any") == 0 || - strcmp(ifname, ".") == 0) ) + if( ifindex == CI_IFID_BAD && + (strcmp(ifname, "any") == 0 || strcmp(ifname, ".") == 0) ) ifindex = CITP_SCALABLE_FILTERS_ALL; /* If we've got a valid ifindex then we need to determine the mode */ @@ -1397,31 +1391,36 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, /* If the mode is set explicitly then parse that */ if( modestr && modestr != strmchrnul(modestr, ",") ) { int mode_value = CITP_SCALABLE_MODE_NONE; - int mode_set = 0; - struct {const char* name; int mode;} modes[] = { - {"transparent_active", CITP_SCALABLE_MODE_TPROXY_ACTIVE}, - {"passive", CITP_SCALABLE_MODE_PASSIVE}, - {"active", CITP_SCALABLE_MODE_ACTIVE}, - {"rss", CITP_SCALABLE_MODE_RSS}, + int mode_set = 0; + struct { + const char* name; + int mode; + } modes[] = { + { "transparent_active", CITP_SCALABLE_MODE_TPROXY_ACTIVE }, + { "passive", CITP_SCALABLE_MODE_PASSIVE }, + { "active", CITP_SCALABLE_MODE_ACTIVE }, + { "rss", CITP_SCALABLE_MODE_RSS }, }; - while ( modestr != strmchrnul(modestr, ",") ) { + while( modestr != strmchrnul(modestr, ",") ) { const char* mode_end = strmchrnul(modestr, ":,"); - int len = mode_end - modestr; - int i; + int len = mode_end - modestr; + int i; for( i = 0; i < sizeof(modes) / sizeof(*modes); ++i ) if( strncmp(modes[i].name, modestr, len) == 0 && modes[i].name[len] == 0 ) { - mode_value |= modes[i].mode; + mode_value |= modes[i].mode; mode_set |= 3; break; - } + } if( ! (mode_set & 1) ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: Error parsing " - "EF_SCALABLE_FILTERS, token '%s', disabling scalable " - "filter mode", modestr); - mode = CITP_SCALABLE_MODE_NONE; + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: Error parsing " + "EF_SCALABLE_FILTERS, token '%s', disabling scalable " + "filter mode", + modestr); + mode = CITP_SCALABLE_MODE_NONE; mode_set = 0; - rc = -EINVAL; + rc = -EINVAL; break; } modestr = mode_end; @@ -1431,68 +1430,72 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, } if( mode_set ) { - int modes_supported[] = { - CITP_SCALABLE_MODE_TPROXY_ACTIVE, - CITP_SCALABLE_MODE_PASSIVE, - CITP_SCALABLE_MODE_ACTIVE, + int modes_supported[] = { CITP_SCALABLE_MODE_TPROXY_ACTIVE, + CITP_SCALABLE_MODE_PASSIVE, CITP_SCALABLE_MODE_ACTIVE, CITP_SCALABLE_MODE_TPROXY_ACTIVE | CITP_SCALABLE_MODE_PASSIVE, CITP_SCALABLE_MODE_TPROXY_ACTIVE | CITP_SCALABLE_MODE_RSS, CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_RSS, CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS, CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_PASSIVE | - CITP_SCALABLE_MODE_RSS - }; - int n_modes = sizeof(modes_supported)/sizeof(*modes_supported); - int fail = 1; + CITP_SCALABLE_MODE_RSS }; + int n_modes = sizeof(modes_supported) / sizeof(*modes_supported); + int fail = 1; int i; mode = mode_value; - for( i = 0; i < n_modes; ++i) { + for( i = 0; i < n_modes; ++i ) { if( mode == modes_supported[i] ) { fail = 0; break; } } if( fail ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: Unsupported scalable " - "mode selected, disabling scalable filter mode."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: Unsupported scalable " + "mode selected, disabling scalable filter mode."); mode = CITP_SCALABLE_MODE_NONE; - rc = -EINVAL; + rc = -EINVAL; } } } - } - else { - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: Could not determine ifindex " - "from name '%s', disabling scalable filter mode.", ifname); + } else { + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: Could not determine ifindex " + "from name '%s', disabling scalable filter mode.", + ifname); mode = CITP_SCALABLE_MODE_NONE; - rc = -EINVAL; + rc = -EINVAL; } if( modestr && *modestr ) ++modestr; *spec_in_out = modestr; - *mode_out = mode; + *mode_out = mode; *ifindex_out = ifindex; return rc; } -#define swap(x,y) ({ typeof(x) t = (x); (x) = (y); (y) = (t); }) +#define swap(x, y) \ + ({ \ + typeof(x) t = (x); \ + (x) = (y); \ + (y) = (t); \ + }) -static void -ci_netif_config_opts_getenv_ef_scalable_filters(ci_netif_config_opts* opts) +static void ci_netif_config_opts_getenv_ef_scalable_filters( + ci_netif_config_opts* opts) { const char* s; - int enable = 0; - int mode = CITP_SCALABLE_MODE_NONE; - int listen_mode = CITP_SCALABLE_LISTEN_BOUND; + int enable = 0; + int mode = CITP_SCALABLE_MODE_NONE; + int listen_mode = CITP_SCALABLE_LISTEN_BOUND; #if CI_CFG_TCP_SHARED_LOCAL_PORTS int active_wilds_need_filter = 1; #endif - int rc = 0; + int rc = 0; ci_int32 ifindexes[2] = {}; /* Nothing is interesting unless EF_SCALABLE_FILTERS is set */ @@ -1501,78 +1504,81 @@ ci_netif_config_opts_getenv_ef_scalable_filters(ci_netif_config_opts* opts) int cluster_name_len; int i; - strncpy(opts->scalable_filter_string, s, - sizeof(opts->scalable_filter_string)); + strncpy( + opts->scalable_filter_string, s, sizeof(opts->scalable_filter_string)); opts->scalable_filter_string[sizeof(opts->scalable_filter_string) - 1] = 0; /* parse interfaces in EF_SCALABLE_FILTERS until: got two of them, * run out of the string or hit parsing error */ - for( i = 0; - i < 2 && s && *s && - 0 == (rc = ci_opts_parse_scalable_filters_nic(opts, &s, &modes[i], - &ifindexes[i])); - ++i); + for( i = 0; i < 2 && s && *s && + 0 == (rc = ci_opts_parse_scalable_filters_nic( + opts, &s, &modes[i], &ifindexes[i])); + ++i ) + ; if( rc != 0 ) { /* message has already been printed */ goto invalid_mode; - } - else if( i == 0 ) { + } else if( i == 0 ) { mode = CITP_SCALABLE_MODE_NONE; - } - else if( i == 1 ) { + } else if( i == 1 ) { /* If the mode was not set explicitly then default to non-rss mode, * otherwise check the mode is supported */ if( modes[0] < 0 ) - modes[0] = CITP_SCALABLE_MODE_TPROXY_ACTIVE | - CITP_SCALABLE_MODE_PASSIVE; + modes[0] = + CITP_SCALABLE_MODE_TPROXY_ACTIVE | CITP_SCALABLE_MODE_PASSIVE; ifindexes[1] = ifindexes[0]; - } - else { + } else { /* Multiple modes specified. */ if( ifindexes[0] == CITP_SCALABLE_FILTERS_ALL || ifindexes[1] == CITP_SCALABLE_FILTERS_ALL ) { CONFIG_LOG(opts, CONFIG_WARNINGS, - "config: Multiple scalable interfaces specified when " - "requesting scalable filters on all interfaces."); + "config: Multiple scalable interfaces specified when " + "requesting scalable filters on all interfaces."); goto invalid_mode; } if( modes[0] < 0 && modes[1] < 0 ) { modes[0] = CITP_SCALABLE_MODE_PASSIVE; modes[1] = CITP_SCALABLE_MODE_TPROXY_ACTIVE; - } - else { + } else { if( modes[1] < 0 ) { swap(modes[0], modes[1]); swap(ifindexes[0], ifindexes[1]); } if( modes[0] < 0 ) { - if( modes[1] & (CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_TPROXY_ACTIVE) ) { + if( modes[1] & (CITP_SCALABLE_MODE_ACTIVE | + CITP_SCALABLE_MODE_TPROXY_ACTIVE) ) { if( modes[1] & CITP_SCALABLE_MODE_PASSIVE ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: With two scalable interfaces " - "one needs to be exclusively active while other exclusively passive."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: With two scalable interfaces " + "one needs to be exclusively active while other exclusively " + "passive."); goto invalid_mode; } - modes[0] = CITP_SCALABLE_MODE_PASSIVE | (modes[1] & CITP_SCALABLE_MODE_RSS); - } - else if( modes[1] & CITP_SCALABLE_MODE_PASSIVE ) { - modes[0] = CITP_SCALABLE_MODE_TPROXY_ACTIVE | (modes[1] & CITP_SCALABLE_MODE_RSS); + modes[0] = CITP_SCALABLE_MODE_PASSIVE | + (modes[1] & CITP_SCALABLE_MODE_RSS); + } else if( modes[1] & CITP_SCALABLE_MODE_PASSIVE ) { + modes[0] = CITP_SCALABLE_MODE_TPROXY_ACTIVE | + (modes[1] & CITP_SCALABLE_MODE_RSS); swap(modes[0], modes[1]); swap(ifindexes[0], ifindexes[1]); } } /* now we have both modes resolved, passive at index 1 */ - ci_assert_nflags(modes[1], CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_TPROXY_ACTIVE); - ci_assert(modes[0] & (CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_TPROXY_ACTIVE)); + ci_assert_nflags(modes[1], + CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_TPROXY_ACTIVE); + ci_assert(modes[0] & (CITP_SCALABLE_MODE_ACTIVE | + CITP_SCALABLE_MODE_TPROXY_ACTIVE)); ci_assert_flags(modes[1], CITP_SCALABLE_MODE_PASSIVE); ci_assert_nflags(modes[0], CITP_SCALABLE_MODE_PASSIVE); } if( (modes[0] ^ modes[1]) & CITP_SCALABLE_MODE_RSS ) { - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: When specifying two scalable " - "modes RSS setting needs to be identical."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: When specifying two scalable " + "modes RSS setting needs to be identical."); goto invalid_mode; } } @@ -1593,49 +1599,50 @@ ci_netif_config_opts_getenv_ef_scalable_filters(ci_netif_config_opts* opts) if( (s = getenv("EF_SCALABLE_ACTIVE_WILDS_NEED_FILTER")) ) active_wilds_need_filter = atoi(s); #endif - } - else { + } else { enable = CITP_SCALABLE_FILTERS_DISABLE; } /* Stacks cannot be named by EF_NAME in clustered scalable modes. */ if( enable == CITP_SCALABLE_FILTERS_ENABLE && - mode & CITP_SCALABLE_MODE_RSS && - (s = getenv("EF_NAME")) && s[0] != '\0' ) + mode & CITP_SCALABLE_MODE_RSS && (s = getenv("EF_NAME")) && + s[0] != '\0' ) CONFIG_LOG(opts, CONFIG_WARNINGS, - "config: Stacks cannot be named by EF_NAME while in a " - "clustered scalable mode.") + "config: Stacks cannot be named by EF_NAME while in a " + "clustered scalable mode.") /* In scalable mode, cluster name has a max length of 5. See bug78935. */ cluster_name_len = 5 - (CITP_OPTS.cluster_size > 9); if( strlen(CITP_OPTS.cluster_name) > cluster_name_len ) { CITP_OPTS.cluster_name[cluster_name_len] = '\0'; CONFIG_LOG(opts, CONFIG_WARNINGS, - "config: The supplied EF_CLUSTER_NAME is too long and is " - "being truncated to: %s.", CITP_OPTS.cluster_name); + "config: The supplied EF_CLUSTER_NAME is too long and is " + "being truncated to: %s.", + CITP_OPTS.cluster_name); } - } - else { + } else { if( (s = getenv("EF_SCALABLE_FILTERS_ENABLE")) ) - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: EF_SCALABLE_FILTERS_ENABLE " - "ignored as no valid config for EF_SCALABLE_FILTERS found."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: EF_SCALABLE_FILTERS_ENABLE " + "ignored as no valid config for EF_SCALABLE_FILTERS found."); enable = CITP_SCALABLE_FILTERS_DISABLE; } if( enable == CITP_SCALABLE_FILTERS_DISABLE ) { if( (s = getenv("EF_SCALABLE_LISTEN_MODE")) ) - CONFIG_LOG(opts, CONFIG_WARNINGS, "config: EF_SCALABLE_LISTEN_MODE " - "ignored as no valid config for EF_SCALABLE_FILTERS found."); + CONFIG_LOG(opts, CONFIG_WARNINGS, + "config: EF_SCALABLE_LISTEN_MODE " + "ignored as no valid config for EF_SCALABLE_FILTERS found."); if( (s = getenv("EF_SCALABLE_ACTIVE_WILDS_NEED_FILTER")) ) CONFIG_LOG(opts, CONFIG_WARNINGS, - "config: EF_SCALABLE_ACTIVE_WILDS_NEED_FILTER " - "ignored as no valid config for EF_SCALABLE_FILTERS found."); + "config: EF_SCALABLE_ACTIVE_WILDS_NEED_FILTER " + "ignored as no valid config for EF_SCALABLE_FILTERS found."); } opts->scalable_filter_ifindex_passive = ifindexes[1]; - opts->scalable_filter_ifindex_active = ifindexes[0]; - opts->scalable_filter_enable = enable; - opts->scalable_filter_mode = mode; - opts->scalable_listen = listen_mode; + opts->scalable_filter_ifindex_active = ifindexes[0]; + opts->scalable_filter_enable = enable; + opts->scalable_filter_mode = mode; + opts->scalable_listen = listen_mode; #if CI_CFG_TCP_SHARED_LOCAL_PORTS opts->scalable_active_wilds_need_filter = active_wilds_need_filter; #endif @@ -1659,44 +1666,43 @@ static void netif_tcp_helper_build2(ci_netif* ni) { #if CI_CFG_TCP_SHARED_LOCAL_PORTS ni->active_wild_table = - (struct oo_p_dllink*) ((char*) ni->state + ni->state->active_wild_ofs); + (struct oo_p_dllink*) ((char*) ni->state + ni->state->active_wild_ofs); #endif ni->seq_table = - (ci_tcp_prev_seq_t*) ((char*) ni->state + ni->state->seq_table_ofs); - ni->deferred_pkts = - (struct oo_deferred_pkt*) ((char*) ni->state + - ni->state->deferred_pkts_ofs); + (ci_tcp_prev_seq_t*) ((char*) ni->state + ni->state->seq_table_ofs); + ni->deferred_pkts = (struct oo_deferred_pkt*) ((char*) ni->state + + ni->state->deferred_pkts_ofs); ni->filter_table = - (ci_netif_filter_table*) ((char*) ni->state + ni->state->table_ofs); + (ci_netif_filter_table*) ((char*) ni->state + ni->state->table_ofs); ni->filter_table_ext = - (ci_netif_filter_table_entry_ext*) ((char*) ni->state + - ni->state->table_ext_ofs); + (ci_netif_filter_table_entry_ext*) ((char*) ni->state + + ni->state->table_ext_ofs); #if CI_CFG_IPV6 ni->ip6_filter_table = - (ci_ip6_netif_filter_table*) ((char*) ni->state + ni->state->ip6_table_ofs); + (ci_ip6_netif_filter_table*) ((char*) ni->state + + ni->state->ip6_table_ofs); #endif ni->packets = (oo_pktbuf_manager*) ((char*) ni->state + ni->state->buf_ofs); ni->dma_addrs = (ef_addr*) ((char*) ni->state + ni->state->dma_ofs); #if CI_CFG_UL_INTERRUPT_HELPER oo_ringbuffer_init(&ni->closed_eps, &ni->state->closed_eps, "closed_eps", - (void*)((char*) ni->state + ni->state->closed_eps_ofs)); + (void*) ((char*) ni->state + ni->state->closed_eps_ofs)); oo_ringbuffer_init(&ni->sw_filter_ops, &ni->state->sw_filter_ops, - "sw_filters", - (void*)((char*) ni->state + ni->state->sw_filter_ofs)); + "sw_filters", (void*) ((char*) ni->state + ni->state->sw_filter_ofs)); #endif } - static void netif_tcp_helper_munmap(ci_netif* ni) { int rc; if( ni->timesync != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->timesync, ni->state->timesync_bytes); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap timesync %d", __FUNCTION__, rc)); + rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), ni->timesync, + ni->state->timesync_bytes); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap timesync %d", __FUNCTION__, rc)); } /* Buffer mapping. */ @@ -1713,8 +1719,7 @@ static void netif_tcp_helper_munmap(ci_netif* ni) #endif { rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->pkt_bufs[id], - CI_CFG_PKT_BUF_SIZE * PKTS_PER_SET); + ni->pkt_bufs[id], CI_CFG_PKT_BUF_SIZE * PKTS_PER_SET); } if( rc < 0 ) LOG_NV(ci_log("%s: munmap packets %d", __FUNCTION__, rc)); @@ -1723,86 +1728,92 @@ static void netif_tcp_helper_munmap(ci_netif* ni) } if( ni->efct_shm_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->efct_shm_ptr, ni->state->efct_shm_mmap_bytes); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap efct shm %d", __FUNCTION__, rc)); + rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), ni->efct_shm_ptr, + ni->state->efct_shm_mmap_bytes); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap efct shm %d", __FUNCTION__, rc)); } if( ni->buf_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->buf_ptr, ni->state->buf_mmap_bytes); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap bufs %d", __FUNCTION__, rc)); + rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), ni->buf_ptr, + ni->state->buf_mmap_bytes); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap bufs %d", __FUNCTION__, rc)); } #if CI_CFG_PIO if( ni->pio_bytes_mapped != 0 && ni->pio_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->pio_ptr, ni->pio_bytes_mapped); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap pio %d", __FUNCTION__, rc)); + rc = oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->pio_ptr, ni->pio_bytes_mapped); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap pio %d", __FUNCTION__, rc)); } #endif #if CI_CFG_CTPIO if( ni->ctpio_bytes_mapped != 0 && ni->ctpio_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->ctpio_ptr, ni->ctpio_bytes_mapped); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap pio %d", __FUNCTION__, rc)); + rc = oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->ctpio_ptr, ni->ctpio_bytes_mapped); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap pio %d", __FUNCTION__, rc)); } #endif #if CI_CFG_TCP_OFFLOAD_RECYCLER if( ni->plugin_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->plugin_ptr, CI_PAGE_SIZE); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap plugin %d", __FUNCTION__, rc)); + rc = oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->plugin_ptr, CI_PAGE_SIZE); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap plugin %d", __FUNCTION__, rc)); } #endif if( ni->io_ptr != NULL ) { - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->io_ptr, ni->state->io_mmap_bytes); - if( rc < 0 ) LOG_NV(ci_log("%s: munmap io %d", __FUNCTION__, rc)); + rc = oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->io_ptr, ni->state->io_mmap_bytes); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap io %d", __FUNCTION__, rc)); } - rc = oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->state, ni->mmap_bytes); + rc = oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->state, ni->mmap_bytes); ni->state = NULL; - if( rc < 0 ) LOG_NV(ci_log("%s: munmap shared state %d", __FUNCTION__, rc)); + if( rc < 0 ) + LOG_NV(ci_log("%s: munmap shared state %d", __FUNCTION__, rc)); } static int netif_tcp_helper_mmap(ci_netif* ni) { ci_netif_state* ns = ni->state; - void* p; - int rc; + void* p; + int rc; /* Initialise all mappings with NULL to roll back in case of error. */ ni->timesync = NULL; - ni->io_ptr = NULL; + ni->io_ptr = NULL; #if CI_CFG_PIO - ni->pio_ptr = NULL; + ni->pio_ptr = NULL; ni->pio_bytes_mapped = 0; #endif #if CI_CFG_CTPIO - ni->ctpio_ptr = NULL; + ni->ctpio_ptr = NULL; ni->ctpio_bytes_mapped = 0; #endif #if CI_CFG_TCP_OFFLOAD_RECYCLER ni->plugin_ptr = NULL; #endif - ni->buf_ptr = NULL; + ni->buf_ptr = NULL; ni->efct_shm_ptr = NULL; - ni->packets = NULL; + ni->packets = NULL; /**************************************************************************** * Create timesync mapping. */ if( ns->timesync_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_TIMESYNC, ns->timesync_bytes, - OO_MMAP_FLAG_READONLY | OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_TIMESYNC, ns->timesync_bytes, + OO_MMAP_FLAG_READONLY | OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap timesync %d", __FUNCTION__, rc)); goto fail1; @@ -1815,10 +1826,8 @@ static int netif_tcp_helper_mmap(ci_netif* ni) * Create the I/O mapping. */ if( ns->io_mmap_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_IO, ns->io_mmap_bytes, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_IO, ns->io_mmap_bytes, OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap io %d", __FUNCTION__, rc)); goto fail1; @@ -1831,15 +1840,13 @@ static int netif_tcp_helper_mmap(ci_netif* ni) * Create the PIO mapping. */ if( ns->pio_mmap_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_PIO, ns->pio_mmap_bytes, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_PIO, ns->pio_mmap_bytes, OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap pio %d", __FUNCTION__, rc)); goto fail2; } - ni->pio_ptr = (uint8_t*) p; + ni->pio_ptr = (uint8_t*) p; /* Record length actually mapped as the value in the shared state can * change across NIC reboots. */ ni->pio_bytes_mapped = ns->pio_mmap_bytes; @@ -1851,15 +1858,14 @@ static int netif_tcp_helper_mmap(ci_netif* ni) * Create the CTPIO mapping. */ if( ns->ctpio_mmap_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_CTPIO, ns->ctpio_mmap_bytes, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_CTPIO, ns->ctpio_mmap_bytes, OO_MMAP_FLAG_POPULATE, + &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap ctpio %d", __FUNCTION__, rc)); goto fail2; } - ni->ctpio_ptr = (uint8_t*) p; + ni->ctpio_ptr = (uint8_t*) p; /* Record length actually mapped as the value in the shared state can * change across NIC reboots. */ ni->ctpio_bytes_mapped = ns->ctpio_mmap_bytes; @@ -1872,17 +1878,15 @@ static int netif_tcp_helper_mmap(ci_netif* ni) */ { bool have_plugin_io = false; - int nic_i; + int nic_i; OO_STACK_FOR_EACH_INTF_I(ni, nic_i) - if( ns->nic[nic_i].oo_vi_flags & OO_VI_FLAGS_PLUGIN_IO_EN ) - have_plugin_io = true; + if( ns->nic[nic_i].oo_vi_flags & OO_VI_FLAGS_PLUGIN_IO_EN ) + have_plugin_io = true; if( have_plugin_io ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_PLUGIN, CI_PAGE_SIZE, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_PLUGIN, CI_PAGE_SIZE, OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap plugin %d", __FUNCTION__, rc)); goto fail2; @@ -1896,10 +1900,9 @@ static int netif_tcp_helper_mmap(ci_netif* ni) * Create the I/O buffer mapping. */ if( ns->buf_mmap_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_IOBUFS, ns->buf_mmap_bytes, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_IOBUFS, ns->buf_mmap_bytes, OO_MMAP_FLAG_POPULATE, + &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap iobufs %d", __FUNCTION__, rc)); goto fail2; @@ -1911,10 +1914,9 @@ static int netif_tcp_helper_mmap(ci_netif* ni) * Create the efct rxq shm mapping. */ if( ns->efct_shm_mmap_bytes != 0 ) { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_EFCT_SHM, ns->efct_shm_mmap_bytes, - OO_MMAP_FLAG_POPULATE, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_EFCT_SHM, ns->efct_shm_mmap_bytes, + OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { LOG_NV(ci_log("%s: oo_resource_mmap rxq shm %d", __FUNCTION__, rc)); goto fail2; @@ -1924,9 +1926,9 @@ static int netif_tcp_helper_mmap(ci_netif* ni) return 0; - fail2: +fail2: netif_tcp_helper_munmap(ni); - fail1: +fail1: return rc; } @@ -1934,47 +1936,49 @@ static int netif_tcp_helper_mmap(ci_netif* ni) static int oo_efct_superbuf_config_refresh(ef_vi* vi, int qid) { oo_efct_superbuf_config_refresh_t op; - ef_vi_efct_rxq* rxq = &vi->efct_rxq[qid]; - op.intf_i = rxq->resource_id; - op.qid = qid; - op.max_superbufs = CI_EFCT_MAX_SUPERBUFS; - CI_USER_PTR_SET(op.superbufs,rxq->superbuf); + ef_vi_efct_rxq* rxq = &vi->efct_rxq[qid]; + op.intf_i = rxq->resource_id; + op.qid = qid; + op.max_superbufs = CI_EFCT_MAX_SUPERBUFS; + CI_USER_PTR_SET(op.superbufs, rxq->superbuf); CI_USER_PTR_SET(op.current_mappings, rxq->current_mappings); return oo_resource_op(vi->dh, OO_IOC_EFCT_SUPERBUF_CONFIG_REFRESH, &op); } static int init_ef_vi(ci_netif* ni, int nic_i, int vi_state_offset, - int vi_io_offset, int vi_efct_shm_offset, - char** vi_mem_ptr, - ef_vi* vi, unsigned vi_instance, unsigned abs_idx, - int evq_bytes, int txq_size, ef_vi_stats* vi_stats) + int vi_io_offset, int vi_efct_shm_offset, char** vi_mem_ptr, ef_vi* vi, + unsigned vi_instance, unsigned abs_idx, int evq_bytes, int txq_size, + ef_vi_stats* vi_stats) { - ef_vi_state* state = (void*) ((char*) ni->state + vi_state_offset); - ci_netif_state_nic_t* nsn = &(ni->state->nic[nic_i]); - uint32_t* ids = (void*) (state + 1); - unsigned vi_bar_off = vi_instance * 8192; + ef_vi_state* state = (void*) ((char*) ni->state + vi_state_offset); + ci_netif_state_nic_t* nsn = &(ni->state->nic[nic_i]); + uint32_t* ids = (void*) (state + 1); + unsigned vi_bar_off = vi_instance * 8192; ef_vi_init(vi, ef_vi_arch_from_efhw_arch(nsn->vi_arch), nsn->vi_variant, - nsn->vi_revision, nsn->vi_flags, nsn->vi_nic_flags, state); + nsn->vi_revision, nsn->vi_flags, nsn->vi_nic_flags, state); ef_vi_init_out_flags(vi, nsn->vi_out_flags); vi_io_offset += vi_bar_off & (CI_PAGE_SIZE - 1); ef_vi_init_io(vi, ni->io_ptr + vi_io_offset); ef_vi_init_timer(vi, nsn->timer_quantum_ns); - vi->vi_i = vi_instance; + vi->vi_i = vi_instance; vi->abs_idx = abs_idx; - vi->dh = ci_netif_get_driver_handle(ni); + vi->dh = ci_netif_get_driver_handle(ni); *vi_mem_ptr = ef_vi_init_qs(vi, *vi_mem_ptr, ids, evq_bytes / 8, - nsn->vi_rxq_size, nsn->rx_prefix_len, txq_size); + nsn->vi_rxq_size, nsn->rx_prefix_len, txq_size); if( vi->max_efct_rxq ) { int i; - int rc = efct_vi_mmap_init_internal(vi, - (void*)((char*)ni->efct_shm_ptr + vi_efct_shm_offset)); + int rc = efct_vi_mmap_init_internal( + vi, (void*) ((char*) ni->efct_shm_ptr + vi_efct_shm_offset)); if( rc < 0 ) return rc; for( i = 0; i < vi->max_efct_rxq; ++i ) - efct_vi_attach_rxq_internal(vi, i, nic_i, - oo_efct_superbuf_config_refresh); + efct_vi_attach_rxq_internal( + vi, i, nic_i, oo_efct_superbuf_config_refresh); + } + if( vi->nic_type.arch == EF_VI_ARCH_SWXTCH ) { + ni->nic_hw[nic_i].poll_in_kernel = 0; } ef_vi_set_ts_format(vi, nsn->ts_format); ef_vi_init_rx_timestamping(vi, nsn->rx_ts_correction); @@ -1995,7 +1999,8 @@ static void cleanup_ef_vi(ef_vi* vi) static void cleanup_all_vis(ci_netif* ni, unsigned vis_inited) { int nic_i; - OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { int i; int num_vis = ci_netif_num_vis(ni); @@ -2011,10 +2016,11 @@ static void cleanup_all_vis(ci_netif* ni, unsigned vis_inited) unsigned ci_netif_build_future_intf_mask(ci_netif* ni) { - int nic_i; + int nic_i; unsigned mask = 0; - OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { /* Disable future when there's an XDP prog attached because that prog may * alter the destination socket, in which case the future code would be * wrong. XDP-attachment implies poll_in_kernel, which is what we actually @@ -2022,12 +2028,13 @@ unsigned ci_netif_build_future_intf_mask(ci_netif* ni) ef_vi* vi = ci_netif_vi(ni, nic_i); if( #ifdef OO_HAS_POLL_IN_KERNEL - ! ni->nic_hw[nic_i].poll_in_kernel && + ! ni->nic_hw[nic_i].poll_in_kernel && #endif ~ef_vi_flags(vi) & EF_VI_RX_EVENT_MERGE && vi->nic_type.arch != EF_VI_ARCH_EF100 && /* TODO AF_XDP future detection is not currently supported */ - vi->nic_type.arch != EF_VI_ARCH_AF_XDP ) + ! (vi->nic_type.arch == EF_VI_ARCH_AF_XDP || + vi->nic_type.arch == EF_VI_ARCH_SWXTCH) ) mask |= 1u << nic_i; } return mask; @@ -2035,14 +2042,41 @@ unsigned ci_netif_build_future_intf_mask(ci_netif* ni) static int af_xdp_kick(ef_vi* vi) { - ci_netif* ni = vi->xdp_kick_context; - ci_netif_nic_t* nic = CI_CONTAINER(ci_netif_nic_t, vis[0], vi); - uint32_t intf_i = nic - ni->nic_hw; - int fd = ci_netif_get_driver_handle(ni); + ci_netif* ni = vi->xdp_kick_context; + ci_netif_nic_t* nic = CI_CONTAINER(ci_netif_nic_t, vis[0], vi); + uint32_t intf_i = nic - ni->nic_hw; + int fd = ci_netif_get_driver_handle(ni); return oo_resource_op(fd, OO_IOC_AF_XDP_KICK, &intf_i); } +static int ci_netif_swxtch_rx_init(ci_netif* ni) +{ + int nic_i, i, rc, out = 1; + ef_vi* vi; + + ci_netif_lock(ni); + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { + int num_vis = ci_netif_num_vis(ni); + for( i = 0; i < num_vis; ++i ) { + vi = &ni->nic_hw[nic_i].vis[i]; + if( vi->nic_type.arch == EF_VI_ARCH_SWXTCH ) { + // reset state + vi->ep_state->rxq.added = 0; + vi->ep_state->rxq.removed = 0; + if( (rc = ci_netif_rx_post(ni, nic_i, vi)) == 0 ) { + LOG_S(ci_log("Unable to initialize swxtch VI with RX Buffers")); + out = rc; + } + } + } + } + ci_netif_unlock(ni); + return out; +} + + static int netif_tcp_helper_build(ci_netif* ni) { /* On entry we require the following to be initialised: @@ -2051,11 +2085,11 @@ static int netif_tcp_helper_build(ci_netif* ni) ** ci_netif_get_driver_handle(ni), ni->tcp_mmap (for user builds only) */ ci_netif_state* ns = ni->state; - int rc, nic_i, size, expected_buf_ofs; - unsigned vi_io_offset, vi_state_offset, vi_efct_shm_offset; - char* vi_mem_ptr; - int vi_state_bytes; - int vis_inited = 0; + int rc, nic_i, size, expected_buf_ofs; + unsigned vi_io_offset, vi_state_offset, vi_efct_shm_offset; + char* vi_mem_ptr; + int vi_state_bytes; + int vis_inited = 0; #if CI_CFG_PIO unsigned pio_io_offset = 0, pio_buf_offset = 0, vi_bar_off; #endif @@ -2081,28 +2115,30 @@ static int netif_tcp_helper_build(ci_netif* ni) ** not, so we keep a count to calculate offsets rather than use ** nic_index. */ - vi_io_offset = 0; - vi_efct_shm_offset = 0; - vi_mem_ptr = ni->buf_ptr; - vi_state_offset = sizeof(*ni->state); + vi_io_offset = 0; + vi_efct_shm_offset = 0; + vi_mem_ptr = ni->buf_ptr; + vi_state_offset = sizeof(*ni->state); ni->future_intf_mask = 0; - OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { ci_netif_state_nic_t* nsn = &ns->nic[nic_i]; - ef_vi* vi; - int i; - int num_vis = ci_netif_num_vis(ni); + ef_vi* vi; + int i; + int num_vis = ci_netif_num_vis(ni); /* Get interface properties. */ - rc = oo_cp_get_hwport_properties(ni->cplane, ns->intf_i_to_hwport[nic_i], - NULL, NULL); + rc = oo_cp_get_hwport_properties( + ni->cplane, ns->intf_i_to_hwport[nic_i], NULL, NULL); if( rc < 0 ) goto fail1; - LOG_NV(ci_log("%s: ni->io_ptr=%p io_offset=%d mem_ptr=%p " - "state_offset=%d", __FUNCTION__, ni->io_ptr, - vi_io_offset, vi_mem_ptr, vi_state_offset)); + LOG_NV(ci_log( + "%s: ni->io_ptr=%p io_offset=%d mem_ptr=%p " + "state_offset=%d", + __FUNCTION__, ni->io_ptr, vi_io_offset, vi_mem_ptr, vi_state_offset)); ci_assert(((vi_mem_ptr - ni->buf_ptr) & (CI_PAGE_SIZE - 1)) == 0); @@ -2112,11 +2148,10 @@ static int netif_tcp_helper_build(ci_netif* ni) vi_state_bytes = 0; for( i = 0; i < num_vis; ++i ) { vi = &ni->nic_hw[nic_i].vis[i]; - rc = init_ef_vi(ni, nic_i, vi_state_offset + vi_state_bytes, vi_io_offset, - vi_efct_shm_offset, - &vi_mem_ptr, vi, nsn->vi_instance[i], nsn->vi_abs_idx[i], - i ? 0 : nsn->vi_evq_bytes, nsn->vi_txq_size, - &ni->state->vi_stats); + rc = init_ef_vi(ni, nic_i, vi_state_offset + vi_state_bytes, + vi_io_offset, vi_efct_shm_offset, &vi_mem_ptr, vi, + nsn->vi_instance[i], nsn->vi_abs_idx[i], i ? 0 : nsn->vi_evq_bytes, + nsn->vi_txq_size, &ni->state->vi_stats); if( rc ) goto fail2; ++vis_inited; @@ -2125,15 +2160,15 @@ static int netif_tcp_helper_build(ci_netif* ni) if( NI_OPTS(ni).tx_push ) ef_vi_set_tx_push_threshold(vi, NI_OPTS(ni).tx_push_thresh); - vi_state_bytes += ef_vi_calc_state_bytes(nsn->vi_rxq_size, - nsn->vi_txq_size); + vi_state_bytes += + ef_vi_calc_state_bytes(nsn->vi_rxq_size, nsn->vi_txq_size); vi_io_offset += nsn->vi_io_mmap_bytes; vi_efct_shm_offset += nsn->vi_efct_shm_mmap_bytes; } vi_state_offset += vi_state_bytes; - vi = ci_netif_vi(ni, nic_i); - vi->xdp_kick = af_xdp_kick; + vi = ci_netif_vi(ni, nic_i); + vi->xdp_kick = af_xdp_kick; vi->xdp_kick_context = ni; ci_assert_equal(vi_state_bytes, ns->vi_state_bytes); @@ -2150,15 +2185,15 @@ static int netif_tcp_helper_build(ci_netif* ni) /* Although the PIO regions are each in their own page, we have a * dense mapping for the host memory copy, starting at pio_bufs_ofs */ - ni->nic_hw[nic_i].pio.pio_buffer = (uint8_t*)ns + ns->pio_bufs_ofs + - pio_buf_offset; + ni->nic_hw[nic_i].pio.pio_buffer = + (uint8_t*) ns + ns->pio_bufs_ofs + pio_buf_offset; pio_buf_offset += nsn->pio_io_len; /* And set up rest of PIO struct so we can call ef_vi_pio_memcpy */ - vi_bar_off = nsn->vi_instance[0] * 8192; + vi_bar_off = nsn->vi_instance[0] * 8192; ni->nic_hw[nic_i].pio.pio_io = ni->pio_ptr + pio_io_offset; ni->nic_hw[nic_i].pio.pio_io += (vi_bar_off + 4096) & (CI_PAGE_SIZE - 1); ni->nic_hw[nic_i].pio.pio_len = nsn->pio_io_len; - vi->linked_pio = &ni->nic_hw[nic_i].pio; + vi->linked_pio = &ni->nic_hw[nic_i].pio; pio_io_offset += nsn->pio_io_mmap_bytes; } #endif @@ -2200,15 +2235,14 @@ static int netif_tcp_helper_build(ci_netif* ni) * the array (if we have had trouble allocating packet buffers), so * we need to be aware of that when checking the sizes are sane */ - size = ns->dma_ofs - ns->buf_ofs - sizeof(oo_pktbuf_manager); + size = ns->dma_ofs - ns->buf_ofs - sizeof(oo_pktbuf_manager); expected_buf_ofs = sizeof(ci_netif_state); expected_buf_ofs = CI_ROUND_UP(expected_buf_ofs, __alignof__(ef_vi_state)); expected_buf_ofs += ns->vi_state_bytes * oo_stack_intf_max(ni); - expected_buf_ofs = CI_ROUND_UP(expected_buf_ofs, - __alignof__(oo_pktbuf_manager)); - if( ns->buf_ofs != expected_buf_ofs || - ni->packets->sets_max < 1 || + expected_buf_ofs = + CI_ROUND_UP(expected_buf_ofs, __alignof__(oo_pktbuf_manager)); + if( ns->buf_ofs != expected_buf_ofs || ni->packets->sets_max < 1 || size / sizeof(oo_pktbuf_set) < ni->packets->sets_max ) { /* This typically happens if someone puts a variable width type such as * long in ci_netif_state_s, and a 32 bit user level library is used @@ -2216,24 +2250,26 @@ static int netif_tcp_helper_build(ci_netif* ni) */ /* Omitted check that size % sizeof(oo_pktbuf_set) == 0 because the * padding to nearest cache line makes it not necessarily true */ - ci_log("%d %d %d", ns->buf_ofs != sizeof(ci_netif_state) + - ns->vi_state_bytes * oo_stack_intf_max(ni), - ni->packets->sets_max < 1, - size / sizeof(oo_pktbuf_set) < ni->packets->sets_max); - ci_log("ERROR: data structure layout mismatch between kernel and " - "user level detected!"); + ci_log("%d %d %d", + ns->buf_ofs != sizeof(ci_netif_state) + + ns->vi_state_bytes * oo_stack_intf_max(ni), + ni->packets->sets_max < 1, + size / sizeof(oo_pktbuf_set) < ni->packets->sets_max); + ci_log( + "ERROR: data structure layout mismatch between kernel and " + "user level detected!"); ci_log("ns->buf_ofs=%d (expected %d)", ns->buf_ofs, expected_buf_ofs); ci_log(" sizeof(ci_netif_state) = %zd", sizeof(ci_netif_state)); ci_log(" alignof(ef_vi_state) = %zd", __alignof__(ef_vi_state)); ci_log(" vi_state_bytes = %d", ns->vi_state_bytes); ci_log(" stack_intf_max = %d", oo_stack_intf_max(ni)); - ci_log(" alignof(oo_pktbuf_manager) = %zd", - __alignof__(oo_pktbuf_manager)); - ci_log("oo_pktbuf_set=%zd, size=%d, sets_max=%d", - sizeof(oo_pktbuf_set), size, ni->packets->sets_max); + ci_log( + " alignof(oo_pktbuf_manager) = %zd", __alignof__(oo_pktbuf_manager)); + ci_log("oo_pktbuf_set=%zd, size=%d, sets_max=%d", sizeof(oo_pktbuf_set), + size, ni->packets->sets_max); ci_log("a: %zd != 0", size % sizeof(oo_pktbuf_set)); - ci_log("b: 1 <= %zd <= %d ", size / sizeof(oo_pktbuf_set), - ni->packets->sets_max); + ci_log("b: 1 <= %zd <= %d ", size / sizeof(oo_pktbuf_set), + ni->packets->sets_max); rc = -EINVAL; goto fail3; } @@ -2244,9 +2280,9 @@ static int netif_tcp_helper_build(ci_netif* ni) goto fail3; } { - int i; + int i; struct ci_extra_ep ref = { CI_FD_BAD }; - for( i = 0; i < ni->state->max_ep_bufs; ++ i ) + for( i = 0; i < ni->state->max_ep_bufs; ++i ) ni->eps[i] = ref; } @@ -2258,6 +2294,10 @@ static int netif_tcp_helper_build(ci_netif* ni) if( ni->cplane_init_net == NULL ) ns->flags |= CI_NETIF_FLAG_NO_INIT_NET_CPLANE; + if( (rc = ci_netif_swxtch_rx_init(ni)) == 0 ) { + goto fail3; + } + return 0; fail3: @@ -2271,38 +2311,34 @@ static int netif_tcp_helper_build(ci_netif* ni) #endif - #ifndef __KERNEL__ -static int -netif_tcp_helper_restore(ci_netif* ni, unsigned netif_mmap_bytes) +static int netif_tcp_helper_restore(ci_netif* ni, unsigned netif_mmap_bytes) { void* p; - int rc; + int rc; - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_STATE, netif_mmap_bytes, - OO_MMAP_FLAG_DEFAULT, &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_STATE, netif_mmap_bytes, OO_MMAP_FLAG_DEFAULT, &p); if( rc < 0 ) { LOG_NV(ci_log("netif_tcp_helper_restore: oo_resource_mmap %d", rc)); return rc; } - ni->state = (ci_netif_state*) p; + ni->state = (ci_netif_state*) p; ni->mmap_bytes = netif_mmap_bytes; - rc = netif_tcp_helper_build(ni); + rc = netif_tcp_helper_build(ni); if( rc < 0 ) { ci_log("%s: netif_tcp_helper_build %d", __FUNCTION__, rc); - oo_resource_munmap(ci_netif_get_driver_handle(ni), - ni->state, netif_mmap_bytes); + oo_resource_munmap( + ci_netif_get_driver_handle(ni), ni->state, netif_mmap_bytes); return rc; } return rc; } -static void ci_netif_deinit(ci_netif* ni); +static void ci_netif_deinit(ci_netif* ni); ci_inline void netif_tcp_helper_free(ci_netif* ni) @@ -2320,8 +2356,7 @@ ci_inline void netif_tcp_helper_free(ci_netif* ni) static void init_resource_alloc(ci_resource_onload_alloc_t* ra, - const ci_netif_config_opts* opts, - unsigned flags, const char* name) + const ci_netif_config_opts* opts, unsigned flags, const char* name) { memset(ra, 0, sizeof(*ra)); CI_USER_PTR_SET(ra->in_opts, opts); @@ -2332,12 +2367,10 @@ static void init_resource_alloc(ci_resource_onload_alloc_t* ra, strncpy(ra->in_version, onload_short_version, sizeof(ra->in_version)); strncpy(ra->in_uk_intf_ver, OO_UK_INTF_VER, sizeof(ra->in_uk_intf_ver)); if( flags & CI_NETIF_FLAG_DO_ALLOCATE_SCALABLE_FILTERS_RSS ) { - ra->in_cluster_size = CITP_OPTS.cluster_size; + ra->in_cluster_size = CITP_OPTS.cluster_size; ra->in_cluster_restart = CITP_OPTS.cluster_restart_opt; strncpy(ra->in_name, CITP_OPTS.cluster_name, CI_CFG_STACK_NAME_LEN); - } - else - if( name != NULL ) + } else if( name != NULL ) strncpy(ra->in_name, name, CI_CFG_STACK_NAME_LEN); ra->in_memfd = -1; @@ -2355,15 +2388,13 @@ static void init_resource_alloc(ci_resource_onload_alloc_t* ra, } -static int -netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, - const ci_netif_config_opts* opts, unsigned flags, - const char* stack_name) +static int netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, + const ci_netif_config_opts* opts, unsigned flags, const char* stack_name) { ci_resource_onload_alloc_t ra; - int rc; - ci_netif_state* ns; - void* p; + int rc; + ci_netif_state* ns; + void* p; /**************************************************************************** * Allocate the TCP Helper resource. @@ -2373,46 +2404,51 @@ netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, /* oo_resource_alloc's ioctl does an interruptible sleep while waiting for * the cplane. If a non-fatal signal is received while we're asleep, * we get an EINTR and want to try again. */ - while( (rc = oo_resource_alloc(fd, &ra)) == -EINTR ); + while( (rc = oo_resource_alloc(fd, &ra)) == -EINTR ) + ; if( ra.in_memfd >= 0 ) ci_sys_close(ra.in_memfd); if( rc < 0 ) { switch( rc ) { - case -ELIBACC: { - static int once; - if( ! once ) { - once = 1; - ci_log("ERROR: Driver/Library version mismatch detected."); - ci_log("This application will not be accelerated."); - ci_log("HINT: Most likely you need to reload the sfc and onload " - "drivers"); + case -ELIBACC: { + static int once; + if( ! once ) { + once = 1; + ci_log("ERROR: Driver/Library version mismatch detected."); + ci_log("This application will not be accelerated."); + ci_log( + "HINT: Most likely you need to reload the sfc and onload " + "drivers"); + } + break; } - break; - } - case -EEXIST: - /* This is not really an error. It means we "raced" with another thread - * to create a stack with this name, and the other guy won the race. We - * return the error code and further up the call-chain we'll retry to - * attach to the stack with the given name. - */ - break; - case -ENODEV: - LOG_E(ci_log("%s: ENODEV.\n" -"This error can occur if:\n" -" - no Solarflare network interfaces are active/UP, or they are running\n" -" packed stream firmware or are disabled, and\n" -" - there are no AF_XDP interfaces registered with sfc_resource\n" -"Please check your configuration.", - __FUNCTION__)); - break; - default: - LOG_E(ci_log("%s: ERROR: Failed to allocate stack (rc=%d)\n" + case -EEXIST: + /* This is not really an error. It means we "raced" with another + * thread to create a stack with this name, and the other guy won the + * race. We return the error code and further up the call-chain we'll + * retry to attach to the stack with the given name. + */ + break; + case -ENODEV: + LOG_E(ci_log( + "%s: ENODEV.\n" + "This error can occur if:\n" + " - no Solarflare network interfaces are active/UP, or they are " + "running\n" + " packed stream firmware or are disabled, and\n" + " - there are no AF_XDP interfaces registered with sfc_resource\n" + "Please check your configuration.", + __FUNCTION__)); + break; + default: + LOG_E( + ci_log("%s: ERROR: Failed to allocate stack (rc=%d)\n" "See kernel messages in dmesg or /var/log/syslog " "for more details of this failure", - __FUNCTION__, rc)); - break; + __FUNCTION__, rc)); + break; } return rc; } @@ -2422,14 +2458,14 @@ netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, */ ni->nic_set = ra.out_nic_set; LOG_NC(ci_log("%s: nic set %" EFRM_NIC_SET_FMT, __FUNCTION__, - efrm_nic_set_pri_arg(&ni->nic_set))); + efrm_nic_set_pri_arg(&ni->nic_set))); ni->mmap_bytes = ra.out_netif_mmap_bytes; /**************************************************************************** * Set up the mem mmaping. */ rc = oo_resource_mmap(fd, OO_MMAP_TYPE_NETIF, CI_NETIF_MMAP_ID_STATE, - ra.out_netif_mmap_bytes, OO_MMAP_FLAG_DEFAULT, &p); + ra.out_netif_mmap_bytes, OO_MMAP_FLAG_DEFAULT, &p); if( rc < 0 ) { LOG_E(ci_log("%s: oo_resource_mmap %d", __FUNCTION__, rc)); return rc; @@ -2441,16 +2477,16 @@ netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, /**************************************************************************** * Final Debug consistency check */ - if( !!(ns->flags & CI_NETIF_FLAG_DEBUG) != CI_DEBUG(1+)0 ) { + if( ! ! (ns->flags & CI_NETIF_FLAG_DEBUG) != CI_DEBUG(1 +) 0 ) { ci_log("ERROR: Driver/Library debug build mismatch detected (%d,%d)", - !!(ns->flags & CI_NETIF_FLAG_DEBUG), CI_DEBUG(1+)0 ); + ! ! (ns->flags & CI_NETIF_FLAG_DEBUG), CI_DEBUG(1 +) 0); rc = -ELIBACC; goto fail; } if( ns->flags & CI_NETIF_FLAG_ONLOAD_UNSUPPORTED ) { - ci_log("*** Warning: use of %s with this adapter is likely", - onload_product); + ci_log( + "*** Warning: use of %s with this adapter is likely", onload_product); ci_log("*** to show suboptimal performance for all cases other than the"); ci_log("*** most trivial benchmarks. Please see your Solarflare"); ci_log("*** representative/reseller to obtain an Onload-capable"); @@ -2488,23 +2524,23 @@ netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, static void ci_netif_sanity_checks(void) { /* These had better be true, or there'll be trouble! */ - CI_BUILD_ASSERT( sizeof(citp_waitable_obj) <= CI_PAGE_SIZE ); - CI_BUILD_ASSERT( sizeof(citp_waitable_obj) <= EP_BUF_SIZE ); - CI_BUILD_ASSERT( EP_BUF_SIZE * EP_BUF_PER_PAGE == CI_PAGE_SIZE ); - CI_BUILD_ASSERT( (1u << CI_SB_FLAG_WAKE_RX_B) == CI_SB_FLAG_WAKE_RX ); - CI_BUILD_ASSERT( (1u << CI_SB_FLAG_WAKE_TX_B) == CI_SB_FLAG_WAKE_TX ); - CI_BUILD_ASSERT( sizeof(ci_ni_aux_mem) == CI_AUX_MEM_SIZE ); + CI_BUILD_ASSERT(sizeof(citp_waitable_obj) <= CI_PAGE_SIZE); + CI_BUILD_ASSERT(sizeof(citp_waitable_obj) <= EP_BUF_SIZE); + CI_BUILD_ASSERT(EP_BUF_SIZE * EP_BUF_PER_PAGE == CI_PAGE_SIZE); + CI_BUILD_ASSERT((1u << CI_SB_FLAG_WAKE_RX_B) == CI_SB_FLAG_WAKE_RX); + CI_BUILD_ASSERT((1u << CI_SB_FLAG_WAKE_TX_B) == CI_SB_FLAG_WAKE_TX); + CI_BUILD_ASSERT(sizeof(ci_ni_aux_mem) == CI_AUX_MEM_SIZE); /* AUX_PER_BUF aux buffers + header = ep buffer, where header is * oo_ep_header and fits in exactly one cache line. */ - CI_BUILD_ASSERT( sizeof(struct oo_ep_header) <= CI_AUX_HEADER_SIZE ); - CI_BUILD_ASSERT( CI_AUX_MEM_SIZE * AUX_PER_BUF + CI_AUX_HEADER_SIZE - <= EP_BUF_SIZE ); + CI_BUILD_ASSERT(sizeof(struct oo_ep_header) <= CI_AUX_HEADER_SIZE); + CI_BUILD_ASSERT( + CI_AUX_MEM_SIZE * AUX_PER_BUF + CI_AUX_HEADER_SIZE <= EP_BUF_SIZE); /* This constraint isn't strictly necessary for functionality, but it makes * debugging/dumping saner */ - CI_BUILD_ASSERT( offsetof(citp_waitable, sb_aflags) + - sizeof(((citp_waitable*)0)->sb_aflags) - <= CI_AUX_HEADER_SIZE ); + CI_BUILD_ASSERT(offsetof(citp_waitable, sb_aflags) + + sizeof(((citp_waitable*) 0)->sb_aflags) <= + CI_AUX_HEADER_SIZE); #ifndef NDEBUG { @@ -2519,7 +2555,7 @@ static void ci_netif_sanity_checks(void) /* Warn if we're wasting memory. */ if( sizeof(citp_waitable_obj) * 2 <= EP_BUF_SIZE ) ci_log("%s: EP_BUF_SIZE=%d larger than necessary (citp_waitable_obj=%zu)", - __FUNCTION__, EP_BUF_SIZE, sizeof(citp_waitable_obj)); + __FUNCTION__, EP_BUF_SIZE, sizeof(citp_waitable_obj)); } #endif @@ -2527,13 +2563,13 @@ static void ci_netif_sanity_checks(void) static int ci_netif_pkt_reserve(ci_netif* ni, int n, oo_pkt_p* p_pkt_list) { ci_ip_pkt_fmt* pkt; - int i; + int i; for( i = 0; i < n; ++i ) { if( (pkt = ci_netif_pkt_alloc(ni, 0)) == NULL ) break; *p_pkt_list = OO_PKT_P(pkt); - p_pkt_list = &pkt->next; + p_pkt_list = &pkt->next; } *p_pkt_list = OO_PP_NULL; return i; @@ -2545,7 +2581,7 @@ static void ci_netif_pkt_reserve_free(ci_netif* ni, oo_pkt_p pkt_list, int n) ci_ip_pkt_fmt* pkt; while( OO_PP_NOT_NULL(pkt_list) ) { CI_DEBUG(--n); - pkt = PKT_CHK(ni, pkt_list); + pkt = PKT_CHK(ni, pkt_list); pkt_list = pkt->next; ci_netif_pkt_release(ni, pkt); } @@ -2557,21 +2593,20 @@ static void ci_netif_pkt_reserve_free(ci_netif* ni, oo_pkt_p pkt_list, int n) #if CI_CFG_TCP_OFFLOAD_RECYCLER void ci_netif_send_plugin_app_ctrl(ci_netif* ni, int nic_index, - ci_ip_pkt_fmt* pkt, - const void* payload, size_t paylen) + ci_ip_pkt_fmt* pkt, const void* payload, size_t paylen) { - pkt->intf_i = nic_index; - pkt->q_id = CI_Q_ID_TCP_APP; - pkt->pay_len = ETH_HLEN + paylen; + pkt->intf_i = nic_index; + pkt->q_id = CI_Q_ID_TCP_APP; + pkt->pay_len = ETH_HLEN + paylen; /* Fake values to ensure this doesn't look like IPv4 or IPv6, both to * various bits of Onload and to the NIC */ - pkt->pkt_start_off = 0; + pkt->pkt_start_off = 0; pkt->pkt_eth_payload_off = 0; - pkt->pkt_outer_l3_off = 0; + pkt->pkt_outer_l3_off = 0; memset(pkt->dma_start, 0, ETH_HLEN); pkt->n_buffers = 1; - pkt->buf_len = ETH_HLEN + paylen; + pkt->buf_len = ETH_HLEN + paylen; memcpy(pkt->dma_start + ETH_HLEN, payload, paylen); ci_netif_send(ni, pkt); } @@ -2615,14 +2650,14 @@ static int ci_netif_pkt_prefault(ci_netif* ni) * optimisations. */ ci_ip_pkt_fmt* pkt; - int i, n; - int rc = 0; + int i, n; + int rc = 0; if( NI_OPTS(ni).prefault_packets ) { n = ni->packets->n_pkts_allocated; for( i = 0; i < n; ++i ) { pkt = PKT(ni, i); - rc += *(volatile ci_int32*)(&pkt->refcount); + rc += *(volatile ci_int32*) (&pkt->refcount); } } return rc; @@ -2632,16 +2667,15 @@ static int ci_netif_pkt_prefault(ci_netif* ni) static void ci_netif_pkt_prefault_reserve(ci_netif* ni) { oo_pkt_p pkt_list; - int n; - int actual_max_packets = ni->packets->sets_max * PKTS_PER_SET; + int n; + int actual_max_packets = ni->packets->sets_max * PKTS_PER_SET; /* The maximum number of packet buffers we can have is subject to rounding * due to packet set size. Conservative approach is to use max of this and * configured EF_MAX_PACKETS - ensures we will always max out the buffers * when EF_PREFAULT_PACKETS is bigger than both. */ - int target_allocated = CI_MIN( NI_OPTS(ni).prefault_packets, - CI_MAX(NI_OPTS(ni).max_packets, - actual_max_packets) ); + int target_allocated = CI_MIN(NI_OPTS(ni).prefault_packets, + CI_MAX(NI_OPTS(ni).max_packets, actual_max_packets)); int already_reserved = (ni->packets->n_pkts_allocated - ni->packets->n_free); if( ! NI_OPTS(ni).prefault_packets ) @@ -2652,10 +2686,7 @@ static void ci_netif_pkt_prefault_reserve(ci_netif* ni) n = ci_netif_pkt_reserve(ni, target_allocated - already_reserved, &pkt_list); if( ni->packets->n_pkts_allocated < target_allocated ) LOG_E(ci_log("%s: Prefaulting only allocated %d of %d (reserved +%d)", - __FUNCTION__, - ni->packets->n_pkts_allocated, - target_allocated, - n)); + __FUNCTION__, ni->packets->n_pkts_allocated, target_allocated, n)); ci_netif_pkt_reserve_free(ni, pkt_list, n); ci_netif_unlock(ni); } @@ -2675,16 +2706,16 @@ void ci_netif_cluster_prefault(ci_netif* ni) static int ci_netif_init(ci_netif* ni, ef_driver_handle fd) { - int rc; + int rc; ef_driver_handle init_net_fd; ni->driver_handle = fd; CI_MAGIC_SET(ni, NETIF_MAGIC); - ni->flags = 0; - ni->error_flags = 0; + ni->flags = 0; + ni->error_flags = 0; ni->cplane_init_net = NULL; - ni->cplane = malloc(sizeof(struct oo_cplane_handle)); + ni->cplane = malloc(sizeof(struct oo_cplane_handle)); if( ni->cplane == NULL ) return -ENOMEM; @@ -2705,13 +2736,12 @@ static int ci_netif_init(ci_netif* ni, ef_driver_handle fd) rc = ef_onload_driver_open(&init_net_fd, OO_STACK_DEV, 1); if( rc != 0 ) { ci_log("%s: failed to open driver handle: %d", __func__, rc); - } - else { + } else { rc = oo_cp_create(init_net_fd, ni->cplane_init_net, - CITP_OPTS.sync_cplane, CP_CREATE_FLAGS_INIT_NET); + CITP_OPTS.sync_cplane, CP_CREATE_FLAGS_INIT_NET); if( rc != 0 ) { ci_log("%s: failed to get init_net control plane handle: %d", __func__, - rc); + rc); ef_onload_driver_close(init_net_fd); } } @@ -2726,7 +2756,7 @@ static int ci_netif_init(ci_netif* ni, ef_driver_handle fd) return 0; - fail: +fail: free(ni->cplane); return rc; } @@ -2756,8 +2786,8 @@ static void ci_netif_start_helper2(ci_netif* ni) __attribute__((noreturn)); static void ci_netif_start_helper2(ci_netif* ni) { char* argv[5]; - char stack_id_str[strlen(OO_STRINGIFY(INT_MAX)) + 1]; - int rc; + char stack_id_str[strlen(OO_STRINGIFY(INT_MAX)) + 1]; + int rc; argv[0] = ONLOAD_HELPER_NAME; argv[1] = "-s"; @@ -2771,9 +2801,9 @@ static void ci_netif_start_helper2(ci_netif* ni) rc = ci_sys_execvpe(ONLOAD_HELPER_NAME, argv, NULL); ci_assert_lt(rc, 0); - (void)rc; /* appease gcc in NDEBUG build */ - ci_log("spawning "ONLOAD_HELPER_NAME" for [%s]: execve() failed: %s", - ni->state->pretty_name, strerror(errno)); + (void) rc; /* appease gcc in NDEBUG build */ + ci_log("spawning " ONLOAD_HELPER_NAME " for [%s]: execve() failed: %s", + ni->state->pretty_name, strerror(errno)); _exit(4); } @@ -2782,10 +2812,10 @@ static void ci_netif_start_helper2(ci_netif* ni) static void ci_netif_start_helper1(ci_netif* ni) __attribute__((noreturn)); static void ci_netif_start_helper1(ci_netif* ni) { - int i; + int i; sigset_t sigset; - int rc; - int wstatus; + int rc; + int wstatus; /* The first part of "man 7 daemon": */ @@ -2800,16 +2830,16 @@ static void ci_netif_start_helper1(ci_netif* ni) /* Get a new session. */ rc = setsid(); if( rc == -1 ) { - ci_log("spawning "ONLOAD_HELPER_NAME" for [%s]: setsid() failed: %s", - ni->state->pretty_name, strerror(errno)); + ci_log("spawning " ONLOAD_HELPER_NAME " for [%s]: setsid() failed: %s", + ni->state->pretty_name, strerror(errno)); _exit(1); } umask(0); rc = chdir("/"); if( rc == -1 ) { - ci_log("spawning "ONLOAD_HELPER_NAME" for [%s]: chdir(/) failed: %s", - ni->state->pretty_name, strerror(errno)); + ci_log("spawning " ONLOAD_HELPER_NAME " for [%s]: chdir(/) failed: %s", + ni->state->pretty_name, strerror(errno)); _exit(1); } /* The second part of "man 7 daemon" is in onload_helper itself. */ @@ -2822,15 +2852,15 @@ static void ci_netif_start_helper1(ci_netif* ni) * and CLONE_VM is really scary. All the danderous things in man vfork * come from CLONE_VM. */ - rc = my_do_syscall3(__NR_clone, CLONE_FILES | CLONE_VFORK | SIGCHLD, - 0, 0); + rc = my_do_syscall3(__NR_clone, CLONE_FILES | CLONE_VFORK | SIGCHLD, 0, 0); if( rc == 0 ) ci_netif_start_helper2(ni); if( rc < 0 ) { - ci_log("spawning "ONLOAD_HELPER_NAME" for [%s]: " + ci_log("spawning " ONLOAD_HELPER_NAME + " for [%s]: " "second clone() failed %s", - ni->state->pretty_name, strerror(errno)); + ni->state->pretty_name, strerror(errno)); _exit(2); } @@ -2857,9 +2887,10 @@ static int ci_netif_start_helper(ci_netif* ni) ci_netif_start_helper1(ni); if( rc < 0 ) { - ci_log("spawning "ONLOAD_HELPER_NAME" for [%s]: " + ci_log("spawning " ONLOAD_HELPER_NAME + " for [%s]: " "first clone() failed %s", - ni->state->pretty_name, strerror(errno)); + ni->state->pretty_name, strerror(errno)); _exit(1); } @@ -2867,23 +2898,23 @@ static int ci_netif_start_helper(ci_netif* ni) if( WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0 ) return 0; - LOG_S(ci_log("%s: spawning "ONLOAD_HELPER_NAME" for [%s]: exit status=%d", - __func__, ni->state->pretty_name, wstatus)); + LOG_S(ci_log("%s: spawning " ONLOAD_HELPER_NAME " for [%s]: exit status=%d", + __func__, ni->state->pretty_name, wstatus)); return -1; } #endif -int ci_netif_ctor(ci_netif* ni, ef_driver_handle fd, const char* stack_name, - unsigned flags) +int ci_netif_ctor( + ci_netif* ni, ef_driver_handle fd, const char* stack_name, unsigned flags) { ci_netif_config_opts* opts; struct oo_per_thread* per_thread; - int rc; + int rc; per_thread = oo_per_thread_get(); - opts = per_thread->thread_local_netif_opts != NULL? - per_thread->thread_local_netif_opts: - &ci_cfg_opts.netif_opts; + opts = per_thread->thread_local_netif_opts != NULL + ? per_thread->thread_local_netif_opts + : &ci_cfg_opts.netif_opts; ci_assert(ni); ci_netif_sanity_checks(); @@ -2893,8 +2924,8 @@ int ci_netif_ctor(ci_netif* ni, ef_driver_handle fd, const char* stack_name, return rc; /*************************************** - * Allocate kernel helper and link into netif - */ + * Allocate kernel helper and link into netif + */ if( (rc = netif_tcp_helper_alloc_u(fd, ni, opts, flags, stack_name)) < 0 ) { ci_netif_deinit(ni); return rc; @@ -2919,7 +2950,7 @@ int ci_netif_ctor(ci_netif* ni, ef_driver_handle fd, const char* stack_name, return 0; } -#else /* __KERNEL__ */ +#else /* __KERNEL__ */ int ci_netif_set_rxq_limit(ci_netif* ni) { @@ -2931,9 +2962,10 @@ int ci_netif_set_rxq_limit(ci_netif* ni) * RX ring at the expense of the last. */ n_intf = 0; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { ef_vi* vi = ci_netif_vi(ni, intf_i); - rxq_cap = ef_vi_receive_capacity(vi); + rxq_cap = ef_vi_receive_capacity(vi); ++n_intf; } /* We allow up to 80% of the total RX packet buf allocation to go in the @@ -2942,31 +2974,31 @@ int ci_netif_set_rxq_limit(ci_netif* ni) * effects. */ max_ring_pkts = NI_OPTS(ni).max_rx_packets * 4 / 5; - fill_limit = rxq_cap; + fill_limit = rxq_cap; if( fill_limit * n_intf > max_ring_pkts ) fill_limit = max_ring_pkts / n_intf; if( fill_limit < NI_OPTS(ni).rxq_limit ) { if( fill_limit < rxq_cap ) - LOG_W(ci_log("WARNING: "N_FMT "RX ring fill level reduced from %d to %d " - "max_ring_pkts=%d rxq_cap=%d n_intf=%d", - N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, fill_limit, - max_ring_pkts, rxq_cap, n_intf)); - ni->opts.rxq_limit = fill_limit; + LOG_W( + ci_log("WARNING: " N_FMT "RX ring fill level reduced from %d to %d " + "max_ring_pkts=%d rxq_cap=%d n_intf=%d", + N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, fill_limit, max_ring_pkts, + rxq_cap, n_intf)); + ni->opts.rxq_limit = fill_limit; ni->state->opts.rxq_limit = fill_limit; } if( ni->nic_n == 0 ) { /* we do not use .rxq_limit, but let's make all checkers happy */ - NI_OPTS(ni).rxq_limit = CI_CFG_RX_DESC_BATCH; - } - else if( NI_OPTS(ni).rxq_limit < NI_OPTS(ni).rxq_min ) { + NI_OPTS(ni).rxq_limit = CI_CFG_RX_DESC_BATCH; + } else if( NI_OPTS(ni).rxq_limit < NI_OPTS(ni).rxq_min ) { /* Do not allow user to create a stack that is too severely * constrained. */ - LOG_E(ci_log("ERROR: "N_FMT "rxq_limit=%d is too small (rxq_min=%d)", - N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, NI_OPTS(ni).rxq_min); + LOG_E(ci_log("ERROR: " N_FMT "rxq_limit=%d is too small (rxq_min=%d)", + N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, NI_OPTS(ni).rxq_min); ci_log("HINT: Use a larger value for EF_RXQ_LIMIT or " "EF_MAX_RX_PACKETS or EF_MAX_PACKETS")); - rc = -ENOMEM; + rc = -ENOMEM; /* NB. This isn't just called at init time -- it is also called after * failure to allocate more packet buffers. So we must leave * [rxq_limit] with a legal value. @@ -2979,7 +3011,8 @@ int ci_netif_set_rxq_limit(ci_netif* ni) static void ci_netif_af_xdp_post_fill(ci_netif* ni) { - /* some ZC UMEM implementation can take a jiffy to schedule HW rx ring refill */ + /* some ZC UMEM implementation can take a jiffy to schedule HW rx ring refill + */ /* FIXME AF_XDP: fill umem rings before binding to umem */ if( ni->flags & CI_NETIF_FLAG_AF_XDP ) usleep_range(TICK_USEC * 2, TICK_USEC * 3); @@ -2991,16 +3024,17 @@ static int __ci_netif_init_fill_rx_rings(ci_netif* ni) * ci_netif_rx_post(). */ int intf_i, rxq_limit = ni->state->rxq_limit; - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { int vi_i; int n_posted = 0; for( vi_i = 0; vi_i < ci_netif_num_vis(ni); ++vi_i ) { ef_vi* vi = &ni->nic_hw[intf_i].vis[vi_i]; - n_posted = ci_netif_rx_post(ni, intf_i, vi); + n_posted = ci_netif_rx_post(ni, intf_i, vi); if( ef_vi_receive_fill_level(vi) < rxq_limit ) return -ENOMEM; } - (void)n_posted; + (void) n_posted; #if CI_CFG_TCP_OFFLOAD_RECYCLER /* See ci_netif_rx_post_all_batch() for the description of what's going on * here */ @@ -3014,12 +3048,12 @@ static int __ci_netif_init_fill_rx_rings(ci_netif* ni) int ci_netif_init_fill_rx_rings(ci_netif* ni) { oo_pkt_p pkt_list; - int lim, rc, n_reserved, n_requested, n_accounted; + int lim, rc, n_reserved, n_requested, n_accounted; rc = ci_tcp_helper_more_bufs(ni); if( ni->packets->n_free == 0 ) { LOG_E(ci_log("%s: [%d] ERROR: failed to allocate initial packet set: %d", - __func__, NI_ID(ni), rc)); + __func__, NI_ID(ni), rc)); return -ENOMEM; } ni->packets->id = 0; @@ -3038,12 +3072,15 @@ int ci_netif_init_fill_rx_rings(ci_netif* ni) n_accounted += ni->state->mem_pressure_pkt_pool_n; if( n_accounted < n_requested ) { if( NI_OPTS(ni).prealloc_packets ) - LOG_E(ci_log("%s: ERROR: Insufficient packet buffers available for " - "EF_PREALLOC_PACKETS=1 EF_MAX_PACKETS=%d got %d", - __FUNCTION__, n_requested, n_accounted)); + LOG_E( + ci_log("%s: ERROR: Insufficient packet buffers available for " + "EF_PREALLOC_PACKETS=1 EF_MAX_PACKETS=%d got %d", + __FUNCTION__, n_requested, n_accounted)); else - LOG_E(ci_log("%s: ERROR: Insufficient packet buffers available for " - "EF_MIN_FREE_PACKETS=%d", __FUNCTION__, n_requested)); + LOG_E( + ci_log("%s: ERROR: Insufficient packet buffers available for " + "EF_MIN_FREE_PACKETS=%d", + __FUNCTION__, n_requested)); return -ENOMEM; } @@ -3062,14 +3099,17 @@ int ci_netif_init_fill_rx_rings(ci_netif* ni) if( (rc = __ci_netif_init_fill_rx_rings(ni)) < 0 || ni->state->rxq_low ) { rc = -ENOMEM; if( lim < NI_OPTS(ni).rxq_min ) - LOG_E(ci_log("%s: ERROR: Insufficient packet buffers to fill RX rings " - "(rxq_limit=%d rxq_low=%d rxq_min=%d)", __FUNCTION__, - NI_OPTS(ni).rxq_limit, ni->state->rxq_low, - NI_OPTS(ni).rxq_min)); + LOG_E( + ci_log("%s: ERROR: Insufficient packet buffers to fill RX rings " + "(rxq_limit=%d rxq_low=%d rxq_min=%d)", + __FUNCTION__, NI_OPTS(ni).rxq_limit, ni->state->rxq_low, + NI_OPTS(ni).rxq_min)); #if CI_CFG_PKTS_AS_HUGE_PAGES else if( NI_OPTS(ni).huge_pages == OO_IOBUFSET_FLAG_HUGE_PAGE_FORCE ) - LOG_E(ci_log("%s: ERROR: Failed to allocate huge pages to fill RX " - "rings", __FUNCTION__)); + LOG_E( + ci_log("%s: ERROR: Failed to allocate huge pages to fill RX " + "rings", + __FUNCTION__)); else #endif rc = 0; @@ -3084,7 +3124,7 @@ int ci_netif_init_fill_rx_rings(ci_netif* ni) * packets as indicated by EF_MIN_FREE_PACKETS */ ci_netif_pkt_reserve_free(ni, pkt_list, n_reserved); } - ni->state->rxq_limit = NI_OPTS(ni).rxq_limit; + ni->state->rxq_limit = NI_OPTS(ni).rxq_limit; #if CI_CFG_PKTS_AS_HUGE_PAGES /* Initial packets allocated: allow other packets to be in non-huge pages @@ -3097,7 +3137,6 @@ int ci_netif_init_fill_rx_rings(ci_netif* ni) } - #endif #ifndef __KERNEL__ @@ -3114,11 +3153,10 @@ int ci_netif_dtor(ci_netif* ni) } - static int install_stack_by_id(ci_fd_t fp, unsigned id, bool is_service) { oo_stack_lookup_and_attach_t op; - op.stack_id = id; + op.stack_id = id; op.is_service = is_service; return oo_resource_op(fp, OO_IOC_INSTALL_STACK_BY_ID, &op); } @@ -3137,8 +3175,8 @@ static int install_stack_by_name(ci_fd_t fd, const char* name) int ci_netif_restore_id(ci_netif* ni, unsigned thr_id, bool is_service) { ef_driver_handle fd, fd2; - ci_uint32 map_size; - int rc; + ci_uint32 map_size; + int rc; ci_assert(ni); @@ -3167,8 +3205,8 @@ int ci_netif_restore_id(ci_netif* ni, unsigned thr_id, bool is_service) int ci_netif_restore_name(ci_netif* ni, const char* name) { ef_driver_handle fd, fd2; - ci_uint32 map_size; - int rc; + ci_uint32 map_size; + int rc; ci_assert(ni); @@ -3181,8 +3219,8 @@ int ci_netif_restore_name(ci_netif* ni, const char* name) goto fail1; if( (rc = install_stack_by_name(fd2, name)) < 0 ) goto fail2; - if( (rc = fd = ci_tcp_helper_stack_attach(fd2, - &ni->nic_set, &map_size)) < 0 ) + if( (rc = fd = ci_tcp_helper_stack_attach(fd2, &ni->nic_set, &map_size)) < + 0 ) goto fail3; if( (rc = ci_netif_restore(ni, fd, map_size)) < 0 ) goto fail4; @@ -3192,12 +3230,12 @@ int ci_netif_restore_name(ci_netif* ni, const char* name) return 0; - fail4: +fail4: ef_onload_driver_close(fd); - fail3: - fail2: +fail3: +fail2: ef_onload_driver_close(fd2); - fail1: +fail1: return rc; } @@ -3206,19 +3244,20 @@ int ci_netif_restore_name(ci_netif* ni, const char* name) * a netif to a new process (e.g. if the fd is used after a fork/exec). For * now we still need the handle but this parameter may be removed one day. */ -int ci_netif_restore(ci_netif* ni, ef_driver_handle fd, - unsigned netif_mmap_bytes) +int ci_netif_restore( + ci_netif* ni, ef_driver_handle fd, unsigned netif_mmap_bytes) { int rc = 0; ci_assert(ni); - + LOG_NV(ci_log("%s: fd=%d", __FUNCTION__, fd)); CI_TRY_RET(ci_netif_init(ni, fd)); - if( (rc = netif_tcp_helper_restore(ni, netif_mmap_bytes)) != 0) { + if( (rc = netif_tcp_helper_restore(ni, netif_mmap_bytes)) != 0 ) { ci_netif_deinit(ni); - ci_log("netif_tcp_helper_restore returned %d at %s:%d", rc, __FILE__, __LINE__); \ + ci_log("netif_tcp_helper_restore returned %d at %s:%d", rc, __FILE__, + __LINE__); return rc; } diff --git a/src/lib/transport/ip/netif_tx.c b/src/lib/transport/ip/netif_tx.c index de7004dc5..d55f25ad3 100644 --- a/src/lib/transport/ip/netif_tx.c +++ b/src/lib/transport/ip/netif_tx.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief Raw packet transmit. @@ -40,20 +40,21 @@ static inline int pkt_q_id(ci_ip_pkt_fmt* pkt) } -static inline void calc_csum_if_needed(ci_netif* ni, ef_vi* vi, - ci_ip_pkt_fmt* pkt) +static inline void calc_csum_if_needed( + ci_netif* ni, ef_vi* vi, ci_ip_pkt_fmt* pkt) { /* Calculate packet checksum in case of AF_XDP */ - if( CI_UNLIKELY(vi->nic_type.arch == EF_VI_ARCH_AF_XDP && + if( CI_UNLIKELY((vi->nic_type.arch == EF_VI_ARCH_AF_XDP || + vi->nic_type.arch == EF_VI_ARCH_SWXTCH) && is_to_primary_vi(pkt)) ) { struct iovec my_iov[CI_IP_PKT_SEGMENTS_MAX]; ci_uint8 protocol; - ci_netif_pkt_to_host_iovec(ni, pkt, my_iov, - sizeof(my_iov) / sizeof(my_iov[0])); + ci_netif_pkt_to_host_iovec( + ni, pkt, my_iov, sizeof(my_iov) / sizeof(my_iov[0])); - protocol = ipx_hdr_protocol(ci_ethertype2af(oo_tx_ether_type_get(pkt)), - oo_ipx_hdr(pkt)); + protocol = ipx_hdr_protocol( + ci_ethertype2af(oo_tx_ether_type_get(pkt)), oo_ipx_hdr(pkt)); if( protocol == IPPROTO_TCP || protocol == IPPROTO_UDP ) oo_pkt_calc_checksums(ni, pkt, my_iov); } @@ -62,27 +63,25 @@ static inline void calc_csum_if_needed(ci_netif* ni, ef_vi* vi, #if CI_CFG_CTPIO static inline int tx_ctpio(ci_netif* ni, int intf_i, ef_vi* vi, - ci_ip_pkt_fmt* pkt, const ef_iovec *iov, - int iov_len) + ci_ip_pkt_fmt* pkt, const ef_iovec* iov, int iov_len) { ci_netif_state_nic_t* nsn = &ni->state->nic[intf_i]; struct iovec host_iov[CI_IP_PKT_SEGMENTS_MAX]; int total_length; int rc; - total_length = ci_netif_pkt_to_host_iovec(ni, pkt, host_iov, - sizeof(host_iov) / sizeof(host_iov[0])); + total_length = ci_netif_pkt_to_host_iovec( + ni, pkt, host_iov, sizeof(host_iov) / sizeof(host_iov[0])); if( (nsn->oo_vi_flags & OO_VI_FLAGS_TX_CTPIO_ONLY) && - ef_vi_transmit_space_bytes(vi) < total_length) + ef_vi_transmit_space_bytes(vi) < total_length ) return -ENOSPC; oo_pkt_calc_checksums(ni, pkt, host_iov); - ef_vi_transmitv_ctpio(vi, total_length, host_iov, - iov_len, nsn->ctpio_ct_threshold); + ef_vi_transmitv_ctpio( + vi, total_length, host_iov, iov_len, nsn->ctpio_ct_threshold); CITP_STATS_NETIF_INC(ni, ctpio_pkts); - rc = ef_vi_transmitv_ctpio_fallback(vi, iov, iov_len, - OO_PKT_ID(pkt)); + rc = ef_vi_transmitv_ctpio_fallback(vi, iov, iov_len, OO_PKT_ID(pkt)); ci_assert_equal(rc, 0); return rc; } @@ -91,17 +90,17 @@ static inline int tx_ctpio(ci_netif* ni, int intf_i, ef_vi* vi, /* [is_fresh] is a hint indicating that the requested TXs are latency- * sensitive. */ -static void __ci_netif_dmaq_shove(ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, - int intf_i, int is_fresh) +static void __ci_netif_dmaq_shove( + ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, int intf_i, int is_fresh) { ci_ip_pkt_fmt* pkt = PKT_CHK(ni, dmaq->head); int rc; #if CI_CFG_CTPIO - #ifdef __KERNEL__ +#ifdef __KERNEL__ int ctpio = 0; - #else +#else int ctpio = is_fresh; - #endif +#endif /* In a non-CTPIO world, we don't need to track whether we've posted any DMA * descriptors because the caller has checked that we have available TXQ @@ -132,17 +131,19 @@ static void __ci_netif_dmaq_shove(ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, * we could. */ ef_remote_iovec remote_iov_storage[CI_IP_PKT_SEGMENTS_MAX + 1]; ef_remote_iovec* remote_iov = remote_iov_storage; - struct ef_vi_tx_extra extra = { .flags = EF_VI_TX_EXTRA_MARK, .mark = 0 }; + struct ef_vi_tx_extra extra = { .flags = EF_VI_TX_EXTRA_MARK, + .mark = 0 }; ci_tcp_state* ts = SP_TO_TCP(ni, pkt->pf.tcp_tx.sock_id); ci_uint32 prev_crc_id = ts->current_crc_id; - iov_len = ci_netif_pkt_to_remote_iovec(ni, pkt, &remote_iov, &extra.mark, - sizeof(remote_iov_storage) / sizeof(remote_iov_storage[0])); + iov_len = + ci_netif_pkt_to_remote_iovec(ni, pkt, &remote_iov, &extra.mark, + sizeof(remote_iov_storage) / sizeof(remote_iov_storage[0])); if( CI_UNLIKELY(iov_len < 0) ) { rc = iov_len; - } - else { - rc = ef_vi_transmitv_init_extra(vi, extra.mark ? &extra : NULL, remote_iov, iov_len, OO_PKT_ID(pkt)); + } else { + rc = ef_vi_transmitv_init_extra(vi, extra.mark ? &extra : NULL, + remote_iov, iov_len, OO_PKT_ID(pkt)); #if CI_CFG_CTPIO if( rc >= 0 ) posted_dma = 1; @@ -153,25 +154,28 @@ static void __ci_netif_dmaq_shove(ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, ts->current_crc_id = prev_crc_id; ci_nvme_plugin_crc_packet_cleanup(ni, ts, pkt); } - } - else { - iov_len = ci_netif_pkt_to_iovec(ni, pkt, iov, - sizeof(iov) / sizeof(iov[0])); + } else { + iov_len = + ci_netif_pkt_to_iovec(ni, pkt, iov, sizeof(iov) / sizeof(iov[0])); if( CI_UNLIKELY(iov_len < 0) ) break; #if CI_CFG_CTPIO if( ctpio && (iov_len < 1 || iov_len > CI_IP_PKT_SEGMENTS_MAX || - ! ci_netif_may_ctpio(ni, intf_i, pkt->pay_len) || - pkt->flags & CI_PKT_FLAG_INDIRECT) ) + ! ci_netif_may_ctpio(ni, intf_i, pkt->pay_len) || + pkt->flags & CI_PKT_FLAG_INDIRECT) ) ctpio = 0; - ctpio |= !! (ni->state->nic[pkt->intf_i].oo_vi_flags & OO_VI_FLAGS_TX_CTPIO_ONLY); + ctpio |= ! ! (ni->state->nic[pkt->intf_i].oo_vi_flags & + OO_VI_FLAGS_TX_CTPIO_ONLY); if( ctpio ) { ci_assert(! posted_dma); rc = tx_ctpio(ni, intf_i, vi, pkt, iov, iov_len); - } - else + } else #endif { +#ifndef __KERNEL__ + /* This is a hack to convert onload packets into dpdk mbufs*/ + ef_fill_tx_data(vi, PKT_START(pkt), pkt->buf_len); +#endif rc = ef_vi_transmitv_init(vi, iov, iov_len, OO_PKT_ID(pkt)); #if CI_CFG_CTPIO if( rc >= 0 ) @@ -182,8 +186,7 @@ static void __ci_netif_dmaq_shove(ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, if( rc >= 0 ) { __oo_pktq_next(ni, dmaq, pkt, netif.tx.dmaq_next); CI_DEBUG(pkt->netif.tx.dmaq_next = OO_PP_NULL); - } - else { + } else { /* Descriptor ring or plugin id pool is full. */ #if CI_CFG_STATS_NETIF if( (ci_uint32) dmaq->num > ni->state->stats.tx_dma_max ) @@ -192,8 +195,7 @@ static void __ci_netif_dmaq_shove(ci_netif* ni, oo_pktq* dmaq, ef_vi* vi, break; } } - } - while( oo_pktq_not_empty(dmaq) ); + } while( oo_pktq_not_empty(dmaq) ); #if CI_CFG_CTPIO /* If everything went out by CTPIO, there will be no outstanding DMA @@ -216,8 +218,8 @@ void ci_netif_dmaq_shove1(ci_netif* ni, int intf_i) { ef_vi* vi = ci_netif_vi(ni, intf_i); if( ef_vi_transmit_space(vi) >= (ef_vi_transmit_capacity(vi) >> 1) ) - __ci_netif_dmaq_shove(ni, ci_netif_dmaq(ni, intf_i), vi, intf_i, - 0 /*is_fresh*/); + __ci_netif_dmaq_shove( + ni, ci_netif_dmaq(ni, intf_i), vi, intf_i, 0 /*is_fresh*/); } @@ -235,8 +237,8 @@ void ci_netif_dmaq_shove_plugin(ci_netif* ni, int intf_i, int q_id) ef_vi* vi = &ni->nic_hw[intf_i].vis[q_id]; ci_assert_ge(q_id, 1); if( ef_vi_transmit_space(vi) > CI_IP_PKT_SEGMENTS_MAX ) - __ci_netif_dmaq_shove(ni, &ni->state->nic[intf_i].dmaq[q_id], vi, intf_i, - 0 /*is_fresh*/); + __ci_netif_dmaq_shove( + ni, &ni->state->nic[intf_i].dmaq[q_id], vi, intf_i, 0 /*is_fresh*/); } #endif @@ -262,17 +264,17 @@ void __ci_netif_send(ci_netif* netif, ci_ip_pkt_fmt* pkt) ___ci_netif_dmaq_insert_prep_pkt(netif, pkt); - LOG_NT(log("%s: [%d] id=%d nseg=%d 0:["EF_ADDR_FMT":%d] dhost=" - CI_MAC_PRINTF_FORMAT, __FUNCTION__, NI_ID(netif), - OO_PKT_FMT(pkt), pkt->n_buffers, - pkt_dma_addr(netif, pkt, pkt->intf_i), - pkt->buf_len, CI_MAC_PRINTF_ARGS(oo_ether_dhost(pkt)))); + LOG_NT(log("%s: [%d] id=%d nseg=%d 0:[" EF_ADDR_FMT + ":%d] dhost=" CI_MAC_PRINTF_FORMAT, + __FUNCTION__, NI_ID(netif), OO_PKT_FMT(pkt), pkt->n_buffers, + pkt_dma_addr(netif, pkt, pkt->intf_i), pkt->buf_len, + CI_MAC_PRINTF_ARGS(oo_ether_dhost(pkt)))); /* Packets to non-primary VIs could be control messages to a plugin, so * there's no requirement that they be Ethernet (or any other recognisable * protocol). */ - ci_check( ! is_to_primary_vi(pkt) || - ! ci_eth_addr_is_zero((ci_uint8 *)oo_ether_dhost(pkt))); + ci_check(! is_to_primary_vi(pkt) || + ! ci_eth_addr_is_zero((ci_uint8*) oo_ether_dhost(pkt))); /* * Packets can be now be n fragments long. If the packet at the head of the @@ -299,41 +301,38 @@ void __ci_netif_send(ci_netif* netif, ci_ip_pkt_fmt* pkt) is_to_primary_vi(pkt) ) { if( pkt->pay_len <= NI_OPTS(netif).pio_thresh && pkt->n_buffers == 1 ) { if( (offset = ci_pio_buddy_alloc(netif, buddy, order)) >= 0 ) { - rc = ef_vi_transmit_copy_pio(vi, - offset, PKT_START(pkt), pkt->buf_len, - OO_PKT_ID(pkt)); + rc = ef_vi_transmit_copy_pio( + vi, offset, PKT_START(pkt), pkt->buf_len, OO_PKT_ID(pkt)); if( rc == 0 ) { CITP_STATS_NETIF_INC(netif, pio_pkts); ci_assert(pkt->pio_addr == -1); pkt->pio_addr = offset; pkt->pio_order = order; goto done; - } - else { + } else { CITP_STATS_NETIF_INC(netif, no_pio_err); ci_pio_buddy_free(netif, buddy, offset, order); /* Continue and do normal send. */ } - } - else { + } else { CI_DEBUG(CITP_STATS_NETIF_INC(netif, no_pio_busy)); } - } - else { + } else { CI_DEBUG(CITP_STATS_NETIF_INC(netif, no_pio_too_long)); } } #endif calc_csum_if_needed(netif, vi, pkt); - iov_len = ci_netif_pkt_to_iovec(netif, pkt, iov, - sizeof(iov) / sizeof(iov[0])); + iov_len = + ci_netif_pkt_to_iovec(netif, pkt, iov, sizeof(iov) / sizeof(iov[0])); /* CTPIO only NICs always claim to be able to do CTPIO, so the only * things that might stop them are packets that are split over multiple * buffers, which should be prevented by the declared MTU and indirect * packets, which aren't used with this NIC type. */ - if( netif->state->nic[pkt->intf_i].oo_vi_flags & OO_VI_FLAGS_TX_CTPIO_ONLY ) { + if( netif->state->nic[pkt->intf_i].oo_vi_flags & + OO_VI_FLAGS_TX_CTPIO_ONLY ) { ci_assert_gt(iov_len, 0); ci_assert_le(iov_len, CI_IP_PKT_SEGMENTS_MAX); ci_assert(is_to_primary_vi(pkt)); @@ -344,14 +343,19 @@ void __ci_netif_send(ci_netif* netif, ci_ip_pkt_fmt* pkt) ci_netif_may_ctpio(netif, intf_i, pkt->pay_len) && is_to_primary_vi(pkt) ) { rc = tx_ctpio(netif, intf_i, vi, pkt, iov, iov_len); - } - else + } else { +#else + { /* this is some real garbage */ #endif - if( (rc = ef_vi_transmitv(vi, iov, iov_len, OO_PKT_ID(pkt))) == 0 ) { - /* After a DMA send, stop attempting CTPIO sends until the TXQ has - * drained. */ - ci_netif_ctpio_desist(netif, intf_i); - CITP_STATS_NETIF_INC(netif, tx_dma_doorbells); +#ifndef __KERNEL__ + ef_fill_tx_data(vi, PKT_START(pkt), pkt->buf_len); +#endif + if( (rc = ef_vi_transmitv(vi, iov, iov_len, OO_PKT_ID(pkt))) == 0 ) { + /* After a DMA send, stop attempting CTPIO sends until the TXQ has + * drained. */ + ci_netif_ctpio_desist(netif, intf_i); + CITP_STATS_NETIF_INC(netif, tx_dma_doorbells); + } } if( rc == 0 ) { LOG_AT(ci_analyse_pkt(oo_ether_hdr(pkt), pkt->buf_len)); @@ -366,7 +370,7 @@ void __ci_netif_send(ci_netif* netif, ci_ip_pkt_fmt* pkt) LOG_NT(log("%s: ENQ id=%d", __FUNCTION__, OO_PKT_FMT(pkt))); __ci_netif_dmaq_put(netif, dmaq, pkt); - done: +done: /* Poll every now and then to ensure we keep up with completions. If we * don't do this then we can ignore completions for so long that we start @@ -395,8 +399,8 @@ void __ci_netif_send(ci_netif* netif, ci_ip_pkt_fmt* pkt) * low-level function used by VIs which are used for communicating with * plugins, where the caller typically has their own reliability policy and * hence they don't want automatic handling of it behind the scenes. */ -bool ci_netif_send_immediate(ci_netif* netif, ci_ip_pkt_fmt* pkt, - const struct ef_vi_tx_extra* extra) +bool ci_netif_send_immediate( + ci_netif* netif, ci_ip_pkt_fmt* pkt, const struct ef_vi_tx_extra* extra) { int intf_i; ef_vi* vi; @@ -410,36 +414,38 @@ bool ci_netif_send_immediate(ci_netif* netif, ci_ip_pkt_fmt* pkt, ci_assert_flags(pkt->flags, CI_PKT_FLAG_TX_PENDING); ci_assert_nflags(pkt->flags, CI_PKT_FLAG_INDIRECT); - LOG_NT(log("%s: [%d] id=%d nseg=%d 0:["EF_ADDR_FMT":%d] dhost=" - CI_MAC_PRINTF_FORMAT, __FUNCTION__, NI_ID(netif), - OO_PKT_FMT(pkt), pkt->n_buffers, - pkt_dma_addr(netif, pkt, pkt->intf_i), - pkt->buf_len, CI_MAC_PRINTF_ARGS(oo_ether_dhost(pkt)))); + LOG_NT(log("%s: [%d] id=%d nseg=%d 0:[" EF_ADDR_FMT + ":%d] dhost=" CI_MAC_PRINTF_FORMAT, + __FUNCTION__, NI_ID(netif), OO_PKT_FMT(pkt), pkt->n_buffers, + pkt_dma_addr(netif, pkt, pkt->intf_i), pkt->buf_len, + CI_MAC_PRINTF_ARGS(oo_ether_dhost(pkt)))); intf_i = pkt->intf_i; ci_assert_lt(pkt->q_id, CI_MAX_VIS_PER_INTF); vi = &netif->nic_hw[intf_i].vis[pkt_q_id(pkt)]; - iov_len = ci_netif_pkt_to_iovec(netif, pkt, iov, - sizeof(iov) / sizeof(iov[0])); + iov_len = + ci_netif_pkt_to_iovec(netif, pkt, iov, sizeof(iov) / sizeof(iov[0])); if( extra ) { int i; ef_remote_iovec riov[CI_IP_PKT_SEGMENTS_MAX]; - for( i = 0; i < iov_len; ++i) { - riov[i] = (ef_remote_iovec){ + for( i = 0; i < iov_len; ++i ) { + riov[i] = (ef_remote_iovec) { .iov_base = iov[i].iov_base, .iov_len = iov[i].iov_len, .flags = 0, .addrspace = EF_ADDRSPACE_LOCAL, }; } - if( ef_vi_transmitv_init_extra(vi, extra, riov, iov_len, - OO_PKT_ID(pkt)) != 0 ) + if( ef_vi_transmitv_init_extra(vi, extra, riov, iov_len, OO_PKT_ID(pkt)) != + 0 ) return false; ef_vi_transmit_push(vi); - } - else { + } else { +#ifndef __KERNEL__ + ef_fill_tx_data(vi, PKT_START(pkt), pkt->buf_len); +#endif if( ef_vi_transmitv(vi, iov, iov_len, OO_PKT_ID(pkt)) != 0 ) return false; } diff --git a/src/lib/transport/ip/tcp_close.c b/src/lib/transport/ip/tcp_close.c index b2c82d0e4..ad45d7717 100644 --- a/src/lib/transport/ip/tcp_close.c +++ b/src/lib/transport/ip/tcp_close.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk ** \brief TCP connection routines: @@ -16,7 +16,7 @@ #include "ip_internal.h" #ifdef __KERNEL__ -# include +#include #endif #include #include @@ -30,7 +30,7 @@ void __ci_tcp_listen_to_normal(ci_netif* netif, ci_tcp_socket_listen* tls) { citp_waitable_obj* wo = SOCK_TO_WAITABLE_OBJ(&tls->s); - ci_tcp_state* ts = &wo->tcp; + ci_tcp_state* ts = &wo->tcp; #if CI_CFG_IPV6 int af = ipcache_af(&ts->s.pkt); #endif @@ -41,8 +41,8 @@ void __ci_tcp_listen_to_normal(ci_netif* netif, ci_tcp_socket_listen* tls) ci_ip_timer_clear(netif, &tls->listenq_tid); - oo_p_dllink_del_init(netif, oo_p_dllink_sb(netif, &tls->s.b, - &tls->s.b.post_poll_link)); + oo_p_dllink_del_init( + netif, oo_p_dllink_sb(netif, &tls->s.b, &tls->s.b.post_poll_link)); #if CI_CFG_IPV6 ts->s.cp.laddr = ip4_addr_any; @@ -66,26 +66,89 @@ void __ci_tcp_listen_to_normal(ci_netif* netif, ci_tcp_socket_listen* tls) #endif } +#ifndef __KERNEL__ +/* This function is a temporary thing to at least attempt to make sure + * conncected sockets receive a last ACK */ +int ci_tcp_fin_added(ci_tcp_state* ts, ci_netif* netif) +{ + ci_assert(ci_netif_is_locked(netif)); + + if( ts->s.b.state == CI_TCP_FIN_WAIT1 ) { + ci_uint64 start_frc, now_frc, schedule_frc; + ci_uint32 timeout = ts->s.so.sndtimeo_msec; + ci_uint64 max_spin = ts->s.b.spin_cycles; + int rc = 0; + citp_signal_info* si = citp_signal_get_specific_inited(); + + if( ts->s.so.sndtimeo_msec ) { + ci_uint64 max_so_spin = + (ci_uint64) ts->s.so.sndtimeo_msec * IPTIMER_STATE(netif)->khz; + if( max_so_spin <= max_spin ) { + max_spin = max_so_spin; + } + } + + ci_frc64(&start_frc); + schedule_frc = start_frc; + now_frc = start_frc; + do { + if( ci_netif_may_poll(netif) ) { + if( ci_netif_need_poll_spinning(netif, now_frc) ) { + ci_netif_poll(netif); + } else if( ! netif->state->is_spinner ) + netif->state->is_spinner = 1; + } + + if( ts->s.b.state != CI_TCP_FIN_WAIT1 ) { + netif->state->is_spinner = 0; + return 0; + } + + ci_frc64(&now_frc); + rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS( + netif, now_frc, &schedule_frc, ts->s.so.sndtimeo_msec, NULL, si); + if( rc != 0 ) { + netif->state->is_spinner = 0; + } + } while( now_frc - start_frc < max_spin ); + + netif->state->is_spinner = 0; + + if( timeout ) { + ci_uint32 spin_ms = (now_frc - start_frc) / IPTIMER_STATE(netif)->khz; + if( spin_ms < timeout ) + timeout -= spin_ms; + else { + if( ts->s.b.state == CI_TCP_FIN_WAIT1 ) + return -EAGAIN; + } + } + } + + return 0; +} +#endif + int ci_tcp_add_fin(ci_tcp_state* ts, ci_netif* netif) { ci_ip_pkt_queue* sendq = &ts->send; - ci_ip_pkt_fmt* pkt; - ci_tcp_hdr *tcp_hdr; + ci_ip_pkt_fmt* pkt; + ci_tcp_hdr* tcp_hdr; ci_assert(ci_netif_is_locked(netif)); LOG_TC(log(FNTS_FMT "sendq_num=%d cork=%d", FNTS_PRI_ARGS(netif, ts), - sendq->num, !!(ts->s.s_aflags & CI_SOCK_AFLAG_CORK))); + sendq->num, ! ! (ts->s.s_aflags & CI_SOCK_AFLAG_CORK))); if( sendq->num ) { /* Bang the fin on the end of the send queue. */ - pkt = PKT_CHK(netif, sendq->tail); + pkt = PKT_CHK(netif, sendq->tail); tcp_hdr = TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt); tcp_hdr->tcp_flags |= CI_TCP_FLAG_FIN | CI_TCP_FLAG_PSH; tcp_enq_nxt(ts) += 1; pkt->pf.tcp_tx.end_seq = tcp_enq_nxt(ts); - pkt->flags &=~ CI_PKT_FLAG_TX_MORE; + pkt->flags &= ~CI_PKT_FLAG_TX_MORE; ci_tcp_tx_advance(ts, netif); return 0; } @@ -98,10 +161,9 @@ int ci_tcp_add_fin(ci_tcp_state* ts, ci_netif* netif) if( pkt ) { ci_tcp_enqueue_no_data(ts, netif, pkt); - } - else { - LOG_U(log(LNTS_FMT "%s: out of pkt bufs", - LNTS_PRI_ARGS(netif, ts), __FUNCTION__)); + } else { + LOG_U(log(LNTS_FMT "%s: out of pkt bufs", LNTS_PRI_ARGS(netif, ts), + __FUNCTION__)); CITP_STATS_NETIF_INC(netif, tcp_cant_fin); return -ENOBUFS; } @@ -135,18 +197,18 @@ int __ci_tcp_shutdown(ci_netif* netif, ci_tcp_state* ts, int how) */ if( ts->s.b.state & CI_TCP_STATE_NOT_CONNECTED ) { switch( ts->s.b.state ) { - case CI_TCP_SYN_SENT: - ci_tcp_drop(netif, ts, ECONNRESET); - ts->s.rx_errno = ENOTCONN; - return 0; - - case CI_TCP_CLOSING: - case CI_TCP_LAST_ACK: - /* already shut down */ - return 0; - - default: - return -ENOTCONN; + case CI_TCP_SYN_SENT: + ci_tcp_drop(netif, ts, ECONNRESET); + ts->s.rx_errno = ENOTCONN; + return 0; + + case CI_TCP_CLOSING: + case CI_TCP_LAST_ACK: + /* already shut down */ + return 0; + + default: + return -ENOTCONN; } } @@ -175,8 +237,7 @@ int __ci_tcp_shutdown(ci_netif* netif, ci_tcp_state* ts, int how) /* peer is going to TIME_WAIT and * ISN for next connection needs to be recorded */ ci_tcp_prev_seq_remember(netif, ts); - } - else { + } else { ci_tcp_set_slow_state(netif, ts, CI_TCP_FIN_WAIT1); } /* if not tied to an fd, make sure we leave this state at some point */ @@ -203,9 +264,14 @@ int __ci_tcp_shutdown(ci_netif* netif, ci_tcp_state* ts, int how) ci_tcp_rto_set(netif, ts); } - ci_tcp_wake_not_in_poll(netif, ts, - CI_SB_FLAG_WAKE_TX | - (how == SHUT_RDWR ? CI_SB_FLAG_WAKE_RX : 0)); +#ifndef __KERNEL__ + if( rc == 0 ) { + if( (rc = ci_tcp_fin_added(ts, netif)) != 0 ) { + LOG_TC(ci_log("Unable to poll for final FIN ACK while shutting down")); + } + } +#endif + return 0; } @@ -218,15 +284,15 @@ int __ci_tcp_shutdown(ci_netif* netif, ci_tcp_state* ts, int how) /* Closes a cached fd. In the typical case, this boils down to sys_close. */ static void uncache_fd(ci_netif* ni, ci_tcp_state* ts) { - int fd = ts->cached_on_fd; - int pid = ts->cached_on_pid; + int fd = ts->cached_on_fd; + int pid = ts->cached_on_pid; int cur_tgid = task_tgid_vnr(current); - LOG_EP(ci_log("Uncaching fd %d on pid %d running pid %d:%s", fd, - pid, cur_tgid, current->comm)); + LOG_EP(ci_log("Uncaching fd %d on pid %d running pid %d:%s", fd, pid, + cur_tgid, current->comm)); /* No tasklets or other bottom-halves - we always have "current" */ ci_assert(current); - if( !(ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && - (~current->flags & PF_EXITING) ) { + if( ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && + (~current->flags & PF_EXITING) ) { /* If the process is exiting, there is nothing to do. * Otherwise, we try to close fd. */ /* There is peril here. We don't currently have the NO_FD flag set, so @@ -249,39 +315,34 @@ static void uncache_fd(ci_netif* ni, ci_tcp_state* ts) if( current->files != NULL ) { if( pid != cur_tgid ) { NI_LOG(ni, RESOURCE_WARNINGS, - "%s: pid mismatch: cached_on_pid=%d current=%d:%s", __func__, - pid, cur_tgid, current->comm); - } - else if( (filp = fget(fd)) == NULL ) { + "%s: pid mismatch: cached_on_pid=%d current=%d:%s", __func__, pid, + cur_tgid, current->comm); + } else if( (filp = fget(fd)) == NULL ) { NI_LOG(ni, RESOURCE_WARNINGS, - "%s: pid %d does not has cached file under fd=%d", - __func__, fd, pid); - } - else if( filp->f_op != &linux_tcp_helper_fops_tcp ) { + "%s: pid %d does not has cached file under fd=%d", __func__, fd, + pid); + } else if( filp->f_op != &linux_tcp_helper_fops_tcp ) { NI_LOG(ni, RESOURCE_WARNINGS, - "%s: pid %d has unexpected file under fd=%d", - __func__, fd, pid); + "%s: pid %d has unexpected file under fd=%d", __func__, fd, pid); fput(filp); - } - else { + } else { fput(filp); efab_linux_sys_close(fd); } - } - else { + } else { /* This should not happen, as uncache_fd() must not be deferred. */ ci_log("%s: called from workqueue - cannot close file descriptor %d.", - __func__, fd); + __func__, fd); ci_assert(0); } } } -ci_inline void clear_cached_state(ci_tcp_state *ts) +ci_inline void clear_cached_state(ci_tcp_state* ts) { ci_atomic32_and(&ts->s.b.sb_aflags, - ~(CI_SB_AFLAG_IN_CACHE|CI_SB_AFLAG_IN_PASSIVE_CACHE)); - ts->cached_on_fd = -1; + ~(CI_SB_AFLAG_IN_CACHE | CI_SB_AFLAG_IN_PASSIVE_CACHE)); + ts->cached_on_fd = -1; ts->cached_on_pid = -1; } @@ -301,14 +362,14 @@ ci_inline void clear_cached_state(ci_tcp_state *ts) * sockets on the listening socket. Else removes the cached sockets * on the stack a.k.a. active caching. */ -static void uncache_ep(ci_netif *netif, ci_tcp_socket_listen* tls, - ci_tcp_state *ts) +static void uncache_ep( + ci_netif* netif, ci_tcp_socket_listen* tls, ci_tcp_state* ts) { LOG_EP(ci_log("Uncaching ep %d", S_FMT(ts))); - ci_assert( ci_tcp_is_cached(ts) ); + ci_assert(ci_tcp_is_cached(ts)); - oo_p_dllink_del_init(netif, oo_p_dllink_sb(netif, &ts->s.b, - &ts->epcache_link)); + oo_p_dllink_del_init( + netif, oo_p_dllink_sb(netif, &ts->s.b, &ts->epcache_link)); /* EPs on the cached list have hw filters present, even though notionally * they are 'freed'. So we clear filters here. Note that we leave the @@ -318,13 +379,13 @@ static void uncache_ep(ci_netif *netif, ci_tcp_socket_listen* tls, * pending or accept-q, because it will be in the closed state if and only * if it is on the cache list. */ - if (ts->s.b.state == CI_TCP_CLOSED) + if( ts->s.b.state == CI_TCP_CLOSED ) ci_tcp_ep_clear_filters(netif, S_SP(ts), 0); /* After we clear CI_SB_AFLAG_IN_CACHE flag, we are not * ci_tcp_is_timeout_orphan() any more. Do not confuse other * parts of code: get out from timewait list. */ - if ( ci_tcp_is_timeout_orphan(ts) ) + if( ci_tcp_is_timeout_orphan(ts) ) ci_netif_timeout_remove(netif, ts); clear_cached_state(ts); @@ -339,27 +400,26 @@ static void uncache_ep(ci_netif *netif, ci_tcp_socket_listen* tls, * control this using [CI_SB_AFLAG_IN_CACHE_NO_FD_BIT]. */ /* Fixme: what about timewait? */ if( ci_bit_test_and_set(&ts->s.b.sb_aflags, CI_SB_AFLAG_IN_CACHE_NO_FD_BIT) ) - efab_tcp_helper_close_endpoint(netif2tcp_helper_resource(netif), S_SP(ts), 0); + efab_tcp_helper_close_endpoint( + netif2tcp_helper_resource(netif), S_SP(ts), 0); if( tls ) { /* increase per socket counter even if passive cache is shared */ - ci_atomic32_inc((volatile ci_uint32*) - CI_NETIF_PTR(netif, tls->epcache.avail_stack)); + ci_atomic32_inc( + (volatile ci_uint32*) CI_NETIF_PTR(netif, tls->epcache.avail_stack)); ci_atomic32_inc(&tls->cache_avail_sock); ci_assert_le(netif->state->passive_cache_avail_stack, - netif->state->opts.sock_cache_max); + netif->state->opts.sock_cache_max); if( ~NI_OPTS(netif).scalable_filter_mode & CITP_SCALABLE_MODE_PASSIVE ) - ci_assert_le(tls->cache_avail_sock, - netif->state->opts.per_sock_cache_max); - } - else if( ts->s.s_flags & CI_SOCK_FLAG_SCALPASSIVE ) { + ci_assert_le( + tls->cache_avail_sock, netif->state->opts.per_sock_cache_max); + } else if( ts->s.s_flags & CI_SOCK_FLAG_SCALPASSIVE ) { ci_atomic32_inc(&netif->state->passive_cache_avail_stack); /* we do not know tls, so per-socket statistic cannot be updated */ ci_assert_le(netif->state->passive_cache_avail_stack, - netif->state->opts.sock_cache_max); - } - else { + netif->state->opts.sock_cache_max); + } else { ci_netif_state* ns = netif->state; ci_atomic32_inc(&ns->active_cache_avail_stack); ci_assert_le(ns->active_cache_avail_stack, ns->opts.sock_cache_max); @@ -371,13 +431,13 @@ static void uncache_ep(ci_netif *netif, ci_tcp_socket_listen* tls, * sockets on the listening socket. Else removes the cached sockets * on the stack a.k.a. active caching. */ -static void -uncache_ep_list(ci_netif *netif, ci_tcp_socket_listen* tls, - struct oo_p_dllink_state thelist) +static void uncache_ep_list(ci_netif* netif, ci_tcp_socket_listen* tls, + struct oo_p_dllink_state thelist) { struct oo_p_dllink_state l, tmp; ci_assert(ci_netif_is_locked(netif)); - oo_p_dllink_for_each_safe(netif, l, tmp, thelist) { + oo_p_dllink_for_each_safe(netif, l, tmp, thelist) + { ci_tcp_state* cached_state = CI_CONTAINER(ci_tcp_state, epcache_link, l.l); ci_assert(cached_state); ci_assert(ci_tcp_is_cached(cached_state)); @@ -396,8 +456,8 @@ uncache_ep_list(ci_netif *netif, ci_tcp_socket_listen* tls, void ci_tcp_listen_uncache_fds(ci_netif* netif, ci_tcp_socket_listen* tls) { /* For scalable passive there will be nothing to do here */ - struct oo_p_dllink_state fd_states = oo_p_dllink_sb(netif, &tls->s.b, - &tls->epcache.fd_states); + struct oo_p_dllink_state fd_states = + oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.fd_states); struct oo_p_dllink_state l; l = oo_p_dllink_statep(netif, ci_xchg32(&fd_states.l->next, OO_P_NULL)); @@ -405,8 +465,8 @@ void ci_tcp_listen_uncache_fds(ci_netif* netif, ci_tcp_socket_listen* tls) if( tls->s.s_flags & CI_SOCK_FLAG_SCALPASSIVE ) return; while( l.p != fd_states.p ) { - ci_tcp_state* cached_state = CI_CONTAINER(ci_tcp_state, - epcache_fd_link, l.l); + ci_tcp_state* cached_state = + CI_CONTAINER(ci_tcp_state, epcache_fd_link, l.l); l = oo_p_dllink_statep(netif, l.l->next); /* We don't free up cached state directly. We call uncache_fd(), which @@ -431,14 +491,14 @@ void ci_tcp_epcache_drop_cache(ci_netif* ni) for( id = 0; id < ni->state->n_ep_bufs; ++id ) { citp_waitable_obj* wo = ID_TO_WAITABLE_OBJ(ni, id); if( wo->waitable.state == CI_TCP_LISTEN ) { - citp_waitable* w = &wo->waitable; - ci_sock_cmn* s = CI_CONTAINER(ci_sock_cmn, b, w); + citp_waitable* w = &wo->waitable; + ci_sock_cmn* s = CI_CONTAINER(ci_sock_cmn, b, w); ci_tcp_socket_listen* tls = SOCK_TO_TCP_LISTEN(s); ci_tcp_listen_uncache_fds(ni, tls); - uncache_ep_list(ni, tls, - oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.pending)); - uncache_ep_list(ni, tls, - oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.cache)); + uncache_ep_list( + ni, tls, oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.pending)); + uncache_ep_list( + ni, tls, oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.cache)); } } } @@ -448,10 +508,8 @@ void ci_tcp_active_cache_drop_cache(ci_netif* ni) { ci_netif_state* ns = ni->state; ci_assert(ci_netif_is_locked(ni)); - uncache_ep_list(ni, NULL, - oo_p_dllink_ptr(ni, &ns->active_cache.pending)); - uncache_ep_list(ni, NULL, - oo_p_dllink_ptr(ni, &ns->active_cache.cache)); + uncache_ep_list(ni, NULL, oo_p_dllink_ptr(ni, &ns->active_cache.pending)); + uncache_ep_list(ni, NULL, oo_p_dllink_ptr(ni, &ns->active_cache.cache)); } @@ -459,10 +517,10 @@ void ci_tcp_passive_scalable_cache_drop_cache(ci_netif* ni) { ci_netif_state* ns = ni->state; ci_assert(ci_netif_is_locked(ni)); - uncache_ep_list(ni, NULL, - oo_p_dllink_ptr(ni, &ns->passive_scalable_cache.pending)); - uncache_ep_list(ni, NULL, - oo_p_dllink_ptr(ni, &ns->passive_scalable_cache.cache)); + uncache_ep_list( + ni, NULL, oo_p_dllink_ptr(ni, &ns->passive_scalable_cache.pending)); + uncache_ep_list( + ni, NULL, oo_p_dllink_ptr(ni, &ns->passive_scalable_cache.cache)); } #endif @@ -474,9 +532,10 @@ void ci_tcp_passive_scalable_cache_drop_cache(ci_netif* ni) #ifndef __KERNEL__ static #endif -/* Wait for SO_LINGER timeout (or ACKed send queue). - * Starts with the stack locked, exits with the stack unlocked. */ -void ci_tcp_linger(ci_netif* ni, ci_tcp_state* ts) + /* Wait for SO_LINGER timeout (or ACKed send queue). + * Starts with the stack locked, exits with the stack unlocked. */ + void + ci_tcp_linger(ci_netif* ni, ci_tcp_state* ts) { /* This is called at user-level when a socket is closed if linger is ** enabled and has a timeout, and there is TX data outstanding. @@ -485,11 +544,11 @@ void ci_tcp_linger(ci_netif* ni, ci_tcp_state* ts) ** until timeout. */ ci_uint64 sleep_seq; - int rc = 0; + int rc = 0; ci_uint32 timeout = ts->s.so.linger * 1000; - int flags = CI_SLEEP_NETIF_LOCKED; + int flags = CI_SLEEP_NETIF_LOCKED; - LOG_TC(log("%s: "NTS_FMT, __FUNCTION__, NTS_PRI_ARGS(ni, ts))); + LOG_TC(log("%s: " NTS_FMT, __FUNCTION__, NTS_PRI_ARGS(ni, ts))); ci_assert(ci_netif_is_locked(ni)); #ifndef __KERNEL__ @@ -504,8 +563,8 @@ void ci_tcp_linger(ci_netif* ni, ci_tcp_state* ts) if( SEQ_EQ(tcp_enq_nxt(ts), tcp_snd_una(ts)) ) { break; } - rc = ci_sock_sleep(ni, &ts->s.b, CI_SB_FLAG_WAKE_TX, flags, - sleep_seq, &timeout); + rc = ci_sock_sleep( + ni, &ts->s.b, CI_SB_FLAG_WAKE_TX, flags, sleep_seq, &timeout); flags = 0; if( rc ) break; @@ -519,7 +578,8 @@ void ci_tcp_linger(ci_netif* ni, ci_tcp_state* ts) #if defined(__KERNEL__) static #endif -int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) + int + ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) { ci_assert(netif); ci_assert(ts); @@ -539,8 +599,8 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) goto drop; #if CI_CFG_TCP_OFFLOAD_RECYCLER - oo_p_dllink_del_init(netif, oo_p_dllink_sb(netif, &ts->s.b, - &ts->recycle_link)); + oo_p_dllink_del_init( + netif, oo_p_dllink_sb(netif, &ts->s.b, &ts->recycle_link)); #endif if( tcp_rcv_usr(ts) != 0 ) { @@ -548,9 +608,10 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) * connection if all rx data not read. */ CI_TCP_EXT_STATS_INC_TCP_ABORT_ON_CLOSE(netif); - LOG_TV(log(LPF "%d CLOSE sent RST, as rx data present added %u " - "delivered %u tcp_rcv_usr=%u", S_FMT(ts), ts->rcv_added, - ts->rcv_delivered, tcp_rcv_usr(ts))); + LOG_TV( + log(LPF "%d CLOSE sent RST, as rx data present added %u " + "delivered %u tcp_rcv_usr=%u", + S_FMT(ts), ts->rcv_added, ts->rcv_delivered, tcp_rcv_usr(ts))); ci_tcp_send_rst(netif, ts); goto drop; } @@ -576,12 +637,11 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) goto drop; } - if( CI_UNLIKELY( ts->tcpflags & CI_TCPT_FLAG_FIN_PENDING ) ) + if( CI_UNLIKELY(ts->tcpflags & CI_TCPT_FLAG_FIN_PENDING) ) ci_tcp_resend_fin(ts, netif); if( (ts->s.b.state == CI_TCP_TIME_WAIT) || - (ts->s.b.state == CI_TCP_CLOSING) || - (ts->s.b.state == CI_TCP_LAST_ACK) ) + (ts->s.b.state == CI_TCP_CLOSING) || (ts->s.b.state == CI_TCP_LAST_ACK) ) return 0; if( ! (ts->s.b.state & CI_TCP_STATE_NOT_CONNECTED) ) { @@ -610,28 +670,27 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) #ifndef __KERNEL__ /* Socket caching + SO_LINGER. In-kernel case is handled in * efab_tcp_helper_close_endpoint() */ - else if( - (ts->s.s_flags & CI_SOCK_FLAG_LINGER) && + else if( (ts->s.s_flags & CI_SOCK_FLAG_LINGER) && ! SEQ_EQ(tcp_enq_nxt(ts), tcp_snd_una(ts)) #if ! CI_CFG_UL_INTERRUPT_HELPER - && (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE) + && (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE) #else - /* Fixme: we should guarantee that this is running the right - * process. - */ + /* Fixme: we should guarantee that this is running the right + * process. + */ #endif - ) { - ci_assert(ts->s.so.linger != 0); - ci_tcp_linger(netif, ts); - ci_netif_lock(netif); + ) { + ci_assert(ts->s.so.linger != 0); + ci_tcp_linger(netif, ts); + ci_netif_lock(netif); } #endif return rc; } - drop: - LOG_TC(log(LPF "%d drop connection in %s state", S_FMT(ts), - ci_tcp_state_str(ts->s.b.state))); +drop: + LOG_TC(log(LPF "%d drop connection in %s state", S_FMT(ts), + ci_tcp_state_str(ts->s.b.state))); /* ci_tcp_drop should really drop connection instead of leaking it, * because we can get here only when asyncronyously closing alien * non-accepted connection from listen socket closure. */ @@ -642,7 +701,8 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts) #endif /* OO_DO_STACK_POLL */ -#if (defined(__KERNEL__) && ! CI_CFG_UL_INTERRUPT_HELPER) || (! defined(__KERNEL__) && CI_CFG_UL_INTERRUPT_HELPER) +#if( defined(__KERNEL__) && ! CI_CFG_UL_INTERRUPT_HELPER ) || \ + (! defined(__KERNEL__) && CI_CFG_UL_INTERRUPT_HELPER) void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) { int synrecvs; @@ -652,8 +712,7 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) ci_assert(ci_netif_is_locked(netif)); /* clear up synrecv queue */ - LOG_TV(ci_log("%s: %d clear out synrecv queue", __FUNCTION__, - S_FMT(tls))); + LOG_TV(ci_log("%s: %d clear out synrecv queue", __FUNCTION__, S_FMT(tls))); if( tls->n_listenq != 0 ) ci_ip_timer_clear(netif, &tls->listenq_tid); synrecvs = ci_tcp_listenq_drop_all(netif, tls); @@ -667,20 +726,20 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) ** and free resources associated with sockets on acceptq */ LOG_TV(log("%s: %d clear out accept queue (%d entries)", __FUNCTION__, - S_FMT(tls), ci_tcp_acceptq_n(tls))); + S_FMT(tls), ci_tcp_acceptq_n(tls))); while( ci_tcp_acceptq_not_empty(tls) ) { citp_waitable* w; - ci_tcp_state* ats; /* accepted ts */ + ci_tcp_state* ats; /* accepted ts */ w = ci_tcp_acceptq_get(netif, tls); #if defined(__KERNEL__) && CI_CFG_ENDPOINT_MOVE if( w->sb_aflags & CI_SB_AFLAG_MOVED_AWAY ) { - tcp_helper_resource_t *thr = NULL; - oo_sp sp; - ci_uint32 stack_id; - ci_netif *ani; /* netif of the accepted socket */ + tcp_helper_resource_t* thr = NULL; + oo_sp sp; + ci_uint32 stack_id; + ci_netif* ani; /* netif of the accepted socket */ #ifdef NDEBUG if( in_interrupt() ) { @@ -689,32 +748,35 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) continue; } #else - ci_assert(!in_interrupt()); + ci_assert(! in_interrupt()); #endif - sp = w->moved_to_sock_id; + sp = w->moved_to_sock_id; stack_id = w->moved_to_stack_id; citp_waitable_obj_free(netif, w); /* do not use w any more */ LOG_TV(log("%s: alien socket %d:%d in accept queue %d:%d", __FUNCTION__, - stack_id, OO_SP_FMT(sp), NI_ID(netif), S_FMT(tls))); + stack_id, OO_SP_FMT(sp), NI_ID(netif), S_FMT(tls))); if( efab_thr_table_lookup(NULL, NULL, stack_id, - EFAB_THR_TABLE_LOOKUP_CHECK_USER, - OO_THR_REF_BASE, &thr) != 0 ) { - LOG_U(log("%s: listening socket %d:%d can't find " - "acceptq memeber %d:%d", __FUNCTION__, - netif->state->stack_id, tls->s.b.bufid, stack_id, sp)); + EFAB_THR_TABLE_LOOKUP_CHECK_USER, OO_THR_REF_BASE, &thr) != 0 ) { + LOG_U( + log("%s: listening socket %d:%d can't find " + "acceptq memeber %d:%d", + __FUNCTION__, netif->state->stack_id, tls->s.b.bufid, stack_id, + sp)); continue; } ani = &thr->netif; - if( !(SP_TO_WAITABLE(ani, sp)->state & CI_TCP_STATE_TCP) || + if( ! (SP_TO_WAITABLE(ani, sp)->state & CI_TCP_STATE_TCP) || SP_TO_WAITABLE(ani, sp)->state == CI_TCP_LISTEN ) { - LOG_U(log("%s: listening socket %d:%d has non-TCP " - "acceptq memeber %d:%d", __FUNCTION__, - netif->state->stack_id, tls->s.b.bufid, stack_id, sp)); + LOG_U( + log("%s: listening socket %d:%d has non-TCP " + "acceptq memeber %d:%d", + __FUNCTION__, netif->state->stack_id, tls->s.b.bufid, stack_id, + sp)); oo_thr_ref_drop(thr->ref, OO_THR_REF_BASE); continue; } @@ -731,18 +793,18 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) ats = &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp; - ci_assert(ci_tcp_is_cached(ats) || - (ats->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); + ci_assert( + ci_tcp_is_cached(ats) || (ats->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); ci_assert(ats->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ); #if CI_CFG_FD_CACHING /* We leave the acceptq flag for cached eps - the state free will be * triggered from the close once we've closed the fd. */ - if( !ci_tcp_is_cached(ats) ) + if( ! ci_tcp_is_cached(ats) ) #endif /* Remove acceptq flag to allow state free on drop */ - ci_bit_clear(&ats->s.b.sb_aflags, CI_SB_AFLAG_TCP_IN_ACCEPTQ_BIT); + ci_bit_clear(&ats->s.b.sb_aflags, CI_SB_AFLAG_TCP_IN_ACCEPTQ_BIT); if( ats->s.b.state != CI_TCP_CLOSED && ats->s.b.state != CI_TCP_TIME_WAIT ) { @@ -754,7 +816,7 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) #if CI_CFG_FD_CACHING if( ci_tcp_is_cached(ats) ) { - LOG_EP(ci_log ("listen_shutdown - uncache from acceptq")); + LOG_EP(ci_log("listen_shutdown - uncache from acceptq")); uncache_ep(netif, tls, ats); /* Remove acceptq flag to allow state free on drop */ @@ -773,11 +835,11 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) */ /* There will be nothing to do here for scalable passive */ LOG_EP(ci_log("listen_shutdown - uncache all on cache list")); - uncache_ep_list(netif, tls, - oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.cache)); + uncache_ep_list( + netif, tls, oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.cache)); LOG_EP(ci_log("listen_shutdown - uncache all on pending list")); - uncache_ep_list(netif, tls, - oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.pending)); + uncache_ep_list( + netif, tls, oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.pending)); #endif } #endif @@ -785,9 +847,9 @@ void ci_tcp_listen_shutdown_queues(ci_netif* netif, ci_tcp_socket_listen* tls) #if defined(__KERNEL__) && CI_CFG_FD_CACHING void ci_tcp_listen_update_cached(ci_netif* netif, ci_tcp_socket_listen* tls) { - tcp_helper_endpoint_t * cached_ep; + tcp_helper_endpoint_t* cached_ep; struct oo_p_dllink_state list, link, tmp; - ci_tcp_state *cached_state; + ci_tcp_state* cached_state; /* Before we clear our filters we must update the filters for any connected * sockets which were accepted from our cache. We do not update the filter @@ -798,7 +860,8 @@ void ci_tcp_listen_update_cached(ci_netif* netif, ci_tcp_socket_listen* tls) */ list = oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache_connected); - oo_p_dllink_for_each_safe(netif, link, tmp, list) { + oo_p_dllink_for_each_safe(netif, link, tmp, list) + { cached_state = CI_CONTAINER(ci_tcp_state, epcache_link, link.l); oo_p_dllink_del_init(netif, link); @@ -816,9 +879,10 @@ void ci_tcp_listen_update_cached(ci_netif* netif, ci_tcp_socket_listen* tls) * shutdown cleanly. */ list = oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.pending); - oo_p_dllink_for_each(netif, link, list) { + oo_p_dllink_for_each(netif, link, list) + { cached_state = CI_CONTAINER(ci_tcp_state, epcache_link, link.l); - cached_ep = ci_netif_ep_get(netif, cached_state->s.b.bufid); + cached_ep = ci_netif_ep_get(netif, cached_state->s.b.bufid); tcp_helper_endpoint_update_filter_details(cached_ep); } @@ -847,31 +911,31 @@ void __ci_tcp_listen_shutdown(ci_netif* netif, ci_tcp_socket_listen* tls) * OS. */ if( ! (tls->s.s_flags & CI_SOCK_FLAG_PORT_BOUND) ) tls->s.s_flags &= ~CI_SOCK_FLAG_BOUND; - /* Shutdown the OS socket and clear out the filters. */ -# ifdef __KERNEL__ - rc = tcp_helper_endpoint_shutdown(netif2tcp_helper_resource(netif), - S_SP(tls), SHUT_RDWR, CI_TCP_LISTEN); + /* Shutdown the OS socket and clear out the filters. */ +#ifdef __KERNEL__ + rc = tcp_helper_endpoint_shutdown( + netif2tcp_helper_resource(netif), S_SP(tls), SHUT_RDWR, CI_TCP_LISTEN); if( rc == -EINVAL ) /* This means there is no O/S socket. This is expected when socket has * been closed, as the O/S socket has already been shutdown and * released. */ rc = 0; -# else - rc = ci_tcp_helper_endpoint_shutdown(netif, S_SP(tls), - SHUT_RDWR, CI_TCP_LISTEN); -# endif +#else + rc = ci_tcp_helper_endpoint_shutdown( + netif, S_SP(tls), SHUT_RDWR, CI_TCP_LISTEN); +#endif #if CI_CFG_UL_INTERRUPT_HELPER if( rc == -1 && errno == EINVAL ) { /* See the comment above - the socket is already closed */ - rc = 0; + rc = 0; errno = saved_errno; } ci_tcp_listen_shutdown_queues(netif, tls); #endif if( rc < 0 ) - LOG_E(ci_log("%s: [%d:%d] shutdown(os_sock) failed %d", - __FUNCTION__, NI_ID(netif), S_FMT(tls), rc)); + LOG_E(ci_log("%s: [%d:%d] shutdown(os_sock) failed %d", __FUNCTION__, + NI_ID(netif), S_FMT(tls), rc)); } @@ -889,19 +953,19 @@ void ci_tcp_all_fds_gone_common(ci_netif* ni, ci_tcp_state* ts) /* If we are in a state where we time out orphaned connections: */ if( (ts->s.b.state & CI_TCP_STATE_TIMEOUT_ORPHAN) && - !(ts->s.b.sb_flags & CI_SB_FLAG_MOVED) ) + ! (ts->s.b.sb_flags & CI_SB_FLAG_MOVED) ) ci_netif_fin_timeout_enter(ni, ts); /* Orphaned sockets do not need keepalive */ if( ts->s.s_flags & CI_SOCK_FLAG_KALIVE ) { - ts->s.s_flags &=~ CI_SOCK_FLAG_KALIVE; + ts->s.s_flags &= ~CI_SOCK_FLAG_KALIVE; ci_tcp_kalive_check_and_clear(ni, ts); ts->ka_probes = 0; } } -void ci_tcp_listen_all_fds_gone(ci_netif* ni, ci_tcp_socket_listen* tls, - int do_free) +void ci_tcp_listen_all_fds_gone( + ci_netif* ni, ci_tcp_socket_listen* tls, int do_free) { /* All process references to this socket have gone. So we should * shutdown() if necessary, and arrange for all resources to eventually diff --git a/src/lib/transport/ip/tcp_connect.c b/src/lib/transport/ip/tcp_connect.c index 8c962edfc..b82e26d99 100644 --- a/src/lib/transport/ip/tcp_connect.c +++ b/src/lib/transport/ip/tcp_connect.c @@ -2,7 +2,7 @@ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk ** \brief TCP connection routines: @@ -12,9 +12,9 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_ip */ - + #include "ip_internal.h" #include #include @@ -29,56 +29,56 @@ #define LPF "tcp_connect: " - - -#if !defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE +#if ! defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE /* TCP connect() implementation is not needed in-kernel except for loopback */ #ifndef __KERNEL__ /*! * Tests for valid sockaddr & sockaddr length & AF_INET or AF_INET6. */ -static int ci_tcp_validate_sa( sa_family_t domain, - const struct sockaddr* sa, socklen_t sa_len ) +static int ci_tcp_validate_sa( + sa_family_t domain, const struct sockaddr* sa, socklen_t sa_len) { /* * Linux deviates from documented behaviour here; * On Linux we return EINVAL if sa and sa_len are NULL and 0 respectively, * and we return EFAULT if sa is NULL and sa_len != 0.... */ - if( !sa ) { - LOG_U(ci_log(LPF "invalid sockaddr : sa = %lx, sa_len = %d", - (long) sa, sa_len)); + if( ! sa ) { + LOG_U(ci_log( + LPF "invalid sockaddr : sa = %lx, sa_len = %d", (long) sa, sa_len)); if( sa_len == 0 ) - RET_WITH_ERRNO( EINVAL ); + RET_WITH_ERRNO(EINVAL); else - RET_WITH_ERRNO( EFAULT ); + RET_WITH_ERRNO(EFAULT); } - if( sa_len < sizeof(struct sockaddr_in) + if( sa_len < sizeof(struct sockaddr_in) #if CI_CFG_FAKE_IPV6 || (domain == AF_INET6 && sa_len < SIN6_LEN_RFC2133) #endif - ) { - LOG_U( ci_log(LPF "struct too short to be sockaddr_in(6)" )); - RET_WITH_ERRNO( EINVAL ); + ) { + LOG_U(ci_log(LPF "struct too short to be sockaddr_in(6)")); + RET_WITH_ERRNO(EINVAL); } /* It should be sa->sa_family, but MS wdm does not understand it, * so let's use CI_SIN(sa)->sin_family. */ - if (CI_SIN(sa)->sin_family != domain && - CI_SIN(sa)->sin_family != AF_UNSPEC) { - LOG_U(ci_log(LPF "address family %d does not match " - "with socket domain %d", CI_SIN(sa)->sin_family, domain)); + if( CI_SIN(sa)->sin_family != domain && + CI_SIN(sa)->sin_family != AF_UNSPEC ) { + LOG_U( + ci_log(LPF "address family %d does not match " + "with socket domain %d", + CI_SIN(sa)->sin_family, domain)); RET_WITH_ERRNO(EAFNOSUPPORT); } -#if CI_CFG_FAKE_IPV6 && !CI_CFG_IPV6 - if (sa->sa_family == AF_INET6 && !ci_tcp_ipv6_is_ipv4(sa)) { +#if CI_CFG_FAKE_IPV6 && ! CI_CFG_IPV6 + if( sa->sa_family == AF_INET6 && ! ci_tcp_ipv6_is_ipv4(sa) ) { LOG_TC(ci_log(LPF "Pure IPv6 address is not supported")); RET_WITH_ERRNO(EAFNOSUPPORT); } -#endif +#endif return 0; } #endif @@ -91,19 +91,19 @@ ci_inline void ci_tcp_bind_flags_assert_valid(ci_sock_cmn* s) { if( s->s_flags & CI_SOCK_FLAG_DEFERRED_BIND ) { /* If we deferred the bind we need to know that we should bind later */ - ci_assert( s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND ); + ci_assert(s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND); /* We can only defer bind in cases where the application doesn't bind to * a specific port. */ - ci_assert( s->s_flags & ~CI_SOCK_FLAG_PORT_BOUND ); + ci_assert(s->s_flags & ~CI_SOCK_FLAG_PORT_BOUND); } } #ifndef __ci_driver__ /* Set CI_SOCK_FLAG_BOUND_ALIEN if needed */ -static void ci_tcp_bind_check_laddr(ci_netif *ni, ci_sock_cmn *s, - ci_addr_t addr) +static void ci_tcp_bind_check_laddr( + ci_netif* ni, ci_sock_cmn* s, ci_addr_t addr) { if( (s->s_flags & CI_SOCK_FLAG_TPROXY) || CI_IPX_ADDR_IS_ANY(addr) || cicp_user_addr_is_local_efab(ni, addr) ) @@ -124,9 +124,8 @@ static void ci_tcp_bind_check_laddr(ci_netif *ni, ci_sock_cmn *s, * CI_SOCKET_HANDOVER, Pass to OS, OS bound ok, (no error) * CI_SOCKET_ERROR & errno set */ -static int -__ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, - ci_addr_t addr, ci_uint16* port_be16, int may_defer) +static int __ci_tcp_bind(ci_netif* ni, ci_sock_cmn* s, ci_fd_t fd, + ci_addr_t addr, ci_uint16* port_be16, int may_defer) { int rc = 0; ci_uint16 user_port; /* Port number specified by user, not by OS. @@ -134,28 +133,29 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, union ci_sockaddr_u sa_u; ci_assert(s->domain == AF_INET || s->domain == AF_INET6); - ci_assert( port_be16 ); - ci_assert(s->b.state & CI_TCP_STATE_TCP || - s->b.state == CI_TCP_STATE_ACTIVE_WILD); + ci_assert(port_be16); + ci_assert( + s->b.state & CI_TCP_STATE_TCP || s->b.state == CI_TCP_STATE_ACTIVE_WILD); ci_tcp_bind_flags_assert_valid(s); user_port = *port_be16; - if( !(s->s_flags & CI_SOCK_FLAG_TPROXY) ) { + if( ! (s->s_flags & CI_SOCK_FLAG_TPROXY) ) { #if CI_CFG_TCP_SHARED_LOCAL_PORTS /* In active-wild mode we might not want to bind yet. */ - if( !may_defer || !NI_OPTS(ni).tcp_shared_local_ports || user_port != 0 ) + if( ! may_defer || ! NI_OPTS(ni).tcp_shared_local_ports || user_port != 0 ) #endif { #if CI_CFG_FAKE_IPV6 ci_assert(s->domain == AF_INET || s->domain == AF_INET6); if( s->domain == AF_INET ) ci_make_sockaddr_from_ip4(&sa_u.sin, user_port, addr.ip4); - else if( !CI_IS_ADDR_IP6(addr) ) + else if( ! CI_IS_ADDR_IP6(addr) ) ci_make_sockaddr_in6_from_ip4(&sa_u.sin6, user_port, addr.ip4); #if CI_CFG_IPV6 else { - ci_make_sockaddr_in6_from_ip6(&sa_u.sin6, user_port, (ci_uint32*)addr.ip6); + ci_make_sockaddr_in6_from_ip6( + &sa_u.sin6, user_port, (ci_uint32*) addr.ip6); /* Bind to link-local address requires an interface */ sa_u.sin6.sin6_scope_id = s->cp.so_bindtodevice; } @@ -167,14 +167,13 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, #ifdef __ci_driver__ rc = efab_tcp_helper_bind_os_sock_kernel(netif2tcp_helper_resource(ni), - SC_SP(s), &sa_u.sa, - sizeof(sa_u), port_be16); + SC_SP(s), &sa_u.sa, sizeof(sa_u), port_be16); #else rc = ci_tcp_helper_bind_os_sock(fd, &sa_u.sa, sizeof(sa_u), port_be16); #endif if( rc == 0 ) - s->s_flags &= ~(CI_SOCK_FLAG_CONNECT_MUST_BIND | - CI_SOCK_FLAG_DEFERRED_BIND); + s->s_flags &= + ~(CI_SOCK_FLAG_CONNECT_MUST_BIND | CI_SOCK_FLAG_DEFERRED_BIND); } #if CI_CFG_TCP_SHARED_LOCAL_PORTS /* We can defer this bind. We need to make an extra check for the socket @@ -184,8 +183,7 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, ! (s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND) ) { /* Already bound. */ CI_SET_ERROR(rc, EINVAL); - } - else { + } else { /* CI_SOCK_FLAG_DEFERRED_BIND is clear, so either we never set it * (meaning nobody called bind()) or we've since cleared it (meaning that * the deferred bind has been performed). Only in the former case are we @@ -200,8 +198,7 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, rc = 0; } #endif - } - else { + } else { /* CI_SOCK_FLAG_TPROXY is set. We don't use OS backing sockets for these, * and we don't support deferred binds either. */ @@ -209,13 +206,13 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, s->s_flags &= ~CI_SOCK_FLAG_CONNECT_MUST_BIND; } - /* bug1781: only do this if the earlier bind succeeded. + /* bug1781: only do this if the earlier bind succeeded. * check if we can handle this socket */ if( rc != 0 ) return rc; if( user_port != 0 ) s->s_flags |= CI_SOCK_FLAG_PORT_BOUND; - if( !CI_IPX_ADDR_IS_ANY(addr) ) + if( ! CI_IPX_ADDR_IS_ANY(addr) ) s->cp.sock_cp_flags |= OO_SCP_BOUND_ADDR; ci_tcp_bind_flags_assert_valid(s); @@ -224,17 +221,17 @@ __ci_tcp_bind(ci_netif *ni, ci_sock_cmn *s, ci_fd_t fd, static int /*bool*/ -ci_tcp_connect_check_local_dst_addr(ci_tcp_socket_listen* tls, - ci_addr_t dst_addr) +ci_tcp_connect_check_local_dst_addr( + ci_tcp_socket_listen* tls, ci_addr_t dst_addr) { - if( !CI_IPX_ADDR_IS_ANY(tls->s.laddr) ) + if( ! CI_IPX_ADDR_IS_ANY(tls->s.laddr) ) return CI_IPX_ADDR_EQ(tls->s.laddr, dst_addr); #if CI_CFG_IPV6 else { if( CI_IS_ADDR_IP6(dst_addr) ) return CI_IS_ADDR_IP6(tls->s.laddr); else - return !(tls->s.s_flags & CI_SOCK_FLAG_V6ONLY); + return ! (tls->s.s_flags & CI_SOCK_FLAG_V6ONLY); } #endif @@ -242,8 +239,8 @@ ci_tcp_connect_check_local_dst_addr(ci_tcp_socket_listen* tls, } -oo_sp ci_tcp_connect_find_local_peer(ci_netif *ni, int locked, - ci_addr_t dst_addr, int dport_be16) +oo_sp ci_tcp_connect_find_local_peer( + ci_netif* ni, int locked, ci_addr_t dst_addr, int dport_be16) { ci_tcp_socket_listen* tls; int i; @@ -255,15 +252,15 @@ oo_sp ci_tcp_connect_find_local_peer(ci_netif *ni, int locked, * socket */ /* FIXME: make ci_netif_listener_lookup() work for unlocked stacks */ /* FIXME: enable IPv6, bug 84048 */ - sock = ci_netif_listener_lookup(ni, CI_IS_ADDR_IP6(dst_addr) ? - AF_SPACE_FLAG_IP6 : AF_SPACE_FLAG_IP4, - dst_addr, dport_be16); + sock = ci_netif_listener_lookup(ni, + CI_IS_ADDR_IP6(dst_addr) ? AF_SPACE_FLAG_IP6 : AF_SPACE_FLAG_IP4, + dst_addr, dport_be16); } if( OO_SP_NOT_NULL(sock) ) { tls = ID_TO_TCP_LISTEN(ni, sock); - if( ( ~tls->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN ) && - ( tls->s.cp.so_bindtodevice == CI_IFID_BAD ) ) + if( (~tls->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) && + (tls->s.cp.so_bindtodevice == CI_IFID_BAD) ) goto found; } @@ -271,21 +268,26 @@ oo_sp ci_tcp_connect_find_local_peer(ci_netif *ni, int locked, * Perform full search to cover the case when destination address * does not belong to SF interface. */ - for( i = 0; i < (int)ni->state->n_ep_bufs; ++i ) { + for( i = 0; i < (int) ni->state->n_ep_bufs; ++i ) { citp_waitable_obj* wo = ID_TO_WAITABLE_OBJ(ni, i); - if( wo->waitable.state != CI_TCP_LISTEN ) continue; - if( wo->waitable.sb_aflags & CI_SB_AFLAG_ORPHAN ) continue; + if( wo->waitable.state != CI_TCP_LISTEN ) + continue; + if( wo->waitable.sb_aflags & CI_SB_AFLAG_ORPHAN ) + continue; tls = SOCK_TO_TCP_LISTEN(&wo->sock); - if( tls->s.cp.lport_be16 != dport_be16 ) continue; - if( !ci_tcp_connect_check_local_dst_addr(tls, dst_addr) ) continue; - if( tls->s.cp.so_bindtodevice != CI_IFID_BAD ) continue; + if( tls->s.cp.lport_be16 != dport_be16 ) + continue; + if( ! ci_tcp_connect_check_local_dst_addr(tls, dst_addr) ) + continue; + if( tls->s.cp.so_bindtodevice != CI_IFID_BAD ) + continue; goto found; } return OO_SP_NULL; found: /* this is our tls - connect to it! */ - if( (int)ci_tcp_acceptq_n(tls) < tls->acceptq_max ) + if( (int) ci_tcp_acceptq_n(tls) < tls->acceptq_max ) return tls->s.b.bufid; else return OO_SP_INVALID; @@ -297,7 +299,8 @@ static void ci_tcp_init_ipcache_ip4_hdr(ci_tcp_state* ts) { ci_init_ipcache_ip4_hdr(&ts->s); memmove(&ts->s.pkt.ipx.ip4 + 1, &ts->s.pkt.ipx.ip6 + 1, sizeof(ci_tcp_hdr)); - ts->outgoing_hdrs_len -= CI_IPX_HDR_SIZE(AF_INET6) - CI_IPX_HDR_SIZE(AF_INET); + ts->outgoing_hdrs_len -= + CI_IPX_HDR_SIZE(AF_INET6) - CI_IPX_HDR_SIZE(AF_INET); if( CI_IS_ADDR_IP6(ts->s.cp.laddr) ) { ci_assert(CI_IPX_ADDR_IS_ANY(ts->s.cp.laddr)); @@ -309,7 +312,8 @@ static void ci_tcp_init_ipcache_ip6_hdr(ci_tcp_state* ts) { memmove(&ts->s.pkt.ipx.ip6 + 1, &ts->s.pkt.ipx.ip4 + 1, sizeof(ci_tcp_hdr)); ci_init_ipcache_ip6_hdr(&ts->s); - ts->outgoing_hdrs_len += CI_IPX_HDR_SIZE(AF_INET6) - CI_IPX_HDR_SIZE(AF_INET); + ts->outgoing_hdrs_len += + CI_IPX_HDR_SIZE(AF_INET6) - CI_IPX_HDR_SIZE(AF_INET); if( ! CI_IS_ADDR_IP6(ts->s.cp.laddr) ) { ci_assert(CI_IPX_ADDR_IS_ANY(ts->s.cp.laddr)); @@ -325,10 +329,9 @@ static void ci_tcp_init_ipcache_ip6_hdr(ci_tcp_state* ts) void ci_tcp_ipcache_convert(int af, ci_tcp_state* ts) { if( IS_AF_INET6(af) ) { - if( !ipcache_is_ipv6(&ts->s.pkt) ) + if( ! ipcache_is_ipv6(&ts->s.pkt) ) ci_tcp_init_ipcache_ip6_hdr(ts); - } - else if( ipcache_is_ipv6(&ts->s.pkt) ) { + } else if( ipcache_is_ipv6(&ts->s.pkt) ) { ci_tcp_init_ipcache_ip4_hdr(ts); } } @@ -337,15 +340,16 @@ void ci_tcp_ipcache_convert(int af, ci_tcp_state* ts) #ifndef __KERNEL__ /* check that we can handle this destination */ -static int ci_tcp_connect_check_dest(citp_socket* ep, ci_addr_t dst, - int dport_be16) +static int ci_tcp_connect_check_dest( + citp_socket* ep, ci_addr_t dst, int dport_be16) { ci_ip_cached_hdrs* ipcache = &ep->s->pkt; ci_addr_t src = sock_ipx_laddr(ep->s); #if CI_CFG_IPV6 /* - * Socket was bound to IPv4 and connecting to IPv6 or vice versa - hand it over. + * Socket was bound to IPv4 and connecting to IPv6 or vice versa - hand it + * over. */ if( (ep->s->cp.sock_cp_flags & OO_SCP_BOUND_ADDR) && CI_ADDR_AF(dst) != CI_ADDR_AF(ep->s->laddr) ) { @@ -367,15 +371,13 @@ static int ci_tcp_connect_check_dest(citp_socket* ep, ci_addr_t dst, /* Control plane has selected a source address for us -- remember it. */ if( ipcache->status != retrrc_noroute && - ipcache->status != retrrc_alienroute && - CI_IPX_ADDR_IS_ANY(src) ) { + ipcache->status != retrrc_alienroute && CI_IPX_ADDR_IS_ANY(src) ) { ci_sock_set_laddr(ep->s, ipcache_laddr(ipcache)); ep->s->cp.laddr = ep->s->laddr; } - if(CI_LIKELY( ipcache->status == retrrc_success || - ipcache->status == retrrc_nomac || - ipcache->status < 0 )) { + if( CI_LIKELY(ipcache->status == retrrc_success || + ipcache->status == retrrc_nomac || ipcache->status < 0) ) { /* Onloadable. */ if( ipcache->encap.type & CICP_LLAP_TYPE_XMIT_HASH_LAYER4 ) /* We don't yet have a local port number, so the result of that @@ -388,19 +390,19 @@ static int ci_tcp_connect_check_dest(citp_socket* ep, ci_addr_t dst, else if( ipcache->status == retrrc_localroute ) { ci_tcp_state* ts = SOCK_TO_TCP(ep->s); - if( NI_OPTS(ep->netif).tcp_client_loopback == CITP_TCP_LOOPBACK_OFF) + if( NI_OPTS(ep->netif).tcp_client_loopback == CITP_TCP_LOOPBACK_OFF ) return CI_SOCKET_HANDOVER; ep->s->s_flags |= CI_SOCK_FLAG_BOUND_ALIEN; if( NI_OPTS(ep->netif).tcp_server_loopback != CITP_TCP_LOOPBACK_OFF ) - ts->local_peer = ci_tcp_connect_find_local_peer(ep->netif, 1 /* locked */, - dst, dport_be16); + ts->local_peer = ci_tcp_connect_find_local_peer( + ep->netif, 1 /* locked */, dst, dport_be16); else ts->local_peer = OO_SP_NULL; if( OO_SP_NOT_NULL(ts->local_peer) || NI_OPTS(ep->netif).tcp_client_loopback != - CITP_TCP_LOOPBACK_SAMESTACK ) { + CITP_TCP_LOOPBACK_SAMESTACK ) { ipcache->flags |= CI_IP_CACHE_IS_LOCALROUTE; ipcache->ether_offset = 4; /* lo is non-VLAN */ ipcache->dport_be16 = dport_be16; @@ -416,16 +418,16 @@ static int ci_tcp_connect_check_dest(citp_socket* ep, ci_addr_t dst, #endif -static int/*bool*/ -cicp_check_ipif_ifindex(struct oo_cplane_handle* cp, - ci_ifid_t ifindex, void* data) +static int /*bool*/ +cicp_check_ipif_ifindex( + struct oo_cplane_handle* cp, ci_ifid_t ifindex, void* data) { - return ifindex == *(ci_ifid_t*)data; + return ifindex == *(ci_ifid_t*) data; } -int -ci_tcp_use_mac_filter_listen(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex) +int ci_tcp_use_mac_filter_listen( + ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex) { int mode; @@ -439,9 +441,9 @@ ci_tcp_use_mac_filter_listen(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex) /* Listening sockets bound to an IP address on an interface that we have * a MAC filter for share that MAC filter. Clustering setting of listening * socket needs to match scalable mode rss-wise. */ - if( ((NI_OPTS(ni).cluster_ignore == 1 ) || - ! (s->s_flags & CI_SOCK_FLAG_REUSEPORT)) == - !(mode & CITP_SCALABLE_MODE_RSS) ) { + if( ((NI_OPTS(ni).cluster_ignore == 1) || + ! (s->s_flags & CI_SOCK_FLAG_REUSEPORT)) == + ! (mode & CITP_SCALABLE_MODE_RSS) ) { /* If we've been configured to use scalable filters on all interfaces, then * we can do so without further ado. */ if( NI_OPTS(ni).scalable_filter_ifindex_passive == @@ -451,9 +453,9 @@ ci_tcp_use_mac_filter_listen(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex) /* based on bind to device we might be using scalable iface */ if( ifindex <= 0 ) { /* Determine which ifindex the IP address being bound to is on. */ - ifindex = NI_OPTS(ni).scalable_filter_ifindex_passive; - return cicp_find_ifindex_by_ip(ni->cplane, sock_laddr(s), - cicp_check_ipif_ifindex, &ifindex); + ifindex = NI_OPTS(ni).scalable_filter_ifindex_passive; + return cicp_find_ifindex_by_ip( + ni->cplane, sock_laddr(s), cicp_check_ipif_ifindex, &ifindex); } return (NI_OPTS(ni).scalable_filter_ifindex_passive == ifindex); } @@ -461,9 +463,13 @@ ci_tcp_use_mac_filter_listen(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex) } -#if !defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE -int ci_tcp_can_set_filter_in_ul(ci_netif *ni, ci_sock_cmn* s) +#if ! defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE +int ci_tcp_can_set_filter_in_ul(ci_netif* ni, ci_sock_cmn* s) { + /* swxtch architectures ONLY work in UL */ + if( ni->nic_hw->vis[0].nic_type.arch == EF_VI_ARCH_SWXTCH ) { + return 1; + } if( (s->s_flags & CI_SOCK_FLAGS_SCALABLE) == 0 ) return 0; if( s->b.state == CI_TCP_LISTEN ) @@ -481,33 +487,31 @@ int ci_tcp_can_set_filter_in_ul(ci_netif *ni, ci_sock_cmn* s) return 0; ci_assert_nequal(s->b.state, CI_TCP_LISTEN); - ci_assert(!CI_IPX_ADDR_IS_ANY(sock_ipx_laddr(s))); + ci_assert(! CI_IPX_ADDR_IS_ANY(sock_ipx_laddr(s))); ci_assert_nequal(sock_lport_be16(s), 0); return 1; } #endif -int ci_tcp_sock_set_stack_filter(ci_netif *ni, ci_sock_cmn* s) +int ci_tcp_sock_set_stack_filter(ci_netif* ni, ci_sock_cmn* s) { int rc; oo_sp sock; - LOG_TC(log( NSS_FMT " %s", NSS_PRI_ARGS(ni, s), __FUNCTION__)); + LOG_TC(log(NSS_FMT " %s", NSS_PRI_ARGS(ni, s), __FUNCTION__)); ci_assert((s->s_flags & CI_SOCK_FLAG_STACK_FILTER) == 0); - sock = ci_netif_filter_lookup(ni, sock_af_space(s), - sock_ipx_laddr(s), sock_lport_be16(s), - sock_ipx_raddr(s), sock_rport_be16(s), - sock_protocol(s)); + sock = ci_netif_filter_lookup(ni, sock_af_space(s), sock_ipx_laddr(s), + sock_lport_be16(s), sock_ipx_raddr(s), sock_rport_be16(s), + sock_protocol(s)); if( OO_SP_NOT_NULL(sock) ) return -EADDRINUSE; rc = ci_netif_filter_insert(ni, SC_ID(s), sock_af_space(s), - sock_ipx_laddr(s), sock_lport_be16(s), - sock_ipx_raddr(s), sock_rport_be16(s), - sock_protocol(s)); + sock_ipx_laddr(s), sock_lport_be16(s), sock_ipx_raddr(s), + sock_rport_be16(s), sock_protocol(s)); if( rc == 0 ) { s->s_flags |= CI_SOCK_FLAG_STACK_FILTER; if( (s->s_flags & CI_SOCK_FLAGS_SCALABLE) != 0 ) @@ -517,13 +521,13 @@ int ci_tcp_sock_set_stack_filter(ci_netif *ni, ci_sock_cmn* s) } -void ci_tcp_sock_clear_stack_filter(ci_netif *ni, ci_tcp_state* ts) +void ci_tcp_sock_clear_stack_filter(ci_netif* ni, ci_tcp_state* ts) { - LOG_TC(log( LNT_FMT " %s", LNT_PRI_ARGS(ni, ts), __FUNCTION__)); + LOG_TC(log(LNT_FMT " %s", LNT_PRI_ARGS(ni, ts), __FUNCTION__)); ci_assert((ts->s.s_flags & CI_SOCK_FLAG_STACK_FILTER) != 0); - ci_netif_filter_remove(ni, S_ID(ts), sock_af_space(&ts->s), tcp_ipx_laddr(ts), - tcp_lport_be16(ts), tcp_ipx_raddr(ts), - tcp_rport_be16(ts), tcp_protocol(ts)); + ci_netif_filter_remove(ni, S_ID(ts), sock_af_space(&ts->s), + tcp_ipx_laddr(ts), tcp_lport_be16(ts), tcp_ipx_raddr(ts), + tcp_rport_be16(ts), tcp_protocol(ts)); ts->s.s_flags &= ~CI_SOCK_FLAG_STACK_FILTER; } @@ -536,39 +540,35 @@ ci_tcp_prev_seq_older(const ci_tcp_prev_seq_t* a, const ci_tcp_prev_seq_t* b) } -ci_inline ci_uint32 -ci_tcp_prev_seq_initial_seqno(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) +ci_inline ci_uint32 ci_tcp_prev_seq_initial_seqno( + ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) { - return ci_tcp_initial_seqno(ni, prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport); + return ci_tcp_initial_seqno( + ni, prev_seq->laddr, prev_seq->lport, prev_seq->raddr, prev_seq->rport); } -ci_inline ci_uint32 -ci_tcp_prev_seq_future_isn(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq, - ci_iptime_t ticks) +ci_inline ci_uint32 ci_tcp_prev_seq_future_isn( + ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq, ci_iptime_t ticks) { return ci_tcp_future_isn(ni, prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport, ticks); + prev_seq->raddr, prev_seq->rport, ticks); } -ci_inline ci_uint32 -ci_tcp_prev_seq_hash1(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) +ci_inline ci_uint32 ci_tcp_prev_seq_hash1( + ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) { - return onload_hash1(ni->state->seq_table_entries_n - 1, - prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport, - IPPROTO_TCP); + return onload_hash1(ni->state->seq_table_entries_n - 1, prev_seq->laddr, + prev_seq->lport, prev_seq->raddr, prev_seq->rport, IPPROTO_TCP); } -ci_inline ci_uint32 -ci_tcp_prev_seq_hash2(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) +ci_inline ci_uint32 ci_tcp_prev_seq_hash2( + ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) { - return onload_hash2(prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport, - IPPROTO_TCP); + return onload_hash2(prev_seq->laddr, prev_seq->lport, prev_seq->raddr, + prev_seq->rport, IPPROTO_TCP); } @@ -583,15 +583,14 @@ ci_tcp_clock_isn_safe(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq) ci_uint32 prev_seq_no = prev_seq->seq_no; /* We assume that all peers have 2 MSL <= 240 s. The argument to this * function is in ticks, but a tick is between one and two milliseconds. */ - ci_uint32 isn_after_2msl = ci_tcp_prev_seq_future_isn - (ni, prev_seq, NI_CONF(ni).tconst_peer2msl_time); + ci_uint32 isn_after_2msl = ci_tcp_prev_seq_future_isn( + ni, prev_seq, NI_CONF(ni).tconst_peer2msl_time); return SEQ_GT(isn_now, prev_seq_no) && SEQ_GT(isn_after_2msl, prev_seq_no); } - ci_inline void ci_tcp_prev_seq_from_ts(ci_netif* ni, const ci_tcp_state* ts, - ci_tcp_prev_seq_t* prev_seq /* out */) + ci_tcp_prev_seq_t* prev_seq /* out */) { prev_seq->laddr = tcp_ipx_laddr(ts); prev_seq->raddr = tcp_ipx_raddr(ts); @@ -606,8 +605,7 @@ ci_inline void ci_tcp_prev_seq_from_ts(ci_netif* ni, const ci_tcp_state* ts, /* Insert [prev_seq_from] (copy 4-tuple and seq_no) * into the table at location [prev_seq]. */ ci_inline void ci_tcp_prev_seq_remember_at(ci_netif* ni, - const ci_tcp_prev_seq_t* prev_seq_from, - ci_tcp_prev_seq_t* prev_seq) + const ci_tcp_prev_seq_t* prev_seq_from, ci_tcp_prev_seq_t* prev_seq) { ci_uint32 isn_now; prev_seq->laddr = prev_seq_from->laddr; @@ -616,8 +614,7 @@ ci_inline void ci_tcp_prev_seq_remember_at(ci_netif* ni, prev_seq->rport = prev_seq_from->rport; prev_seq->seq_no = prev_seq_from->seq_no; - prev_seq->expiry = ci_tcp_time_now(ni) + - NI_CONF(ni).tconst_peer2msl_time; + prev_seq->expiry = ci_tcp_time_now(ni) + NI_CONF(ni).tconst_peer2msl_time; /* In many cases clock based ISN catches with entry's seq_no sooner * then nominal expiry time. Once this happen clock based ISN would be @@ -641,19 +638,18 @@ ci_inline void ci_tcp_prev_seq_remember_at(ci_netif* ni, but can expire at after_2msl XXXXXXXXXXXXXXXXXXXXXXXXXXXX| bad: same as case 2 */ - isn_now = ci_tcp_initial_seqno(ni, prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport); + isn_now = ci_tcp_initial_seqno( + ni, prev_seq->laddr, prev_seq->lport, prev_seq->raddr, prev_seq->rport); if( SEQ_GT(prev_seq->seq_no, isn_now) ) { - ci_uint32 isn_after_2msl = ci_tcp_future_isn - (ni, prev_seq->laddr, prev_seq->lport, - prev_seq->raddr, prev_seq->rport, - NI_CONF(ni).tconst_peer2msl_time); + ci_uint32 isn_after_2msl = ci_tcp_future_isn(ni, prev_seq->laddr, + prev_seq->lport, prev_seq->raddr, prev_seq->rport, + NI_CONF(ni).tconst_peer2msl_time); if( SEQ_GT(isn_after_2msl, prev_seq->seq_no) ) { /* The clock based ISN will catch up with entry between 0 and 2msl. * Let's calculate exactly how much earlier this will happen * and adjust expiry time accordingly */ - ci_iptime_t expiry_reduce = ci_tcp_isn2tick - (ni, isn_after_2msl - prev_seq->seq_no); + ci_iptime_t expiry_reduce = + ci_tcp_isn2tick(ni, isn_after_2msl - prev_seq->seq_no); ci_assert_ge(NI_CONF(ni).tconst_peer2msl_time, expiry_reduce); prev_seq->expiry -= expiry_reduce; @@ -672,9 +668,9 @@ ci_inline void ci_tcp_prev_seq_remember_at(ci_netif* ni, * [prev_seq_val] is used to generate hashes, * [prev_seq_entry] is pointer to the hash table entry, we'd got match with * [prev_seq_val] 4 tuple. */ -static void -__ci_tcp_prev_seq_free(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq_val, - const ci_tcp_prev_seq_t* prev_seq_entry) +static void __ci_tcp_prev_seq_free(ci_netif* ni, + const ci_tcp_prev_seq_t* prev_seq_val, + const ci_tcp_prev_seq_t* prev_seq_entry) { unsigned hash; unsigned hash2 = 0; @@ -696,7 +692,7 @@ __ci_tcp_prev_seq_free(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq_val, hash = (hash + hash2) & (ni->state->seq_table_entries_n - 1); depth++; ci_assert_le(depth, TCP_PREV_SEQ_DEPTH_LIMIT); - if(CI_UNLIKELY( depth > TCP_PREV_SEQ_DEPTH_LIMIT )) { + if( CI_UNLIKELY(depth > TCP_PREV_SEQ_DEPTH_LIMIT) ) { LOG_U(ci_log("%s: reached search depth", __FUNCTION__)); break; } @@ -704,8 +700,8 @@ __ci_tcp_prev_seq_free(ci_netif* ni, const ci_tcp_prev_seq_t* prev_seq_val, } -static void -ci_tcp_prev_seq_free(ci_netif* ni, ci_tcp_prev_seq_t* prev_seq) { +static void ci_tcp_prev_seq_free(ci_netif* ni, ci_tcp_prev_seq_t* prev_seq) +{ __ci_tcp_prev_seq_free(ni, prev_seq, prev_seq); prev_seq->laddr = addr_any; } @@ -725,7 +721,7 @@ __ci_tcp_prev_seq_remember(ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) /* Oldest amongst the entries that we've traversed. */ ci_tcp_prev_seq_t* oldest_seq = NULL; ci_tcp_prev_seq_t* prev_seq; - + int depth; /* If the clock ISN is safe, no need to remember the sequence number. */ @@ -741,7 +737,7 @@ __ci_tcp_prev_seq_remember(ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) ci_assert_lt(hash, ni->state->seq_table_entries_n); ci_assert_impl(CI_TCP_PREV_SEQ_IS_TERMINAL(*prev_seq), - CI_TCP_PREV_SEQ_IS_FREE(*prev_seq)); + CI_TCP_PREV_SEQ_IS_FREE(*prev_seq)); ++prev_seq->route_count; ni->state->stats.tcp_seq_table_steps++; @@ -749,15 +745,13 @@ __ci_tcp_prev_seq_remember(ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) /* Free entry. Use it. */ ci_tcp_prev_seq_remember_at(ni, ts_prev_seq, prev_seq); break; - } - else if( ci_ip_time_before(prev_seq->expiry, ci_ip_time_now(ni)) ) { + } else if( ci_ip_time_before(prev_seq->expiry, ci_ip_time_now(ni)) ) { /* Expired entry. Free it and reuse it. */ ci_tcp_prev_seq_free(ni, prev_seq); ci_tcp_prev_seq_remember_at(ni, ts_prev_seq, prev_seq); ni->state->stats.tcp_seq_table_expiries++; break; - } - else if( depth == 0 || ci_tcp_prev_seq_older(prev_seq, oldest_seq) ) { + } else if( depth == 0 || ci_tcp_prev_seq_older(prev_seq, oldest_seq) ) { /* Entry is live and in use, and the oldest that we've seen so far. * Remember it so that we can purge the oldest if we don't find any free * or expired entries. */ @@ -787,8 +781,8 @@ __ci_tcp_prev_seq_remember(ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) } -static ci_tcp_prev_seq_t* -__ci_tcp_prev_seq_lookup(ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) +static ci_tcp_prev_seq_t* __ci_tcp_prev_seq_lookup( + ci_netif* ni, const ci_tcp_prev_seq_t* ts_prev_seq) { unsigned hash = ci_tcp_prev_seq_hash1(ni, ts_prev_seq); unsigned hash2 = 0; @@ -853,36 +847,34 @@ void ci_tcp_prev_seq_remember(ci_netif* ni, ci_tcp_state* ts) if( __ci_tcp_prev_seq_remember(ni, &ts_prev_seq) ) ts->tcpflags |= CI_TCPT_FLAG_SEQNO_REMEMBERED; - } -#if !defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE +#if ! defined(__KERNEL__) || CI_CFG_ENDPOINT_MOVE /* Linux clears implicit address on connect failure */ -ci_inline void ci_tcp_connect_drop_implicit_address(ci_tcp_state *ts) +ci_inline void ci_tcp_connect_drop_implicit_address(ci_tcp_state* ts) { - if( ! (ts->s.s_flags & CI_SOCK_FLAG_BOUND) ) { + if( ! (ts->s.s_flags & CI_SOCK_FLAG_BOUND) ) { #if CI_CFG_IPV6 - if( ts->s.domain == AF_INET6 ) - ts->s.cp.laddr = ts->s.laddr = addr_any; - else + if( ts->s.domain == AF_INET6 ) + ts->s.cp.laddr = ts->s.laddr = addr_any; + else #endif - ts->s.cp.laddr = ts->s.laddr = ip4_addr_any; - } + ts->s.cp.laddr = ts->s.laddr = ip4_addr_any; + } } /* Return codes from ci_tcp_connect_ul_start(). */ -#define CI_CONNECT_UL_OK 0 -#define CI_CONNECT_UL_FAIL -1 -#define CI_CONNECT_UL_START_AGAIN -2 -#define CI_CONNECT_UL_LOCK_DROPPED -3 -#define CI_CONNECT_UL_ALIEN_BOUND -4 +#define CI_CONNECT_UL_OK 0 +#define CI_CONNECT_UL_FAIL -1 +#define CI_CONNECT_UL_START_AGAIN -2 +#define CI_CONNECT_UL_LOCK_DROPPED -3 +#define CI_CONNECT_UL_ALIEN_BOUND -4 /* The fd parameter is ignored when this is called in the kernel */ -static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, - ci_addr_t dst, unsigned dport_be16, - int* fail_rc) +static int ci_tcp_connect_ul_start(ci_netif* ni, ci_tcp_state* ts, ci_fd_t fd, + ci_addr_t dst, unsigned dport_be16, int* fail_rc) { ci_ip_pkt_fmt* pkt; int rc = 0; @@ -894,7 +886,7 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, ci_assert(ts->s.pkt.mtu); /* Recover from previous connection via the same socket: */ - ts->tcpflags &=~ CI_TCPT_FLAG_FIN_RECEIVED; + ts->tcpflags &= ~CI_TCPT_FLAG_FIN_RECEIVED; /* send_prequeue may be set to OO_PP_ID_INVALID by a previous connection * attempt. However there is no need to reinit send_prequeue_in and * other counters, because no real send was possible. */ @@ -923,16 +915,16 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, */ ts->ka_probes = 0; - /* + /* * 3. State and address are OK. It's address routed through our NIC. * Do connect(). */ - ci_assert(!CI_IPX_ADDR_IS_ANY(ipcache_laddr(&ts->s.pkt))); + ci_assert(! CI_IPX_ADDR_IS_ANY(ipcache_laddr(&ts->s.pkt))); /* socket can only could have gotten scalative on prior * implicit bind */ ci_assert_impl(ts->s.s_flags & CI_SOCK_FLAG_SCALACTIVE, - ~ts->s.s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND); + ~ts->s.s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND); if( ts->s.s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND ) { ci_uint16 source_be16 = 0; @@ -941,26 +933,24 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, saddr = sock_ipx_laddr(s); #ifndef __KERNEL__ - /* In the normal case, we only install filters for IP addresses configured on - * acceleratable interfaces, and so if the socket is bound to an alien - * address, we can't accelerate it. Using a MAC filter overcomes this - * limitation, however. */ - if( ! (ts->s.s_flags & CI_SOCK_FLAG_BOUND) ) - ci_tcp_bind_check_laddr(ni, &ts->s, saddr); - if( ~ni->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS && - (ts->s.s_flags & CI_SOCK_FLAG_BOUND_ALIEN) && - ! (ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE || - ts->s.s_flags & CI_SOCK_FLAG_SCALACTIVE) ) { - return CI_CONNECT_UL_ALIEN_BOUND; - } + /* In the normal case, we only install filters for IP addresses configured + * on acceleratable interfaces, and so if the socket is bound to an alien + * address, we can't accelerate it. Using a MAC filter overcomes this + * limitation, however. */ + if( ! (ts->s.s_flags & CI_SOCK_FLAG_BOUND) ) + ci_tcp_bind_check_laddr(ni, &ts->s, saddr); + if( ~ni->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS && + (ts->s.s_flags & CI_SOCK_FLAG_BOUND_ALIEN) && + ! (ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE || + ts->s.s_flags & CI_SOCK_FLAG_SCALACTIVE) ) { + return CI_CONNECT_UL_ALIEN_BOUND; + } #endif -#if !defined(__KERNEL__) && CI_CFG_TCP_SHARED_LOCAL_PORTS +#if ! defined(__KERNEL__) && CI_CFG_TCP_SHARED_LOCAL_PORTS if( ! (ts->s.s_flags & CI_SOCK_FLAG_FILTER) ) active_wild = ci_netif_active_wild_get(ni, sock_ipx_laddr(&ts->s), - sock_ipx_raddr(&ts->s), - dport_be16, &source_be16, - &prev_seq); + sock_ipx_raddr(&ts->s), dport_be16, &source_be16, &prev_seq); #endif /* Defer active_wild related state update to after potential lock drops @@ -972,29 +962,29 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, CI_SET_ERROR(rc, EADDRNOTAVAIL); else #endif - rc = __ci_tcp_bind(ni, &ts->s, fd, - s->cp.sock_cp_flags & OO_SCP_BOUND_ADDR ? saddr : addr_any, - &source_be16, 0); + rc = __ci_tcp_bind(ni, &ts->s, fd, + s->cp.sock_cp_flags & OO_SCP_BOUND_ADDR ? saddr : addr_any, + &source_be16, 0); - if(CI_UNLIKELY( rc != 0 )) { - LOG_U(ci_log("__ci_tcp_bind returned %d at %s:%d", rc, - __FILE__, __LINE__)); + if( CI_UNLIKELY(rc != 0) ) { + LOG_U(ci_log( + "__ci_tcp_bind returned %d at %s:%d", rc, __FILE__, __LINE__)); *fail_rc = rc; return CI_CONNECT_UL_FAIL; } - if(CI_UNLIKELY( CI_IPX_ADDR_IS_ANY(saddr) )) { + if( CI_UNLIKELY(CI_IPX_ADDR_IS_ANY(saddr)) ) { /* FIXME is this an impossible branch? */ CI_SET_ERROR(*fail_rc, EINVAL); return CI_CONNECT_UL_FAIL; } } - /* Commit source port now. In case of failure down the lane, an implicit port - * might be overwritten by following attempt */ + /* Commit source port now. In case of failure down the lane, an implicit + * port might be overwritten by following attempt */ TS_IPX_TCP(ts)->tcp_source_be16 = source_be16; ts->s.cp.lport_be16 = source_be16; LOG_TC(log(LNT_FMT "connect: our bind returned " IPX_PORT_FMT, - LNT_PRI_ARGS(ni, ts), IPX_ARG(AF_IP(saddr)), - (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16))); + LNT_PRI_ARGS(ni, ts), IPX_ARG(AF_IP(saddr)), + (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16))); } /* Commit peer now - these are OK to be overwritten by following attempt */ @@ -1005,13 +995,15 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, if( CI_UNLIKELY(! pkt) ) { /* Should we block or return error? */ if( NI_OPTS(ni).tcp_nonblock_no_pkts_mode && - (ts->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY)) ) { + (ts->s.b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY)) ) { CI_SET_ERROR(*fail_rc, ENOBUFS); rc = CI_CONNECT_UL_FAIL; goto fail; } /* NB. We've already done a poll above. */ - rc = ci_netif_pkt_wait(ni, &ts->s, CI_SLEEP_NETIF_LOCKED|CI_SLEEP_NETIF_RQ); + rc = ci_netif_pkt_wait( + ni, &ts->s, CI_SLEEP_NETIF_LOCKED | CI_SLEEP_NETIF_RQ); if( ci_netif_pkt_wait_was_interrupted(rc) ) { CI_SET_ERROR(*fail_rc, -rc); rc = CI_CONNECT_UL_LOCK_DROPPED; @@ -1028,28 +1020,28 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, if( active_wild != OO_SP_NULL && (ts->s.s_flags & CI_SOCK_FLAG_TPROXY) == 0 ) { - /* Need to set the flag now for consumption by ci_tcp_ep_set_filters */ - ts->s.s_flags |= CI_SOCK_FLAG_SCALACTIVE; - added_scalable = 1; + /* Need to set the flag now for consumption by ci_tcp_ep_set_filters */ + ts->s.s_flags |= CI_SOCK_FLAG_SCALACTIVE; + added_scalable = 1; } - rc = ci_tcp_ep_set_filters(ni, S_SP(ts), ts->s.cp.so_bindtodevice, - active_wild); + rc = ci_tcp_ep_set_filters( + ni, S_SP(ts), ts->s.cp.so_bindtodevice, active_wild); if( rc < 0 ) { /* Perhaps we've run out of filters? See if we can push a socket out * of timewait and steal its filter. */ ci_assert_nequal(rc, -EFILTERSSOME); if( rc != -EBUSY || ! ci_netif_timewait_try_to_free_filter(ni) || - (rc = ci_tcp_ep_set_filters(ni, S_SP(ts), - ts->s.cp.so_bindtodevice, - active_wild)) < 0 ) { + (rc = ci_tcp_ep_set_filters( + ni, S_SP(ts), ts->s.cp.so_bindtodevice, active_wild)) < 0 ) { ci_assert_nequal(rc, -EFILTERSSOME); /* Either a different error, or our efforts to free a filter did not * work. */ if( added_scalable ) - ts->s.s_flags &= ~CI_SOCK_FLAG_SCALACTIVE; /* rollback scalactive flag */ + ts->s.s_flags &= + ~CI_SOCK_FLAG_SCALACTIVE; /* rollback scalactive flag */ ci_netif_pkt_release(ni, pkt); CI_SET_ERROR(*fail_rc, -rc); rc = CI_CONNECT_UL_FAIL; @@ -1062,16 +1054,15 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, /* Commit active_wild related flags */ if( active_wild != OO_SP_NULL ) { ts->tcpflags |= CI_TCPT_FLAG_ACTIVE_WILD; - ts->s.s_flags &= ~(CI_SOCK_FLAG_DEFERRED_BIND | - CI_SOCK_FLAG_CONNECT_MUST_BIND); + ts->s.s_flags &= + ~(CI_SOCK_FLAG_DEFERRED_BIND | CI_SOCK_FLAG_CONNECT_MUST_BIND); } LOG_TC(log(LNT_FMT "CONNECT " IPX_PORT_FMT "->" IPX_PORT_FMT, - LNT_PRI_ARGS(ni, ts), - IPX_ARG(AF_IP(ipcache_laddr(&ts->s.pkt))), - (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16), - IPX_ARG(AF_IP(ipcache_raddr(&ts->s.pkt))), - (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_dest_be16))); + LNT_PRI_ARGS(ni, ts), IPX_ARG(AF_IP(ipcache_laddr(&ts->s.pkt))), + (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16), + IPX_ARG(AF_IP(ipcache_raddr(&ts->s.pkt))), + (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_dest_be16))); /* We are going to send the SYN - set states appropriately */ @@ -1082,8 +1073,7 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, if( NI_OPTS(ni).tcp_isn_mode == 1 ) { if( prev_seq == 0 ) { prev_seq = ci_tcp_prev_seq_lookup(ni, ts); - } - else { + } else { #ifndef NDEBUG /* If we got a sequence number from TIME_WAIT-reuse, the table should not * have an entry for this four-tuple, as any such entry would now @@ -1101,49 +1091,44 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, */ tcp_snd_nxt(ts) = prev_seq; else - tcp_snd_nxt(ts) = ci_tcp_initial_seqno(ni, - tcp_ipx_laddr(ts), - TS_IPX_TCP(ts)->tcp_source_be16, - tcp_ipx_laddr(ts), - TS_IPX_TCP(ts)->tcp_dest_be16); + tcp_snd_nxt(ts) = ci_tcp_initial_seqno(ni, tcp_ipx_laddr(ts), + TS_IPX_TCP(ts)->tcp_source_be16, tcp_ipx_laddr(ts), + TS_IPX_TCP(ts)->tcp_dest_be16); tcp_snd_una(ts) = tcp_enq_nxt(ts) = tcp_snd_up(ts) = tcp_snd_nxt(ts); ts->snd_max = tcp_snd_nxt(ts) + 1; /* Must be after initialising snd_una. */ ci_tcp_clear_rtt_timing(ts); ci_tcp_set_flags(ts, CI_TCP_FLAG_SYN); - ts->tcpflags &=~ CI_TCPT_FLAG_OPT_MASK; + ts->tcpflags &= ~CI_TCPT_FLAG_OPT_MASK; ts->tcpflags |= NI_OPTS(ni).syn_opts; if( (ts->tcpflags & CI_TCPT_FLAG_WSCL) ) { if( NI_OPTS(ni).tcp_rcvbuf_mode == 1 ) - ts->rcv_wscl = - ci_tcp_wscl_by_buff(ni, ci_tcp_max_rcvbuf(ni, ts->amss)); + ts->rcv_wscl = ci_tcp_wscl_by_buff(ni, ci_tcp_max_rcvbuf(ni, ts->amss)); else ts->rcv_wscl = - ci_tcp_wscl_by_buff(ni, ci_tcp_rcvbuf_established(ni, &ts->s)); + ci_tcp_wscl_by_buff(ni, ci_tcp_rcvbuf_established(ni, &ts->s)); CI_IP_SOCK_STATS_VAL_RXWSCL(ts, ts->rcv_wscl); - } - else { + } else { ts->rcv_wscl = 0; CI_IP_SOCK_STATS_VAL_RXWSCL(ts, 0); } ci_tcp_set_rcvbuf(ni, ts); - TS_IPX_TCP(ts)->tcp_window_be16 = ci_tcp_calc_rcv_wnd_syn(ts->s.so.rcvbuf, - ts->amss, - ts->rcv_wscl); - tcp_rcv_wnd_right_edge_sent(ts) = tcp_rcv_nxt(ts) + - TS_IPX_TCP(ts)->tcp_window_be16; + TS_IPX_TCP(ts)->tcp_window_be16 = + ci_tcp_calc_rcv_wnd_syn(ts->s.so.rcvbuf, ts->amss, ts->rcv_wscl); + tcp_rcv_wnd_right_edge_sent(ts) = + tcp_rcv_nxt(ts) + TS_IPX_TCP(ts)->tcp_window_be16; ts->rcv_wnd_advertised = TS_IPX_TCP(ts)->tcp_window_be16; TS_IPX_TCP(ts)->tcp_window_be16 = CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_window_be16); /* outgoing_hdrs_len is initialised to include timestamp option. */ if( ! (ts->tcpflags & CI_TCPT_FLAG_TSO) ) - ts->outgoing_hdrs_len = CI_IPX_HDR_SIZE(ipcache_af(&ts->s.pkt)) + - sizeof(ci_tcp_hdr); + ts->outgoing_hdrs_len = + CI_IPX_HDR_SIZE(ipcache_af(&ts->s.pkt)) + sizeof(ci_tcp_hdr); if( ci_tcp_can_stripe(ni, ts->s.pkt.ipx.ip4.ip_saddr_be32, - ts->s.pkt.ipx.ip4.ip_daddr_be32) ) + ts->s.pkt.ipx.ip4.ip_daddr_be32) ) ts->tcpflags |= CI_TCPT_FLAG_STRIPE; ci_tcp_set_slow_state(ni, ts, CI_TCP_SYN_SENT); @@ -1156,21 +1141,21 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, ** ** Clearing tx_errno and rx_errno acheive this. The transmit window ** is set to 1 byte which ensures that only the SYN packet gets - ** sent until the ACK is received with more window. + ** sent until the ACK is received with more window. */ ci_assert(ts->snd_max == tcp_snd_nxt(ts) + 1); ts->s.rx_errno = 0; - ts->s.tx_errno = 0; + ts->s.tx_errno = 0; /* If ARP resolution fails, we have to drop the connection, so we store * the socket id in the SYN packet. */ pkt->pf.tcp_tx.sock_id = ts->s.b.bufid; ci_tcp_enqueue_no_data(ts, ni, pkt); - ci_tcp_set_flags(ts, CI_TCP_FLAG_ACK); + ci_tcp_set_flags(ts, CI_TCP_FLAG_ACK); if( ts->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) { ts->tcpflags |= CI_TCPT_FLAG_NONBLOCK_CONNECT; - LOG_TC(log( LNT_FMT "Non-blocking connect - return EINPROGRESS", - LNT_PRI_ARGS(ni, ts))); + LOG_TC(log(LNT_FMT "Non-blocking connect - return EINPROGRESS", + LNT_PRI_ARGS(ni, ts))); CI_SET_ERROR(*fail_rc, EINPROGRESS); /* We don't jump to the "fail" label here, as this is a failure only from * the point of view of the connect() API, and we don't want to tear down @@ -1180,12 +1165,12 @@ static int ci_tcp_connect_ul_start(ci_netif *ni, ci_tcp_state* ts, ci_fd_t fd, return CI_CONNECT_UL_OK; - fail: +fail: ci_tcp_connect_drop_implicit_address(ts); return rc; } -ci_inline int ci_tcp_connect_handle_so_error(ci_sock_cmn *s) +ci_inline int ci_tcp_connect_handle_so_error(ci_sock_cmn* s) { ci_int32 rc = ci_get_so_error(s); if( rc == 0 ) @@ -1194,7 +1179,7 @@ ci_inline int ci_tcp_connect_handle_so_error(ci_sock_cmn *s) return rc; } -static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) +static int ci_tcp_connect_ul_syn_sent(ci_netif* ni, ci_tcp_state* ts) { int rc = 0; @@ -1219,8 +1204,8 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) int stack_locked = 1; if( ts->s.so.sndtimeo_msec ) { - ci_uint64 max_so_spin = (ci_uint64)ts->s.so.sndtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) ts->s.so.sndtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= max_spin ) max_spin = max_so_spin; } @@ -1237,8 +1222,7 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) ci_netif_unlock(ni); stack_locked = 0; } - } - else if( ! ni->state->is_spinner ) + } else if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; } if( ts->s.b.state != CI_TCP_SYN_SENT ) { @@ -1256,8 +1240,8 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) } ci_frc64(&now_frc); - rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, &schedule_frc, - ts->s.so.sndtimeo_msec, NULL, si); + rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS( + ni, now_frc, &schedule_frc, ts->s.so.sndtimeo_msec, NULL, si); if( rc != 0 ) { ni->state->is_spinner = 0; if( ! stack_locked ) @@ -1286,28 +1270,24 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) } #endif - CI_TCP_SLEEP_WHILE(ni, ts, CI_SB_FLAG_WAKE_RX, - timeout, - ts->s.b.state == CI_TCP_SYN_SENT, &rc); + CI_TCP_SLEEP_WHILE(ni, ts, CI_SB_FLAG_WAKE_RX, timeout, + ts->s.b.state == CI_TCP_SYN_SENT, &rc); } #ifndef __KERNEL__ - out: +out: #endif if( rc == -EAGAIN ) { - LOG_TC(log( LNT_FMT "timeout on sleep: %d", - LNT_PRI_ARGS(ni, ts), -rc)); + LOG_TC(log(LNT_FMT "timeout on sleep: %d", LNT_PRI_ARGS(ni, ts), -rc)); if( ! (ts->tcpflags & CI_TCPT_FLAG_NONBLOCK_CONNECT) ) { ts->tcpflags |= CI_TCPT_FLAG_NONBLOCK_CONNECT; CI_SET_ERROR(rc, EINPROGRESS); - } - else + } else CI_SET_ERROR(rc, EALREADY); return rc; - } - else if( rc == -EINTR ) { - LOG_TC(log(LNT_FMT "connect() was interrupted by a signal", - LNT_PRI_ARGS(ni, ts))); + } else if( rc == -EINTR ) { + LOG_TC(log(LNT_FMT "connect() was interrupted by a signal", + LNT_PRI_ARGS(ni, ts))); ts->tcpflags |= CI_TCPT_FLAG_NONBLOCK_CONNECT; CI_SET_ERROR(rc, EINTR); return rc; @@ -1316,14 +1296,13 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) /*! \TODO propagate the correct error code: CONNREFUSED, NOROUTE, etc. */ if( ts->s.b.state == CI_TCP_CLOSED ) { - /* Bug 3558: + /* Bug 3558: * Set OS socket state to allow/disallow next bind(). * It is Linux hack. */ if( ts->s.b.sb_aflags & CI_SB_AFLAG_OS_BACKED ) { #ifdef __ci_driver__ CI_TRY(efab_tcp_helper_set_tcp_close_os_sock( - netif2tcp_helper_resource(ni), - S_SP(ts))); + netif2tcp_helper_resource(ni), S_SP(ts))); #else CI_TRY(ci_tcp_helper_set_tcp_close_os_sock(ni, S_SP(ts))); #endif @@ -1338,8 +1317,8 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) /* - if SO_ERROR is set, handle it and return this value; * - else if rx_errno is set, return it; * - else (TCP_RX_ERRNO==0, socket is CI_SHUT_RD) return ECONNABORTED */ - if( (rc = ci_tcp_connect_handle_so_error(&ts->s)) == 0) - rc = TCP_RX_ERRNO(ts) ? TCP_RX_ERRNO(ts) : ECONNABORTED; + if( (rc = ci_tcp_connect_handle_so_error(&ts->s)) == 0 ) + rc = TCP_RX_ERRNO(ts) ? TCP_RX_ERRNO(ts) : ECONNABORTED; CI_SET_ERROR(rc, rc); ci_tcp_connect_drop_implicit_address(ts); @@ -1351,8 +1330,7 @@ static int ci_tcp_connect_ul_syn_sent(ci_netif *ni, ci_tcp_state *ts) #ifndef __KERNEL__ -static int -complete_deferred_bind(ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd) +static int complete_deferred_bind(ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd) { ci_uint16 source_be16 = 0; int rc; @@ -1360,29 +1338,27 @@ complete_deferred_bind(ci_netif* netif, ci_sock_cmn* s, ci_fd_t fd) ci_assert_flags(s->s_flags, CI_SOCK_FLAG_DEFERRED_BIND); rc = __ci_tcp_bind(netif, s, fd, - s->cp.sock_cp_flags & OO_SCP_BOUND_ADDR ? s->laddr : addr_any, - &source_be16, 0); + s->cp.sock_cp_flags & OO_SCP_BOUND_ADDR ? s->laddr : addr_any, + &source_be16, 0); - if(CI_LIKELY( rc == 0 )) { - s->s_flags &= ~(CI_SOCK_FLAG_DEFERRED_BIND | - CI_SOCK_FLAG_CONNECT_MUST_BIND); + if( CI_LIKELY(rc == 0) ) { + s->s_flags &= + ~(CI_SOCK_FLAG_DEFERRED_BIND | CI_SOCK_FLAG_CONNECT_MUST_BIND); sock_lport_be16(s) = source_be16; s->cp.lport_be16 = source_be16; LOG_TC(log(NSS_FMT "Deferred bind returned " IPX_FMT " :%u", - NSS_PRI_ARGS(netif, s), - IPX_ARG(AF_IP(addr_any)), ntohs(sock_lport_be16(s)))); - } - else { + NSS_PRI_ARGS(netif, s), IPX_ARG(AF_IP(addr_any)), + ntohs(sock_lport_be16(s)))); + } else { LOG_U(ci_log("__ci_tcp_bind returned %d at %s:%d", CI_GET_ERROR(rc), - __FILE__, __LINE__)); + __FILE__, __LINE__)); } return rc; } -static int -ci_tcp_retrieve_addr(ci_netif* netif, const struct sockaddr* serv_addr, - ci_addr_t* dst_addr, ci_uint16* dst_port) +static int ci_tcp_retrieve_addr(ci_netif* netif, + const struct sockaddr* serv_addr, ci_addr_t* dst_addr, ci_uint16* dst_port) { /* Address family is validated to be AF_INET or AF_INET6 earlier. */ const struct sockaddr_in* inaddr = (struct sockaddr_in*) serv_addr; @@ -1402,7 +1378,7 @@ ci_tcp_retrieve_addr(ci_netif* netif, const struct sockaddr* serv_addr, /* Returns: * 0 on success - * + * * CI_SOCKET_ERROR (and errno set) * this is a normal error that is returned to the * the application @@ -1411,7 +1387,7 @@ ci_tcp_retrieve_addr(ci_netif* netif, const struct sockaddr* serv_addr, * to set errno since it isn't a real error */ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, - socklen_t addrlen, ci_fd_t fd, int *p_moved) + socklen_t addrlen, ci_fd_t fd, int* p_moved) { ci_sock_cmn* s = ep->s; ci_tcp_state* ts = &SOCK_TO_WAITABLE_OBJ(s)->tcp; @@ -1432,9 +1408,9 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, * 1. Check if state of the socket is OK for connect operation. */ - start_again: +start_again: - if( (rc = ci_tcp_connect_handle_so_error(s)) != 0) { + if( (rc = ci_tcp_connect_handle_so_error(s)) != 0 ) { CI_SET_ERROR(rc, rc); goto unlock_out; } @@ -1445,36 +1421,35 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, if( s->b.state & CI_TCP_STATE_SYNCHRONISED ) { if( ts->tcpflags & CI_TCPT_FLAG_NONBLOCK_CONNECT ) { ts->tcpflags &= ~CI_TCPT_FLAG_NONBLOCK_CONNECT; - rc = 0; - goto unlock_out; + rc = 0; + goto unlock_out; } if( serv_addr->sa_family == AF_UNSPEC ) - LOG_E(ci_log("Onload does not support TCP disconnect via " + LOG_E( + ci_log("Onload does not support TCP disconnect via " - "connect(addr->sa_family==AF_UNSPEC)")); + "connect(addr->sa_family==AF_UNSPEC)")); CI_SET_ERROR(rc, EISCONN); - } - else if( s->b.state == CI_TCP_LISTEN ) { + } else if( s->b.state == CI_TCP_LISTEN ) { #if CI_CFG_POSIX_CONNECT_AFTER_LISTEN CI_SET_ERROR(rc, EOPNOTSUPP); #else if( ci_tcp_validate_sa(s->domain, serv_addr, addrlen) ) { /* Request should be forwarded to OS */ rc = CI_SOCKET_HANDOVER; - goto unlock_out; + goto unlock_out; } if( serv_addr->sa_family == AF_UNSPEC ) { /* Linux does listen shutdown on disconnect (AF_UNSPEC) */ ci_netif_unlock(ep->netif); rc = ci_tcp_shutdown(ep, SHUT_RD, fd); - goto out; + goto out; } else { /* Linux has curious error reporting in this case */ CI_SET_ERROR(rc, EISCONN); } #endif - } - else { + } else { /* Socket is in SYN-SENT state. Let's block for receiving SYN-ACK */ ci_assert_equal(s->b.state, CI_TCP_SYN_SENT); if( s->b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) @@ -1491,24 +1466,23 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, goto unlock_out; } - /* + /* * 2. Check address parameter, if it's inappropriate for handover * decision or handover should be done, try to to call OS and * do handover on success. */ - if ( - /* Af first, check that address family and length is OK. */ - ci_tcp_validate_sa(s->domain, serv_addr, addrlen) - /* Check for NAT. */ - || (dnat = ci_tcp_retrieve_addr(ep->netif, serv_addr, &dst_addr, - &dst_port)) < 0 - /* rfc793 p54 if the foreign socket is unspecified return */ - /* "error: foreign socket unspecified" (EINVAL), but keep it to OS */ - || CI_IPX_ADDR_IS_ANY(dst_addr) - /* Zero destination port is tricky as well, keep it to OS */ - || dst_port == 0 ) - { + if( + /* Af first, check that address family and length is OK. */ + ci_tcp_validate_sa(s->domain, serv_addr, addrlen) + /* Check for NAT. */ + || (dnat = ci_tcp_retrieve_addr( + ep->netif, serv_addr, &dst_addr, &dst_port)) < 0 + /* rfc793 p54 if the foreign socket is unspecified return */ + /* "error: foreign socket unspecified" (EINVAL), but keep it to OS */ + || CI_IPX_ADDR_IS_ANY(dst_addr) + /* Zero destination port is tricky as well, keep it to OS */ + || dst_port == 0 ) { rc = CI_SOCKET_HANDOVER; goto unlock_out; } @@ -1523,7 +1497,8 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, /* is this a socket that we can handle? */ rc = ci_tcp_connect_check_dest(ep, dst_addr, dst_port); - if( rc ) goto unlock_out; + if( rc ) + goto unlock_out; #if CI_CFG_ENDPOINT_MOVE if( (ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE) && @@ -1534,12 +1509,12 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, op.dst_addr = dst_addr; /* this operation unlocks netif */ rc = oo_resource_op(fd, OO_IOC_TCP_LOOPBACK_CONNECT, &op); - if( rc < 0) + if( rc < 0 ) return CI_SOCKET_HANDOVER; if( op.out_moved ) *p_moved = 1; if( op.out_rc == -EINPROGRESS ) - RET_WITH_ERRNO( EINPROGRESS ); + RET_WITH_ERRNO(EINPROGRESS); else if( op.out_rc == -EAGAIN ) RET_WITH_ERRNO(EAGAIN); else if( op.out_rc != 0 ) @@ -1554,33 +1529,32 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, ts->pre_nat.dport_be16 = ((struct sockaddr_in*) serv_addr)->sin_port; } - crc = ci_tcp_connect_ul_start(ep->netif, ts, fd, dst_addr, dst_port, - &rc); + crc = ci_tcp_connect_ul_start(ep->netif, ts, fd, dst_addr, dst_port, &rc); if( crc != CI_CONNECT_UL_OK ) { switch( crc ) { - case CI_CONNECT_UL_ALIEN_BOUND: - rc = CI_SOCKET_HANDOVER; - ci_fallthrough; - case CI_CONNECT_UL_FAIL: - /* Check non-blocking */ - if( errno == EINPROGRESS ) { - CI_TCP_STATS_INC_ACTIVE_OPENS( ep->netif ); - } - goto unlock_out; - case CI_CONNECT_UL_LOCK_DROPPED: - goto out; - case CI_CONNECT_UL_START_AGAIN: - goto start_again; + case CI_CONNECT_UL_ALIEN_BOUND: + rc = CI_SOCKET_HANDOVER; + ci_fallthrough; + case CI_CONNECT_UL_FAIL: + /* Check non-blocking */ + if( errno == EINPROGRESS ) { + CI_TCP_STATS_INC_ACTIVE_OPENS(ep->netif); + } + goto unlock_out; + case CI_CONNECT_UL_LOCK_DROPPED: + goto out; + case CI_CONNECT_UL_START_AGAIN: + goto start_again; } } - CI_TCP_STATS_INC_ACTIVE_OPENS( ep->netif ); + CI_TCP_STATS_INC_ACTIVE_OPENS(ep->netif); - syn_sent: +syn_sent: rc = ci_tcp_connect_ul_syn_sent(ep->netif, ts); - unlock_out: +unlock_out: ci_netif_unlock(ep->netif); - out: +out: if( rc == CI_SOCKET_HANDOVER && (s->s_flags & CI_SOCK_FLAG_DEFERRED_BIND) ) { int rc1 = complete_deferred_bind(ep->netif, &ts->s, fd); if( rc1 < 0 ) @@ -1590,7 +1564,7 @@ int ci_tcp_connect(citp_socket* ep, const struct sockaddr* serv_addr, } #endif -int ci_tcp_listen_init(ci_netif *ni, ci_tcp_socket_listen *tls) +int ci_tcp_listen_init(ci_netif* ni, ci_tcp_socket_listen* tls) { int i; oo_p sp; @@ -1622,8 +1596,7 @@ int ci_tcp_listen_init(ci_netif *ni, ci_tcp_socket_listen *tls) /* Initialize the cache and pending lists for the EP-cache. * See comment at definition for details */ - LOG_EP (log ("Initialise cache and pending list for id %d", - S_FMT(tls))); + LOG_EP(log("Initialise cache and pending list for id %d", S_FMT(tls))); #if CI_CFG_FD_CACHING oo_p_dllink_init(ni, oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.cache)); @@ -1631,8 +1604,8 @@ int ci_tcp_listen_init(ci_netif *ni, ci_tcp_socket_listen *tls) oo_p_dllink_init(ni, oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache_connected)); oo_p_dllink_init(ni, oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.fd_states)); - tls->epcache.avail_stack = oo_ptr_to_statep - (ni, &ni->state->passive_cache_avail_stack); + tls->epcache.avail_stack = + oo_ptr_to_statep(ni, &ni->state->passive_cache_avail_stack); tls->cache_avail_sock = ni->state->opts.per_sock_cache_max; #endif @@ -1642,8 +1615,8 @@ int ci_tcp_listen_init(ci_netif *ni, ci_tcp_socket_listen *tls) #ifdef __KERNEL__ -int ci_tcp_connect_lo_samestack(ci_netif *ni, ci_tcp_state *ts, oo_sp tls_id, - int *stack_locked) +int ci_tcp_connect_lo_samestack( + ci_netif* ni, ci_tcp_state* ts, oo_sp tls_id, int* stack_locked) { int crc, rc = 0; @@ -1651,8 +1624,8 @@ int ci_tcp_connect_lo_samestack(ci_netif *ni, ci_tcp_state *ts, oo_sp tls_id, *stack_locked = 1; ts->local_peer = tls_id; - crc = ci_tcp_connect_ul_start(ni, ts, CI_FD_BAD, sock_ipx_raddr(&ts->s), - ts->s.pkt.dport_be16, &rc); + crc = ci_tcp_connect_ul_start( + ni, ts, CI_FD_BAD, sock_ipx_raddr(&ts->s), ts->s.pkt.dport_be16, &rc); /* The connect is really finished, but we should return EINPROGRESS * for non-blocking connect and 0 for normal. */ @@ -1665,13 +1638,13 @@ int ci_tcp_connect_lo_samestack(ci_netif *ni, ci_tcp_state *ts, oo_sp tls_id, /* c_ni is assumed to be locked on enterance and is always unlocked on * exit. */ -int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, - ci_netif *l_ni, oo_sp l_id) +int ci_tcp_connect_lo_toconn( + ci_netif* c_ni, oo_sp c_id, ci_addr_t dst, ci_netif* l_ni, oo_sp l_id) { - ci_tcp_state *ts; + ci_tcp_state* ts; ci_tcp_socket_listen *tls, *alien_tls; - citp_waitable_obj *wo; - citp_waitable *w; + citp_waitable_obj* wo; + citp_waitable* w; int rc; int stack_locked; @@ -1679,12 +1652,11 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, ci_assert(OO_SP_NOT_NULL(c_id)); ci_assert(OO_SP_NOT_NULL(l_id)); - LOG_TC(log("%s: connect %d:%d to %d:%d", __FUNCTION__, - c_ni->state->stack_id, OO_SP_TO_INT(c_id), - l_ni->state->stack_id, OO_SP_TO_INT(l_id))); + LOG_TC(log("%s: connect %d:%d to %d:%d", __FUNCTION__, c_ni->state->stack_id, + OO_SP_TO_INT(c_id), l_ni->state->stack_id, OO_SP_TO_INT(l_id))); alien_tls = SP_TO_TCP_LISTEN(l_ni, l_id); - if( (int)ci_tcp_acceptq_n(alien_tls) >= alien_tls->acceptq_max ) { + if( (int) ci_tcp_acceptq_n(alien_tls) >= alien_tls->acceptq_max ) { ci_netif_unlock(c_ni); return -EBUSY; } @@ -1736,18 +1708,19 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, int rc1 = ci_netif_lock(c_ni); if( rc1 != 0 ) { /* we leak the shadow listener and a synrecv state, but so be it */ - ci_log("%s([%d:%d] to [%d:%d]): leaking the shadow listener " - "[%d:%d] rc=%d", - __func__, c_ni->state->stack_id, OO_SP_TO_INT(c_id), - l_ni->state->stack_id, OO_SP_TO_INT(l_id), - c_ni->state->stack_id, tls->s.b.bufid, rc); + ci_log( + "%s([%d:%d] to [%d:%d]): leaking the shadow listener " + "[%d:%d] rc=%d", + __func__, c_ni->state->stack_id, OO_SP_TO_INT(c_id), + l_ni->state->stack_id, OO_SP_TO_INT(l_id), c_ni->state->stack_id, + tls->s.b.bufid, rc); /* rc is usually -ERESTARTSYS, and it does not help user */ return -ENOBUFS; } } /* Accept as from tls */ - if( !ci_tcp_acceptq_not_empty(tls) ) { + if( ! ci_tcp_acceptq_not_empty(tls) ) { /* it is possible, for example, if ci_tcp_listenq_try_promote() failed * because there are no endpoints */ ci_tcp_listenq_drop_all(c_ni, tls); @@ -1757,12 +1730,10 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, } w = ci_tcp_acceptq_get(c_ni, tls); ci_assert(w); - LOG_TV(ci_log("%s: %d:%d to %d:%d shadow %d:%d accepted %d:%d", - __FUNCTION__, - c_ni->state->stack_id, OO_SP_TO_INT(c_id), - l_ni->state->stack_id, OO_SP_TO_INT(l_id), - c_ni->state->stack_id, tls->s.b.bufid, - c_ni->state->stack_id, w->bufid)); + LOG_TV(ci_log("%s: %d:%d to %d:%d shadow %d:%d accepted %d:%d", __FUNCTION__, + c_ni->state->stack_id, OO_SP_TO_INT(c_id), l_ni->state->stack_id, + OO_SP_TO_INT(l_id), c_ni->state->stack_id, tls->s.b.bufid, + c_ni->state->stack_id, w->bufid)); ci_assert(w->state & CI_TCP_STATE_TCP); ci_assert(w->state != CI_TCP_LISTEN); @@ -1793,8 +1764,7 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, spin_unlock_irqrestore(&l_ep->lock, lock_flags); if( os_sock_ref != NULL ) fput(os_sock_ref); - } - else { + } else { spin_unlock_irqrestore(&l_ep->lock, lock_flags); goto cleanup; } @@ -1807,15 +1777,15 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, if( alien_tls->s.b.state != CI_TCP_LISTEN || (alien_tls->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) || S_IPX_TCP_HDR(&alien_tls->s)->tcp_source_be16 != - TS_IPX_TCP(ts)->tcp_dest_be16 || - (!CI_IPX_ADDR_IS_ANY(alien_tls->s.laddr) && - !CI_IPX_ADDR_EQ(alien_tls->s.laddr, sock_ipx_raddr(&ts->s))) ) { + TS_IPX_TCP(ts)->tcp_dest_be16 || + (! CI_IPX_ADDR_IS_ANY(alien_tls->s.laddr) && + ! CI_IPX_ADDR_EQ(alien_tls->s.laddr, sock_ipx_raddr(&ts->s))) ) { ci_netif_unlock(l_ni); goto cleanup; } - ci_bit_mask_set(&w->sb_aflags, - CI_SB_AFLAG_TCP_IN_ACCEPTQ | CI_SB_AFLAG_ORPHAN); + ci_bit_mask_set( + &w->sb_aflags, CI_SB_AFLAG_TCP_IN_ACCEPTQ | CI_SB_AFLAG_ORPHAN); wo = citp_waitable_obj_alloc(l_ni); if( wo == NULL ) { @@ -1827,8 +1797,8 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, wo->waitable.moved_to_stack_id = c_ni->state->stack_id; wo->waitable.moved_to_sock_id = W_SP(w); LOG_TC(log("%s: put to acceptq %d:%d referencing %d:%d", __func__, - l_ni->state->stack_id, OO_SP_TO_INT(W_SP(&wo->waitable)), - c_ni->state->stack_id, OO_SP_TO_INT(W_SP(w)))); + l_ni->state->stack_id, OO_SP_TO_INT(W_SP(&wo->waitable)), + c_ni->state->stack_id, OO_SP_TO_INT(W_SP(w)))); ci_tcp_acceptq_put(l_ni, alien_tls, &wo->waitable); citp_waitable_wake_not_in_poll(l_ni, &alien_tls->s.b, CI_SB_FLAG_WAKE_RX); @@ -1838,8 +1808,8 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, cleanup: ci_assert(w->sb_aflags & CI_SB_AFLAG_ORPHAN); - ci_bit_mask_clear(&w->sb_aflags, - CI_SB_AFLAG_TCP_IN_ACCEPTQ | CI_SB_AFLAG_ORPHAN); + ci_bit_mask_clear( + &w->sb_aflags, CI_SB_AFLAG_TCP_IN_ACCEPTQ | CI_SB_AFLAG_ORPHAN); efab_tcp_helper_close_endpoint(netif2tcp_helper_resource(c_ni), w->bufid, 0); /* we can not guarantee c_ni lock, so we can' call * ci_tcp_drop(c_ni, ts). So, we return error; UL will handover @@ -1849,7 +1819,6 @@ int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, #endif - #ifndef __KERNEL__ #if CI_CFG_ENDPOINT_MOVE @@ -1860,12 +1829,10 @@ int ci_tcp_reuseport_bind(ci_sock_cmn* sock, ci_fd_t fd) int rc; ci_assert_nequal(sock->s_flags & CI_SOCK_FLAG_REUSEPORT, 0); - if ( (rc = ci_tcp_ep_reuseport_bind(fd, CITP_OPTS.cluster_name, - CITP_OPTS.cluster_size, - CITP_OPTS.cluster_restart_opt, - CITP_OPTS.cluster_hot_restart_opt, - sock_ipx_laddr(sock), - sock_lport_be16(sock))) != 0 ) { + if( (rc = ci_tcp_ep_reuseport_bind(fd, CITP_OPTS.cluster_name, + CITP_OPTS.cluster_size, CITP_OPTS.cluster_restart_opt, + CITP_OPTS.cluster_hot_restart_opt, sock_ipx_laddr(sock), + sock_lport_be16(sock))) != 0 ) { errno = -rc; return -1; } @@ -1874,10 +1841,10 @@ int ci_tcp_reuseport_bind(ci_sock_cmn* sock, ci_fd_t fd) #endif /* In this bind handler we just check that the address to which - * are binding is either "any" or one of ours. + * are binding is either "any" or one of ours. */ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, - socklen_t addrlen, ci_fd_t fd ) + socklen_t addrlen, ci_fd_t fd) { ci_uint16 new_port; ci_addr_t addr; @@ -1891,34 +1858,34 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, /* Check if state of the socket is OK for bind operation. */ /* \todo Earlier (TS_TCP( epi->tcpep.state )->tcp_source_be16) is used. * What is better? */ - if (my_addr == NULL) - RET_WITH_ERRNO( EINVAL ); + if( my_addr == NULL ) + RET_WITH_ERRNO(EINVAL); - if (s->b.state != CI_TCP_CLOSED) - RET_WITH_ERRNO( EINVAL ); + if( s->b.state != CI_TCP_CLOSED ) + RET_WITH_ERRNO(EINVAL); - if (c->tcpflags & CI_TCPT_FLAG_WAS_ESTAB) - RET_WITH_ERRNO( EINVAL ); + if( c->tcpflags & CI_TCPT_FLAG_WAS_ESTAB ) + RET_WITH_ERRNO(EINVAL); /* There should be address length check before address family validation to * match Linux errno value set in inet6_bind(). */ - if (s->domain == PF_INET6 && addrlen < SIN6_LEN_RFC2133) - RET_WITH_ERRNO( EINVAL ); + if( s->domain == PF_INET6 && addrlen < SIN6_LEN_RFC2133 ) + RET_WITH_ERRNO(EINVAL); if( my_addr->sa_family != s->domain ) - RET_WITH_ERRNO( EAFNOSUPPORT ); + RET_WITH_ERRNO(EAFNOSUPPORT); /* sin_port and sin6_port share tha same place in the sockaddr */ - new_port = ((struct sockaddr_in*)my_addr)->sin_port; + new_port = ((struct sockaddr_in*) my_addr)->sin_port; - /* Bug 4884: Windows regularly uses addrlen > sizeof(struct sockaddr_in) + /* Bug 4884: Windows regularly uses addrlen > sizeof(struct sockaddr_in) * Linux is also relaxed about overlength data areas. */ - if (s->domain == PF_INET && addrlen < sizeof(struct sockaddr_in)) - RET_WITH_ERRNO( EINVAL ); + if( s->domain == PF_INET && addrlen < sizeof(struct sockaddr_in) ) + RET_WITH_ERRNO(EINVAL); #if CI_CFG_FAKE_IPV6 #if ! CI_CFG_IPV6 - if( s->domain == PF_INET6 && !ci_tcp_ipv6_is_ipv4(my_addr) ) + if( s->domain == PF_INET6 && ! ci_tcp_ipv6_is_ipv4(my_addr) ) goto handover; #else if( s->domain == PF_INET6 && (s->s_flags & CI_SOCK_FLAG_V6ONLY) && @@ -1927,10 +1894,10 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, #endif #endif - if( ((s->s_flags & CI_SOCK_FLAG_TPROXY) != 0) && - (new_port == 0) ) { - NI_LOG(ep->netif, USAGE_WARNINGS, "Sockets with IP_TRANSPARENT set must " - "be explicitly bound to a port to be accelerated"); + if( ((s->s_flags & CI_SOCK_FLAG_TPROXY) != 0) && (new_port == 0) ) { + NI_LOG(ep->netif, USAGE_WARNINGS, + "Sockets with IP_TRANSPARENT set must " + "be explicitly bound to a port to be accelerated"); goto handover; } @@ -1938,49 +1905,51 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, /* In scalable RSS mode accelerated 127.* sockets cause issues: * * with SO_REUSEPORT they would fail at listen - * * without SO_REUSEPORT they would end up in non-rss stack degrading performance - * with lock contention, epoll3 and accelerated loopback */ + * * without SO_REUSEPORT they would end up in non-rss stack degrading + * performance with lock contention, epoll3 and accelerated loopback */ if( CI_IPX_IS_LOOPBACK(addr) && - NI_OPTS(ep->netif).scalable_filter_enable != CITP_SCALABLE_FILTERS_DISABLE && + NI_OPTS(ep->netif).scalable_filter_enable != + CITP_SCALABLE_FILTERS_DISABLE && ((NI_OPTS(ep->netif).scalable_filter_mode & - (CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS)) == - (CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS)) ) + (CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS)) == + (CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS)) ) goto handover; - if( ((s->s_flags & CI_SOCK_FLAG_TPROXY) != 0) && - CI_IPX_ADDR_IS_ANY(addr) ) { - NI_LOG(ep->netif, USAGE_WARNINGS, "Sockets with IP_TRANSPARENT set must " - "be explicitly bound to an address to be accelerated"); + if( ((s->s_flags & CI_SOCK_FLAG_TPROXY) != 0) && CI_IPX_ADDR_IS_ANY(addr) ) { + NI_LOG(ep->netif, USAGE_WARNINGS, + "Sockets with IP_TRANSPARENT set must " + "be explicitly bound to an address to be accelerated"); goto handover; } /* Using the port number provided, see if we can do this bind */ if( CITP_OPTS.tcp_reuseports != 0 && new_port != 0 ) { - struct ci_port_list *force_reuseport; + struct ci_port_list* force_reuseport; CI_DLLIST_FOR_EACH2(struct ci_port_list, force_reuseport, link, - (ci_dllist*)(ci_uintptr_t)CITP_OPTS.tcp_reuseports) { + (ci_dllist*) (ci_uintptr_t) CITP_OPTS.tcp_reuseports) + { if( force_reuseport->port == new_port ) { int one = 1; if( ep->s->b.sb_aflags & CI_SB_AFLAG_OS_BACKED ) { ci_fd_t os_sock = ci_get_os_sock_fd(fd); ci_assert(CI_IS_VALID_SOCKET(os_sock)); - rc = ci_sys_setsockopt(os_sock, SOL_SOCKET, SO_REUSEPORT, &one, - sizeof(one)); + rc = ci_sys_setsockopt( + os_sock, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)); ci_rel_os_sock_fd(os_sock); /* Fixme: shouldn't we handle errors? */ - } - else if( (s->s_flags & CI_SOCK_FLAG_TPROXY) == 0 ) { + } else if( (s->s_flags & CI_SOCK_FLAG_TPROXY) == 0 ) { rc = ci_tcp_helper_os_sock_create_and_set(ep->netif, fd, s, - SOL_SOCKET, SO_REUSEPORT, - (char*)&one, sizeof(one)); + SOL_SOCKET, SO_REUSEPORT, (char*) &one, sizeof(one)); } if( rc != 0 ) { log("%s: failed to set SO_REUSEPORT on OS socket: " - "rc=%d errno=%d", __func__, rc, errno); + "rc=%d errno=%d", + __func__, rc, errno); } ep->s->s_flags |= CI_SOCK_FLAG_REUSEPORT; - LOG_TC(log("%s "SF_FMT", applied legacy SO_REUSEPORT flag for port %u", - __FUNCTION__, SF_PRI_ARGS(ep, fd), new_port)); + LOG_TC( + log("%s " SF_FMT ", applied legacy SO_REUSEPORT flag for port %u", + __FUNCTION__, SF_PRI_ARGS(ep, fd), new_port)); } } } @@ -1991,9 +1960,8 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, goto handover; #endif - CI_LOGLEVEL_TRY_RET(LOG_TV, - __ci_tcp_bind(ep->netif, ep->s, fd, addr, - &new_port, 1)); + CI_LOGLEVEL_TRY_RET( + LOG_TV, __ci_tcp_bind(ep->netif, ep->s, fd, addr, &new_port, 1)); ci_tcp_bind_check_laddr(ep->netif, ep->s, addr); ep->s->s_flags |= CI_SOCK_FLAG_BOUND; #if CI_CFG_IPV6 @@ -2002,16 +1970,16 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, ci_sock_cmn_set_laddr(ep->s, addr, new_port); ci_sock_set_raddr_port(s, addr_any, 0); - LOG_TC(log(LPF "bind to "IPX_FMT":%u n_p:%u lp:%u", IPX_ARG(AF_IP(addr)), - CI_BSWAP_BE16(((struct sockaddr_in*)my_addr)->sin_port), - CI_BSWAP_BE16(new_port), CI_BSWAP_BE16(sock_lport_be16(s)))); + LOG_TC(log(LPF "bind to " IPX_FMT ":%u n_p:%u lp:%u", IPX_ARG(AF_IP(addr)), + CI_BSWAP_BE16(((struct sockaddr_in*) my_addr)->sin_port), + CI_BSWAP_BE16(new_port), CI_BSWAP_BE16(sock_lport_be16(s)))); return 0; - handover: - if( !(ep->s->b.sb_aflags & CI_SB_AFLAG_OS_BACKED) ) { - rc = ci_tcp_helper_os_sock_create_and_set(ep->netif, fd, s, -1, 0, NULL, - 0); +handover: + if( ! (ep->s->b.sb_aflags & CI_SB_AFLAG_OS_BACKED) ) { + rc = + ci_tcp_helper_os_sock_create_and_set(ep->netif, fd, s, -1, 0, NULL, 0); if( rc < 0 ) RET_WITH_ERRNO(errno); } @@ -2028,7 +1996,7 @@ int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) { - /* + /* ** ?? error handling on possible fails not handled robustly... ** ?? Need to check port number is valid TODO */ @@ -2045,8 +2013,8 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) int scalable; int will_accelerate = 1; - LOG_TC(log("%s "SK_FMT" listen backlog=%d", __FUNCTION__, SK_PRI_ARGS(ep), - backlog)); + LOG_TC(log("%s " SK_FMT " listen backlog=%d", __FUNCTION__, SK_PRI_ARGS(ep), + backlog)); CHECK_TEP(ep); scalable = ci_tcp_use_mac_filter_listen(netif, s, s->cp.so_bindtodevice); @@ -2054,22 +2022,27 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) if( s->s_flags & CI_SOCK_FLAG_DEFERRED_BIND ) complete_deferred_bind(netif, s, fd); - if( NI_OPTS(netif).tcp_listen_handover ) + if( NI_OPTS(netif).tcp_listen_handover ) { return CI_SOCKET_HANDOVER; + } /* We should handover if the socket is bound to alien address. */ if( s->s_flags & CI_SOCK_FLAG_BOUND_ALIEN ) { + ci_log("I am alien"); /* We MUST NOT install filters for a loopback address */ - will_accelerate = (netif->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS || - scalable) && !CI_IPX_IS_LOOPBACK(s->laddr); + will_accelerate = + (netif->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS || scalable) && + ! CI_IPX_IS_LOOPBACK(s->laddr); } if( #if CI_CFG_ENDPOINT_MOVE - !NI_OPTS(netif).tcp_server_loopback && + ! NI_OPTS(netif).tcp_server_loopback && #endif - ! will_accelerate ) + ! will_accelerate ) { + ci_log("I am handing over"); return CI_SOCKET_HANDOVER; + } if( ul_backlog < 0 ) ul_backlog = NI_OPTS(netif).max_ep_bufs; @@ -2081,7 +2054,8 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) ci_netif_lock(ep->netif); tls->acceptq_max = ul_backlog; if( (s->s_flags & CI_SOCK_FLAG_SCALPASSIVE) == 0 || - NI_OPTS(netif).scalable_listen != CITP_SCALABLE_LISTEN_ACCELERATED_ONLY ) + NI_OPTS(netif).scalable_listen != + CITP_SCALABLE_LISTEN_ACCELERATED_ONLY ) ci_tcp_helper_listen_os_sock(fd, ul_backlog); ci_netif_unlock(ep->netif); return 0; @@ -2096,7 +2070,7 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) /* Bug 3376: if socket used for a previous, failed, connect then the error * numbers will not be as expected. Only seen when not using listening - * netifs (as moving the EP to the new netif resets them). + * netifs (as moving the EP to the new netif resets them). */ ts->s.tx_errno = EPIPE; @@ -2108,7 +2082,7 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) if( ts->s.s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND ) { ci_uint16 source_be16; - /* They haven't previously done a bind, so we need to choose + /* They haven't previously done a bind, so we need to choose * a port. As we haven't been given a hint we let the OS choose. * * NB We don't need to call ci_tcp_bind_check_laddr() here, @@ -2117,21 +2091,21 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) source_be16 = 0; rc = __ci_tcp_bind(ep->netif, ep->s, fd, ts->s.laddr, &source_be16, 0); - if (CI_LIKELY( rc==0 )) { + if( CI_LIKELY(rc == 0) ) { TS_IPX_TCP(ts)->tcp_source_be16 = source_be16; ts->s.cp.lport_be16 = source_be16; - LOG_TC(log(LNT_FMT "listen: our bind returned "IPX_FMT":%u", - LNT_PRI_ARGS(ep->netif, ts), IPX_ARG(AF_IP(ts->s.laddr)), - (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16))); + LOG_TC(log(LNT_FMT "listen: our bind returned " IPX_FMT ":%u", + LNT_PRI_ARGS(ep->netif, ts), IPX_ARG(AF_IP(ts->s.laddr)), + (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_source_be16))); } else { LOG_U(ci_log("__ci_tcp_bind returned %d at %s:%d", CI_GET_ERROR(rc), - __FILE__, __LINE__)); + __FILE__, __LINE__)); ci_netif_unlock(ep->netif); ci_sock_unlock(netif, &ts->s.b); return rc; } - } + } ci_tcp_set_slow_state(netif, ts, CI_TCP_LISTEN); tls = SOCK_TO_TCP_LISTEN(&ts->s); @@ -2159,10 +2133,10 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) CITP_STATS_TCP_LISTEN(CI_ZERO(&tls->stats)); - /* install all the filters needed for this connection + /* install all the filters needed for this connection * - tcp_laddr_be32(ts) = 0 for IPADDR_ANY * - * TODO: handle BINDTODEVICE by setting phys_port paramter to correct + * TODO: handle BINDTODEVICE by setting phys_port paramter to correct * physical L5 port index * TODO: handle REUSEADDR by setting last paramter to TRUE */ @@ -2170,8 +2144,8 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) if( scalable ) tls->s.s_flags |= CI_SOCK_FLAG_SCALPASSIVE; - rc = ci_tcp_ep_set_filters(netif, S_SP(tls), tls->s.cp.so_bindtodevice, - OO_SP_NULL); + rc = ci_tcp_ep_set_filters( + netif, S_SP(tls), tls->s.cp.so_bindtodevice, OO_SP_NULL); if( rc == -EFILTERSSOME ) { if( CITP_OPTS.no_fail ) rc = 0; @@ -2182,19 +2156,18 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) } ci_assert_nequal(rc, -EFILTERSSOME); VERB(ci_log("%s: set_filters returned %d", __FUNCTION__, rc)); - if (rc < 0) { + if( rc < 0 ) { if( s->s_flags & CI_SOCK_FLAG_BOUND_ALIEN #if CI_CFG_ENDPOINT_MOVE && NI_OPTS(netif).tcp_server_loopback #endif - ) { + ) { /* That alien address can't be served by filters despite * CI_NETIF_FLAG_USE_ALIEN_LADDRS. We'll accelerate loopback in * any case. */ rc = 0; - } - else { + } else { CI_SET_ERROR(rc, -rc); goto post_listen_fail; } @@ -2203,22 +2176,23 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) ci_assert_equal(rc, 0); - /* + /* * Call of system listen() is required for listen any, local host * communications server and multi-homed server (to accept connections * to L5 assigned address(es), but incoming from other interfaces). * The exception is scalable passive mode where we avoid listen on * OS socket to avoid kernel LHTABLE related performance degradation. */ if( (s->s_flags & CI_SOCK_FLAG_SCALPASSIVE) == 0 || - NI_OPTS(netif).scalable_listen != CITP_SCALABLE_LISTEN_ACCELERATED_ONLY ) { + NI_OPTS(netif).scalable_listen != + CITP_SCALABLE_LISTEN_ACCELERATED_ONLY ) { #ifdef __ci_driver__ - rc = efab_tcp_helper_listen_os_sock( netif2tcp_helper_resource(netif), - S_SP(tls), backlog); + rc = efab_tcp_helper_listen_os_sock( + netif2tcp_helper_resource(netif), S_SP(tls), backlog); #else rc = ci_tcp_helper_listen_os_sock(fd, backlog); #endif } - if ( rc < 0 ) { + if( rc < 0 ) { /* clear the filter we've just set */ ci_tcp_ep_clear_filters(netif, S_SP(tls), 0); goto post_listen_fail; @@ -2226,9 +2200,9 @@ int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) ci_netif_unlock(ep->netif); return 0; - post_listen_fail: +post_listen_fail: ci_tcp_listenq_drop_all(netif, tls); - listen_fail: +listen_fail: /* revert TCP state to a non-listening socket format */ __ci_tcp_listen_to_normal(netif, tls); /* Above function sets orphan flag but we are attached to an FD. */ @@ -2251,7 +2225,7 @@ static int ci_tcp_shutdown_listen(citp_socket* ep, int how, ci_fd_t fd) ci_sock_lock(ep->netif, &tls->s.b); ci_netif_lock(ep->netif); - LOG_TC(ci_log(SK_FMT" shutdown(SHUT_RD)", SK_PRI_ARGS(ep))); + LOG_TC(ci_log(SK_FMT " shutdown(SHUT_RD)", SK_PRI_ARGS(ep))); __ci_tcp_listen_shutdown(ep->netif, tls); __ci_tcp_listen_to_normal(ep->netif, tls); { @@ -2261,8 +2235,8 @@ static int ci_tcp_shutdown_listen(citp_socket* ep, int how, ci_fd_t fd) CI_TRY(ci_sys_fcntl(os_sock, F_SETFL, flags)); ci_rel_os_sock_fd(os_sock); } - citp_waitable_wake_not_in_poll(ep->netif, &tls->s.b, - CI_SB_FLAG_WAKE_RX | CI_SB_FLAG_WAKE_TX); + citp_waitable_wake_not_in_poll( + ep->netif, &tls->s.b, CI_SB_FLAG_WAKE_RX | CI_SB_FLAG_WAKE_TX); ci_netif_unlock(ep->netif); ci_sock_unlock(ep->netif, &tls->s.b); return 0; @@ -2288,10 +2262,10 @@ int ci_tcp_shutdown(citp_socket* ep, int how, ci_fd_t fd) /* Can't get lock, so try to defer shutdown to the lock holder. */ unsigned flags = 0; switch( s->b.state ) { - case CI_TCP_CLOSED: - case CI_TCP_TIME_WAIT: - CI_SET_ERROR(rc, ENOTCONN); - return rc; + case CI_TCP_CLOSED: + case CI_TCP_TIME_WAIT: + CI_SET_ERROR(rc, ENOTCONN); + return rc; } if( how == SHUT_RD || how == SHUT_RDWR ) flags |= CI_SOCK_AFLAG_NEED_SHUT_RD; @@ -2311,20 +2285,20 @@ int ci_tcp_shutdown(citp_socket* ep, int how, ci_fd_t fd) } -void ci_tcp_get_peer_addr(ci_tcp_state* ts, struct sockaddr* name, - socklen_t* namelen) +void ci_tcp_get_peer_addr( + ci_tcp_state* ts, struct sockaddr* name, socklen_t* namelen) { int af = ipcache_af(&ts->s.pkt); int /*bool*/ dnat = ts->s.s_flags & CI_SOCK_FLAG_DNAT; ci_addr_t raddr = dnat ? ts->pre_nat.daddr_be32 : tcp_ipx_raddr(ts); - ci_uint16 port = dnat ? ts->pre_nat.dport_be16 : - TS_IPX_TCP(ts)->tcp_dest_be16; + ci_uint16 port = + dnat ? ts->pre_nat.dport_be16 : TS_IPX_TCP(ts)->tcp_dest_be16; ci_addr_to_user(name, namelen, af, ts->s.domain, port, - CI_IPX_ADDR_PTR(af, raddr), ts->s.cp.so_bindtodevice); + CI_IPX_ADDR_PTR(af, raddr), ts->s.cp.so_bindtodevice); } -int ci_tcp_getpeername(citp_socket* ep, struct sockaddr* name, - socklen_t* namelen) +int ci_tcp_getpeername( + citp_socket* ep, struct sockaddr* name, socklen_t* namelen) { ci_sock_cmn* s = ep->s; int rc; @@ -2347,8 +2321,9 @@ int ci_tcp_getpeername(citp_socket* ep, struct sockaddr* name, } -int ci_tcp_getsockname(citp_socket* ep, ci_fd_t fd, struct sockaddr* sa, - socklen_t* p_sa_len) { +int ci_tcp_getsockname( + citp_socket* ep, ci_fd_t fd, struct sockaddr* sa, socklen_t* p_sa_len) +{ ci_sock_cmn* s = ep->s; int rc = 0; @@ -2365,4 +2340,3 @@ int ci_tcp_getsockname(citp_socket* ep, ci_fd_t fd, struct sockaddr* sa, #endif #endif - diff --git a/src/lib/transport/ip/tcp_recv.c b/src/lib/transport/ip/tcp_recv.c index 2f549a4be..dba27ad9e 100644 --- a/src/lib/transport/ip/tcp_recv.c +++ b/src/lib/transport/ip/tcp_recv.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief TCP recvmsg() etc. @@ -29,24 +29,24 @@ struct tcp_recv_info; typedef int (*pkt_copy_t)(ci_netif* netif, struct tcp_recv_info* rinf, - ci_ip_pkt_fmt* pkt, int peek_off, int* rc); + ci_ip_pkt_fmt* pkt, int peek_off, int* rc); struct tcp_recv_info { - int rc; - int stack_locked; - ci_iovec_ptr piov; - const ci_tcp_recvmsg_args* a; - pkt_copy_t copier; - int msg_flags; + int rc; + int stack_locked; + ci_iovec_ptr piov; + const ci_tcp_recvmsg_args* a; + pkt_copy_t copier; + int msg_flags; struct onload_zc_recv_args* zc_args; - size_t controllen; + size_t controllen; }; #ifndef __KERNEL__ -static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf); +static int ci_tcp_recvmsg_urg(struct tcp_recv_info* rinf); #endif -static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf); +static int ci_tcp_recvmsg_recv2(struct tcp_recv_info* rinf); static bool iovec_roll_over(ci_iovec_ptr* piov) @@ -64,9 +64,8 @@ static bool iovec_roll_over(ci_iovec_ptr* piov) /* * \todo It looks like it's common with getpeername(). */ -ci_inline void -ci_tcp_recv_fill_msgname(ci_tcp_state* ts, struct sockaddr *name, - socklen_t *namelen) +ci_inline void ci_tcp_recv_fill_msgname( + ci_tcp_state* ts, struct sockaddr* name, socklen_t* namelen) { #if CI_CFG_TCP_RECVMSG_MSGNAME if( name ) { @@ -77,21 +76,20 @@ ci_tcp_recv_fill_msgname(ci_tcp_state* ts, struct sockaddr *name, ci_assert(namelen); if( CI_LIKELY(*namelen >= sizeof(struct sockaddr_in)) ) { - sinp = (struct sockaddr_in *)name; - sinp->sin_family = AF_INET; - sinp->sin_port = TS_IPX_TCP(ts)->tcp_dest_be16; + sinp = (struct sockaddr_in*) name; + sinp->sin_family = AF_INET; + sinp->sin_port = TS_IPX_TCP(ts)->tcp_dest_be16; sinp->sin_addr.s_addr = ts->s.pkt.ip.ip_daddr_be32; - *namelen = sizeof(struct sockaddr_in); - } - else { - sin_buf.sin_family = AF_INET; - sin_buf.sin_port = TS_IPX_TCP(ts)->tcp_dest_be16; + *namelen = sizeof(struct sockaddr_in); + } else { + sin_buf.sin_family = AF_INET; + sin_buf.sin_port = TS_IPX_TCP(ts)->tcp_dest_be16; sin_buf.sin_addr.s_addr = ts->s.pkt.ip.ip_daddr_be32; memcpy(name, &sin_buf, *namelen); } } #else - *namelen = 0; + *namelen = 0; #endif } @@ -110,14 +108,15 @@ static void ci_tcp_recvmsg_send_wnd_update(ci_netif* ni, ci_tcp_state* ts) CHECK_TS(ni, ts); - LOG_TR(log(LNTS_FMT "ack_trigger=%x c/w rcv_delivered=%x " - "rcv_added=%u buff=%u wnd_rhs=%x current=%u", - LNTS_PRI_ARGS(ni, ts), ts->ack_trigger, ts->rcv_delivered, - ts->rcv_added, ts->rcv_window_max, - tcp_rcv_wnd_right_edge_sent(ts), - tcp_rcv_wnd_current(ts))); + LOG_TR( + log(LNTS_FMT "ack_trigger=%x c/w rcv_delivered=%x " + "rcv_added=%u buff=%u wnd_rhs=%x current=%u", + LNTS_PRI_ARGS(ni, ts), ts->ack_trigger, ts->rcv_delivered, + ts->rcv_added, ts->rcv_window_max, tcp_rcv_wnd_right_edge_sent(ts), + tcp_rcv_wnd_current(ts))); - if( ts->s.b.state & CI_TCP_STATE_NOT_CONNECTED ) goto out; + if( ts->s.b.state & CI_TCP_STATE_NOT_CONNECTED ) + goto out; /* Free-up some receive buffers now we have the netif lock. */ ci_tcp_rx_reap_rxq_bufs(ni, ts); @@ -136,12 +135,11 @@ static void ci_tcp_recvmsg_send_wnd_update(ci_netif* ni, ci_tcp_state* ts) /* Reset [ack_trigger] so it'll fire when we would advertise a window ** which is at least tcp_rcv_wnd_advertised() + delta. */ - ts->ack_trigger = ts->rcv_delivered - + ci_tcp_ack_trigger_delta(ts) - - SEQ_SUB(ts->rcv_delivered + ts->rcv_window_max, - tcp_rcv_wnd_right_edge_sent(ts)); + ts->ack_trigger = ts->rcv_delivered + ci_tcp_ack_trigger_delta(ts) - + SEQ_SUB(ts->rcv_delivered + ts->rcv_window_max, + tcp_rcv_wnd_right_edge_sent(ts)); - out: +out: CHECK_TS(ni, ts); ci_netif_unlock(ni); @@ -154,20 +152,20 @@ static void ci_tcp_recvmsg_send_wnd_update(ci_netif* ni, ci_tcp_state* ts) void ci_tcp_rcvbuf_drs(ci_netif* netif, ci_tcp_state* ts) { ci_iptime_t time; - ci_uint32 rcv_bytes; + ci_uint32 rcv_bytes; /* Set an upper ceiling on rcvbuf for a single socket. * In general, DRS will pick a smaller size than this, based on how much * data the socket is transfering each RTT. - * Useful to make this fairly big so that a stack with a single socket can + * Useful to make this fairly big so that a stack with a single socket can * achieve good throughput. If we find that resource contention with many * sockets is a problem can adjust via EF_TCP_SOCKBUF_MAX_FRACTION. * If neceesary, could implement a fairness algorithm to control access to * the buffers (similar to flow WFQ). But general advice would be to make * sufficient packet buffers available (e.g. at least sum of Bandwidth Delay * Products * 4) */ - ci_uint64 max_rcvbuf_packets = - NI_OPTS(netif).max_rx_packets >> NI_OPTS(netif).tcp_sockbuf_max_fraction; + ci_uint64 max_rcvbuf_packets = + NI_OPTS(netif).max_rx_packets >> NI_OPTS(netif).tcp_sockbuf_max_fraction; time = ci_tcp_time_now(netif) - ts->rcvbuf_drs.time; if( time < (ts->sa >> 3) || ts->sa == 0 ) @@ -192,15 +190,15 @@ void ci_tcp_rcvbuf_drs(ci_netif* netif, ci_tcp_state* ts) if( rcv_bytes >= ts->rcvbuf_drs.bytes + (ts->rcvbuf_drs.bytes >> 2) ) { /* traffic grew, but by how much ? */ - if (rcv_bytes >= ts->rcvbuf_drs.bytes + (ts->rcvbuf_drs.bytes >> 1)) - /* looks like 2x growth per RTT so we need rcv_win > 4 * rcv_bytes */ - rcv_wnd <<= 1; + if( rcv_bytes >= ts->rcvbuf_drs.bytes + (ts->rcvbuf_drs.bytes >> 1) ) + /* looks like 2x growth per RTT so we need rcv_win > 4 * rcv_bytes */ + rcv_wnd <<= 1; else - /* looks like slow start, so want rcv_win > 3 * rcv_bytes */ - rcv_wnd += (rcv_wnd >> 1); + /* looks like slow start, so want rcv_win > 3 * rcv_bytes */ + rcv_wnd += (rcv_wnd >> 1); } - rcvbuf = CI_MIN((ci_uint64)rcv_wnd, max_rcvbuf_packets * ts->amss); + rcvbuf = CI_MIN((ci_uint64) rcv_wnd, max_rcvbuf_packets * ts->amss); if( rcvbuf > ts->s.so.rcvbuf ) { ts->s.so.rcvbuf = rcvbuf; @@ -210,15 +208,15 @@ void ci_tcp_rcvbuf_drs(ci_netif* netif, ci_tcp_state* ts) } ts->rcvbuf_drs.bytes = rcv_bytes; - new_period: - ts->rcvbuf_drs.seq = ts->rcv_delivered; +new_period: + ts->rcvbuf_drs.seq = ts->rcv_delivered; ts->rcvbuf_drs.time = ci_tcp_time_now(netif); } static inline int /* bool */ -ci_tcp_recvmsg_get_nopeek(int peek_off, ci_tcp_state *ts, ci_netif *netif, - ci_ip_pkt_fmt **pkt, int total, int n, int max_bytes) +ci_tcp_recvmsg_get_nopeek(int peek_off, ci_tcp_state* ts, ci_netif* netif, + ci_ip_pkt_fmt** pkt, int total, int n, int max_bytes) { ci_assert(peek_off == 0); ts->rcv_delivered += n; @@ -236,7 +234,7 @@ ci_tcp_recvmsg_get_nopeek(int peek_off, ci_tcp_state *ts, ci_netif *netif, ci_wmb(); ci_assert(OO_PP_EQ(ts->recv1_extract, OO_PKT_P(*pkt))); ts->recv1_extract = (*pkt)->next; - *pkt = PKT_CHK_NNL(netif, ts->recv1_extract); + *pkt = PKT_CHK_NNL(netif, ts->recv1_extract); ci_assert(oo_offbuf_not_empty(&(*pkt)->buf)); } return 0; @@ -250,35 +248,35 @@ ci_tcp_recvmsg_get_nopeek(int peek_off, ci_tcp_state *ts, ci_netif *netif, */ /* Turn timestamps into the requested cmsg structure(s). */ -ci_inline void -ci_tcp_fill_recv_timestamp(struct tcp_recv_info* rinf, ci_ip_pkt_fmt* pkt) +ci_inline void ci_tcp_fill_recv_timestamp( + struct tcp_recv_info* rinf, ci_ip_pkt_fmt* pkt) { - ci_netif* ni = rinf->a->ni; - ci_tcp_state* ts = rinf->a->ts; - ci_msghdr* msg = rinf->a->msg; + ci_netif* ni = rinf->a->ni; + ci_tcp_state* ts = rinf->a->ts; + ci_msghdr* msg = rinf->a->msg; if( msg != NULL ) { struct cmsg_state cmsg_state; - if( CI_UNLIKELY( ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMP_ANY ) ) { - msg->msg_controllen = rinf->controllen; - cmsg_state.msg = msg; + if( CI_UNLIKELY(ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMP_ANY) ) { + msg->msg_controllen = rinf->controllen; + cmsg_state.msg = msg; cmsg_state.cmsg_bytes_used = 0; - cmsg_state.cm = CMSG_FIRSTHDR(msg); - cmsg_state.p_msg_flags = &rinf->msg_flags; + cmsg_state.cm = CMSG_FIRSTHDR(msg); + cmsg_state.p_msg_flags = &rinf->msg_flags; - if ( ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMPNS ) + if( ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMPNS ) ip_cmsg_recv_timestampns(ni, pkt->tstamp_frc, &cmsg_state); - else /* CI_IP_CMSG_TIMESTAMP flag gets ignored if NS counterpart is set */ + else /* CI_IP_CMSG_TIMESTAMP flag gets ignored if NS counterpart is set + */ if( ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMP ) ip_cmsg_recv_timestamp(ni, pkt->tstamp_frc, &cmsg_state); if( ts->s.cmsg_flags & CI_IP_CMSG_TIMESTAMPING ) - ip_cmsg_recv_timestamping(ni, pkt, ts->s.timestamping_flags, - &cmsg_state); + ip_cmsg_recv_timestamping( + ni, pkt, ts->s.timestamping_flags, &cmsg_state); msg->msg_controllen = cmsg_state.cmsg_bytes_used; - } - else + } else msg->msg_controllen = 0; } } @@ -287,11 +285,11 @@ ci_tcp_fill_recv_timestamp(struct tcp_recv_info* rinf, ci_ip_pkt_fmt* pkt) #if CI_CFG_TCP_OFFLOAD_RECYCLER && CI_CFG_TCP_PLUGIN_RECV_NONZC -static int offloaded_copy_block(ci_iovec* iov, const void* src, size_t max, - int flags, int* rc) +static int offloaded_copy_block( + ci_iovec* iov, const void* src, size_t max, int flags, int* rc) { int n = CI_MIN(max, CI_IOVEC_LEN(iov)); - if(CI_LIKELY( ! (flags & MSG_TRUNC) )) { + if( CI_LIKELY(! (flags & MSG_TRUNC)) ) { #ifdef __KERNEL__ if( copy_to_user(CI_IOVEC_BASE(iov), src, n) ) return -EFAULT; @@ -299,22 +297,22 @@ static int offloaded_copy_block(ci_iovec* iov, const void* src, size_t max, memcpy(CI_IOVEC_BASE(iov), src, n); #endif } - CI_IOVEC_BASE(iov) = (char*)CI_IOVEC_BASE(iov) + n; + CI_IOVEC_BASE(iov) = (char*) CI_IOVEC_BASE(iov) + n; CI_IOVEC_LEN(iov) -= n; *rc += n; return n; } static int copy_ceph_pkt(ci_netif* netif, struct tcp_recv_info* rinf, - ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) + ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) { /* This function is essentially entirely bogus, most prominently in the fact * that it'll emit zeros for all 'remote' data. It exists primarily so that * test tools (e.g. packetdrill) can work on pluginized streams. */ - int total = oo_offbuf_left(&pkt->buf); - int ofs = 0; - char* p = oo_offbuf_ptr(&pkt->buf); - int out_rc = 0; + int total = oo_offbuf_left(&pkt->buf); + int ofs = 0; + char* p = oo_offbuf_ptr(&pkt->buf); + int out_rc = 0; static const char zeros[64]; /* Not currently required, and a little tricky to get right: */ @@ -322,13 +320,13 @@ static int copy_ceph_pkt(ci_netif* netif, struct tcp_recv_info* rinf, return -EOPNOTSUPP; while( ofs != total && CI_IOVEC_LEN(&rinf->piov.io) != 0 ) { - const int hdr_len = offsetof(struct ceph_data_pkt, data); + const int hdr_len = offsetof(struct ceph_data_pkt, data); struct ceph_data_pkt data; - int n; + int n; if( total - ofs < hdr_len ) { - LOG_TR(log(LNTS_FMT "bogus plugin metastream ofs=%d total=%d", - LNTS_PRI_ARGS(netif, rinf->a->ts), ofs, total)); + LOG_TR(log(LNTS_FMT "bogus plugin metastream ofs=%d total=%d", + LNTS_PRI_ARGS(netif, rinf->a->ts), ofs, total)); goto unrecoverable; } @@ -337,86 +335,81 @@ static int copy_ceph_pkt(ci_netif* netif, struct tcp_recv_info* rinf, /* NB: if adding a new msg_type here, don't forget that zc_ceph_callback() * has a similar switch statement */ switch( data.msg_type ) { - case XSN_CEPH_DATA_INLINE: - if( total - ofs < data.msg_len ) { - LOG_TR(log(LNTS_FMT "bogus plugin inline len %d-%d<%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, - data.msg_len)); - goto unrecoverable; - } - n = offloaded_copy_block(&rinf->piov.io, p + ofs, data.msg_len, - rinf->a->flags, &out_rc); - if( n < 0 ) - return -EFAULT; - if( n != data.msg_len ) { - /* Stopped in the middle: hack the packet so that we can resume next - * time. NB: this can potentially make onload_tcpdump output a little - * odd */ - data.msg_len -= n; - memcpy(p + ofs + n - hdr_len, &data, hdr_len); - ofs += n - hdr_len; - goto out; - } - break; - - case XSN_CEPH_DATA_REMOTE: - if( total - ofs < sizeof(data.remote) || - data.msg_len != sizeof(data.remote) ) { - LOG_TR(log(LNTS_FMT "bogus plugin remote block %d-%d/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, - data.msg_len)); - goto unrecoverable; - } - memcpy(&data.remote, p + ofs, sizeof(data.remote)); - while( data.remote.data_len ) { - n = offloaded_copy_block(&rinf->piov.io, zeros, - CI_MIN((uint16_t)sizeof(zeros), - data.remote.data_len), - rinf->a->flags, &out_rc); + case XSN_CEPH_DATA_INLINE: + if( total - ofs < data.msg_len ) { + LOG_TR(log(LNTS_FMT "bogus plugin inline len %d-%d<%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, data.msg_len)); + goto unrecoverable; + } + n = offloaded_copy_block( + &rinf->piov.io, p + ofs, data.msg_len, rinf->a->flags, &out_rc); if( n < 0 ) return -EFAULT; - data.remote.data_len -= n; - data.remote.start_ptr += n; - if( n != sizeof(zeros) ) { - memcpy(p + ofs, &data.remote, sizeof(data.remote)); - ofs -= hdr_len; + if( n != data.msg_len ) { + /* Stopped in the middle: hack the packet so that we can resume next + * time. NB: this can potentially make onload_tcpdump output a little + * odd */ + data.msg_len -= n; + memcpy(p + ofs + n - hdr_len, &data, hdr_len); + ofs += n - hdr_len; goto out; } - } - break; + break; - case XSN_CEPH_DATA_LOST_SYNC: - if( total - ofs < sizeof(data.lost_sync) || - data.msg_len != sizeof(data.lost_sync) ) { - LOG_TR(log(LNTS_FMT "bogus plugin lost-sync block %d-%d/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, - data.msg_len)); - goto unrecoverable; - } - memcpy(&data.lost_sync, p, sizeof(data.lost_sync)); - log(LNTS_FMT "plugin lost sync: %u/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), data.lost_sync.reason, - data.lost_sync.subreason); - /* Set the return value so that we'll keep hitting this same lost-sync - * message on every receive, and hence block the socket from making - * further progress */ - ofs -= hdr_len; - goto out; + case XSN_CEPH_DATA_REMOTE: + if( total - ofs < sizeof(data.remote) || + data.msg_len != sizeof(data.remote) ) { + LOG_TR(log(LNTS_FMT "bogus plugin remote block %d-%d/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, data.msg_len)); + goto unrecoverable; + } + memcpy(&data.remote, p + ofs, sizeof(data.remote)); + while( data.remote.data_len ) { + n = offloaded_copy_block(&rinf->piov.io, zeros, + CI_MIN((uint16_t) sizeof(zeros), data.remote.data_len), + rinf->a->flags, &out_rc); + if( n < 0 ) + return -EFAULT; + data.remote.data_len -= n; + data.remote.start_ptr += n; + if( n != sizeof(zeros) ) { + memcpy(p + ofs, &data.remote, sizeof(data.remote)); + ofs -= hdr_len; + goto out; + } + } + break; - default: - LOG_TR(log(LNTS_FMT "bogus plugin metastream header %u/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), data.msg_type, - data.msg_len)); - goto unrecoverable; + case XSN_CEPH_DATA_LOST_SYNC: + if( total - ofs < sizeof(data.lost_sync) || + data.msg_len != sizeof(data.lost_sync) ) { + LOG_TR(log(LNTS_FMT "bogus plugin lost-sync block %d-%d/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), total, ofs, data.msg_len)); + goto unrecoverable; + } + memcpy(&data.lost_sync, p, sizeof(data.lost_sync)); + log(LNTS_FMT "plugin lost sync: %u/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), data.lost_sync.reason, + data.lost_sync.subreason); + /* Set the return value so that we'll keep hitting this same lost-sync + * message on every receive, and hence block the socket from making + * further progress */ + ofs -= hdr_len; + goto out; + + default: + LOG_TR(log(LNTS_FMT "bogus plugin metastream header %u/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), data.msg_type, data.msg_len)); + goto unrecoverable; } ofs += data.msg_len; } - out: +out: *ndata = out_rc; return ofs; - unrecoverable: +unrecoverable: /* Return the number of bytes successfully consumed, so that if the user * tries again then we'll log the same error again. This is a different * decision to the one we made at the identical label in zc_ceph_callback() @@ -429,7 +422,7 @@ static int copy_ceph_pkt(ci_netif* netif, struct tcp_recv_info* rinf, static int copy_one_pkt(ci_netif* netif, struct tcp_recv_info* rinf, - ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) + ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) { int n; @@ -443,14 +436,14 @@ static int copy_one_pkt(ci_netif* netif, struct tcp_recv_info* rinf, } #endif - if(CI_LIKELY( ! (rinf->a->flags & MSG_TRUNC) )) + if( CI_LIKELY(! (rinf->a->flags & MSG_TRUNC)) ) n = ci_ip_copy_pkt_to_user(netif, &rinf->piov.io, pkt, peek_off); else { /* Very strange kernel behaviour: MSG_TRUNC will consume the number * of bytes requested, but will not write to the user's pointer in any * circumstances. This code does the same. */ - n = CI_MIN((size_t)oo_offbuf_left(&pkt->buf) - peek_off, - rinf->piov.io.iov_len); + n = CI_MIN( + (size_t) oo_offbuf_left(&pkt->buf) - peek_off, rinf->piov.io.iov_len); CI_IOVEC_LEN(&rinf->piov.io) -= n; } /* NB: on failure of this function (i.e. n<0) the caller doesn't make any @@ -471,15 +464,14 @@ static int copy_one_pkt(ci_netif* netif, struct tcp_recv_info* rinf, ** arg and the CI_MSG_*_LOCKED constants to specify which locks are ** already held. */ -__attribute__((always_inline)) -static inline int -ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) +__attribute__((always_inline)) static inline int ci_tcp_recvmsg_get_impl( + struct tcp_recv_info* rinf) { - ci_netif* netif = rinf->a->ni; - ci_tcp_state* ts = rinf->a->ts; - int n, ndata, peek_off, total, rc; + ci_netif* netif = rinf->a->ni; + ci_tcp_state* ts = rinf->a->ts; + int n, ndata, peek_off, total, rc; ci_ip_pkt_fmt* pkt; - int max_bytes; + int max_bytes; #if CI_CFG_TIMESTAMPING && ! defined(__KERNEL__) int fill_tstamp; #endif @@ -491,27 +483,28 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) /* The socket must be locked. */ ci_assert(ci_sock_is_locked(netif, &ts->s.b)); - peek_off = 0; - total = 0; - rc = 0; + peek_off = 0; + total = 0; + rc = 0; /* Maximum number of bytes we have in both recv1 and recv2. * In this function, we get data from recv1 only, so the actual amount * of received data may be less than max_bytes. */ max_bytes = tcp_rcv_usr(ts); - if( max_bytes <= 0 || OO_PP_IS_NULL(ts->recv1_extract)) - return rc; /* Receive queue is empty. */ + if( max_bytes <= 0 || OO_PP_IS_NULL(ts->recv1_extract) ) + return rc; /* Receive queue is empty. */ ci_assert(OO_PP_NOT_NULL(ts->recv1.head)); pkt = PKT_CHK_NNL(netif, ts->recv1_extract); if( oo_offbuf_is_empty(&pkt->buf) ) { - if( OO_PP_IS_NULL(pkt->next) ) return rc; /* recv1 is empty. */ + if( OO_PP_IS_NULL(pkt->next) ) + return rc; /* recv1 is empty. */ /* See ci_tcp_recvmsg_get_nopeek() for barrier discussion. */ ci_wmb(); ts->recv1_extract = pkt->next; - pkt = PKT_CHK_NNL(netif, ts->recv1_extract); + pkt = PKT_CHK_NNL(netif, ts->recv1_extract); ci_assert(oo_offbuf_not_empty(&pkt->buf)); } initial_recv1_extract = ts->recv1_extract; @@ -539,16 +532,17 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) ci_assert(oo_offbuf_left(&pkt->buf) > peek_off); #if CI_CFG_TIMESTAMPING && ! defined(__KERNEL__) - if( fill_tstamp ) { - ci_tcp_fill_recv_timestamp(rinf, pkt); - if( ! rinf->zc_args ) - fill_tstamp = 0; - } + if( fill_tstamp ) { + ci_tcp_fill_recv_timestamp(rinf, pkt); + if( ! rinf->zc_args ) + fill_tstamp = 0; + } #endif n = rinf->copier(netif, rinf, pkt, peek_off, &ndata); -#ifdef __KERNEL__ - if( n < 0 ) break; +#ifdef __KERNEL__ + if( n < 0 ) + break; #endif rc += ndata; oo_offbuf_advance(&pkt->buf, n); @@ -556,12 +550,11 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) total += ndata; ci_assert_le(total, max_bytes); - if(CI_LIKELY( ! (rinf->a->flags & (MSG_PEEK | ONLOAD_MSG_ONEPKT)) )) { - if( ci_tcp_recvmsg_get_nopeek(peek_off, ts, netif, &pkt, total, ndata, - max_bytes) != 0 ) + if( CI_LIKELY(! (rinf->a->flags & (MSG_PEEK | ONLOAD_MSG_ONEPKT))) ) { + if( ci_tcp_recvmsg_get_nopeek( + peek_off, ts, netif, &pkt, total, ndata, max_bytes) != 0 ) break; - } - else { + } else { if( rinf->a->flags & MSG_PEEK ) { /* copy did an implicit advance of the offbuf which we do not want */ oo_offbuf_retard(&pkt->buf, n); @@ -572,14 +565,13 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) if( total == max_bytes || OO_PP_IS_NULL(pkt->next) ) /* We've emptied the receive queue. */ return rc; - pkt = PKT_CHK_NNL(netif, pkt->next); + pkt = PKT_CHK_NNL(netif, pkt->next); peek_off = 0; ci_assert(oo_offbuf_not_empty(&pkt->buf)); } - } - else { - if( ci_tcp_recvmsg_get_nopeek(peek_off, ts, netif, &pkt, total, ndata, - max_bytes) != 0 ) + } else { + if( ci_tcp_recvmsg_get_nopeek( + peek_off, ts, netif, &pkt, total, ndata, max_bytes) != 0 ) break; } @@ -597,8 +589,8 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) ** comment; darn. */ } - /* we do this here as the last thing to avoid sending many small window updates - * in cases with small recv window and small segments */ + /* we do this here as the last thing to avoid sending many small window + * updates in cases with small recv window and small segments */ if( initial_recv1_extract != ts->recv1_extract && CI_UNLIKELY(SEQ_LE(ts->ack_trigger, ts->rcv_delivered)) ) { ci_tcp_recvmsg_send_wnd_update(netif, ts); @@ -607,16 +599,14 @@ ci_tcp_recvmsg_get_impl(struct tcp_recv_info *rinf) } -__attribute__((always_inline)) -static inline int -ci_tcp_recvmsg_get_inline(struct tcp_recv_info *rinf) +__attribute__((always_inline)) static inline int ci_tcp_recvmsg_get_inline( + struct tcp_recv_info* rinf) { return ci_tcp_recvmsg_get_impl(rinf); } -static int -ci_tcp_recvmsg_get_outofline(struct tcp_recv_info *rinf) +static int ci_tcp_recvmsg_get_outofline(struct tcp_recv_info* rinf) { return ci_tcp_recvmsg_get_impl(rinf); } @@ -626,14 +616,14 @@ ci_tcp_recvmsg_get_outofline(struct tcp_recv_info *rinf) /* Returns >0 if socket is readable. Returns 0 if spin times-out. Returns * -ve error code otherwise. */ -static int ci_tcp_recvmsg_spin(ci_netif* ni, ci_tcp_state* ts, - ci_uint64 start_frc) +static int ci_tcp_recvmsg_spin( + ci_netif* ni, ci_tcp_state* ts, ci_uint64 start_frc) { - ci_uint64 now_frc; - ci_uint64 schedule_frc = start_frc; - citp_signal_info* si = citp_signal_get_specific_inited(); - ci_uint64 max_spin = ts->s.b.spin_cycles; - int rc, spin_limit_by_so = 0; + ci_uint64 now_frc; + ci_uint64 schedule_frc = start_frc; + citp_signal_info* si = citp_signal_get_specific_inited(); + ci_uint64 max_spin = ts->s.b.spin_cycles; + int rc, spin_limit_by_so = 0; /* Cache the next expected packet buffer to save work within the loop. * We need to update this after polling. If someone else polls, then this @@ -644,15 +634,16 @@ static int ci_tcp_recvmsg_spin(ci_netif* ni, ci_tcp_state* ts, * If there is no future packet to poll, then we point to a local location * which always contains the "poison" value. */ - int intf_i = ts->s.pkt.intf_i; - const uint32_t poison = CI_PKT_RX_POISON; - const volatile uint32_t* future = ci_netif_intf_rx_future(ni, intf_i, &poison); + int intf_i = ts->s.pkt.intf_i; + const uint32_t poison = CI_PKT_RX_POISON; + const volatile uint32_t* future = + ci_netif_intf_rx_future(ni, intf_i, &poison); if( ts->s.so.rcvtimeo_msec ) { - ci_uint64 max_so_spin = (ci_uint64)ts->s.so.rcvtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) ts->s.so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= max_spin ) { - max_spin = max_so_spin; + max_spin = max_so_spin; spin_limit_by_so = 1; } } @@ -679,16 +670,15 @@ static int ci_tcp_recvmsg_spin(ci_netif* ni, ci_tcp_state* ts, if( tcp_rcv_usr(ts) ) goto out; future = ci_netif_intf_rx_future(ni, intf_i, &poison); - } - else if( ! ni->state->is_spinner ) + } else if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; } if( tcp_rcv_usr(ts) || TCP_RX_DONE(ts) ) goto out; ci_frc64(&now_frc); - rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, &schedule_frc, - ts->s.so.rcvtimeo_msec, &ts->s.b, si); + rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS( + ni, now_frc, &schedule_frc, ts->s.so.rcvtimeo_msec, &ts->s.b, si); if( rc != 0 ) goto out; #if CI_CFG_SPIN_STATS @@ -699,7 +689,7 @@ static int ci_tcp_recvmsg_spin(ci_netif* ni, ci_tcp_state* ts, } while( now_frc - start_frc < max_spin ); rc = spin_limit_by_so ? -EAGAIN : 0; - out: +out: ni->state->is_spinner = 0; return rc; } @@ -715,9 +705,9 @@ static int ci_tcp_recvmsg_spin(ci_netif* ni, ci_tcp_state* ts, ** MSG_DONTWAIT or MSG_PEEK. (On linux at least: MSG_PEEK cancels ** MSG_WAITALL, and MSG_DONTWAIT overrides MSG_WAITALL). */ -#define FLAGS_AND_LOWAT_PERMIT_FAST_RET_WITH_DATA(ts, bytes, flags) \ - ((flags & (MSG_DONTWAIT | MSG_PEEK)) || \ - ((~flags & MSG_WAITALL) && (bytes) >= (ts)->s.so.rcvlowat)) +#define FLAGS_AND_LOWAT_PERMIT_FAST_RET_WITH_DATA(ts, bytes, flags) \ + ((flags & (MSG_DONTWAIT | MSG_PEEK)) || \ + ((~flags & MSG_WAITALL) && (bytes) >= (ts)->s.so.rcvlowat)) static inline void ci_tcp_recvmsg_init_piov(struct tcp_recv_info* rinf) @@ -728,34 +718,31 @@ static inline void ci_tcp_recvmsg_init_piov(struct tcp_recv_info* rinf) * always see that there's 'infinite' space left, but let's set the * pointers to NULL as well, to catch anywhere that might actually try to * write anything. */ - rinf->piov.iov = NULL; - rinf->piov.iovlen = 1; - rinf->piov.io.iov_len = ~(size_t)0; + rinf->piov.iov = NULL; + rinf->piov.iovlen = 1; + rinf->piov.io.iov_len = ~(size_t) 0; rinf->piov.io.iov_base = NULL; - } - else { + } else { /* [piov] gives keeps track of our position in the apps buffer(s). */ - ci_iovec_ptr_init_nz(&rinf->piov, - rinf->a->msg->msg_iov,rinf-> a->msg->msg_iovlen); + ci_iovec_ptr_init_nz( + &rinf->piov, rinf->a->msg->msg_iov, rinf->a->msg->msg_iovlen); } } -__attribute__((always_inline)) -static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, - pkt_copy_t copier, - struct onload_zc_recv_args* zc_args) +__attribute__((always_inline)) static inline int ci_tcp_recvmsg_impl( + const ci_tcp_recvmsg_args* a, pkt_copy_t copier, + struct onload_zc_recv_args* zc_args) { - int have_polled; - ci_uint64 sleep_seq; - ci_tcp_state* ts = a->ts; - ci_netif* ni = a->ni; - int flags = a->flags; - ci_uint64 start_frc = 0; /* suppress compiler warning */ + ci_uint64 sleep_seq; + ci_tcp_state* ts = a->ts; + ci_netif* ni = a->ni; + int flags = a->flags; + ci_uint64 start_frc = 0; /* suppress compiler warning */ #ifndef __KERNEL__ - unsigned tcp_recv_spin = 0; + unsigned tcp_recv_spin = 0; #endif - ci_uint32 timeout = ts->s.so.rcvtimeo_msec; - struct tcp_recv_info rinf; + ci_uint32 timeout = ts->s.so.rcvtimeo_msec; + struct tcp_recv_info rinf; ci_assert(a); ci_assert(ni); @@ -763,26 +750,26 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, ci_assert(a->msg); rinf.stack_locked = 0; - rinf.a = a; - rinf.rc = 0; - rinf.msg_flags = 0; - rinf.copier = copier; - rinf.zc_args = zc_args; + rinf.a = a; + rinf.rc = 0; + rinf.msg_flags = 0; + rinf.copier = copier; + rinf.zc_args = zc_args; #ifdef __KERNEL__ rinf.controllen = 0; #else - rinf.controllen = a->msg->msg_controllen; + rinf.controllen = a->msg->msg_controllen; a->msg->msg_controllen = 0; #endif /* Grab the per-socket lock so we can access the receive queue. */ rinf.rc = ci_sock_lock(ni, &ts->s.b); - if(CI_UNLIKELY( rinf.rc != 0 )) + if( CI_UNLIKELY(rinf.rc != 0) ) return rinf.rc; - if( ts->s.b.state == CI_TCP_LISTEN ) goto check_errno; + if( ts->s.b.state == CI_TCP_LISTEN ) + goto check_errno; - have_polled = 0; ci_assert_equal(rinf.rc, 0); #ifndef __KERNEL__ @@ -794,26 +781,26 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, ci_tcp_recvmsg_init_piov(&rinf); - LOG_TR(log(LNTS_FMT "recvmsg len=%d flags=%x bytes_in_rxq=%d", - LNTS_PRI_ARGS(ni, ts), - zc_args ? -1 : ci_iovec_ptr_bytes_count(&rinf.piov), - flags, tcp_rcv_usr(ts))); + LOG_TR(log(LNTS_FMT "recvmsg len=%d flags=%x bytes_in_rxq=%d", + LNTS_PRI_ARGS(ni, ts), + zc_args ? -1 : ci_iovec_ptr_bytes_count(&rinf.piov), flags, + tcp_rcv_usr(ts))); #ifndef __KERNEL__ - tcp_recv_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_RECV); + tcp_recv_spin = oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_RECV); #endif ci_frc64(&start_frc); - poll_recv_queue: +poll_recv_queue: rinf.rc += ci_tcp_recvmsg_get_inline(&rinf); /* Return immediately if we've filled the app's buffer(s). * In case of empty buffer, we should wait for socket to be readable. - */ + */ if( ci_iovec_ptr_is_empty_proper(&rinf.piov) && - ( rinf.rc != 0 || TCP_RX_DONE(ts) || tcp_rcv_usr(ts) ) ) { - if( CI_UNLIKELY(rinf.rc == 0) ) goto check_errno; + (rinf.rc != 0 || TCP_RX_DONE(ts) || tcp_rcv_usr(ts)) ) { + if( CI_UNLIKELY(rinf.rc == 0) ) + goto check_errno; goto success_unlock_out; } @@ -823,41 +810,30 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, if( (rinf.a->flags & ONLOAD_MSG_ONEPKT) && (rinf.rc > 0) ) goto success_unlock_out; - if( ! have_polled ) { - /* We've not yet filled the app's buffer. But the receive queue may - ** not be up-to-date, so we need to check that it is, or bring it - ** up-to-date ourselves. - */ - have_polled = 1; - - if( ci_netif_may_poll(ni) && ci_netif_need_poll_spinning(ni, start_frc) ) { - if( ci_netif_trylock(ni) ) { - ci_uint32 rcv_added_before = ts->rcv_added; - int any_evs = ci_netif_poll(ni); - if( ts->rcv_added != rcv_added_before ) { - /* We've handled some events, but possibly not all. So if the - * events we've handled do not satisfy the request, we need to - * ensure we come back and poll some more. - */ - have_polled = 0; + /* We've not yet filled the app's buffer. But the receive queue may + ** not be up-to-date, so we need to check that it is, or bring it + ** up-to-date ourselves. + */ + + if( ci_netif_may_poll(ni) && ci_netif_need_poll_spinning(ni, start_frc) ) { + if( ci_netif_trylock(ni) ) { + ci_uint32 rcv_added_before = ts->rcv_added; + int any_evs = ci_netif_poll(ni); + if( any_evs ) + ci_netif_poll(ni); + ci_netif_unlock(ni); + if( ts->rcv_added != rcv_added_before ) { + if( (flags & MSG_PEEK) ) { + ci_tcp_recvmsg_init_piov(&rinf); + rinf.rc = 0; } - else if( any_evs ) - ci_netif_poll(ni); - ci_netif_unlock(ni); - if( ts->rcv_added != rcv_added_before ) { - if( (flags & MSG_PEEK) ) { - ci_tcp_recvmsg_init_piov(&rinf); - rinf.rc = 0; - } - goto poll_recv_queue; - } - } - else { - /* The netif lock is contended, so the chances are we're up-to-date. - ** Even if we're not, at least we will be soon. So we pretend we are - ** up-to-date, and continue... - */ + goto poll_recv_queue; } + } else { + /* The netif lock is contended, so the chances are we're up-to-date. + ** Even if we're not, at least we will be soon. So we pretend we are + ** up-to-date, and continue... + */ } } @@ -866,7 +842,7 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, */ /* \todo For MSG_PEEK, we always will re-copy all data if we did not * filled user buffer. */ - if(CI_UNLIKELY( OO_PP_NOT_NULL(ts->recv2.head) )) + if( CI_UNLIKELY(OO_PP_NOT_NULL(ts->recv2.head)) ) if( ci_tcp_recvmsg_recv2(&rinf) ) goto success_unlock_out; @@ -874,10 +850,12 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, ** haven't filled the app's buffer. */ - if( rinf.rc && FLAGS_AND_LOWAT_PERMIT_FAST_RET_WITH_DATA(ts, rinf.rc, flags) ) + if( rinf.rc && + FLAGS_AND_LOWAT_PERMIT_FAST_RET_WITH_DATA(ts, rinf.rc, flags) ) goto success_unlock_out; - if( TCP_RX_DONE(ts) ) goto rx_done; + if( TCP_RX_DONE(ts) ) + goto rx_done; if( rinf.rc == 0 && (flags & MSG_DONTWAIT) ) { rinf.rc = -EAGAIN; @@ -885,7 +863,7 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, } /* Must not delay return if we have any data and are peeking. */ - ci_assert(!(flags & MSG_PEEK) || rinf.rc == 0); + ci_assert(! (flags & MSG_PEEK) || rinf.rc == 0); #ifndef __KERNEL__ /* Spin (if enabled) until timeout, or something happens, or we get @@ -920,8 +898,10 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, sleep_seq = ts->s.b.sleep_seq.all; ci_rmb(); - if( tcp_rcv_usr(ts) ) goto poll_recv_queue; - if( TCP_RX_DONE(ts) ) goto rx_done; + if( tcp_rcv_usr(ts) ) + goto poll_recv_queue; + if( TCP_RX_DONE(ts) ) + goto rx_done; /* ?? TODO: lock recv queue so other thread can't get in in middle of our ** receive. NB. Need to check what happens on Linux if one thread blocks @@ -933,30 +913,28 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, int rc2; /* This function drops the socket lock, and returns unlocked. */ - ci_assert(!rinf.stack_locked); + ci_assert(! rinf.stack_locked); rc2 = ci_sock_sleep(ni, &ts->s.b, CI_SB_FLAG_WAKE_RX, - CI_SLEEP_SOCK_LOCKED | CI_SLEEP_SOCK_RQ, - sleep_seq, &timeout); + CI_SLEEP_SOCK_LOCKED | CI_SLEEP_SOCK_RQ, sleep_seq, &timeout); if( rc2 == 0 ) rc2 = ci_sock_lock(ni, &ts->s.b); if( rc2 < 0 ) { /* If we've received anything at all, we must say how much. */ if( rinf.rc ) { #ifndef __KERNEL__ - ci_tcp_recv_fill_msgname(ts, (struct sockaddr*) a->msg->msg_name, - &a->msg->msg_namelen); + ci_tcp_recv_fill_msgname( + ts, (struct sockaddr*) a->msg->msg_name, &a->msg->msg_namelen); #endif } else rinf.rc = rc2; goto out; } } - ci_assert(have_polled); goto poll_recv_queue; #ifndef __KERNEL__ - slow_path: +slow_path: if( flags & MSG_ERRQUEUE ) { #if CI_CFG_TIMESTAMPING @@ -979,7 +957,7 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, ci_rmb(); if( ! (pkt->flags & - (CI_PKT_FLAG_TX_TIMESTAMPED | CI_PKT_FLAG_INDIRECT)) ) { + (CI_PKT_FLAG_TX_TIMESTAMPED | CI_PKT_FLAG_INDIRECT)) ) { if( ! rinf.stack_locked ) { ci_netif_lock(ni); rinf.stack_locked = 1; @@ -989,75 +967,75 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, goto slow_path; } - a->msg->msg_controllen = rinf.controllen; - cmsg_state.msg = a->msg; - cmsg_state.cm = a->msg->msg_control; + a->msg->msg_controllen = rinf.controllen; + cmsg_state.msg = a->msg; + cmsg_state.cm = a->msg->msg_control; cmsg_state.cmsg_bytes_used = 0; - cmsg_state.p_msg_flags = &rinf.msg_flags; + cmsg_state.p_msg_flags = &rinf.msg_flags; if( pkt->flags & CI_PKT_FLAG_TX_TIMESTAMPED ) { if( ts->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_ONLOAD ) { if( pkt->flags & ~CI_PKT_FLAG_RTQ_RETRANS ) { - struct onload_timestamp ts = {pkt->hw_stamp.tv_sec, - pkt->hw_stamp.tv_nsec}; + struct onload_timestamp ts = { pkt->hw_stamp.tv_sec, + pkt->hw_stamp.tv_nsec }; ci_put_cmsg(&cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING, - sizeof(ts), &ts); - } - else { + sizeof(ts), &ts); + } else { /* Ignore retransmit timestamps. We might want something like - * ONLOAD_SCM_TIMESTAMPING_STREAM to report them along with the - * original transmission time */ + * ONLOAD_SCM_TIMESTAMPING_STREAM to report them along with the + * original transmission time */ goto timestamp_q_check; } - } - else { + } else { struct onload_scm_timestamping_stream stamps; - int tx_hw_stamp_in_sync; + int tx_hw_stamp_in_sync; memset(&stamps, 0, sizeof(stamps)); - tx_hw_stamp_in_sync = pkt->hw_stamp.tv_nsec & - CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC; + tx_hw_stamp_in_sync = + pkt->hw_stamp.tv_nsec & CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC; if( pkt->flags & CI_PKT_FLAG_RTQ_RETRANS ) { if( pkt->pf.tcp_tx.first_tx_hw_stamp.tv_nsec & CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC ) { - stamps.first_sent.tv_sec = pkt->pf.tcp_tx.first_tx_hw_stamp.tv_sec; - stamps.first_sent.tv_nsec = pkt->pf.tcp_tx.first_tx_hw_stamp.tv_nsec; + stamps.first_sent.tv_sec = + pkt->pf.tcp_tx.first_tx_hw_stamp.tv_sec; + stamps.first_sent.tv_nsec = + pkt->pf.tcp_tx.first_tx_hw_stamp.tv_nsec; } if( tx_hw_stamp_in_sync ) { - stamps.last_sent.tv_sec = pkt->hw_stamp.tv_sec; + stamps.last_sent.tv_sec = pkt->hw_stamp.tv_sec; stamps.last_sent.tv_nsec = pkt->hw_stamp.tv_nsec; } - } - else if( tx_hw_stamp_in_sync ) { - stamps.first_sent.tv_sec = pkt->hw_stamp.tv_sec; + } else if( tx_hw_stamp_in_sync ) { + stamps.first_sent.tv_sec = pkt->hw_stamp.tv_sec; stamps.first_sent.tv_nsec = pkt->hw_stamp.tv_nsec; } stamps.len = pkt->pf.tcp_tx.end_seq - pkt->pf.tcp_tx.start_seq; - /* FIN and SYN eat seq space, but the user is not interested in them */ + /* FIN and SYN eat seq space, but the user is not interested in them + */ if( TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt)->tcp_flags & - (CI_TCP_FLAG_SYN|CI_TCP_FLAG_FIN) ) + (CI_TCP_FLAG_SYN | CI_TCP_FLAG_FIN) ) stamps.len--; ci_put_cmsg(&cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING_STREAM, - sizeof(stamps), &stamps); + sizeof(stamps), &stamps); } } if( pkt->flags & CI_PKT_FLAG_INDIRECT ) { - struct ci_pkt_zc_header* zch = oo_tx_zc_header(pkt); + struct ci_pkt_zc_header* zch = oo_tx_zc_header(pkt); struct ci_pkt_zc_payload* zcp; - OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) { + OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) + { if( zcp->is_remote && zcp->use_remote_cookie ) { ci_put_cmsg(&cmsg_state, SOL_IP, ONLOAD_SO_ONLOADZC_COMPLETE, - sizeof(zcp->remote.app_cookie), - &zcp->remote.app_cookie); + sizeof(zcp->remote.app_cookie), &zcp->remote.app_cookie); } } } ci_ip_cmsg_finish(&cmsg_state); rinf.msg_flags |= MSG_ERRQUEUE; - + /* Wake up TX if necessary as a result of delivering from timestamp_q */ if( NI_OPTS(ni).tcp_sndbuf_mode >= 1 && ci_tcp_tx_advertise_space(ni, ts) ) { @@ -1070,8 +1048,7 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, rinf.rc = 0; goto unlock_out; - } - else { + } else { /* Try polling to see if there is a TX timestamp event available * to satisfy this request */ @@ -1083,9 +1060,8 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, if( pkt != NULL ) { if( ! (pkt->flags & CI_PKT_FLAG_TX_PENDING) ) goto timestamp_q_nonempty; - } - else if( (pkt = ci_udp_recv_q_get(ni, &ts->timestamp_q)) != NULL - && ! (pkt->flags & CI_PKT_FLAG_TX_PENDING) ) { + } else if( (pkt = ci_udp_recv_q_get(ni, &ts->timestamp_q)) != NULL && + ! (pkt->flags & CI_PKT_FLAG_TX_PENDING) ) { goto timestamp_q_nonempty; } } @@ -1098,50 +1074,53 @@ static inline int ci_tcp_recvmsg_impl(const ci_tcp_recvmsg_args* a, ci_assert(flags & MSG_OOB); rinf.rc = ci_tcp_recvmsg_urg(&rinf); - if( rinf.rc >= 0 ) goto success_unlock_out; + if( rinf.rc >= 0 ) + goto success_unlock_out; goto unlock_out; #endif - rx_done: - if( tcp_rcv_usr(ts) && !ci_iovec_ptr_is_empty_proper(&rinf.piov) ) +rx_done: + if( tcp_rcv_usr(ts) && ! ci_iovec_ptr_is_empty_proper(&rinf.piov) ) /* Race breaker: rx_errno can get updated asynchronously just after ** we've looked at the receive queue. We need to go back and get that ** data. */ goto poll_recv_queue; - if( rinf.rc ) goto success_unlock_out; - check_errno: + if( rinf.rc ) + goto success_unlock_out; +check_errno: /* tcp recv() does not set errno if the connection was properly shut down */ if( ts->tcpflags & CI_TCPT_FLAG_FIN_RECEIVED ) goto unlock_out; - if (ts->s.so_error) { + if( ts->s.so_error ) { ci_int32 rc1 = ci_get_so_error(&ts->s); - if (rc1 != 0) + if( rc1 != 0 ) rinf.rc = -rc1; } else if( TCP_RX_ERRNO(ts) ) { rinf.rc = -TCP_RX_ERRNO(ts); } goto unlock_out; - success_unlock_out: +success_unlock_out: #ifndef __KERNEL__ ci_tcp_recv_fill_msgname(ts, (struct sockaddr*) a->msg->msg_name, - &a->msg->msg_namelen); /*!\TODO fixme remove cast*/ + &a->msg->msg_namelen); /*!\TODO fixme remove cast*/ #endif - unlock_out: +unlock_out: /* If we've received FIN and RXQ is empty, let's reap it. * See the counterpart in ci_tcp_rx_process_fin(), if FIN arrives with * the empty receive queue. */ - if( ( ( (ts->s.b.state & CI_TCP_STATE_RECVD_FIN) && tcp_rcv_usr(ts) == 0 ) - || ni->state->mem_pressure ) && ci_netif_trylock(ni) ) { + if( (((ts->s.b.state & CI_TCP_STATE_RECVD_FIN) && tcp_rcv_usr(ts) == 0) || + ni->state->mem_pressure) && + ci_netif_trylock(ni) ) { ci_tcp_rx_reap_rxq_bufs_socklocked(ni, ts); ci_netif_unlock(ni); } ci_sock_unlock(ni, &ts->s.b); - out: - if(CI_UNLIKELY( ni->state->rxq_low )) +out: + if( CI_UNLIKELY(ni->state->rxq_low) ) ci_netif_rxq_low_on_recv(ni, &ts->s, rinf.rc); #ifndef __KERNEL__ if( rinf.rc >= 0 ) @@ -1161,8 +1140,7 @@ int ci_tcp_recvmsg(const ci_tcp_recvmsg_args* a) static void move_from_recv2_to_recv1(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* head, - ci_ip_pkt_fmt* tail, int n) + ci_ip_pkt_fmt* head, ci_ip_pkt_fmt* tail, int n) { /* Move the [n] packets from [head] to [tail] inclusive from the ** beginning of [recv2] to [recv1]. If [recv2] is emptied, switch back @@ -1180,8 +1158,9 @@ static void move_from_recv2_to_recv1(ci_netif* ni, ci_tcp_state* ts, if( n ) { LOG_URG(log(NTS_FMT "recvmsg: moving %d pkts from recv2 to recv1", - NTS_PRI_ARGS(ni, ts), n)); - /* as this is move between recv queues - no pkt receive adjustment needed */ + NTS_PRI_ARGS(ni, ts), n)); + /* as this is move between recv queues - no pkt receive adjustment needed + */ ci_ip_queue_move(ni, recv2, recv1, tail, n); /* The extract pointer can only be made -ve when the receive queues are ** emptied (and both locks are held). It can only be -ve here if after @@ -1190,43 +1169,42 @@ static void move_from_recv2_to_recv1(ci_netif* ni, ci_tcp_state* ts, */ if( OO_PP_IS_NULL(ts->recv1_extract) ) { ts->recv1_extract = recv1->head; - } - else { + } else { /* * must point to an emptied packet * - pull up to the first packet moved from recv2 */ ci_assert(oo_offbuf_is_empty(&(PKT_CHK(ni, ts->recv1_extract)->buf))); ts->recv1_extract = OO_PKT_P(head); - ci_assert_impl(OO_PP_IS_NULL(recv1->head), - OO_PP_IS_NULL(ts->recv1_extract)); + ci_assert_impl( + OO_PP_IS_NULL(recv1->head), OO_PP_IS_NULL(ts->recv1_extract)); } - } /* If we've managed to empty recv2, and we're not still waiting for the * urgent data to arrive, then we can switch back to recv1. */ - if( OO_PP_IS_NULL(recv2->head) && !(tcp_urg_data(ts) & CI_TCP_URG_COMING) ) { + if( OO_PP_IS_NULL(recv2->head) && + ! (tcp_urg_data(ts) & CI_TCP_URG_COMING) ) { LOG_URG(log(NTS_FMT "recvmsg: switch to recv1", NTS_PRI_ARGS(ni, ts))); TS_QUEUE_RX_SET(ts, recv1); - ci_assert(!(tcp_urg_data(ts) & CI_TCP_URG_PTR_VALID)); + ci_assert(! (tcp_urg_data(ts) & CI_TCP_URG_PTR_VALID)); } } #ifndef __KERNEL__ -static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) +static int ci_tcp_recvmsg_urg(struct tcp_recv_info* rinf) { - ci_netif* ni = rinf->a->ni; - ci_tcp_state* ts = rinf->a->ts; + ci_netif* ni = rinf->a->ni; + ci_tcp_state* ts = rinf->a->ts; struct msghdr* msg = rinf->a->msg; - ci_iovec_ptr piov; - ci_uint8 oob; - int can_write; - int rc = 0; + ci_iovec_ptr piov; + ci_uint8 oob; + int can_write; + int rc = 0; - if( !rinf->stack_locked ) { + if( ! rinf->stack_locked ) { rc = ci_netif_lock(ni); if( rc != 0 ) return rc; @@ -1238,7 +1216,7 @@ static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) ci_assert(msg->msg_iovlen > 0); ci_iovec_ptr_init_nz(&piov, msg->msg_iov, msg->msg_iovlen); - can_write = !ci_iovec_ptr_is_empty_proper(&piov); + can_write = ! ci_iovec_ptr_is_empty_proper(&piov); if( ts->s.s_flags & CI_SOCK_FLAG_OOBINLINE ) { LOG_URG(ci_log("%s: OOBINLINE is set, rc=-EINVAL", __FUNCTION__)); @@ -1260,7 +1238,7 @@ static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) goto out; } - if (ts->s.b.state == CI_TCP_CLOSED) { + if( ts->s.b.state == CI_TCP_CLOSED ) { LOG_URG(ci_log("%s: tcp state is CLOSED, rc=0", __FUNCTION__)); goto out; } @@ -1271,11 +1249,12 @@ static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) oob = tcp_urg_data(ts) & CI_TCP_URG_DATA_MASK; rinf->msg_flags |= MSG_OOB; - LOG_URG(ci_log("Reading OOB byte, oob=0x%X, flags=0x%X", oob, rinf->a->flags)); + LOG_URG( + ci_log("Reading OOB byte, oob=0x%X, flags=0x%X", oob, rinf->a->flags)); /* if we are not in peek mode, mark the oob state as read */ - if (~rinf->a->flags & MSG_PEEK) - tcp_urg_data(ts) &=~ (CI_TCP_URG_IS_HERE | CI_TCP_URG_DATA_MASK); + if( ~rinf->a->flags & MSG_PEEK ) + tcp_urg_data(ts) &= ~(CI_TCP_URG_IS_HERE | CI_TCP_URG_DATA_MASK); /*! Linux appears to treat the MSG_TRUNC flag, in TCP, as a * "PEEK and clear data" flag. @@ -1295,10 +1274,10 @@ static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) ** ci_iovec_ptr_is_empty_proper() above has moved us to a non-zero-length ** buffer, so we can just copy the byte here. */ - *(char*)CI_IOVEC_BASE(&piov.io) = oob; - rc = 1; + *(char*) CI_IOVEC_BASE(&piov.io) = oob; + rc = 1; - out: +out: CHECK_TS(ni, ts); ci_netif_unlock(ni); rinf->stack_locked = 0; @@ -1307,32 +1286,32 @@ static int ci_tcp_recvmsg_urg(struct tcp_recv_info *rinf) #endif -static void ci_tcp_recvmsg_recv2_peek2(struct tcp_recv_info *rinfo, - int start_skip, int stop_at_mark, - unsigned rd_nxt_seq) +static void ci_tcp_recvmsg_recv2_peek2(struct tcp_recv_info* rinfo, + int start_skip, int stop_at_mark, unsigned rd_nxt_seq) { - /* + /* * This function is used to peek at data on recv2. Either to look a data ** before the mark, or at data after the OOB byte. - * + * * Windows: unlike normal reads, peeks will not read past any OOBB */ - ci_tcp_state* ts = rinfo->a->ts; - ci_netif* ni = rinfo->a->ni; + ci_tcp_state* ts = rinfo->a->ts; + ci_netif* ni = rinfo->a->ni; ci_ip_pkt_queue* recv2 = &ts->recv2; - ci_ip_pkt_fmt* pkt = PKT_CHK(ni, recv2->head); - oo_offbuf* buf = &pkt->buf; - int rc, n, peek_off = start_skip; - int orig_buf_end; + ci_ip_pkt_fmt* pkt = PKT_CHK(ni, recv2->head); + oo_offbuf* buf = &pkt->buf; + int rc, n, peek_off = start_skip; + int orig_buf_end; ci_assert(oo_offbuf_left(buf) >= start_skip); ci_assert(tcp_urg_data(ts) & CI_TCP_URG_PTR_VALID); - ci_assert(!stop_at_mark || SEQ_LE(rd_nxt_seq, tcp_rcv_up(ts))); + ci_assert(! stop_at_mark || SEQ_LE(rd_nxt_seq, tcp_rcv_up(ts))); - LOG_URG(log(LNTS_FMT "recv2_peek: so_far=%d skip=%d stop@mark=%d " - "rd_nxt_seq=%08x rcv_up=%08x", LNTS_PRI_ARGS(ni, ts), - rinfo->rc, start_skip, stop_at_mark, - rd_nxt_seq, tcp_rcv_up(ts))); + LOG_URG( + log(LNTS_FMT "recv2_peek: so_far=%d skip=%d stop@mark=%d " + "rd_nxt_seq=%08x rcv_up=%08x", + LNTS_PRI_ARGS(ni, ts), rinfo->rc, start_skip, stop_at_mark, + rd_nxt_seq, tcp_rcv_up(ts))); rd_nxt_seq += start_skip; @@ -1351,13 +1330,13 @@ static void ci_tcp_recvmsg_recv2_peek2(struct tcp_recv_info *rinfo, } rc = 0; - n = rinfo->copier(ni, rinfo, pkt, peek_off, &rc); + n = rinfo->copier(ni, rinfo, pkt, peek_off, &rc); ci_assert_equal(n, rc); /* zc shenanigans not supported with urgent data */ pkt->buf.end = orig_buf_end; #ifdef __KERNEL__ if( n < 0 ) { - LOG_URG(log(LNTS_FMT "%s: copy_to_user returned %d", - LNTS_PRI_ARGS(ni, ts), __FUNCTION__, n)); + LOG_URG(log(LNTS_FMT "%s: copy_to_user returned %d", + LNTS_PRI_ARGS(ni, ts), __FUNCTION__, n)); if( rinfo->rc == 0 ) rinfo->rc = n; break; @@ -1370,34 +1349,34 @@ static void ci_tcp_recvmsg_recv2_peek2(struct tcp_recv_info *rinfo, if( ! iovec_roll_over(&rinfo->piov) ) break; if( oo_offbuf_left(buf) - peek_off == 0 ) { - if( OO_PP_IS_NULL(pkt->next) ) - break; - pkt = PKT_CHK(ni, pkt->next); - buf = &pkt->buf; + if( OO_PP_IS_NULL(pkt->next) ) + break; + pkt = PKT_CHK(ni, pkt->next); + buf = &pkt->buf; peek_off = 0; } } } -static int ci_tcp_recvmsg_recv2_peek(struct tcp_recv_info *rinf) +static int ci_tcp_recvmsg_recv2_peek(struct tcp_recv_info* rinf) { - ci_tcp_state* ts = rinf->a->ts; - ci_netif* ni = rinf->a->ni; + ci_tcp_state* ts = rinf->a->ts; + ci_netif* ni = rinf->a->ni; ci_ip_pkt_queue* recv2 = &ts->recv2; - ci_ip_pkt_fmt* pkt; - int skip, stop_at_mark; - unsigned rd_nxt_seq; - int af = ipcache_af(&ts->s.pkt); + ci_ip_pkt_fmt* pkt; + int skip, stop_at_mark; + unsigned rd_nxt_seq; + int af = ipcache_af(&ts->s.pkt); - if( !rinf->stack_locked ) { + if( ! rinf->stack_locked ) { int rc = ci_netif_lock(ni); if( rc != 0 ) return rc; rinf->stack_locked = 1; } - pkt = PKT_CHK(ni, recv2->head); + pkt = PKT_CHK(ni, recv2->head); rd_nxt_seq = PKT_IPX_RX_BUF_SEQ(af, pkt); /* Double-check for packets added to recv1 after we finished sucking data @@ -1405,7 +1384,7 @@ static int ci_tcp_recvmsg_recv2_peek(struct tcp_recv_info *rinf) */ if( OO_PP_NOT_NULL(ts->recv1_extract) ) { ci_ip_pkt_fmt* r1pkt = PKT_CHK(ni, ts->recv1_extract); - unsigned seq = PKT_IPX_RX_BUF_SEQ(af, r1pkt) + rinf->rc; + unsigned seq = PKT_IPX_RX_BUF_SEQ(af, r1pkt) + rinf->rc; /* We think we've read everything in recv1, and [seq] points just ** beyond that. So it ought to match the beginning of recv2. If it ** doesn't, then something else has been added to recv1. @@ -1423,23 +1402,22 @@ static int ci_tcp_recvmsg_recv2_peek(struct tcp_recv_info *rinf) ** it. Otherwise peek the data up to the mark. */ if( tcp_rcv_up(ts) == rd_nxt_seq ) { - skip = !(ts->s.s_flags & CI_SOCK_FLAG_OOBINLINE); + skip = ! (ts->s.s_flags & CI_SOCK_FLAG_OOBINLINE); stop_at_mark = 0; - } - else { - skip = 0; + } else { + skip = 0; stop_at_mark = 1; } ci_tcp_recvmsg_recv2_peek2(rinf, skip, stop_at_mark, rd_nxt_seq); - out: +out: ci_netif_unlock(ni); rinf->stack_locked = 0; return rinf->rc; } -static int ci_tcp_recvmsg_handle_race(struct tcp_recv_info *rinf) +static int ci_tcp_recvmsg_handle_race(struct tcp_recv_info* rinf) { int rc; @@ -1468,32 +1446,33 @@ ci_inline int ci_tcp_recv1_is_empty(ci_netif* ni, ci_tcp_state* ts) /* NB. The first buffer pointed to by the extract pointer may be empty, ** but any subsequent ones must not be. */ - ci_ip_pkt_fmt *pkt; - if( OO_PP_IS_NULL(ts->recv1_extract) ) return 1; + ci_ip_pkt_fmt* pkt; + if( OO_PP_IS_NULL(ts->recv1_extract) ) + return 1; pkt = PKT_CHK_NNL(ni, ts->recv1_extract); return oo_offbuf_is_empty(&pkt->buf) && OO_PP_IS_NULL(pkt->next); } -static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) +static int ci_tcp_recvmsg_recv2(struct tcp_recv_info* rinf) { - ci_tcp_state* ts = rinf->a->ts; - ci_netif* ni = rinf->a->ni; + ci_tcp_state* ts = rinf->a->ts; + ci_netif* ni = rinf->a->ni; ci_ip_pkt_queue* recv2 = &ts->recv2; - ci_ip_pkt_fmt* pkt, *head_pkt, *tail_pkt; - oo_offbuf* buf; - unsigned rd_nxt_seq, n; - int must_return_from_recv = 0; - int af = ipcache_af(&ts->s.pkt); + ci_ip_pkt_fmt * pkt, *head_pkt, *tail_pkt; + oo_offbuf* buf; + unsigned rd_nxt_seq, n; + int must_return_from_recv = 0; + int af = ipcache_af(&ts->s.pkt); if( rinf->a->flags & MSG_PEEK ) return ci_tcp_recvmsg_recv2_peek(rinf); - again: +again: LOG_URG(ci_log("%s: again rc=%d", __FUNCTION__, rinf->rc)); - + ci_assert(ci_sock_is_locked(ni, &ts->s.b)); - if( !rinf->stack_locked ) { + if( ! rinf->stack_locked ) { int rc = ci_netif_lock(ni); if( rc != 0 ) return rc; @@ -1504,7 +1483,8 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) /* Double-check for packets added to recv1. */ if( ! ci_tcp_recv1_is_empty(ni, ts) ) { must_return_from_recv = ci_tcp_recvmsg_handle_race(rinf); - if( must_return_from_recv ) goto unlock_out; + if( must_return_from_recv ) + goto unlock_out; } ci_assert(ci_tcp_recv1_is_empty(ni, ts)); @@ -1516,10 +1496,10 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) /* Calculate the sequence number of the first un-read byte in this pkt. */ rd_nxt_seq = PKT_IPX_RX_BUF_SEQ(af, pkt); - LOG_URG(log("%s: "NTS_FMT "so_far=%d flags=%x nxt_seq=%08x rcv_up=%08x " - "urg_data=%03x", __FUNCTION__, NTS_PRI_ARGS(ni, ts), - rinf->rc, rinf->a->flags, rd_nxt_seq, tcp_rcv_up(ts), - tcp_urg_data(ts))); + LOG_URG(log("%s: " NTS_FMT "so_far=%d flags=%x nxt_seq=%08x rcv_up=%08x " + "urg_data=%03x", + __FUNCTION__, NTS_PRI_ARGS(ni, ts), rinf->rc, rinf->a->flags, rd_nxt_seq, + tcp_rcv_up(ts), tcp_urg_data(ts))); ci_assert(tcp_urg_data(ts) & CI_TCP_URG_PTR_VALID); @@ -1541,8 +1521,8 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) **/ if( tcp_rcv_up(ts) == rd_nxt_seq || rinf->zc_args ) { /* We are staring at the urgent byte. */ - LOG_URG(ci_log("%s: We're staring at the oob byte and rc=%d", - __FUNCTION__, rinf->rc)); + LOG_URG(ci_log("%s: We're staring at the oob byte and rc=%d", __FUNCTION__, + rinf->rc)); /* * windows allows in-band reads to pass the mark - so don't quit here @@ -1550,11 +1530,11 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) if( rinf->rc && ! rinf->zc_args ) { /* We've consumed some data, so stop at the mark. */ LOG_URG(ci_log("%s: We're staring at the oob byte and rc=%d", - __FUNCTION__, rinf->rc)); + __FUNCTION__, rinf->rc)); must_return_from_recv = 1; goto unlock_out; } - + if( ! (ts->s.s_flags & CI_SOCK_FLAG_OOBINLINE) && ! oo_offbuf_is_empty(buf) ) { @@ -1575,7 +1555,8 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) * - so leave as valid */ tcp_urg_data_invalidate(ts); - move_from_recv2_to_recv1(ni, ts, pkt, PKT_CHK(ni,recv2->tail), recv2->num); + move_from_recv2_to_recv1( + ni, ts, pkt, PKT_CHK(ni, recv2->tail), recv2->num); ci_assert(OO_PP_IS_NULL(recv2->head)); ci_assert(TS_QUEUE_RX(ts) == &ts->recv1); ci_netif_unlock(ni); @@ -1588,12 +1569,13 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) ** packets that come before the mark. */ head_pkt = pkt; - n = 0; + n = 0; tail_pkt = 0; /* just to suppress compiler warning */ while( SEQ_GE(tcp_rcv_up(ts), pkt->pf.tcp_rx.end_seq) ) { tail_pkt = pkt; ++n; - if( OO_PP_IS_NULL(pkt->next) ) break; + if( OO_PP_IS_NULL(pkt->next) ) + break; pkt = PKT_CHK(ni, pkt->next); } if( n ) { @@ -1607,26 +1589,29 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) rinf->stack_locked = 0; /* Pull data out of recv1 and return if we fill app's buffer. */ rinf->rc += ci_tcp_recvmsg_get_outofline(rinf); - must_return_from_recv = ci_iovec_ptr_is_empty_proper(&rinf->piov) || - ((rinf->a->flags & ONLOAD_MSG_ONEPKT) && (rinf->rc > 0)); - if( must_return_from_recv ) goto out; + must_return_from_recv = + ci_iovec_ptr_is_empty_proper(&rinf->piov) || + ((rinf->a->flags & ONLOAD_MSG_ONEPKT) && (rinf->rc > 0)); + if( must_return_from_recv ) + goto out; /* May need to pull some more from recv2 before the mark. NB. Can't ** just fall through to the code below, because the mark may have moved ** forward because we dropped the netif lock. */ - if( OO_PP_NOT_NULL(recv2->head) ) goto again; + if( OO_PP_NOT_NULL(recv2->head) ) + goto again; goto out; - } - else { + } else { /* The packet at the head of recv2 (if any) contains normal data ** followed by urgent data. So read the normal data. */ int n; ci_assert(! rinf->zc_args); - if( OO_PP_IS_NULL(recv2->head) ) goto unlock_out; - n = tcp_rcv_up(ts) - rd_nxt_seq; /* number of normal bytes */ - LOG_URG(ci_log("%s: reading %d bytes from urg segment before OOBB", - __FUNCTION__, n)); + if( OO_PP_IS_NULL(recv2->head) ) + goto unlock_out; + n = tcp_rcv_up(ts) - rd_nxt_seq; /* number of normal bytes */ + LOG_URG(ci_log( + "%s: reading %d bytes from urg segment before OOBB", __FUNCTION__, n)); ci_assert(n > 0); ci_assert_lt(n, oo_offbuf_left(buf)); n = ci_copy_to_iovec(&rinf->piov, oo_offbuf_ptr(buf), n); @@ -1638,29 +1623,29 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) ** recvmsg() can return now. */ must_return_from_recv = 1; - } - unlock_out: +unlock_out: CHECK_TS(ni, ts); if( rinf->stack_locked ) { ci_netif_unlock(ni); rinf->stack_locked = 0; } - out: +out: if( NI_OPTS(ni).tcp_rcvbuf_mode == 1 ) ci_tcp_rcvbuf_drs(ni, ts); /* Must return if we've filled the app buffer. */ - must_return_from_recv |= ci_iovec_ptr_is_empty_proper(&rinf->piov) || - ((rinf->a->flags & ONLOAD_MSG_ONEPKT) && (rinf->rc > 0)); - - LOG_URG(ci_log("%s: returning %d rc=%d " - "ci_iovec_ptr_is_empty_proper=%d", - __FUNCTION__, must_return_from_recv, - rinf->rc, - ci_iovec_ptr_is_empty_proper(&rinf->piov))); - + must_return_from_recv |= + ci_iovec_ptr_is_empty_proper(&rinf->piov) || + ((rinf->a->flags & ONLOAD_MSG_ONEPKT) && (rinf->rc > 0)); + + LOG_URG( + ci_log("%s: returning %d rc=%d " + "ci_iovec_ptr_is_empty_proper=%d", + __FUNCTION__, must_return_from_recv, rinf->rc, + ci_iovec_ptr_is_empty_proper(&rinf->piov))); + return must_return_from_recv; } @@ -1668,36 +1653,36 @@ static int ci_tcp_recvmsg_recv2(struct tcp_recv_info *rinf) #ifndef __KERNEL__ #if CI_CFG_TCP_OFFLOAD_RECYCLER -#define CI_ZC_IOV_STATIC_MAX 32 +#define CI_ZC_IOV_STATIC_MAX 32 CI_BUILD_ASSERT((ONLOAD_ZC_RECV_FLAG_OFFLOAD_OOB & - ~ONLOAD_ZC_RECV_FLAG_OFFLOAD_RESERVED) == 0); + ~ONLOAD_ZC_RECV_FLAG_OFFLOAD_RESERVED) == 0); static int zc_ceph_callback(ci_netif* netif, struct tcp_recv_info* rinf, - ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) + ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) { - int total = oo_offbuf_left(&pkt->buf); - int n = total; - char* p = oo_offbuf_ptr(&pkt->buf); - struct onload_zc_iovec static_iov[CI_ZC_IOV_STATIC_MAX]; - struct onload_zc_iovec* iov = static_iov; - int iovlen = 0; - int iov_max = CI_ZC_IOV_STATIC_MAX; - int out_rc = 0; + int total = oo_offbuf_left(&pkt->buf); + int n = total; + char* p = oo_offbuf_ptr(&pkt->buf); + struct onload_zc_iovec static_iov[CI_ZC_IOV_STATIC_MAX]; + struct onload_zc_iovec* iov = static_iov; + int iovlen = 0; + int iov_max = CI_ZC_IOV_STATIC_MAX; + int out_rc = 0; enum onload_zc_callback_rc cb_rc; - ssize_t overrun; + ssize_t overrun; /* Not currently a required feature, and a little tricky to get right: */ if( rinf->msg_flags & MSG_PEEK ) return -EOPNOTSUPP; while( n ) { - const int hdr_len = offsetof(struct ceph_data_pkt, data); + const int hdr_len = offsetof(struct ceph_data_pkt, data); struct ceph_data_pkt data; if( n < hdr_len ) { LOG_TR(log(LNTS_FMT "bogus plugin metastream len=%d", - LNTS_PRI_ARGS(netif, rinf->a->ts), n)); + LNTS_PRI_ARGS(netif, rinf->a->ts), n)); goto unrecoverable; } @@ -1712,15 +1697,15 @@ static int zc_ceph_callback(ci_netif* netif, struct tcp_recv_info* rinf, * the DDR ring buffer. A message will never require more than two * iovs: the plugin will not deliver a message longer than ddr_size. */ struct onload_zc_iovec* iov_new; - LOG_TR(log(LNTS_FMT "large number of iovs in metapkt (%d @ %d/%d)", - LNTS_PRI_ARGS(netif, rinf->a->ts), iovlen, - (int)(p - PKT_START(pkt)), - (int)(oo_offbuf_end(&pkt->buf) - PKT_START(pkt)))); + LOG_TR(log(LNTS_FMT "large number of iovs in metapkt (%d @ %d/%d)", + LNTS_PRI_ARGS(netif, rinf->a->ts), iovlen, + (int) (p - PKT_START(pkt)), + (int) (oo_offbuf_end(&pkt->buf) - PKT_START(pkt)))); iov_max = iov_max + (iov_max >> 1); - iov_new = realloc(iov == static_iov ? NULL : iov, - iov_max * sizeof(*iov)); + iov_new = + realloc(iov == static_iov ? NULL : iov, iov_max * sizeof(*iov)); if( ! iov_new ) { - log(LNTS_FMT "OOM growing iov array (%d)", + log(LNTS_FMT "OOM growing iov array (%d)", LNTS_PRI_ARGS(netif, rinf->a->ts), iov_max); goto unrecoverable; } @@ -1733,89 +1718,92 @@ static int zc_ceph_callback(ci_netif* netif, struct tcp_recv_info* rinf, /* NB: if adding a new msg_type here, don't forget that copy_ceph_pkt() * has a similar switch statement */ switch( data.msg_type ) { - case XSN_CEPH_DATA_INLINE: - if( n < data.msg_len ) { - LOG_TR(log(LNTS_FMT "bogus plugin inline len %d<%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); - goto unrecoverable; - } - iov[iovlen].iov_base = p; - iov[iovlen].iov_len = data.msg_len; - iov[iovlen].addr_space = EF_ADDRSPACE_LOCAL; - iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; - iov[iovlen].iov_flags = 0; - out_rc += data.msg_len; - break; - - case XSN_CEPH_DATA_REMOTE: - if( n < sizeof(data.remote) || data.msg_len != sizeof(data.remote) ) { - LOG_TR(log(LNTS_FMT "bogus plugin remote block %d/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); - goto unrecoverable; - } - memcpy(&data.remote, p, sizeof(data.remote)); - iov[iovlen].iov_ptr = data.remote.start_ptr + rinf->a->ts->plugin_ddr_base; - iov[iovlen].iov_len = data.remote.data_len; - iov[iovlen].iov_flags = 0; - iov[iovlen].addr_space = netif->state->nic[pkt->intf_i].plugin_addr_space; - out_rc += data.remote.data_len; - - overrun = data.remote.start_ptr + data.remote.data_len - rinf->a->ts->plugin_ddr_size; - if( overrun > 0 ) { - /* This data wraps round the DDR ring buffer; the end of the data - * will be found at the start of the ring. */ - iov[iovlen].iov_len -= overrun; - iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + case XSN_CEPH_DATA_INLINE: + if( n < data.msg_len ) { + LOG_TR(log(LNTS_FMT "bogus plugin inline len %d<%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); + goto unrecoverable; + } + iov[iovlen].iov_base = p; + iov[iovlen].iov_len = data.msg_len; + iov[iovlen].addr_space = EF_ADDRSPACE_LOCAL; + iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + iov[iovlen].iov_flags = 0; + out_rc += data.msg_len; + break; - ++iovlen; - iov[iovlen].iov_ptr = rinf->a->ts->plugin_ddr_base; - iov[iovlen].iov_len = overrun; - iov[iovlen].addr_space = netif->state->nic[pkt->intf_i].plugin_addr_space; - iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + case XSN_CEPH_DATA_REMOTE: + if( n < sizeof(data.remote) || data.msg_len != sizeof(data.remote) ) { + LOG_TR(log(LNTS_FMT "bogus plugin remote block %d/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); + goto unrecoverable; + } + memcpy(&data.remote, p, sizeof(data.remote)); + iov[iovlen].iov_ptr = + data.remote.start_ptr + rinf->a->ts->plugin_ddr_base; + iov[iovlen].iov_len = data.remote.data_len; iov[iovlen].iov_flags = 0; - } + iov[iovlen].addr_space = + netif->state->nic[pkt->intf_i].plugin_addr_space; + out_rc += data.remote.data_len; + + overrun = data.remote.start_ptr + data.remote.data_len - + rinf->a->ts->plugin_ddr_size; + if( overrun > 0 ) { + /* This data wraps round the DDR ring buffer; the end of the data + * will be found at the start of the ring. */ + iov[iovlen].iov_len -= overrun; + iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + + ++iovlen; + iov[iovlen].iov_ptr = rinf->a->ts->plugin_ddr_base; + iov[iovlen].iov_len = overrun; + iov[iovlen].addr_space = + netif->state->nic[pkt->intf_i].plugin_addr_space; + iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + iov[iovlen].iov_flags = 0; + } - /* CRC iov; we are currently wasting a new iov, since we can't distinguish - * whether the CRC is enabled or not. */ - ++iovlen; - iov[iovlen].iov_flags = ONLOAD_ZC_RECV_FLAG_OFFLOAD_OOB; + /* CRC iov; we are currently wasting a new iov, since we can't + * distinguish whether the CRC is enabled or not. */ + ++iovlen; + iov[iovlen].iov_flags = ONLOAD_ZC_RECV_FLAG_OFFLOAD_OOB; - /* Pass the address of the CRC within the packet buffer. This is not - * necessarily naturally aligned. */ - iov[iovlen].iov_len = sizeof(data.remote.data_crc); - iov[iovlen].iov_base = p + CI_MEMBER_OFFSET(typeof(data.remote), - data_crc); - ci_assert_le((uintptr_t) iov[iovlen].iov_base + iov[iovlen].iov_len, - (uintptr_t) p + sizeof(data.remote)); + /* Pass the address of the CRC within the packet buffer. This is not + * necessarily naturally aligned. */ + iov[iovlen].iov_len = sizeof(data.remote.data_crc); + iov[iovlen].iov_base = + p + CI_MEMBER_OFFSET(typeof(data.remote), data_crc); + ci_assert_le((uintptr_t) iov[iovlen].iov_base + iov[iovlen].iov_len, + (uintptr_t) p + sizeof(data.remote)); - iov[iovlen].addr_space = EF_ADDRSPACE_LOCAL; - iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; + iov[iovlen].addr_space = EF_ADDRSPACE_LOCAL; + iov[iovlen].buf = ONLOAD_ZC_HANDLE_NONZC; - break; + break; - case XSN_CEPH_DATA_LOST_SYNC: - if( n < sizeof(data.lost_sync) || - data.msg_len != sizeof(data.lost_sync) ) { - LOG_TR(log(LNTS_FMT "bogus plugin lost-sync block %d/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); + case XSN_CEPH_DATA_LOST_SYNC: + if( n < sizeof(data.lost_sync) || + data.msg_len != sizeof(data.lost_sync) ) { + LOG_TR(log(LNTS_FMT "bogus plugin lost-sync block %d/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), n, data.msg_len)); + goto unrecoverable; + } + memcpy(&data.lost_sync, p, sizeof(data.lost_sync)); + log(LNTS_FMT "plugin lost sync: %u/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), data.lost_sync.reason, + data.lost_sync.subreason); + rinf->a->msg->msg_controllen = 0; + *ndata = out_rc; + /* Set the return value so that we'll keep hitting this same lost-sync + * message on every receive, and hence block the socket from making + * further progress */ + return total - n - hdr_len; + + default: + LOG_TR(log(LNTS_FMT "bogus plugin metastream header %u/%u", + LNTS_PRI_ARGS(netif, rinf->a->ts), data.msg_type, data.msg_len)); goto unrecoverable; - } - memcpy(&data.lost_sync, p, sizeof(data.lost_sync)); - log(LNTS_FMT "plugin lost sync: %u/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), data.lost_sync.reason, - data.lost_sync.subreason); - rinf->a->msg->msg_controllen = 0; - *ndata = out_rc; - /* Set the return value so that we'll keep hitting this same lost-sync - * message on every receive, and hence block the socket from making - * further progress */ - return total - n - hdr_len; - - default: - LOG_TR(log(LNTS_FMT "bogus plugin metastream header %u/%u", - LNTS_PRI_ARGS(netif, rinf->a->ts), data.msg_type, - data.msg_len)); - goto unrecoverable; } ++iovlen; @@ -1833,22 +1821,22 @@ static int zc_ceph_callback(ci_netif* netif, struct tcp_recv_info* rinf, * this case, is the first iov of the last batch, to match how UDP uses the * zc callback. */ pkt->rx_flags |= CI_PKT_RX_FLAG_KEEP; - pkt->user_refcount = CI_ZC_USER_REFCOUNT_ONE; - iov[0].buf = zc_pktbuf_to_handle(pkt); - rinf->zc_args->msg.iov = iov; + pkt->user_refcount = CI_ZC_USER_REFCOUNT_ONE; + iov[0].buf = zc_pktbuf_to_handle(pkt); + rinf->zc_args->msg.iov = iov; rinf->zc_args->msg.msghdr.msg_iovlen = iovlen; - rinf->zc_args->msg.msghdr.msg_flags = rinf->msg_flags; - cb_rc = rinf->zc_args->cb(rinf->zc_args, 0); + rinf->zc_args->msg.msghdr.msg_flags = rinf->msg_flags; + cb_rc = rinf->zc_args->cb(rinf->zc_args, 0); if( cb_rc & ONLOAD_ZC_TERMINATE ) { /* Make it look like the non-zc buffer is full */ rinf->piov.io.iov_len = 0; - rinf->piov.iovlen = 0; + rinf->piov.iovlen = 0; } ci_pkt_zc_free_clean(pkt, cb_rc); *ndata = out_rc; - unrecoverable: +unrecoverable: /* The correct thing to do with bad framing is debatable. This code throws * away the remainder of the packet and continues on without telling the * app. An easy other option would be to put the app in a continuous loop of @@ -1863,11 +1851,11 @@ static int zc_ceph_callback(ci_netif* netif, struct tcp_recv_info* rinf, static int zc_call_callback(ci_netif* netif, struct tcp_recv_info* rinf, - ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) + ci_ip_pkt_fmt* pkt, int peek_off, int* ndata) { - int n = oo_offbuf_left(&pkt->buf); + int n = oo_offbuf_left(&pkt->buf); enum onload_zc_callback_rc cb_rc; - struct onload_zc_iovec iov; + struct onload_zc_iovec iov; #if CI_CFG_TCP_OFFLOAD_RECYCLER if( ci_tcp_is_pluginized(rinf->a->ts) ) @@ -1884,17 +1872,17 @@ static int zc_call_callback(ci_netif* netif, struct tcp_recv_info* rinf, */ pkt->rx_flags |= CI_PKT_RX_FLAG_KEEP; - rinf->zc_args->msg.iov = &iov; + rinf->zc_args->msg.iov = &iov; rinf->zc_args->msg.msghdr.msg_iovlen = 1; - rinf->zc_args->msg.msghdr.msg_flags = rinf->msg_flags; - iov.buf = zc_pktbuf_to_handle(pkt); - iov.iov_base = oo_offbuf_ptr(&pkt->buf) + peek_off; - iov.iov_len = oo_offbuf_left(&pkt->buf) - peek_off; - iov.iov_flags = 0; + rinf->zc_args->msg.msghdr.msg_flags = rinf->msg_flags; + iov.buf = zc_pktbuf_to_handle(pkt); + iov.iov_base = oo_offbuf_ptr(&pkt->buf) + peek_off; + iov.iov_len = oo_offbuf_left(&pkt->buf) - peek_off; + iov.iov_flags = 0; - iov.addr_space = EF_ADDRSPACE_LOCAL; - pkt->user_refcount = CI_ZC_USER_REFCOUNT_ONE; - cb_rc = rinf->zc_args->cb(rinf->zc_args, 0); + iov.addr_space = EF_ADDRSPACE_LOCAL; + pkt->user_refcount = CI_ZC_USER_REFCOUNT_ONE; + cb_rc = rinf->zc_args->cb(rinf->zc_args, 0); ci_pkt_zc_free_clean(pkt, cb_rc); if( cb_rc & ONLOAD_ZC_KEEP ) { @@ -1906,25 +1894,25 @@ static int zc_call_callback(ci_netif* netif, struct tcp_recv_info* rinf, if( cb_rc & ONLOAD_ZC_TERMINATE ) { /* Make it look like the non-zc buffer is full */ rinf->piov.io.iov_len = 0; - rinf->piov.iovlen = 0; + rinf->piov.iovlen = 0; } rinf->a->msg->msg_controllen = 0; - *ndata = n; + *ndata = n; return n; } -int ci_tcp_zc_recvmsg(const ci_tcp_recvmsg_args* a, - struct onload_zc_recv_args* args) +int ci_tcp_zc_recvmsg( + const ci_tcp_recvmsg_args* a, struct onload_zc_recv_args* args) { /* This fill_msgname is duplicated at the end of ci_tcp_recvmsg_impl, but we * want to get the value filled in before the callback is called. The * potential for inefficiency is basically irrelevant since the function * does very little in all standard build configurations */ - ci_tcp_recv_fill_msgname(a->ts, (struct sockaddr*) a->msg->msg_name, - &a->msg->msg_namelen); + ci_tcp_recv_fill_msgname( + a->ts, (struct sockaddr*) a->msg->msg_name, &a->msg->msg_namelen); return ci_tcp_recvmsg_impl(a, zc_call_callback, args); } #endif diff --git a/src/lib/transport/ip/udp_recv.c b/src/lib/transport/ip/udp_recv.c index 752f5a979..6a7994823 100644 --- a/src/lib/transport/ip/udp_recv.c +++ b/src/lib/transport/ip/udp_recv.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief UDP recvmsg() etc. @@ -10,18 +10,18 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_ip */ -#define _GNU_SOURCE /* for recvmmsg */ +#define _GNU_SOURCE /* for recvmmsg */ #include "ip_internal.h" #include #ifndef __KERNEL__ -# include +#include #endif -#if !defined(__KERNEL__) +#if ! defined(__KERNEL__) #include #include #endif @@ -29,13 +29,13 @@ #if OO_DO_STACK_POLL #define VERB(x) -#define LPF "ci_udp_" -#define LPFIN LPF -#define LPFOUT LPF +#define LPF "ci_udp_" +#define LPFIN LPF +#define LPFOUT LPF /* Special return codes from ci_udp_recvmsg_socklocked_slowpath() */ -#define SLOWPATH_RET_IOVLEN_INITED (1<<30) -#define SLOWPATH_RET_ZERO (SLOWPATH_RET_IOVLEN_INITED + 1) +#define SLOWPATH_RET_IOVLEN_INITED (1 << 30) +#define SLOWPATH_RET_ZERO (SLOWPATH_RET_IOVLEN_INITED + 1) /* Implementation: ** MSG_PEEK supported @@ -54,48 +54,47 @@ ** ** On Linux, MSG_OOB is ignored. */ -#define MSG_OOB_CHK 0 +#define MSG_OOB_CHK 0 #ifdef MSG_ERRQUEUE -# define MSG_ERRQUEUE_CHK MSG_ERRQUEUE +#define MSG_ERRQUEUE_CHK MSG_ERRQUEUE #else -# define MSG_ERRQUEUE_CHK 0 +#define MSG_ERRQUEUE_CHK 0 #endif #ifndef __KERNEL__ -# define HAVE_MSG_FLAGS 1 +#define HAVE_MSG_FLAGS 1 #else -# define HAVE_MSG_FLAGS 0 +#define HAVE_MSG_FLAGS 0 #endif -#define LOCAL_MSG_TRUNC MSG_TRUNC +#define LOCAL_MSG_TRUNC MSG_TRUNC typedef struct { - ci_udp_iomsg_args *a; - ci_msghdr* msg; - int sock_locked; - int flags; + ci_udp_iomsg_args* a; + ci_msghdr* msg; + int sock_locked; + int flags; #if HAVE_MSG_FLAGS int msg_flags; #endif } ci_udp_recv_info; -ci_inline void ci_udp_recvmsg_fill_msghdr(ci_netif* ni, ci_msghdr* msg, - const ci_ip_pkt_fmt* pkt, - ci_sock_cmn* s) +ci_inline void ci_udp_recvmsg_fill_msghdr( + ci_netif* ni, ci_msghdr* msg, const ci_ip_pkt_fmt* pkt, ci_sock_cmn* s) { #ifndef __KERNEL__ if( msg != NULL ) { if( msg->msg_name != NULL ) { - int af; + int af; const ci_udp_hdr* udp; - ci_addr_t saddr; + ci_addr_t saddr; if( pkt->flags & CI_PKT_FLAG_INDIRECT ) pkt = PKT_CHK_NNL(ni, pkt->frag_next); - af = oo_pkt_af(pkt); - udp = oo_ipx_data(af, (ci_ip_pkt_fmt*)pkt); - saddr = RX_PKT_SADDR((ci_ip_pkt_fmt*)pkt); + af = oo_pkt_af(pkt); + udp = oo_ipx_data(af, (ci_ip_pkt_fmt*) pkt); + saddr = RX_PKT_SADDR((ci_ip_pkt_fmt*) pkt); #if CI_CFG_IPV6 if( CI_IPX_IS_LINKLOCAL(saddr) ) @@ -103,8 +102,8 @@ ci_inline void ci_udp_recvmsg_fill_msghdr(ci_netif* ni, ci_msghdr* msg, #endif ci_addr_to_user(CI_SA(msg->msg_name), &msg->msg_namelen, af, s->domain, - udp->udp_source_be16, CI_IPX_ADDR_PTR(af, saddr), - s->cp.so_bindtodevice); + udp->udp_source_be16, CI_IPX_ADDR_PTR(af, saddr), + s->cp.so_bindtodevice); } } #endif @@ -123,45 +122,43 @@ ci_inline int do_copy(void* to, const void* from, int n_bytes) struct oo_copy_state { - int pkt_left; - int pkt_off; - int bytes_copied; - int bytes_to_copy; - const char *from; + int pkt_left; + int pkt_off; + int bytes_copied; + int bytes_to_copy; + const char* from; const ci_ip_pkt_fmt* pkt; }; -ci_inline int -__oo_copy_frag_to_iovec_no_adv(ci_netif* ni, - ci_iovec_ptr* piov, - struct oo_copy_state *ocs) +ci_inline int __oo_copy_frag_to_iovec_no_adv( + ci_netif* ni, ci_iovec_ptr* piov, struct oo_copy_state* ocs) { int n; - n = CI_MIN((size_t)ocs->pkt_left, CI_IOVEC_LEN(&piov->io)); + n = CI_MIN((size_t) ocs->pkt_left, CI_IOVEC_LEN(&piov->io)); n = CI_MIN(n, ocs->bytes_to_copy); - if(CI_UNLIKELY( do_copy(CI_IOVEC_BASE(&piov->io), - ocs->from + ocs->pkt_off, n) != 0 )) + if( CI_UNLIKELY(do_copy(CI_IOVEC_BASE(&piov->io), ocs->from + ocs->pkt_off, + n) != 0) ) return -EFAULT; - + ocs->bytes_copied += n; ocs->pkt_off += n; if( n == ocs->bytes_to_copy ) return 0; - + ocs->bytes_to_copy -= n; if( n == ocs->pkt_left ) { /* Caller guarantees that packet contains at least [bytes_to_copy]. */ ci_assert(OO_PP_NOT_NULL(ocs->pkt->frag_next)); ci_iovec_ptr_advance(piov, n); - ocs->pkt = PKT_CHK_NNL(ni, ocs->pkt->frag_next); + ocs->pkt = PKT_CHK_NNL(ni, ocs->pkt->frag_next); ocs->pkt_off = 0; /* We're unlikely to hit end-of-pkt-buf and end-of-iovec at the same * time, and if we do, just go round the loop again. */ return 1; } - + ci_assert_equal(n, CI_IOVEC_LEN(&piov->io)); if( piov->iovlen == 0 ) return 0; @@ -172,9 +169,8 @@ __oo_copy_frag_to_iovec_no_adv(ci_netif* ni, } -static int -oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, - ci_iovec_ptr* piov, int bytes_to_copy) +static int oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, + ci_iovec_ptr* piov, int bytes_to_copy) { /* Copy data from [pkt] to [piov], following [pkt->frag_next] as * necessary. Does not modify [pkt]. May or may not advance [piov]. @@ -183,17 +179,17 @@ oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, * * Returns number of bytes copied on success, or -EFAULT otherwise. */ - int rc; + int rc; struct oo_copy_state ocs; - ocs.bytes_copied = 0; + ocs.bytes_copied = 0; ocs.bytes_to_copy = bytes_to_copy; - ocs.pkt_off = 0; - ocs.pkt = pkt; + ocs.pkt_off = 0; + ocs.pkt = pkt; while( 1 ) { ocs.pkt_left = oo_offbuf_left(&(ocs.pkt->buf)) - ocs.pkt_off; - ocs.from = oo_offbuf_ptr(&(ocs.pkt->buf)); - rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); + ocs.from = oo_offbuf_ptr(&(ocs.pkt->buf)); + rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); if( rc == 0 ) return ocs.bytes_copied; else if( rc == 1 ) @@ -209,26 +205,25 @@ oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, #ifndef __KERNEL__ #if CI_CFG_TIMESTAMPING /* Very similar to oo_copy_pkt_to_iovec_no_adv() but doesn't use pkt->buf */ -static int -ci_udp_timestamp_q_pkt_to_iovec(ci_netif* ni, const ci_ip_pkt_fmt* pkt, - ci_iovec_ptr* piov) +static int ci_udp_timestamp_q_pkt_to_iovec( + ci_netif* ni, const ci_ip_pkt_fmt* pkt, ci_iovec_ptr* piov) { - int rc; + int rc; struct oo_copy_state ocs; - ocs.bytes_copied = 0; + ocs.bytes_copied = 0; /* We have to copy all chunks of jumbo frame, so pkt->buf_len is wrong * here. */ ocs.bytes_to_copy = CI_BSWAP_BE16(oo_ip_hdr_const(pkt)->ip_tot_len_be16) + - oo_tx_pre_l3_len(pkt); + oo_tx_pre_l3_len(pkt); ocs.pkt_off = 0; - ocs.pkt = pkt; + ocs.pkt = pkt; while( 1 ) { /* Don't use pkt->buf so we don't interfere with the data path. We * need different offsets to include the delivery of the headers */ ocs.pkt_left = ocs.pkt->buf_len - ocs.pkt_off; - ocs.from = (char *)oo_ether_hdr_const(ocs.pkt); - rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); + ocs.from = (char*) oo_ether_hdr_const(ocs.pkt); + rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); if( rc == 0 ) return ocs.bytes_copied; else if( rc == 1 ) @@ -246,20 +241,20 @@ ci_udp_timestamp_q_pkt_to_iovec(ci_netif* ni, const ci_ip_pkt_fmt* pkt, #ifndef __KERNEL__ /* Max number of iovecs needed: * = max_datagram / (min_mtu - udp_header) - * = 65536 / (576 - 28) + * = 65536 / (576 - 28) * = 120 */ #define CI_UDP_ZC_IOVEC_MAX 120 -static void ci_udp_pkt_to_zc_msg(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct onload_zc_msg* zc_msg) +static void ci_udp_pkt_to_zc_msg( + ci_netif* ni, ci_ip_pkt_fmt* pkt, struct onload_zc_msg* zc_msg) { - int i, bytes_left = pkt->pf.udp.pay_len; + int i, bytes_left = pkt->pf.udp.pay_len; ci_ip_pkt_fmt* frag; ci_ip_pkt_fmt* handle_frag; handle_frag = frag = pkt; - i = 0; + i = 0; ci_assert_nequal(zc_msg->iov, NULL); /* Ignore first frag if zero length and there is another frag, but @@ -271,74 +266,73 @@ static void ci_udp_pkt_to_zc_msg(ci_netif* ni, ci_ip_pkt_fmt* pkt, handle_frag->user_refcount = CI_ZC_USER_REFCOUNT_ONE; do { - zc_msg->iov[i].iov_len = CI_MIN(oo_offbuf_left(&frag->buf), - bytes_left); - zc_msg->iov[i].iov_base = oo_offbuf_ptr(&frag->buf); - zc_msg->iov[i].buf = zc_pktbuf_to_handle(handle_frag); - zc_msg->iov[i].iov_flags = 0; + zc_msg->iov[i].iov_len = CI_MIN(oo_offbuf_left(&frag->buf), bytes_left); + zc_msg->iov[i].iov_base = oo_offbuf_ptr(&frag->buf); + zc_msg->iov[i].buf = zc_pktbuf_to_handle(handle_frag); + zc_msg->iov[i].iov_flags = 0; zc_msg->iov[i].addr_space = EF_ADDRSPACE_LOCAL; bytes_left -= zc_msg->iov[i].iov_len; ++i; - if( OO_PP_IS_NULL(frag->frag_next) || - (i == CI_UDP_ZC_IOVEC_MAX) || + if( OO_PP_IS_NULL(frag->frag_next) || (i == CI_UDP_ZC_IOVEC_MAX) || (bytes_left == 0) ) break; - frag = PKT_CHK_NNL(ni, frag->frag_next); + frag = PKT_CHK_NNL(ni, frag->frag_next); handle_frag = frag; } while( 1 ); zc_msg->msghdr.msg_iovlen = i; } -# if CI_CFG_ZC_RECV_FILTER -static void ci_udp_filter_kernel_pkt(ci_netif* ni, ci_udp_state* us, - struct msghdr* msg, int *bytes) +#if CI_CFG_ZC_RECV_FILTER +static void ci_udp_filter_kernel_pkt( + ci_netif* ni, ci_udp_state* us, struct msghdr* msg, int* bytes) { enum onload_zc_callback_rc rc; - struct onload_zc_msg zc_msg; - struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags = 0; - int i = 0, bytes_remaining = *bytes; + struct onload_zc_msg zc_msg; + struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; + unsigned cb_flags = 0; + int i = 0, bytes_remaining = *bytes; if( msg->msg_iovlen > CI_UDP_ZC_IOVEC_MAX ) { LOG_U(log("%s: too many fragments (%d), passing packet unfiltered", - __FUNCTION__, (int)msg->msg_iovlen)); + __FUNCTION__, (int) msg->msg_iovlen)); return; } - zc_msg.iov = zc_iovec; - zc_msg.msghdr = *msg; + zc_msg.iov = zc_iovec; + zc_msg.msghdr = *msg; zc_msg.msghdr.msg_iov = NULL; ci_assert_gt(msg->msg_iovlen, 0); do { - zc_msg.iov[i].iov_base = msg->msg_iov[i].iov_base; - zc_msg.iov[i].iov_len = msg->msg_iov[i].iov_len > bytes_remaining ? - bytes_remaining : msg->msg_iov[i].iov_len; - zc_msg.iov[i].buf = ONLOAD_ZC_HANDLE_NONZC; + zc_msg.iov[i].iov_base = msg->msg_iov[i].iov_base; + zc_msg.iov[i].iov_len = msg->msg_iov[i].iov_len > bytes_remaining + ? bytes_remaining + : msg->msg_iov[i].iov_len; + zc_msg.iov[i].buf = ONLOAD_ZC_HANDLE_NONZC; zc_msg.iov[i].iov_flags = 0; bytes_remaining -= zc_msg.iov[i].iov_len; - } while(++i < msg->msg_iovlen && bytes_remaining); + } while( ++i < msg->msg_iovlen && bytes_remaining ); zc_msg.msghdr.msg_iovlen = i; - rc = (*(onload_zc_recv_filter_callback)((ci_uintptr_t)us->recv_q_filter)) - (&zc_msg, (void *)((ci_uintptr_t)us->recv_q_filter_arg), cb_flags); + rc = (*(onload_zc_recv_filter_callback) ((ci_uintptr_t) us->recv_q_filter))( + &zc_msg, (void*) ((ci_uintptr_t) us->recv_q_filter_arg), cb_flags); ci_assert_equal(rc, ONLOAD_ZC_CONTINUE); - (void)rc; + (void) rc; } -# endif +#endif #endif /* __KERNEL__ */ static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) { - ci_netif* ni = rinf->a->ni; - ci_udp_state* us = rinf->a->us; - ci_msghdr* msg = rinf->msg; + ci_netif* ni = rinf->a->ni; + ci_udp_state* us = rinf->a->us; + ci_msghdr* msg = rinf->msg; ci_ip_pkt_fmt* pkt; - int rc; + int rc; /* NB. [msg] can be NULL for async recv. */ @@ -347,49 +341,50 @@ static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) #ifndef __KERNEL__ if( msg != NULL ) { - if( CI_UNLIKELY(us->s.cmsg_flags != 0 ) ) + if( CI_UNLIKELY(us->s.cmsg_flags != 0) ) ci_ip_cmsg_recv(ni, us, pkt, msg, 0, &rinf->msg_flags); else msg->msg_controllen = 0; } #endif - us->stamp = pkt->tstamp_frc; + us->stamp = pkt->tstamp_frc; us->future_intf_i = pkt->intf_i; rc = oo_copy_pkt_to_iovec_no_adv(ni, pkt, piov, pkt->pf.udp.pay_len); - if(CI_LIKELY( rc >= 0 )) { + if( CI_LIKELY(rc >= 0) ) { #if HAVE_MSG_FLAGS - if(CI_UNLIKELY( rc < pkt->pf.udp.pay_len && msg != NULL )) + if( CI_UNLIKELY(rc < pkt->pf.udp.pay_len && msg != NULL) ) rinf->msg_flags |= LOCAL_MSG_TRUNC; #endif ci_udp_recvmsg_fill_msghdr(ni, msg, pkt, &us->s); if( ! (rinf->flags & MSG_PEEK) ) { #ifndef __KERNEL__ -# if CI_CFG_ZC_RECV_FILTER +#if CI_CFG_ZC_RECV_FILTER if( us->recv_q_filter ) { - struct onload_zc_msg zc_msg; + struct onload_zc_msg zc_msg; struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags; - int filterrc; + unsigned cb_flags; + int filterrc; - zc_msg.iov = zc_iovec; + zc_msg.iov = zc_iovec; zc_msg.msghdr.msg_controllen = 0; - zc_msg.msghdr.msg_flags = 0; + zc_msg.msghdr.msg_flags = 0; ci_udp_pkt_to_zc_msg(ni, pkt, &zc_msg); - cb_flags = CI_IP_IS_MULTICAST(oo_ip_hdr(pkt)->ip_daddr_be32) ? - ONLOAD_ZC_MSG_SHARED : 0; - filterrc = - (*(onload_zc_recv_filter_callback)((ci_uintptr_t)us->recv_q_filter)) - (&zc_msg, (void *)((ci_uintptr_t)us->recv_q_filter_arg), cb_flags); + cb_flags = CI_IP_IS_MULTICAST(oo_ip_hdr(pkt)->ip_daddr_be32) + ? ONLOAD_ZC_MSG_SHARED + : 0; + filterrc = (*(onload_zc_recv_filter_callback) (( + ci_uintptr_t) us->recv_q_filter))( + &zc_msg, (void*) ((ci_uintptr_t) us->recv_q_filter_arg), cb_flags); ci_assert_equal(filterrc, ONLOAD_ZC_CONTINUE); - (void)filterrc; + (void) filterrc; pkt->pio_addr = -1; } -# endif +#endif #endif ci_udp_recv_q_deliver(ni, &us->recv_q, pkt); @@ -399,15 +394,15 @@ static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) return rc; - recv_q_is_empty: +recv_q_is_empty: return -EAGAIN; } #ifndef __KERNEL__ -static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, - struct msghdr* msg, int flags, int* prc) +static int __ci_udp_recvmsg_try_os( + ci_netif* ni, ci_udp_state* us, struct msghdr* msg, int flags, int* prc) { int rc; @@ -417,11 +412,10 @@ static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, ++us->stats.n_rx_os; us->udpflags &= ~CI_UDPF_LAST_RECV_ON; if( ! (flags & MSG_PEEK) ) - us->udpflags &=~ CI_UDPF_PEEK_FROM_OS; + us->udpflags &= ~CI_UDPF_PEEK_FROM_OS; else - us->udpflags |= CI_UDPF_PEEK_FROM_OS; - } - else { + us->udpflags |= CI_UDPF_PEEK_FROM_OS; + } else { if( rc == -EAGAIN ) return 0; CI_SET_ERROR(rc, -rc); @@ -432,14 +426,14 @@ static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, return 1; } -#else /* __KERNEL__ */ +#else /* __KERNEL__ */ -static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, - ci_msghdr* msg, int flags, int* prc) +static int __ci_udp_recvmsg_try_os( + ci_netif* ni, ci_udp_state* us, ci_msghdr* msg, int flags, int* prc) { int rc, total_bytes, i; - tcp_helper_endpoint_t *ep = ci_netif_ep_get(ni, us->s.b.bufid); - struct socket *sock; + tcp_helper_endpoint_t* ep = ci_netif_ep_get(ni, us->s.b.bufid); + struct socket* sock; oo_os_file os_sock; struct msghdr kmsg; @@ -471,8 +465,7 @@ static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, if( rc >= 0 ) { ++us->stats.n_rx_os; - } - else { + } else { if( rc == -EAGAIN ) return 0; ++us->stats.n_rx_os_error; @@ -481,22 +474,22 @@ static int __ci_udp_recvmsg_try_os(ci_netif *ni, ci_udp_state *us, if( rc >= 0 ) { us->udpflags &= ~CI_UDPF_LAST_RECV_ON; if( ! (flags & MSG_PEEK) ) - us->udpflags &=~ CI_UDPF_PEEK_FROM_OS; + us->udpflags &= ~CI_UDPF_PEEK_FROM_OS; else - us->udpflags |= CI_UDPF_PEEK_FROM_OS; + us->udpflags |= CI_UDPF_PEEK_FROM_OS; } *prc = rc; return 1; } -#endif /* __KERNEL__ */ +#endif /* __KERNEL__ */ -static int ci_udp_recvmsg_try_os(ci_udp_recv_info *rinf, int* prc) +static int ci_udp_recvmsg_try_os(ci_udp_recv_info* rinf, int* prc) { - ci_udp_state *us = rinf->a->us; - int rc; + ci_udp_state* us = rinf->a->us; + int rc; - if( !(us->s.os_sock_status & OO_OS_STATUS_RX) ) + if( ! (us->s.os_sock_status & OO_OS_STATUS_RX) ) return 0; rc = __ci_udp_recvmsg_try_os(rinf->a->ni, us, rinf->msg, rinf->flags, prc); #if HAVE_MSG_FLAGS @@ -508,28 +501,28 @@ static int ci_udp_recvmsg_try_os(ci_udp_recv_info *rinf, int* prc) #endif #ifndef __KERNEL__ -# if CI_CFG_ZC_RECV_FILTER - if( us->recv_q_filter && rc == 1 && *prc >= 0) +#if CI_CFG_ZC_RECV_FILTER + if( us->recv_q_filter && rc == 1 && *prc >= 0 ) ci_udp_filter_kernel_pkt(rinf->a->ni, us, rinf->msg, prc); -# endif +#endif #endif return rc; } -static int ci_udp_recvmsg_socklocked_slowpath(ci_udp_recv_info* rinf, - ci_iovec_ptr *piov) +static int ci_udp_recvmsg_socklocked_slowpath( + ci_udp_recv_info* rinf, ci_iovec_ptr* piov) { - int rc = 0; - ci_netif* ni = rinf->a->ni; + int rc = 0; + ci_netif* ni = rinf->a->ni; ci_udp_state* us = rinf->a->us; - if(CI_UNLIKELY( ni->state->rxq_low )) - ci_netif_rxq_low_on_recv(ni, &us->s, - 1 /* assume at least one pkt freed */); - /* In the kernel recv() with flags is not called. - * only read(). So flags may only contain MSG_DONTWAIT */ + if( CI_UNLIKELY(ni->state->rxq_low) ) + ci_netif_rxq_low_on_recv( + ni, &us->s, 1 /* assume at least one pkt freed */); + /* In the kernel recv() with flags is not called. + * only read(). So flags may only contain MSG_DONTWAIT */ #ifdef __KERNEL__ ci_assert_equal(rinf->flags, 0); #endif @@ -549,68 +542,66 @@ static int ci_udp_recvmsg_socklocked_slowpath(ci_udp_recv_info* rinf, struct { struct oo_sock_extended_err ee; union { - struct sockaddr_in offender; + struct sockaddr_in offender; #if CI_CFG_IPV6 - struct sockaddr_in6 offender6; + struct sockaddr_in6 offender6; #endif }; } __attribute__((packed, aligned(sizeof(ci_uint32)))) errhdr; - int do_data = ( rinf->msg->msg_iovlen > 0 ); + int do_data = (rinf->msg->msg_iovlen > 0); - cmsg_state.msg = rinf->msg; - cmsg_state.cm = rinf->msg->msg_control; + cmsg_state.msg = rinf->msg; + cmsg_state.cm = rinf->msg->msg_control; cmsg_state.cmsg_bytes_used = 0; - cmsg_state.p_msg_flags = &rinf->msg_flags; + cmsg_state.p_msg_flags = &rinf->msg_flags; if( do_data ) ci_iovec_ptr_init_nz(piov, rinf->msg->msg_iov, rinf->msg->msg_iovlen); if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_ONLOAD ) { - struct onload_timestamp ts = {pkt->hw_stamp.tv_sec, - pkt->hw_stamp.tv_nsec}; - ci_put_cmsg(&cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING, - sizeof(ts), &ts); - } - else { + struct onload_timestamp ts = { pkt->hw_stamp.tv_sec, + pkt->hw_stamp.tv_nsec }; + ci_put_cmsg( + &cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING, sizeof(ts), &ts); + } else { struct timespec ts[3]; memset(ts, 0, sizeof(ts)); if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_RAW_HARDWARE ) { - ts[2].tv_sec = pkt->hw_stamp.tv_sec; + ts[2].tv_sec = pkt->hw_stamp.tv_sec; ts[2].tv_nsec = pkt->hw_stamp.tv_nsec; } - if( (us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_SYS_HARDWARE) && + if( (us->s.timestamping_flags & + ONLOAD_SOF_TIMESTAMPING_SYS_HARDWARE) && (pkt->hw_stamp.tv_nsec & CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC) ) { - ts[1].tv_sec = pkt->hw_stamp.tv_sec; + ts[1].tv_sec = pkt->hw_stamp.tv_sec; ts[1].tv_nsec = pkt->hw_stamp.tv_nsec; } - ci_put_cmsg(&cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING, - sizeof(ts), &ts); + ci_put_cmsg( + &cmsg_state, SOL_SOCKET, ONLOAD_SCM_TIMESTAMPING, sizeof(ts), &ts); } if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_OPT_TSONLY ) { rc = SLOWPATH_RET_ZERO; - } - else if( do_data ) { + } else if( do_data ) { rc = ci_udp_timestamp_q_pkt_to_iovec(ni, pkt, piov); if( rc < pkt->buf_len ) rinf->msg_flags |= LOCAL_MSG_TRUNC; - } - else { + } else { rinf->msg_flags |= LOCAL_MSG_TRUNC; rc = SLOWPATH_RET_ZERO; } memset(&errhdr, 0, sizeof(errhdr)); - errhdr.ee.ee_errno = ENOMSG; + errhdr.ee.ee_errno = ENOMSG; errhdr.ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; - errhdr.ee.ee_info = 0; - errhdr.ee.ee_data = pkt->ts_key; + errhdr.ee.ee_info = 0; + errhdr.ee.ee_data = pkt->ts_key; if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_OPT_CMSG ) { ci_addr_t saddr = ipx_hdr_saddr(oo_pkt_af(pkt), oo_ipx_hdr(pkt)); #if CI_CFG_IPV6 if( IS_AF_INET6(us->s.domain) ) - ci_make_sockaddr_in6_from_ip6(&errhdr.offender6, 0, - (ci_uint32*)saddr.ip6); + ci_make_sockaddr_in6_from_ip6( + &errhdr.offender6, 0, (ci_uint32*) saddr.ip6); else #endif ci_make_sockaddr_from_ip4(&errhdr.offender, 0, saddr.ip4); @@ -622,11 +613,11 @@ static int ci_udp_recvmsg_socklocked_slowpath(ci_udp_recv_info* rinf, #if CI_CFG_IPV6 if( IS_AF_INET6(us->s.domain) ) ci_put_cmsg(&cmsg_state, SOL_IPV6, IPV6_RECVERR, - sizeof(errhdr.ee) + sizeof(errhdr.offender6), &errhdr); + sizeof(errhdr.ee) + sizeof(errhdr.offender6), &errhdr); else #endif ci_put_cmsg(&cmsg_state, SOL_IP, IP_RECVERR, - sizeof(errhdr.ee) + sizeof(errhdr.offender), &errhdr); + sizeof(errhdr.ee) + sizeof(errhdr.offender), &errhdr); ci_ip_cmsg_finish(&cmsg_state); rinf->msg_flags |= MSG_ERRQUEUE_CHK; @@ -637,8 +628,7 @@ static int ci_udp_recvmsg_socklocked_slowpath(ci_udp_recv_info* rinf, rc = oo_os_sock_recvmsg(ni, SC_SP(&us->s), rinf->msg, rinf->flags); if( rc < 0 ) { RET_WITH_ERRNO(-rc); - } - else { + } else { rinf->msg_flags = rinf->msg->msg_flags; return rc == 0 ? SLOWPATH_RET_ZERO : rc; } @@ -654,8 +644,8 @@ static int ci_udp_recvmsg_socklocked_slowpath(ci_udp_recv_info* rinf, return rc; } #endif -#if CI_CFG_POSIX_RECV - if( ! udp_lport_be16(us)) { +#if CI_CFG_POSIX_RECV + if( ! udp_lport_be16(us) ) { LOG_UV(log("%s: -1 (ENOTCONN)", __FUNCTION__)); CI_SET_ERROR(rc, ENOTCONN); return rc; @@ -675,29 +665,28 @@ struct recvmsg_spinstate { ci_uint64 start_frc; ci_uint64 schedule_frc; ci_uint64 max_spin; - int do_spin; - int spin_limit_by_so; + int do_spin; + int spin_limit_by_so; ci_uint32 timeout; #ifndef __KERNEL__ - uint32_t poison; + uint32_t poison; const volatile uint32_t* future; - citp_signal_info* si; + citp_signal_info* si; #endif }; -static int -ci_udp_recvmsg_block(ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, - int timeout) +static int ci_udp_recvmsg_block( + ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, int timeout) { int rc; #ifndef __KERNEL__ { citp_signal_info* si; - struct pollfd pfd; - int inside_lib; - pfd.fd = a->fd; + struct pollfd pfd; + int inside_lib; + pfd.fd = a->fd; pfd.events = POLLIN; if( timeout == 0 ) @@ -709,7 +698,7 @@ ci_udp_recvmsg_block(ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, si = citp_signal_get_specific_inited(); continue_to_block: inside_lib = oo_exit_lib_temporary_begin(si); - rc = ci_sys_poll(&pfd, 1, timeout); + rc = ci_sys_poll(&pfd, 1, timeout); oo_exit_lib_temporary_end(si, inside_lib); if( rc > 0 ) @@ -720,7 +709,7 @@ ci_udp_recvmsg_block(ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, timeout == -1 ) { /* Blocking recv() should only be restarted if there is no timeout. */ goto continue_to_block; - } else + } else rc = -errno; return rc; @@ -740,11 +729,9 @@ ci_udp_recvmsg_block(ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, if( rc == 0 ) { if( mask ) { return 0; - } - else + } else rc = -EAGAIN; - } - else if( rc == -ERESTARTSYS && us->s.so.rcvtimeo_msec ) + } else if( rc == -ERESTARTSYS && us->s.so.rcvtimeo_msec ) rc = -EINTR; } return rc; @@ -752,9 +739,8 @@ ci_udp_recvmsg_block(ci_udp_iomsg_args* a, ci_netif* ni, ci_udp_state* us, } -ci_inline int -ci_udp_recvmsg_socklocked_spin(ci_netif* ni, ci_udp_state* us, - struct recvmsg_spinstate* spin_state) +ci_inline int ci_udp_recvmsg_socklocked_spin( + ci_netif* ni, ci_udp_state* us, struct recvmsg_spinstate* spin_state) { ci_uint64 now_frc; @@ -766,8 +752,8 @@ ci_udp_recvmsg_socklocked_spin(ci_netif* ni, ci_udp_state* us, if( ci_netif_may_poll(ni) ) { #ifndef __KERNEL__ if( spin_state->future == &spin_state->poison ) - spin_state->future = ci_netif_intf_rx_future(ni, us->future_intf_i, - &spin_state->poison); + spin_state->future = ci_netif_intf_rx_future( + ni, us->future_intf_i, &spin_state->poison); if( *spin_state->future != CI_PKT_RX_POISON && ci_netif_trylock(ni) ) { if( ! ci_netif_poll_intf_future(ni, us->future_intf_i, now_frc) ) { @@ -793,12 +779,10 @@ ci_udp_recvmsg_socklocked_spin(ci_netif* ni, ci_udp_state* us, if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; } - return OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, - &spin_state->schedule_frc, - us->s.so.rcvtimeo_msec, - &us->s.b, spin_state->si); - } - else { + return OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, + &spin_state->schedule_frc, us->s.so.rcvtimeo_msec, &us->s.b, + spin_state->si); + } else { if( spin_state->spin_limit_by_so ) { ++us->stats.n_rx_eagain; return -EAGAIN; @@ -821,26 +805,24 @@ ci_udp_recvmsg_socklocked_spin(ci_netif* ni, ci_udp_state* us, } -static int -ci_udp_recvmsg_common(ci_udp_recv_info *rinf) +static int ci_udp_recvmsg_common(ci_udp_recv_info* rinf) { - ci_netif* ni = rinf->a->ni; - ci_udp_state* us = rinf->a->us; - int have_polled = 0; - ci_iovec_ptr piov = {NULL,0, {NULL, 0}}; - int rc = 0, slow; - struct recvmsg_spinstate spin_state = {0}; + ci_netif* ni = rinf->a->ni; + ci_udp_state* us = rinf->a->us; + ci_iovec_ptr piov = { NULL, 0, { NULL, 0 } }; + int rc = 0, slow; + struct recvmsg_spinstate spin_state = { 0 }; #ifndef __KERNEL__ spin_state.do_spin = -1; - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); #endif spin_state.timeout = us->s.so.rcvtimeo_msec; /* Grab the per-socket lock so we can access the receive queue. */ - if( !rinf->sock_locked ) { + if( ! rinf->sock_locked ) { rc = ci_sock_lock(ni, &us->s.b); - if(CI_UNLIKELY( rc != 0 )) { + if( CI_UNLIKELY(rc != 0) ) { CI_SET_ERROR(rc, -rc); return rc; } @@ -852,52 +834,48 @@ ci_udp_recvmsg_common(ci_udp_recv_info *rinf) #endif slow = ((rinf->flags & (MSG_OOB_CHK | MSG_ERRQUEUE_CHK)) | - (rinf->msg->msg_iovlen == 0 ) | - (rinf->msg->msg_iov == NULL ) | - (ni->state->rxq_low ) | -#if CI_CFG_POSIX_RECV - (udp_lport_be16(us) == 0 ) | + (rinf->msg->msg_iovlen == 0) | (rinf->msg->msg_iov == NULL) | + (ni->state->rxq_low) | +#if CI_CFG_POSIX_RECV + (udp_lport_be16(us) == 0) | #endif - (us->s.so_error )); + (us->s.so_error)); if( slow ) goto slow_path; - back_to_fast_path: +back_to_fast_path: ci_iovec_ptr_init_nz(&piov, rinf->msg->msg_iov, rinf->msg->msg_iovlen); - - piov_inited: - if(CI_UNLIKELY( us->udpflags & CI_UDPF_PEEK_FROM_OS )) + +piov_inited: + if( CI_UNLIKELY(us->udpflags & CI_UDPF_PEEK_FROM_OS) ) goto peek_from_os; - check_ul_recv_q: +check_ul_recv_q: rc = ci_udp_recvmsg_get(rinf, &piov); if( rc >= 0 ) goto out; /* User-level receive queue is empty. */ - if( ! have_polled ) { - have_polled = 1; - ci_frc64(&spin_state.start_frc); + ci_frc64(&spin_state.start_frc); - if( ci_netif_may_poll(ni) && - ci_netif_need_poll_spinning(ni, spin_state.start_frc) && - ci_netif_trylock(ni) ) { - int any_evs = ci_netif_poll(ni); - if( ci_udp_recv_q_is_empty(&us->recv_q) && any_evs ) - ci_netif_poll(ni); - ci_netif_unlock(ni); - if( ci_udp_recv_q_not_empty(&us->recv_q) ) - goto check_ul_recv_q; - } + if( ci_netif_may_poll(ni) && + ci_netif_need_poll_spinning(ni, spin_state.start_frc) && + ci_netif_trylock(ni) ) { + int any_evs = ci_netif_poll(ni); + if( ci_udp_recv_q_is_empty(&us->recv_q) && any_evs ) + ci_netif_poll(ni); + ci_netif_unlock(ni); + if( ci_udp_recv_q_not_empty(&us->recv_q) ) + goto check_ul_recv_q; } - if(CI_UNLIKELY( (rc = UDP_RX_ERRNO(us)) )) { + if( CI_UNLIKELY((rc = UDP_RX_ERRNO(us))) ) { CI_SET_ERROR(rc, rc); us->s.rx_errno = us->s.rx_errno & 0xf0000000; goto out; } - if(CI_UNLIKELY( us->s.so_error )) { + if( CI_UNLIKELY(us->s.so_error) ) { int rc1 = ci_get_so_error(&us->s); if( rc1 != 0 ) { CI_SET_ERROR(rc, rc1); @@ -909,13 +887,12 @@ ci_udp_recvmsg_common(ci_udp_recv_info *rinf) if( ci_udp_recvmsg_try_os(rinf, &rc) ) goto out; - if( ((rinf->flags | us->s.b.sb_aflags) & MSG_DONTWAIT)) { + if( ((rinf->flags | us->s.b.sb_aflags) & MSG_DONTWAIT) ) { /* UDP returns EAGAIN when non-blocking even when shutdown. */ CI_SET_ERROR(rc, EAGAIN); ++us->stats.n_rx_eagain; goto out; - } - else if (UDP_IS_SHUT_RD(us)) { + } else if( UDP_IS_SHUT_RD(us) ) { /* Blocking and shutdowned */ rc = 0; goto out; @@ -923,22 +900,22 @@ ci_udp_recvmsg_common(ci_udp_recv_info *rinf) /* We need to block (optionally spinning first). */ -#ifndef __KERNEL__ +#ifndef __KERNEL__ /* -1 is special value for uninitialised */ if( spin_state.do_spin == -1 ) { - spin_state.do_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); + spin_state.do_spin = + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); if( spin_state.do_spin ) { - spin_state.poison = CI_PKT_RX_POISON; - spin_state.future = &spin_state.poison; + spin_state.poison = CI_PKT_RX_POISON; + spin_state.future = &spin_state.poison; spin_state.schedule_frc = spin_state.start_frc; - spin_state.max_spin = us->s.b.spin_cycles; + spin_state.max_spin = us->s.b.spin_cycles; if( us->s.so.rcvtimeo_msec ) { - ci_uint64 max_so_spin = (ci_uint64)us->s.so.rcvtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) us->s.so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= spin_state.max_spin ) { - spin_state.max_spin = max_so_spin; + spin_state.max_spin = max_so_spin; spin_state.spin_limit_by_so = 1; } } @@ -960,7 +937,7 @@ ci_udp_recvmsg_common(ci_udp_recv_info *rinf) rinf->sock_locked = 0; rc = ci_udp_recvmsg_block(rinf->a, ni, us, spin_state.timeout); if( rc == 0 ) { - if( !rinf->sock_locked ) + if( ! rinf->sock_locked ) rc = ci_sock_lock(ni, &us->s.b); } if( rc == 0 ) { @@ -969,44 +946,43 @@ ci_udp_recvmsg_common(ci_udp_recv_info *rinf) } CI_SET_ERROR(rc, -rc); - out: +out: ni->state->is_spinner = 0; return rc; - slow_path: +slow_path: rc = ci_udp_recvmsg_socklocked_slowpath(rinf, &piov); - if( rc == 0 ) + if( rc == 0 ) goto back_to_fast_path; else if( rc == SLOWPATH_RET_IOVLEN_INITED ) goto piov_inited; else if( rc == SLOWPATH_RET_ZERO ) { rc = 0; goto out; - } - else + } else goto out; - peek_from_os: +peek_from_os: if( ci_udp_recvmsg_try_os(rinf, &rc) ) goto out; - + goto check_ul_recv_q; } -int ci_udp_recvmsg(ci_udp_iomsg_args *a, ci_msghdr* msg, int flags) +int ci_udp_recvmsg(ci_udp_iomsg_args* a, ci_msghdr* msg, int flags) { - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - int rc; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + int rc; ci_udp_recv_info rinf; - rinf.a = a; - rinf.msg = msg; + rinf.a = a; + rinf.msg = msg; rinf.sock_locked = 0; - rinf.flags = flags; + rinf.flags = flags; - rc = ci_udp_recvmsg_common(&rinf); + rc = ci_udp_recvmsg_common(&rinf); if( rinf.sock_locked ) ci_sock_unlock(ni, &us->s.b); #if HAVE_MSG_FLAGS @@ -1019,20 +995,19 @@ int ci_udp_recvmsg(ci_udp_iomsg_args *a, ci_msghdr* msg, int flags) #ifndef __KERNEL__ -int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, - unsigned int vlen, int flags, - const struct timespec* timeout) +int ci_udp_recvmmsg(ci_udp_iomsg_args* a, struct mmsghdr* mmsg, + unsigned int vlen, int flags, const struct timespec* timeout) { - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - int rc, i; - struct timeval tv_before; - int timeout_msec = -1; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + int rc, i; + struct timeval tv_before; + int timeout_msec = -1; ci_udp_recv_info rinf; - rinf.a = a; + rinf.a = a; rinf.sock_locked = 0; - rinf.flags = flags; + rinf.flags = flags; if( timeout ) { timeout_msec = timeout->tv_sec * 1000 + timeout->tv_nsec / 1000000; @@ -1042,14 +1017,13 @@ int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, i = 0; while( i < vlen ) { rinf.msg = &mmsg[i].msg_hdr; - rc = ci_udp_recvmsg_common(&rinf); + rc = ci_udp_recvmsg_common(&rinf); if( rc >= 0 ) { mmsg[i].msg_len = rc; #if HAVE_MSG_FLAGS mmsg[i].msg_hdr.msg_flags = rinf.msg_flags; #endif - } - else { + } else { if( i != 0 && errno != EAGAIN ) us->s.so_error = errno; if( rinf.sock_locked ) @@ -1060,7 +1034,7 @@ int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, return rc; } - if( ( rinf.flags & MSG_DONTWAIT ) && rc == 0 ) + if( (rinf.flags & MSG_DONTWAIT) && rc == 0 ) break; if( rinf.flags & MSG_WAITFORONE ) @@ -1084,7 +1058,7 @@ int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, if( rinf.sock_locked ) ci_sock_unlock(ni, &us->s.b); - + return i; } #endif @@ -1093,23 +1067,23 @@ int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, #ifndef __KERNEL__ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, - struct onload_zc_recv_args* args, - enum onload_zc_callback_rc* cb_rc) + struct onload_zc_recv_args* args, enum onload_zc_callback_rc* cb_rc) { -#define ZC_BUFFERS_FOR_64K_DATAGRAM \ - ((0x10000 / (CI_CFG_PKT_BUF_SIZE - \ - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))) + 1) - - int rc, i, cb_flags; - struct msghdr msg; - struct iovec iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; +#define ZC_BUFFERS_FOR_64K_DATAGRAM \ + ((0x10000 / \ + (CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))) + \ + 1) + + int rc, i, cb_flags; + struct msghdr msg; + struct iovec iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; struct onload_zc_iovec zc_iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; - oo_pkt_p pkt_p, first_pkt_p; - ci_ip_pkt_fmt* pkt; + oo_pkt_p pkt_p, first_pkt_p; + ci_ip_pkt_fmt* pkt; ci_assert_le(us->zc_kernel_datagram_count, ZC_BUFFERS_FOR_64K_DATAGRAM); - if( us->zc_kernel_datagram_count < ZC_BUFFERS_FOR_64K_DATAGRAM) { + if( us->zc_kernel_datagram_count < ZC_BUFFERS_FOR_64K_DATAGRAM ) { if( us->zc_kernel_datagram_count == 0 ) ci_assert_equal(us->zc_kernel_datagram, OO_PP_NULL); @@ -1120,13 +1094,13 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, ci_netif_lock(ni); while( us->zc_kernel_datagram_count < ZC_BUFFERS_FOR_64K_DATAGRAM ) { pkt = ci_netif_pkt_alloc(ni, 0); - if( !pkt ) { + if( ! pkt ) { ci_netif_unlock(ni); return -ENOBUFS; } pkt->flags |= CI_PKT_FLAG_RX; ++ni->state->n_rx_pkts; - pkt->frag_next = us->zc_kernel_datagram; + pkt->frag_next = us->zc_kernel_datagram; us->zc_kernel_datagram = OO_PKT_P(pkt); ++us->zc_kernel_datagram_count; } @@ -1134,97 +1108,97 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, } pkt_p = us->zc_kernel_datagram; - i = 0; + i = 0; while( OO_PP_NOT_NULL(pkt_p) ) { #ifndef NDEBUG ci_assert_lt(i, us->zc_kernel_datagram_count); #endif - pkt = PKT_CHK_NNL(ni, pkt_p); + pkt = PKT_CHK_NNL(ni, pkt_p); iov[i].iov_base = pkt->dma_start; - iov[i].iov_len = (CI_CFG_PKT_BUF_SIZE - - ((char *)pkt->dma_start - (char*)pkt)); + iov[i].iov_len = + (CI_CFG_PKT_BUF_SIZE - ((char*) pkt->dma_start - (char*) pkt)); ++i; pkt_p = pkt->frag_next; } - msg.msg_iov = iov; - msg.msg_iovlen = i; - msg.msg_control = args->msg.msghdr.msg_control; + msg.msg_iov = iov; + msg.msg_iovlen = i; + msg.msg_control = args->msg.msghdr.msg_control; msg.msg_controllen = args->msg.msghdr.msg_controllen; - msg.msg_name = args->msg.msghdr.msg_name; - msg.msg_namelen = args->msg.msghdr.msg_namelen; - msg.msg_flags = 0; + msg.msg_name = args->msg.msghdr.msg_name; + msg.msg_namelen = args->msg.msghdr.msg_namelen; + msg.msg_flags = 0; ci_assert(us->s.os_sock_status & OO_OS_STATUS_RX); - i = __ci_udp_recvmsg_try_os(ni, us, &msg, - args->flags & ONLOAD_ZC_RECV_FLAGS_PTHRU_MASK, - &rc); + i = __ci_udp_recvmsg_try_os( + ni, us, &msg, args->flags & ONLOAD_ZC_RECV_FLAGS_PTHRU_MASK, &rc); ci_assert_equal(i, 1); /* should be data on the OS socket */ - if(CI_UNLIKELY( rc < 0 )) return rc; + if( CI_UNLIKELY(rc < 0) ) + return rc; /* We now have to translate the result from OS recvmsg - stored as * an iovec - into something we can pass to the callback, stored in - * the caller's onload_zc_iovec + * the caller's onload_zc_iovec */ - - i = 0; + + i = 0; pkt_p = us->zc_kernel_datagram; do { #ifndef NDEBUG ci_assert_lt(i, us->zc_kernel_datagram_count); #endif - pkt = PKT_CHK_NNL(ni, pkt_p); - zc_iov[i].iov_len = rc > iov[i].iov_len ? iov[i].iov_len : rc; - zc_iov[i].iov_base = iov[i].iov_base; - zc_iov[i].buf = zc_pktbuf_to_handle(pkt); + pkt = PKT_CHK_NNL(ni, pkt_p); + zc_iov[i].iov_len = rc > iov[i].iov_len ? iov[i].iov_len : rc; + zc_iov[i].iov_base = iov[i].iov_base; + zc_iov[i].buf = zc_pktbuf_to_handle(pkt); zc_iov[i].addr_space = EF_ADDRSPACE_LOCAL; rc -= zc_iov[i].iov_len; ++i; pkt_p = pkt->frag_next; - } while (rc > 0); + } while( rc > 0 ); /* Clear last packet's frag_next in chain we're passing to callback. - * We'll restore it later if they don't keep the buffers + * We'll restore it later if they don't keep the buffers */ - pkt->frag_next = OO_PP_NULL; + pkt->frag_next = OO_PP_NULL; /* pkt_p handily points to the buffer after the last one used for * this datagram, and i is the number of buffers we used. Remove * them from the zc_kernel_datagram list */ - first_pkt_p = us->zc_kernel_datagram; + first_pkt_p = us->zc_kernel_datagram; PKT_CHK_NNL(ni, first_pkt_p)->user_refcount = CI_ZC_USER_REFCOUNT_ONE; - us->zc_kernel_datagram = pkt_p; + us->zc_kernel_datagram = pkt_p; #ifndef NDEBUG ci_assert_ge(us->zc_kernel_datagram_count, i); #endif us->zc_kernel_datagram_count -= i; - args->msg.iov = zc_iov; - args->msg.msghdr.msg_iovlen = i; - args->msg.msghdr.msg_control = msg.msg_control; + args->msg.iov = zc_iov; + args->msg.msghdr.msg_iovlen = i; + args->msg.msghdr.msg_control = msg.msg_control; args->msg.msghdr.msg_controllen = msg.msg_controllen; - args->msg.msghdr.msg_name = msg.msg_name; - args->msg.msghdr.msg_namelen = msg.msg_namelen; - args->msg.msghdr.msg_flags = msg.msg_flags; + args->msg.msghdr.msg_name = msg.msg_name; + args->msg.msghdr.msg_namelen = msg.msg_namelen; + args->msg.msghdr.msg_flags = msg.msg_flags; - cb_flags = 0; - if( (ci_udp_recv_q_pkts(&us->recv_q) == 0) && + cb_flags = 0; + if( (ci_udp_recv_q_pkts(&us->recv_q) == 0) && (us->s.os_sock_status & OO_OS_STATUS_RX) == 0 ) cb_flags |= ONLOAD_ZC_END_OF_BURST; - /* Beware - as soon as we provide the pkts to the callback we can't + /* Beware - as soon as we provide the pkts to the callback we can't * touch them anymore as we don't know what the app might be doing with * them, such as releasing them. */ *cb_rc = (*args->cb)(args, cb_flags); - if( !((*cb_rc) & ONLOAD_ZC_KEEP) ) { + if( ! ((*cb_rc) & ONLOAD_ZC_KEEP) ) { #ifndef NDEBUG - /* Check the integrity of the list structure on the packets that we passed to - * the application. */ + /* Check the integrity of the list structure on the packets that we passed + * to the application. */ int app_packet_count = 0; - pkt_p = first_pkt_p; + pkt_p = first_pkt_p; while( OO_PP_NOT_NULL(pkt_p) ) { ci_assert_lt(app_packet_count, i); ci_assert_nequal(pkt_p, us->zc_kernel_datagram); @@ -1237,8 +1211,8 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, /* Put the buffers back on the zc_kernel_datagram list */ PKT_CHK_NNL(ni, first_pkt_p)->pio_addr = -1; - pkt->frag_next = us->zc_kernel_datagram; - us->zc_kernel_datagram = first_pkt_p; + pkt->frag_next = us->zc_kernel_datagram; + us->zc_kernel_datagram = first_pkt_p; us->zc_kernel_datagram_count += i; } @@ -1260,28 +1234,28 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) { - int rc, done_big_poll = 0, done_kernel_poll = 0, done_callback = 0; - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - enum onload_zc_callback_rc cb_rc = ONLOAD_ZC_CONTINUE; - struct recvmsg_spinstate spin_state = {0}; - size_t supplied_controllen = args->msg.msghdr.msg_controllen; - void* supplied_control = args->msg.msghdr.msg_control; - socklen_t supplied_namelen = args->msg.msghdr.msg_namelen; - void* supplied_name = args->msg.msghdr.msg_name; + int rc, done_big_poll = 0, done_kernel_poll = 0, done_callback = 0; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + enum onload_zc_callback_rc cb_rc = ONLOAD_ZC_CONTINUE; + struct recvmsg_spinstate spin_state = { 0 }; + size_t supplied_controllen = args->msg.msghdr.msg_controllen; + void* supplied_control = args->msg.msghdr.msg_control; + socklen_t supplied_namelen = args->msg.msghdr.msg_namelen; + void* supplied_name = args->msg.msghdr.msg_name; struct onload_zc_iovec iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags; + unsigned cb_flags; spin_state.do_spin = -1; - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); spin_state.timeout = us->s.so.rcvtimeo_msec; - rc = ci_sock_lock(ni, &us->s.b); - if(CI_UNLIKELY( rc != 0 )) + rc = ci_sock_lock(ni, &us->s.b); + if( CI_UNLIKELY(rc != 0) ) return rc; #if CI_CFG_ZC_RECV_FILTER - ci_assert(!us->recv_q_filter); + ci_assert(! us->recv_q_filter); #endif if( CI_UNLIKELY(us->s.so_error) ) { @@ -1300,30 +1274,29 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) while( (pkt = ci_udp_recv_q_get(ni, &us->recv_q)) != NULL ) { /* Reinitialise our own state within [args] each time around the loop, as * the app's callback might have changed it. */ - args->msg.iov = iovec; - args->msg.msghdr.msg_name = supplied_name; + args->msg.iov = iovec; + args->msg.msghdr.msg_name = supplied_name; args->msg.msghdr.msg_namelen = supplied_namelen; - args->msg.msghdr.msg_flags = 0; + args->msg.msghdr.msg_flags = 0; - if( CI_UNLIKELY(us->s.cmsg_flags != 0 ) ) { + if( CI_UNLIKELY(us->s.cmsg_flags != 0) ) { args->msg.msghdr.msg_controllen = supplied_controllen; - args->msg.msghdr.msg_control = supplied_control; - ci_ip_cmsg_recv(ni, us, pkt, &args->msg.msghdr, 0, - &args->msg.msghdr.msg_flags); - } - else + args->msg.msghdr.msg_control = supplied_control; + ci_ip_cmsg_recv( + ni, us, pkt, &args->msg.msghdr, 0, &args->msg.msghdr.msg_flags); + } else args->msg.msghdr.msg_controllen = 0; - ci_udp_recvmsg_fill_msghdr(ni, &args->msg.msghdr, pkt, - &us->s); + ci_udp_recvmsg_fill_msghdr(ni, &args->msg.msghdr, pkt, &us->s); ci_udp_pkt_to_zc_msg(ni, pkt, &args->msg); us->stamp = pkt->tstamp_frc; us->udpflags |= CI_UDPF_LAST_RECV_ON; - - cb_flags = CI_IP_IS_MULTICAST(oo_ip_hdr(pkt)->ip_daddr_be32) ? - ONLOAD_ZC_MSG_SHARED : 0; + + cb_flags = CI_IP_IS_MULTICAST(oo_ip_hdr(pkt)->ip_daddr_be32) + ? ONLOAD_ZC_MSG_SHARED + : 0; if( (ci_udp_recv_q_pkts(&us->recv_q) == 1) && ((us->s.os_sock_status & OO_OS_STATUS_RX) == 0) ) cb_flags |= ONLOAD_ZC_END_OF_BURST; @@ -1346,33 +1319,32 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) goto out; } - if( done_big_poll && done_kernel_poll && + if( done_big_poll && done_kernel_poll && (cb_flags & ONLOAD_ZC_END_OF_BURST) ) goto out; goto empty; } - out: +out: ni->state->is_spinner = 0; ci_sock_unlock(ni, &us->s.b); - + return rc; - empty: +empty: if( spin_state.start_frc == 0 ) ci_frc64(&spin_state.start_frc); if( ci_netif_may_poll(ni) && - ci_netif_need_poll_spinning(ni, spin_state.start_frc) && + ci_netif_need_poll_spinning(ni, spin_state.start_frc) && ci_netif_trylock(ni) ) { /* If only a few events, we don't need to bother with the full poll */ - if( ci_netif_poll(ni) < - NI_OPTS(ni).evs_per_poll ) + if( ci_netif_poll(ni) < NI_OPTS(ni).evs_per_poll ) done_big_poll = 1; /* If polling a few events didn't get us anything, do a full poll */ - if( !done_big_poll && ci_udp_recv_q_is_empty(&us->recv_q) ) { + if( ! done_big_poll && ci_udp_recv_q_is_empty(&us->recv_q) ) { done_big_poll = 1; ci_netif_poll(ni); } @@ -1382,16 +1354,16 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) if( ci_udp_recv_q_not_empty(&us->recv_q) ) goto not_empty; - } else + } else done_big_poll = 1; /* pretend we did if we can't poll */ - spin_loop: - if(CI_UNLIKELY( (rc = UDP_RX_ERRNO(us)) )) { - rc = -rc; +spin_loop: + if( CI_UNLIKELY((rc = UDP_RX_ERRNO(us))) ) { + rc = -rc; us->s.rx_errno = us->s.rx_errno & 0xf0000000; goto out; } - if(CI_UNLIKELY( us->s.so_error )) { + if( CI_UNLIKELY(us->s.so_error) ) { int rc1 = ci_get_so_error(&us->s); if( rc1 != 0 ) { rc = -rc1; @@ -1405,10 +1377,10 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) do { /* Restore these just in case they are needed */ args->msg.msghdr.msg_controllen = supplied_controllen; - args->msg.msghdr.msg_control = supplied_control; - args->msg.msghdr.msg_name = supplied_name; - args->msg.msghdr.msg_namelen = supplied_namelen; - rc = ci_udp_zc_recv_from_os(ni, us, args, &cb_rc); + args->msg.msghdr.msg_control = supplied_control; + args->msg.msghdr.msg_name = supplied_name; + args->msg.msghdr.msg_namelen = supplied_namelen; + rc = ci_udp_zc_recv_from_os(ni, us, args, &cb_rc); done_callback = 1; if( rc != 0 || cb_rc & ONLOAD_ZC_TERMINATE ) { ci_assert(done_big_poll); @@ -1417,8 +1389,7 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) if( ci_udp_recv_q_not_empty(&us->recv_q) ) goto not_empty; } while( us->s.os_sock_status & OO_OS_STATUS_RX ); - } - else { + } else { /* Return error */ rc = -ENOTEMPTY; goto out; @@ -1436,13 +1407,12 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) goto out; } - if( ((args->flags | us->s.b.sb_aflags) & MSG_DONTWAIT)) { + if( ((args->flags | us->s.b.sb_aflags) & MSG_DONTWAIT) ) { /* UDP returns EAGAIN when non-blocking even when shutdown. */ rc = -EAGAIN; ++us->stats.n_rx_eagain; goto out; - } - else if (UDP_IS_SHUT_RD(us)) { + } else if( UDP_IS_SHUT_RD(us) ) { /* Blocking and shutdowned */ rc = 0; goto out; @@ -1452,20 +1422,20 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) /* -1 is special value that means uninitialised */ if( spin_state.do_spin == -1 ) { - spin_state.do_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); - + spin_state.do_spin = + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); + if( spin_state.do_spin ) { - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); spin_state.max_spin = us->s.b.spin_cycles; - spin_state.poison = CI_PKT_RX_POISON; - spin_state.future = &spin_state.poison; + spin_state.poison = CI_PKT_RX_POISON; + spin_state.future = &spin_state.poison; if( us->s.so.rcvtimeo_msec ) { - ci_uint64 max_so_spin = (ci_uint64)us->s.so.rcvtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) us->s.so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= spin_state.max_spin ) { - spin_state.max_spin = max_so_spin; + spin_state.max_spin = max_so_spin; spin_state.spin_limit_by_so = 1; } } @@ -1474,16 +1444,15 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) if( spin_state.do_spin ) { rc = ci_udp_recvmsg_socklocked_spin(ni, us, &spin_state); - /* 0 => ul maybe readable - * 1 => spin complete - * -ve => error + /* 0 => ul maybe readable + * 1 => spin complete + * -ve => error */ if( rc == 0 ) { if( ci_udp_recv_q_not_empty(&us->recv_q) ) goto not_empty; goto spin_loop; - } - else if( rc < 0 ) + } else if( rc < 0 ) goto out; } @@ -1495,14 +1464,13 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) goto not_empty; else goto empty; - } - else + } else goto out; } -int ci_udp_recvmsg_kernel(int fd, ci_netif* ni, ci_udp_state* us, - struct msghdr* msg, int flags) +int ci_udp_recvmsg_kernel( + int fd, ci_netif* ni, ci_udp_state* us, struct msghdr* msg, int flags) { int rc = 0; int rc1; @@ -1515,8 +1483,7 @@ int ci_udp_recvmsg_kernel(int fd, ci_netif* ni, ci_udp_state* us, else rc = rc1; } - } - else { + } else { rc = -EAGAIN; } diff --git a/src/lib/transport/unix/dpdk.c b/src/lib/transport/unix/dpdk.c new file mode 100644 index 000000000..1451ce7c0 --- /dev/null +++ b/src/lib/transport/unix/dpdk.c @@ -0,0 +1,33 @@ +#include +#include "internal.h" + +int dpdk_cleanup(void) +{ + rte_eal_cleanup(); + return 0; +} + +int dpdk_init(void) +{ + char *argv[] = { + "-l", + "1", + "--proc-type=secondary", + }; + + int ret; + ret = rte_eal_init(3, argv); + if( ret < 0 ) { + LOG_S(ci_log("Unable to intialize DPDK")); + return -1; + } + + ret = rte_eal_primary_proc_alive(NULL); + if( ret == 0 ) { + LOG_S(ci_log("DPDK Primary process is not alive")); + dpdk_cleanup(); + return -2; + } + + return 0; +} diff --git a/src/lib/transport/unix/internal.h b/src/lib/transport/unix/internal.h index 0b524b38e..02cf9a887 100644 --- a/src/lib/transport/unix/internal.h +++ b/src/lib/transport/unix/internal.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author ** \brief @@ -47,7 +47,7 @@ /* Define onload_ functions to use in the library. */ #define CI_MK_DECL(ret, fn, args) extern ret onload_##fn args; -# include +#include /********************************************************************** @@ -55,15 +55,15 @@ */ typedef struct { - int log_fd; - int onload_fd; + int log_fd; + int onload_fd; - ci_uint64 spin_cycles; - ci_uint64 poll_nonblock_fast_cycles; - ci_uint64 poll_fast_cycles; - ci_uint64 select_nonblock_fast_cycles; - ci_uint64 select_fast_cycles; - ci_uint32 cpu_khz; + ci_uint64 spin_cycles; + ci_uint64 poll_nonblock_fast_cycles; + ci_uint64 poll_fast_cycles; + ci_uint64 select_nonblock_fast_cycles; + ci_uint64 select_fast_cycles; + ci_uint32 cpu_khz; enum { CITP_INIT_NONE = 0, @@ -75,43 +75,51 @@ typedef struct { * application request. * CITP_INIT_MAX may contains some post-init actions. */ -#define CITP_INIT_ALL CITP_INIT_PROTO -#define CITP_INIT_MAX CITP_INIT_SIGNALS +#define CITP_INIT_ALL CITP_INIT_PROTO +#define CITP_INIT_MAX CITP_INIT_SIGNALS - char process_path[128]; - char* process_name; + char process_path[128]; + char* process_name; #if CI_CFG_FD_CACHING - ci_uint32 pid; + ci_uint32 pid; #endif } citp_globals_t; -extern citp_globals_t citp CI_HV; +extern citp_globals_t citp CI_HV; -#define fdtable_strict() (CITP_OPTS.fdtable_strict) +#define fdtable_strict() (CITP_OPTS.fdtable_strict) /********************************************************************** ** Atomic ops that are not atomic when app is single-threaded. */ -ci_inline int citp_fdtable_is_mt_safe(void) { +ci_inline int citp_fdtable_is_mt_safe(void) +{ return ! ci_is_multithreaded() || CITP_OPTS.fds_mt_safe; } -ci_inline int citp_fdtable_not_mt_safe(void) { +ci_inline int citp_fdtable_not_mt_safe(void) +{ return ci_is_multithreaded() && ! CITP_OPTS.fds_mt_safe; } -ci_inline void oo_atomic_quick_inc (oo_atomic_t *a) { - if( ci_is_multithreaded() ) oo_atomic_inc(a); - else ++a->n; +ci_inline void oo_atomic_quick_inc(oo_atomic_t* a) +{ + if( ci_is_multithreaded() ) + oo_atomic_inc(a); + else + ++a->n; } -ci_inline int oo_atomic_quick_dec_and_test(oo_atomic_t* a) { - if( ci_is_multithreaded() ) return oo_atomic_dec_and_test(a); - else return --a->n == 0; +ci_inline int oo_atomic_quick_dec_and_test(oo_atomic_t* a) +{ + if( ci_is_multithreaded() ) + return oo_atomic_dec_and_test(a); + else + return --a->n == 0; } @@ -131,110 +139,109 @@ typedef struct { */ typedef struct citp_protocol_impl_s citp_protocol_impl; -typedef struct citp_fdinfo_s citp_fdinfo; +typedef struct citp_fdinfo_s citp_fdinfo; struct oo_ul_poll_state; struct oo_ul_select_state; struct citp_epoll_member; struct oo_ul_epoll_state; typedef struct { - int (*socket )(int domain, int type, int protocol); - citp_fdinfo* - (*dup )(citp_fdinfo*); + int (*socket)(int domain, int type, int protocol); + citp_fdinfo* (*dup)(citp_fdinfo*); #if CI_CFG_FD_CACHING - void (*close )(citp_fdinfo*); + void (*close)(citp_fdinfo*); #endif - void (*dtor )(citp_fdinfo*, int fdt_locked); - int (*bind )(citp_fdinfo*, const struct sockaddr*, socklen_t); - int (*listen )(citp_fdinfo*, int); - int (*accept )(citp_fdinfo*, struct sockaddr*, socklen_t*, int flags, - citp_lib_context_t*); - int (*connect )(citp_fdinfo*, const struct sockaddr*, socklen_t, - citp_lib_context_t*); - int (*shutdown )(citp_fdinfo*, int); - int (*getsockname )(citp_fdinfo*, struct sockaddr*, socklen_t*); - int (*getpeername )(citp_fdinfo*, struct sockaddr*, socklen_t*); - int (*getsockopt )(citp_fdinfo*, int, int, void*, socklen_t*); - int (*setsockopt )(citp_fdinfo*, int, int, const void*, socklen_t); - int (*recv )(citp_fdinfo*, struct msghdr*, int); - int (*recvmmsg )(citp_fdinfo*, struct mmsghdr*, unsigned, int, - ci_recvmmsg_timespec*); - int (*send )(citp_fdinfo*, const struct msghdr*, int); - int (*sendmmsg )(citp_fdinfo*, struct mmsghdr*, unsigned, int); - int (*fcntl )(citp_fdinfo*, int, long); - int (*ioctl )(citp_fdinfo*, int, void *); + void (*dtor)(citp_fdinfo*, int fdt_locked); + int (*bind)(citp_fdinfo*, const struct sockaddr*, socklen_t); + int (*listen)(citp_fdinfo*, int); + int (*accept)(citp_fdinfo*, struct sockaddr*, socklen_t*, int flags, + citp_lib_context_t*); + int (*connect)( + citp_fdinfo*, const struct sockaddr*, socklen_t, citp_lib_context_t*); + int (*shutdown)(citp_fdinfo*, int); + int (*getsockname)(citp_fdinfo*, struct sockaddr*, socklen_t*); + int (*getpeername)(citp_fdinfo*, struct sockaddr*, socklen_t*); + int (*getsockopt)(citp_fdinfo*, int, int, void*, socklen_t*); + int (*setsockopt)(citp_fdinfo*, int, int, const void*, socklen_t); + int (*recv)(citp_fdinfo*, struct msghdr*, int); + int (*recvmmsg)( + citp_fdinfo*, struct mmsghdr*, unsigned, int, ci_recvmmsg_timespec*); + int (*send)(citp_fdinfo*, const struct msghdr*, int); + int (*sendmmsg)(citp_fdinfo*, struct mmsghdr*, unsigned, int); + int (*fcntl)(citp_fdinfo*, int, long); + int (*ioctl)(citp_fdinfo*, int, void*); /* poll() and select() return "I've handled it" bool */ - int (*select )(citp_fdinfo*, int*, int, int, int, - struct oo_ul_select_state*); - int (*poll )(citp_fdinfo*, struct pollfd*, struct oo_ul_poll_state*); + int (*select)(citp_fdinfo*, int*, int, int, int, struct oo_ul_select_state*); + int (*poll)(citp_fdinfo*, struct pollfd*, struct oo_ul_poll_state*); /* epoll() and sleep_seq() should be present both or none. * epoll() returns "poll again" bool */ - int (*epoll )(citp_fdinfo*, struct citp_epoll_member* eitem, - struct oo_ul_epoll_state*, int* stored_event); + int (*epoll)(citp_fdinfo*, struct citp_epoll_member* eitem, + struct oo_ul_epoll_state*, int* stored_event); ci_uint64 (*sleep_seq)(citp_fdinfo*); - int (*zc_send )(citp_fdinfo*, struct onload_zc_mmsg*, int); - int (*zc_recv )(citp_fdinfo*, struct onload_zc_recv_args*); - int (*zc_recv_filter)(citp_fdinfo*, onload_zc_recv_filter_callback, - void*, int); - int (*recvmsg_kernel)(citp_fdinfo*, struct msghdr*, int); - int (*tmpl_alloc)(citp_fdinfo*, const struct iovec*, int, - struct oo_msg_template**, unsigned); - int (*tmpl_update)(citp_fdinfo*, struct oo_msg_template*, - const struct onload_template_msg_update_iovec*, int, - unsigned); - int (*tmpl_abort)(citp_fdinfo*, struct oo_msg_template*); + int (*zc_send)(citp_fdinfo*, struct onload_zc_mmsg*, int); + int (*zc_recv)(citp_fdinfo*, struct onload_zc_recv_args*); + int (*zc_recv_filter)( + citp_fdinfo*, onload_zc_recv_filter_callback, void*, int); + int (*recvmsg_kernel)(citp_fdinfo*, struct msghdr*, int); + int (*tmpl_alloc)(citp_fdinfo*, const struct iovec*, int, + struct oo_msg_template**, unsigned); + int (*tmpl_update)(citp_fdinfo*, struct oo_msg_template*, + const struct onload_template_msg_update_iovec*, int, unsigned); + int (*tmpl_abort)(citp_fdinfo*, struct oo_msg_template*); #if CI_CFG_TIMESTAMPING /* Examines receive queue up to timespec limit, and fills in first_out * with the timestamp of the first data available, and bytes_out with the * number of bytes available to be read before reaching limit. */ - int (*ordered_data)(citp_fdinfo*, struct timespec* limit, - struct timespec* first_out, int* bytes_out); + int (*ordered_data)(citp_fdinfo*, struct timespec* limit, + struct timespec* first_out, int* bytes_out); #endif int (*is_spinning)(citp_fdinfo*); #if CI_CFG_FD_CACHING - int (*cache )(citp_fdinfo*); + int (*cache)(citp_fdinfo*); #endif - enum onload_delegated_send_rc - (*dsend_prepare)(citp_fdinfo*, int size, unsigned flags, - struct onload_delegated_send* out); - int (*dsend_complete)(citp_fdinfo*, const ci_iovec *iov, int iovlen, - int flags); - int (*dsend_cancel)(citp_fdinfo*); + enum onload_delegated_send_rc (*dsend_prepare)(citp_fdinfo*, int size, + unsigned flags, struct onload_delegated_send* out); + int (*dsend_complete)( + citp_fdinfo*, const ci_iovec* iov, int iovlen, int flags); + int (*dsend_cancel)(citp_fdinfo*); } citp_fdops; struct citp_protocol_impl_s { - int type; -# define CITP_CI_SOCKET 0 -# define CITP_TCP_SOCKET 1 -# define CITP_UDP_SOCKET 2 -# define CITP_PASSTHROUGH_FD 3 -# define CITP_EPOLL_FD 4 -# define CITP_EPOLLB_FD 5 -# define CITP_PIPE_FD 6 - - citp_fdops ops; - - ci_dllink link; + int type; +#define CITP_CI_SOCKET 0 +#define CITP_TCP_SOCKET 1 +#define CITP_UDP_SOCKET 2 +#define CITP_PASSTHROUGH_FD 3 +#define CITP_EPOLL_FD 4 +#define CITP_EPOLLB_FD 5 +#define CITP_PIPE_FD 6 + + citp_fdops ops; + + ci_dllink link; }; -#define CITP_PROTOCOL_IMPL_ASSERT_VALID citp_protocol_impl_assert_valid +#define CITP_PROTOCOL_IMPL_ASSERT_VALID citp_protocol_impl_assert_valid extern void citp_protocol_impl_assert_valid(citp_protocol_impl*) CI_HF; -extern void citp_protocol_manager_add(citp_protocol_impl*, - int is_stream) CI_HF; +extern void citp_protocol_manager_add( + citp_protocol_impl*, int is_stream) CI_HF; -extern int citp_protocol_manager_create_socket(int dom, - int type, int proto) CI_HF; +extern int citp_protocol_manager_create_socket( + int dom, int type, int proto) CI_HF; + +extern int dpdk_init(void); +extern int dpdk_cleanup(void); #define citp_protocol_impl_get_ops(p) (&(p)->ops) -#define citp_protocol_impl_get_type(p) ((p)->type) +#define citp_protocol_impl_get_type(p) ((p)->type) /*! Call not handled - this is not the same as a handover! */ -#define CITP_NOT_HANDLED -2 +#define CITP_NOT_HANDLED -2 /******************************************************************************* @@ -242,12 +249,12 @@ extern int citp_protocol_manager_create_socket(int dom, */ #if CI_CFG_FDTABLE_CHECKS extern void citp_fdtable_assert_valid(void) CI_HF; -# define FDTABLE_ASSERT_VALID() citp_fdtable_assert_valid() +#define FDTABLE_ASSERT_VALID() citp_fdtable_assert_valid() #else -# define FDTABLE_ASSERT_VALID() +#define FDTABLE_ASSERT_VALID() #endif -#define PTHREAD_NULL ((pthread_t)(-1L)) +#define PTHREAD_NULL ((pthread_t) (-1L)) /********************************************************************** ** File descriptor info. @@ -265,49 +272,49 @@ extern void citp_fdtable_assert_valid(void) CI_HF; */ struct citp_fdinfo_s { /* Sequence no. Used by epoll to detect change in meaning of an fd. */ - ci_uint64 seq; + ci_uint64 seq; /* Seq no. of epoll fd this fd has been added to. */ - ci_uint64 epoll_fd_seq; + ci_uint64 epoll_fd_seq; /* The implementation for this fdinfo. */ - citp_protocol_impl* protocol; + citp_protocol_impl* protocol; /* Number of threads using this (+1 if it's in the table). */ - oo_atomic_t ref_count; + oo_atomic_t ref_count; union { struct { - unsigned fd; - int flags; + unsigned fd; + int flags; } dup3_args; - int dup2_result; - int handover_nonb_switch; + int dup2_result; + int handover_nonb_switch; } on_rcz; /* The O/S file descriptor. */ - int fd; + int fd; /* epoll fd this fd has been added to, or -1 if not in an epoll set. */ - int epoll_fd; + int epoll_fd; /* thread id using this fdi */ - pthread_t thread_id; + pthread_t thread_id; /* What to do when the ref count goes to zero. */ -# define FDI_ON_RCZ_NONE 0 -# define FDI_ON_RCZ_CLOSE 1 -# define FDI_ON_RCZ_DUP2 2 -# define FDI_ON_RCZ_HANDOVER 3 -# define FDI_ON_RCZ_MOVED 5 -# define FDI_ON_RCZ_DONE 6 - volatile char on_ref_count_zero; +#define FDI_ON_RCZ_NONE 0 +#define FDI_ON_RCZ_CLOSE 1 +#define FDI_ON_RCZ_DUP2 2 +#define FDI_ON_RCZ_HANDOVER 3 +#define FDI_ON_RCZ_MOVED 5 +#define FDI_ON_RCZ_DONE 6 + volatile char on_ref_count_zero; #if CI_CFG_FD_CACHING /* Non-zero if this fd is eligable for caching (i.e. if created via * accept). */ - char can_cache; + char can_cache; #endif /* This bit is redundant -- can be calculated from other state. However, @@ -321,44 +328,45 @@ struct citp_fdinfo_s { * 'chars' rather than bit-fields because this is quicker on * architectures that allow byte- aligned access (e.g. x86). */ - char is_special; + char is_special; }; extern ci_uint64 fdtable_seq_no; -ci_inline void citp_fdinfo_init(citp_fdinfo* fdi, citp_protocol_impl* p) { +ci_inline void citp_fdinfo_init(citp_fdinfo* fdi, citp_protocol_impl* p) +{ /* The rest of the initialisation is done in citp_fdtable_insert(). */ oo_atomic_set(&fdi->ref_count, 1); #if CI_CFG_FD_CACHING fdi->can_cache = 0; #endif - fdi->protocol = p; - fdi->seq = fdtable_seq_no++; - fdi->epoll_fd = -1; + fdi->protocol = p; + fdi->seq = fdtable_seq_no++; + fdi->epoll_fd = -1; fdi->thread_id = PTHREAD_NULL; } ci_inline int citp_sys_socket(int domain, int type, int protocol) { int s = -1; - s = ci_sys_socket(domain, type | SOCK_CLOEXEC, protocol); + s = ci_sys_socket(domain, type | SOCK_CLOEXEC, protocol); return s; } -#define CITP_FDINFO_ASSERT_VALID citp_fdinfo_assert_valid +#define CITP_FDINFO_ASSERT_VALID citp_fdinfo_assert_valid extern void citp_fdinfo_assert_valid(citp_fdinfo*) CI_HF; -#define citp_fdinfo_get_ops(fdinfo) \ +#define citp_fdinfo_get_ops(fdinfo) \ (citp_protocol_impl_get_ops((fdinfo)->protocol)) -#define citp_fdinfo_get_type(fdinfo) \ +#define citp_fdinfo_get_type(fdinfo) \ (citp_protocol_impl_get_type((fdinfo)->protocol)) -extern citp_fdinfo citp_the_closed_fd CI_HV; -extern citp_fdinfo citp_the_reserved_fd CI_HV; +extern citp_fdinfo citp_the_closed_fd CI_HV; +extern citp_fdinfo citp_the_reserved_fd CI_HV; extern citp_protocol_impl citp_closed_protocol_impl CI_HV; @@ -368,27 +376,27 @@ extern citp_protocol_impl citp_closed_protocol_impl CI_HV; */ extern void __citp_fdinfo_ref_count_zero(citp_fdinfo*, int fdt_locked) CI_HF; -#define citp_fdinfo_ref(fdi) \ +#define citp_fdinfo_ref(fdi) \ do { \ oo_atomic_quick_inc(&(fdi)->ref_count); \ if( ci_is_multithreaded() ) \ (fdi)->thread_id = pthread_self(); \ - } while(0) + } while( 0 ) /*! Release one ref count. When the ref count hits zero will cause - * release of resources, handles etc. + * release of resources, handles etc. * Call with [fdt_locked] = 0 if the fd table lock is NOT held (this - * is the legacy operation) or [fdt_locked] != 0 if * the fd table + * is the legacy operation) or [fdt_locked] != 0 if * the fd table * lock IS held. */ -ci_inline void citp_fdinfo_release_ref(citp_fdinfo* fdinfo, - int fdt_locked) { +ci_inline void citp_fdinfo_release_ref(citp_fdinfo* fdinfo, int fdt_locked) +{ /* If we're releasing a reference from one of our "magic" fd's, then we * should never drop the ref-count below 1,000,000 */ - ci_assert (((fdinfo != &citp_the_closed_fd) && - (fdinfo != &citp_the_reserved_fd)) || - (oo_atomic_read (&fdinfo->ref_count) > 1000000)); + ci_assert( + ((fdinfo != &citp_the_closed_fd) && (fdinfo != &citp_the_reserved_fd)) || + (oo_atomic_read(&fdinfo->ref_count) > 1000000)); ci_assert_gt(oo_atomic_read(&fdinfo->ref_count), 0); /* We might call ref_count_zero, which locks fdtable. Assert that @@ -400,18 +408,20 @@ ci_inline void citp_fdinfo_release_ref(citp_fdinfo* fdinfo, } /*! Release reference obtained by calling citp_fdtable_lookup_fast(). */ -ci_inline void citp_fdinfo_release_ref_fast(citp_fdinfo* fdinfo) { +ci_inline void citp_fdinfo_release_ref_fast(citp_fdinfo* fdinfo) +{ if( citp_fdtable_not_mt_safe() ) citp_fdinfo_release_ref(fdinfo, 0); } /*! Take the same number of references as with citp_fdtable_lookup_fast(). */ -ci_inline void citp_fdinfo_ref_fast(citp_fdinfo* fdinfo) { +ci_inline void citp_fdinfo_ref_fast(citp_fdinfo* fdinfo) +{ if( citp_fdtable_not_mt_safe() ) citp_fdinfo_ref(fdinfo); } /* Called when refcount reaches zero. */ -# define citp_fdinfo_free CI_FREE_OBJ +#define citp_fdinfo_free CI_FREE_OBJ /* Hands-over the socket to the kernel. That is, it replaces the @@ -428,7 +438,7 @@ ci_inline void citp_fdinfo_ref_fast(citp_fdinfo* fdinfo) { ** If [nonb_switch == 0] O_NONBLOCK is cleared for the socket. If ** [nonb_switch > 0] if is set. Otherwise nothing is done. */ -extern void citp_fdinfo_handover(citp_fdinfo* fdi, int nonb_switch) CI_HF; +extern void citp_fdinfo_handover(citp_fdinfo* fdi, int nonb_switch) CI_HF; ci_inline int citp_fdinfo_is_socket(const citp_fdinfo* fdi) { @@ -436,7 +446,7 @@ ci_inline int citp_fdinfo_is_socket(const citp_fdinfo* fdi) (fdi->protocol->type == CITP_UDP_SOCKET); } -extern int citp_ep_dup(unsigned oldfd, int (*syscall)(int,long), long) CI_HF; +extern int citp_ep_dup(unsigned oldfd, int (*syscall)(int, long), long) CI_HF; /* One of these should be used as an arg to citp_ep_dup(). */ extern int citp_ep_dup_dup(int oldfd, long arg_unused) CI_HF; @@ -450,66 +460,66 @@ extern int citp_ep_close(unsigned fd) CI_HF; /********************************************************************** ** exec() support */ -extern int __citp_exec_restore( int fd ) CI_HF; +extern int __citp_exec_restore(int fd) CI_HF; /********************************************************************** ** Transport implementations. */ -extern citp_protocol_impl citp_tcp_protocol_impl CI_HV; -extern citp_protocol_impl citp_udp_protocol_impl CI_HV; +extern citp_protocol_impl citp_tcp_protocol_impl CI_HV; +extern citp_protocol_impl citp_udp_protocol_impl CI_HV; extern citp_protocol_impl citp_epoll_protocol_impl CI_HV; #if CI_CFG_EPOLL2 extern citp_protocol_impl citp_epollb_protocol_impl CI_HV; #endif -extern citp_protocol_impl citp_pipe_read_protocol_impl CI_HV; +extern citp_protocol_impl citp_pipe_read_protocol_impl CI_HV; extern citp_protocol_impl citp_pipe_write_protocol_impl CI_HV; extern citp_protocol_impl citp_passthrough_protocol_impl; typedef struct { - citp_fdinfo fdinfo; - citp_socket sock; + citp_fdinfo fdinfo; + citp_socket sock; } citp_sock_fdi; -#define fdi_to_sock_fdi(fdi) CI_CONTAINER(citp_sock_fdi, fdinfo, (fdi)) -#define fdi_to_socket(fdi) (&fdi_to_sock_fdi(fdi)->sock) +#define fdi_to_sock_fdi(fdi) CI_CONTAINER(citp_sock_fdi, fdinfo, (fdi)) +#define fdi_to_socket(fdi) (&fdi_to_sock_fdi(fdi)->sock) typedef struct { - citp_fdinfo fdinfo; - ci_netif* netif; + citp_fdinfo fdinfo; + ci_netif* netif; citp_waitable* ep; - int os_socket; + int os_socket; } citp_alien_fdi; -#define fdi_to_alien_fdi(fdi) CI_CONTAINER(citp_alien_fdi, fdinfo, (fdi)) +#define fdi_to_alien_fdi(fdi) CI_CONTAINER(citp_alien_fdi, fdinfo, (fdi)) extern void citp_passthrough_init(citp_alien_fdi* epi); #include typedef struct { - citp_fdinfo fdinfo; - int kepfd; - int is_accel; - - int not_mt_safe; - int have_postponed; - pthread_mutex_t lock_postponed; - struct oo_epoll_item postponed[CI_CFG_EPOLL_MAX_POSTPONED]; + citp_fdinfo fdinfo; + int kepfd; + int is_accel; + + int not_mt_safe; + int have_postponed; + pthread_mutex_t lock_postponed; + struct oo_epoll_item postponed[CI_CFG_EPOLL_MAX_POSTPONED]; } citp_epollb_fdi; -#define fdi_to_epollb_fdi(fdi) CI_CONTAINER(citp_epollb_fdi, fdinfo, (fdi)) -extern void oo_epollb_ctor(citp_epollb_fdi *epi); +#define fdi_to_epollb_fdi(fdi) CI_CONTAINER(citp_epollb_fdi, fdinfo, (fdi)) +extern void oo_epollb_ctor(citp_epollb_fdi* epi); /********************************************************************** ** Netif initialisation (netif_init.c). */ -extern int citp_netif_init_ctor(void) CI_HF; +extern int citp_netif_init_ctor(void) CI_HF; /* Set up fork handling at start-of-day */ -extern int ci_setup_fork(void); +extern int ci_setup_fork(void); /*! Handles user-level netif internals pre bproc_move() */ extern void citp_netif_pre_bproc_move_hook(void) CI_HF; @@ -527,22 +537,22 @@ extern bool have_active_netifs(void); ** Misc. */ -extern void citp_log_fn_ul(const char* msg) CI_HF; -extern void citp_log_fn_drv(const char* msg) CI_HF; +extern void citp_log_fn_ul(const char* msg) CI_HF; +extern void citp_log_fn_drv(const char* msg) CI_HF; extern void citp_setup_logging_prefix(void) CI_HF; -extern int citp_packet_interceptor_startup(void) CI_HF; +extern int citp_packet_interceptor_startup(void) CI_HF; extern int _citp_do_init_inprogress CI_HV; -extern int citp_do_init(int max_init_level) CI_HF; +extern int citp_do_init(int max_init_level) CI_HF; -extern int citp_basic_syscall_init(void) CI_HF; -extern int citp_syscall_init(void) CI_HF; +extern int citp_basic_syscall_init(void) CI_HF; +extern int citp_syscall_init(void) CI_HF; #undef socklen_t -extern citp_fdinfo* citp_tcp_dup(citp_fdinfo* orig_fdi); +extern citp_fdinfo* citp_tcp_dup(citp_fdinfo* orig_fdi); /* Locking order: * - citp_pkt_map_lock is the innermost lock; @@ -554,11 +564,11 @@ extern citp_fdinfo* citp_tcp_dup(citp_fdinfo* orig_fdi); extern pthread_mutex_t citp_dup_lock; extern pthread_mutex_t citp_pkt_map_lock; -extern int citp_timespec_compare(const struct timespec* a, - const struct timespec* b) CI_HF; +extern int citp_timespec_compare( + const struct timespec* a, const struct timespec* b) CI_HF; -extern int citp_oo_timespec_compare(const struct oo_timespec* a, - const struct timespec* b) CI_HF; +extern int citp_oo_timespec_compare( + const struct oo_timespec* a, const struct timespec* b) CI_HF; /********************************************************************** ** fdtable internals. @@ -568,31 +578,32 @@ extern int citp_oo_timespec_compare(const struct oo_timespec* a, ** may be accessed concurrently from multiple threads, and also take ** certain special values. */ -typedef ci_uintptr_t citp_fdinfo_p; - -#define fdip_passthru ((citp_fdinfo_p)1u) -#define fdip_unknown ((citp_fdinfo_p)2u) -#define fdip_busy ((citp_fdinfo_p)3u) -#define fdip_closing fdi_to_fdip(&citp_the_closed_fd) -#define fdip_reserved fdi_to_fdip(&citp_the_reserved_fd) - -#define fdip_is_normal(fdip) (((fdip) & fdip_busy) == 0) -#define fdip_is_busy(fdip) (((fdip) & fdip_busy) == fdip_busy) -#define fdip_is_passthru(fdip) ((fdip) == fdip_passthru) -#define fdip_is_unknown(fdip) ((fdip) == fdip_unknown) -#define fdip_is_closing(fdip) ((fdip) == fdip_closing) -#define fdip_is_reserved(fdip) ((fdip) == fdip_reserved) - -ci_inline citp_fdinfo* fdip_to_fdi(citp_fdinfo_p fdip) { +typedef ci_uintptr_t citp_fdinfo_p; + +#define fdip_passthru ((citp_fdinfo_p) 1u) +#define fdip_unknown ((citp_fdinfo_p) 2u) +#define fdip_busy ((citp_fdinfo_p) 3u) +#define fdip_closing fdi_to_fdip(&citp_the_closed_fd) +#define fdip_reserved fdi_to_fdip(&citp_the_reserved_fd) + +#define fdip_is_normal(fdip) (((fdip) &fdip_busy) == 0) +#define fdip_is_busy(fdip) (((fdip) &fdip_busy) == fdip_busy) +#define fdip_is_passthru(fdip) ((fdip) == fdip_passthru) +#define fdip_is_unknown(fdip) ((fdip) == fdip_unknown) +#define fdip_is_closing(fdip) ((fdip) == fdip_closing) +#define fdip_is_reserved(fdip) ((fdip) == fdip_reserved) + +ci_inline citp_fdinfo* fdip_to_fdi(citp_fdinfo_p fdip) +{ ci_assert(fdip_is_normal(fdip)); ci_assert(fdip); return (citp_fdinfo*) fdip; } -#define fdi_to_fdip(fdi) ((citp_fdinfo_p)(ci_uintptr_t) (fdi)) +#define fdi_to_fdip(fdi) ((citp_fdinfo_p) (ci_uintptr_t) (fdi)) -#define fdip_cas_succeed ci_cas_uintptr_succeed -#define fdip_cas_fail ci_cas_uintptr_fail +#define fdip_cas_succeed ci_cas_uintptr_succeed +#define fdip_cas_fail ci_cas_uintptr_fail typedef struct { @@ -601,31 +612,32 @@ typedef struct { typedef struct { - citp_fdtable_entry* table; - unsigned size; - unsigned inited_count; + citp_fdtable_entry* table; + unsigned size; + unsigned inited_count; } citp_fdtable_globals; -extern citp_fdtable_globals citp_fdtable CI_HV; +extern citp_fdtable_globals citp_fdtable CI_HV; /* The following stuff is used to block when an fdtable entry is busy. */ typedef struct { - citp_fdinfo_p next; - oo_rwlock_cond cond; + citp_fdinfo_p next; + oo_rwlock_cond cond; } citp_fdtable_waiter; -#define fdip_to_waiter(fdip) ((citp_fdtable_waiter*)(ci_uintptr_t) \ - ((fdip) & ~(fdip_busy))) +#define fdip_to_waiter(fdip) \ + ((citp_fdtable_waiter*) (ci_uintptr_t) ((fdip) & ~(fdip_busy))) -#define waiter_to_fdip(w) ((citp_fdinfo_p)(ci_uintptr_t)(w) | fdip_busy) +#define waiter_to_fdip(w) ((citp_fdinfo_p) (ci_uintptr_t) (w) | fdip_busy) -extern void __citp_fdtable_busy_clear_slow(unsigned fd, citp_fdinfo_p, - int fdt_locked) CI_HF; +extern void __citp_fdtable_busy_clear_slow( + unsigned fd, citp_fdinfo_p, int fdt_locked) CI_HF; -ci_inline void citp_fdtable_busy_clear(unsigned fd, citp_fdinfo_p fdip, - int fdt_locked) { +ci_inline void citp_fdtable_busy_clear( + unsigned fd, citp_fdinfo_p fdip, int fdt_locked) +{ if( fdip_cas_fail(&citp_fdtable.table[fd].fdip, fdip_busy, fdip) ) __citp_fdtable_busy_clear_slow(fd, fdip, fdt_locked); } @@ -635,8 +647,6 @@ ci_inline void citp_fdtable_busy_clear(unsigned fd, citp_fdinfo_p fdip, extern citp_fdinfo_p citp_fdtable_busy_wait(unsigned fd, int fdt_locked) CI_HF; - - /********************************************************************** ** Transport library user-level lock */ @@ -653,33 +663,37 @@ extern citp_fdinfo_p citp_fdtable_busy_wait(unsigned fd, int fdt_locked) CI_HF; * private to the process for which we can play this game. */ -#define __CITP_LOCK(l) do { \ - if (ci_is_multithreaded()) \ - oo_rwlock_lock_write(l); \ - } while(0) +#define __CITP_LOCK(l) \ + do { \ + if( ci_is_multithreaded() ) \ + oo_rwlock_lock_write(l); \ + } while( 0 ) -#define __CITP_LOCK_RD(l) do { \ - if (ci_is_multithreaded()) \ - oo_rwlock_lock_read(l); \ - } while(0) +#define __CITP_LOCK_RD(l) \ + do { \ + if( ci_is_multithreaded() ) \ + oo_rwlock_lock_read(l); \ + } while( 0 ) -#define __CITP_UNLOCK(l) do { \ - if (ci_is_multithreaded()) \ - oo_rwlock_unlock_write(l);\ - } while(0) +#define __CITP_UNLOCK(l) \ + do { \ + if( ci_is_multithreaded() ) \ + oo_rwlock_unlock_write(l); \ + } while( 0 ) -#define __CITP_UNLOCK_RD(l) do {\ - if (ci_is_multithreaded()) \ - oo_rwlock_unlock_read(l); \ - } while(0) +#define __CITP_UNLOCK_RD(l) \ + do { \ + if( ci_is_multithreaded() ) \ + oo_rwlock_unlock_read(l); \ + } while( 0 ) /* \TODO Add specific unlock read and unlock write operations */ #ifdef NDEBUG -#define CITP_FDTABLE_LOCK() __CITP_LOCK(&citp_ul_lock) -#define CITP_FDTABLE_LOCK_RD() __CITP_LOCK_RD(&citp_ul_lock) -#define CITP_FDTABLE_UNLOCK() __CITP_UNLOCK(&citp_ul_lock) +#define CITP_FDTABLE_LOCK() __CITP_LOCK(&citp_ul_lock) +#define CITP_FDTABLE_LOCK_RD() __CITP_LOCK_RD(&citp_ul_lock) +#define CITP_FDTABLE_UNLOCK() __CITP_UNLOCK(&citp_ul_lock) #define CITP_FDTABLE_UNLOCK_RD() __CITP_UNLOCK_RD(&citp_ul_lock) #define CITP_FDTABLE_ASSERT_LOCKED(fdt_locked) @@ -716,8 +730,8 @@ ci_inline void CITP_FDTABLE_UNLOCK_RD(void) __CITP_UNLOCK_RD(&citp_ul_lock); } -ci_inline void -_CITP_FDTABLE_ASSERT_LOCKED(int fdt_locked, char* file, int line) +ci_inline void _CITP_FDTABLE_ASSERT_LOCKED( + int fdt_locked, char* file, int line) { citp_signal_info* si = &oo_per_thread_get()->sig; if( ! fdt_locked ) @@ -725,7 +739,7 @@ _CITP_FDTABLE_ASSERT_LOCKED(int fdt_locked, char* file, int line) _ci_assert(si->c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED, file, line); _ci_assert(si->c.inside_lib, file, line); } -#define CITP_FDTABLE_ASSERT_LOCKED(fdt_locked) \ +#define CITP_FDTABLE_ASSERT_LOCKED(fdt_locked) \ _CITP_FDTABLE_ASSERT_LOCKED(fdt_locked, __FILE__, __LINE__) #define CITP_FDTABLE_ASSERT_LOCKED_RD CITP_FDTABLE_ASSERT_LOCKED(1) @@ -735,7 +749,7 @@ _CITP_FDTABLE_ASSERT_LOCKED(int fdt_locked, char* file, int line) ** File-descriptor table. */ -extern int citp_fdtable_ctor(void) CI_HF; +extern int citp_fdtable_ctor(void) CI_HF; /* Looks up the user-level fdinfo for a given file descriptor. If found, * increments the ref count and returns pointer to the fdinfo. @@ -744,55 +758,56 @@ extern int citp_fdtable_ctor(void) CI_HF; * * Must have "entered" the library before calling this. */ -extern citp_fdinfo* citp_fdtable_lookup(unsigned fd) CI_HF; +extern citp_fdinfo* citp_fdtable_lookup(unsigned fd) CI_HF; /* Faster version of citp_fdtable_lookup(). In most cases (but not always) * avoids entering the library when [fd] is pass-through. */ -extern citp_fdinfo* citp_fdtable_lookup_fast(citp_lib_context_t*, - unsigned fd) CI_HF; +extern citp_fdinfo* citp_fdtable_lookup_fast( + citp_lib_context_t*, unsigned fd) CI_HF; -extern citp_fdinfo* citp_fdtable_lookup_noprobe(unsigned fd, int fdt_locked) CI_HF; +extern citp_fdinfo* citp_fdtable_lookup_noprobe( + unsigned fd, int fdt_locked) CI_HF; -extern int -citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, - int fdip_is_already_busy, citp_fdinfo** fdinfo_out); +extern int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, + int fdip_is_already_busy, citp_fdinfo** fdinfo_out); -ci_inline citp_fdinfo* -citp_reprobe_moved(citp_fdinfo* fdinfo, int from_fast_lookup, - int fdip_is_already_busy) +ci_inline citp_fdinfo* citp_reprobe_moved( + citp_fdinfo* fdinfo, int from_fast_lookup, int fdip_is_already_busy) { citp_fdinfo* new_fdinfo; - citp_reprobe_moved_common(fdinfo, from_fast_lookup, fdip_is_already_busy, - &new_fdinfo); + citp_reprobe_moved_common( + fdinfo, from_fast_lookup, fdip_is_already_busy, &new_fdinfo); return new_fdinfo; } #if CI_CFG_FD_CACHING -extern void citp_netif_cache_disable(void) CI_HF; -extern void citp_netif_cache_warn_on_fork(void) CI_HF; +extern void citp_netif_cache_disable(void) CI_HF; +extern void citp_netif_cache_warn_on_fork(void) CI_HF; #endif extern void citp_fdtable_fork_hook(void) CI_HF; -extern citp_fdinfo_p citp_fdtable_new_fd_set(unsigned fd, citp_fdinfo_p, - int fdt_locked) CI_HF; -extern void citp_fdtable_insert(citp_fdinfo*, - unsigned fd, int fdt_locked) CI_HF; -extern void __citp_fdtable_reserve(int fd, int reserve) CI_HF; - - /* Marks [fd] as reserved, so any external attempt to use it will give - ** EBADF. Caller should ensure that the fdtable lock is held (or can be - ** called at init time without the lock). - ** - ** If [reserve] is zero, the entry is un-reserved. - */ - - -ci_inline bool citp_fd_is_special(int fd) { - return fd == citp.log_fd || fd == citp.onload_fd; +extern citp_fdinfo_p citp_fdtable_new_fd_set( + unsigned fd, citp_fdinfo_p, int fdt_locked) CI_HF; +extern void citp_fdtable_insert( + citp_fdinfo*, unsigned fd, int fdt_locked) CI_HF; +extern void __citp_fdtable_reserve(int fd, int reserve) CI_HF; + +/* Marks [fd] as reserved, so any external attempt to use it will give +** EBADF. Caller should ensure that the fdtable lock is held (or can be +** called at init time without the lock). +** +** If [reserve] is zero, the entry is un-reserved. +*/ + + +ci_inline bool citp_fd_is_special(int fd) +{ + return fd == citp.log_fd || fd == citp.onload_fd; } /* Extend the initialisation of the FD table, marking each FD as unknown */ -ci_inline void __citp_fdtable_extend(unsigned fd) { +ci_inline void __citp_fdtable_extend(unsigned fd) +{ unsigned i, max; CITP_FDTABLE_ASSERT_LOCKED(1); @@ -804,9 +819,9 @@ ci_inline void __citp_fdtable_extend(unsigned fd) { if( max > citp_fdtable.inited_count ) { for( i = citp_fdtable.inited_count; i < max; ++i ) { if( ! citp_fd_is_special(i) ) - citp_fdtable.table[i].fdip = fdip_unknown; + citp_fdtable.table[i].fdip = fdip_unknown; else - citp_fdtable.table[i].fdip = fdi_to_fdip(&citp_the_reserved_fd); + citp_fdtable.table[i].fdip = fdi_to_fdip(&citp_the_reserved_fd); } ci_wmb(); citp_fdtable.inited_count = max; @@ -815,30 +830,27 @@ ci_inline void __citp_fdtable_extend(unsigned fd) { /*! Marks an fdtable entry as pass-through. */ -ci_inline void citp_fdtable_passthru(int fd, int fdt_locked) { +ci_inline void citp_fdtable_passthru(int fd, int fdt_locked) +{ if( fd >= 0 && fd < citp_fdtable.inited_count && - !oo_per_thread_get()->in_vfork_child ) + ! oo_per_thread_get()->in_vfork_child ) citp_fdtable_new_fd_set(fd, fdip_passthru, fdt_locked); } -extern int -citp_passthrough_bind(citp_fdinfo* fdi, - const struct sockaddr* sa, socklen_t sa_len); -extern int -citp_passthrough_accept(citp_fdinfo* fdi, - struct sockaddr* sa, socklen_t* p_sa_len, int flags, - citp_lib_context_t* lib_context); -extern int -citp_passthrough_connect(citp_fdinfo* fdi, - const struct sockaddr* sa, socklen_t sa_len, - citp_lib_context_t* lib_context); +extern int citp_passthrough_bind( + citp_fdinfo* fdi, const struct sockaddr* sa, socklen_t sa_len); +extern int citp_passthrough_accept(citp_fdinfo* fdi, struct sockaddr* sa, + socklen_t* p_sa_len, int flags, citp_lib_context_t* lib_context); +extern int citp_passthrough_connect(citp_fdinfo* fdi, + const struct sockaddr* sa, socklen_t sa_len, + citp_lib_context_t* lib_context); /********************************************************************** ** Stack name state access */ extern int oo_extensions_init(void); -ci_inline struct oo_stackname_state *oo_stackname_thread_get(void) +ci_inline struct oo_stackname_state* oo_stackname_thread_get(void) { struct oo_per_thread* pt = oo_per_thread_get(); return &pt->stackname; @@ -849,101 +861,95 @@ ci_inline struct oo_stackname_state *oo_stackname_thread_get(void) ** Signal deferral and errno propagation */ -ci_inline int __citp_checked_enter_lib(citp_lib_context_t *lib_context - CI_DEBUG_ARG(const char *fn) - CI_DEBUG_ARG(int line) ) +ci_inline int __citp_checked_enter_lib( + citp_lib_context_t* lib_context CI_DEBUG_ARG(const char* fn) + CI_DEBUG_ARG(int line)) { lib_context->saved_errno = errno; - lib_context->thread = __oo_per_thread_get(); + lib_context->thread = __oo_per_thread_get(); Log_LIB(log(" citp_checked_enter_lib(%p) [was_in=%d] %s (%d)", - lib_context->thread, lib_context->thread->sig.c.inside_lib > 0, - fn, line)); - ci_assert(~lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_FDTABLE_LOCKED); - ++lib_context->thread->sig.c.inside_lib; - return (lib_context->thread->sig.c.inside_lib==1); + lib_context->thread, lib_context->thread->sig.c.inside_lib > 0, fn, + line)); + ci_assert( + ~lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED); + ++lib_context->thread->sig.c.inside_lib; + return (lib_context->thread->sig.c.inside_lib == 1); } -ci_inline void __citp_enter_lib(citp_lib_context_t *lib_context - CI_DEBUG_ARG(const char *fn) - CI_DEBUG_ARG(int line) ) +ci_inline void __citp_enter_lib(citp_lib_context_t* lib_context CI_DEBUG_ARG( + const char* fn) CI_DEBUG_ARG(int line)) { lib_context->saved_errno = errno; - lib_context->thread = __oo_per_thread_get(); + lib_context->thread = __oo_per_thread_get(); Log_LIB(log(" citp_enter_lib(%p) inside_lib=%d %s (%d)", - lib_context->thread, lib_context->thread->sig.c.inside_lib, - fn, line)); + lib_context->thread, lib_context->thread->sig.c.inside_lib, fn, line)); ci_assert_ge(lib_context->thread->sig.c.inside_lib, 0); - ci_assert(~lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_FDTABLE_LOCKED); + ci_assert( + ~lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED); ++lib_context->thread->sig.c.inside_lib; } -ci_inline void __citp_reenter_lib(citp_lib_context_t *lib_context - CI_DEBUG_ARG(const char *fn) - CI_DEBUG_ARG(int line) ) +ci_inline void __citp_reenter_lib(citp_lib_context_t* lib_context CI_DEBUG_ARG( + const char* fn) CI_DEBUG_ARG(int line)) { Log_LIB(log(" citp_reenter_lib(%p) inside_lib=%d %s (%d)", - lib_context->thread, lib_context->thread->sig.c.inside_lib, - fn, line)); + lib_context->thread, lib_context->thread->sig.c.inside_lib, fn, line)); ci_assert_ge(lib_context->thread->sig.c.inside_lib, 0); - ci_assert(~lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_FDTABLE_LOCKED); + ci_assert( + ~lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED); ++lib_context->thread->sig.c.inside_lib; } -ci_inline void __citp_exit_lib(citp_lib_context_t *lib_context, int do_errno - CI_DEBUG_ARG(const char *fn) - CI_DEBUG_ARG(int line) ) +ci_inline void __citp_exit_lib(citp_lib_context_t* lib_context, + int do_errno CI_DEBUG_ARG(const char* fn) CI_DEBUG_ARG(int line)) { - Log_LIB(log(" citp_exit_lib(%p) inside_lib=%d %s (%d)", - lib_context->thread, lib_context->thread->sig.c.inside_lib, - fn, line)); + Log_LIB(log(" citp_exit_lib(%p) inside_lib=%d %s (%d)", lib_context->thread, + lib_context->thread->sig.c.inside_lib, fn, line)); ci_assert_ge(lib_context->thread->sig.c.inside_lib, 1); - ci_assert(~lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_FDTABLE_LOCKED); + ci_assert( + ~lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_FDTABLE_LOCKED); --lib_context->thread->sig.c.inside_lib; ci_compiler_barrier(); - if(CI_UNLIKELY( lib_context->thread->sig.c.inside_lib == 0 && - (lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_HAVE_PENDING) )) + if( CI_UNLIKELY( + lib_context->thread->sig.c.inside_lib == 0 && + (lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_HAVE_PENDING)) ) citp_signal_run_pending(&lib_context->thread->sig); if( do_errno ) errno = lib_context->saved_errno; } -#define citp_checked_enter_lib(c) \ - __citp_checked_enter_lib((c) CI_DEBUG_ARG(__FUNCTION__) \ - CI_DEBUG_ARG(__LINE__)) +#define citp_checked_enter_lib(c) \ + __citp_checked_enter_lib( \ + (c) CI_DEBUG_ARG(__FUNCTION__) CI_DEBUG_ARG(__LINE__)) -#define citp_enter_lib(c) \ +#define citp_enter_lib(c) \ __citp_enter_lib((c) CI_DEBUG_ARG(__FUNCTION__) CI_DEBUG_ARG(__LINE__)) -#define citp_reenter_lib(c) \ +#define citp_reenter_lib(c) \ __citp_reenter_lib((c) CI_DEBUG_ARG(__FUNCTION__) CI_DEBUG_ARG(__LINE__)) -#define citp_exit_lib(c, de) \ +#define citp_exit_lib(c, de) \ __citp_exit_lib((c), (de) CI_DEBUG_ARG(__FUNCTION__) CI_DEBUG_ARG(__LINE__)) -#define citp_enter_lib_if(c) \ - do { \ - if( (c)->thread == NULL ) \ - citp_enter_lib(c); \ +#define citp_enter_lib_if(c) \ + do { \ + if( (c)->thread == NULL ) \ + citp_enter_lib(c); \ } while( 0 ) -#define citp_exit_lib_if(c, de) \ - do { \ - if(CI_UNLIKELY( (c)->thread != NULL )) \ - citp_exit_lib((c), (de)); \ +#define citp_exit_lib_if(c, de) \ + do { \ + if( CI_UNLIKELY((c)->thread != NULL) ) \ + citp_exit_lib((c), (de)); \ } while( 0 ) #ifndef TRUE -#define TRUE 1 +#define TRUE 1 #define FALSE 0 #endif @@ -953,13 +959,13 @@ ci_inline void __citp_exit_lib(citp_lib_context_t *lib_context, int do_errno */ extern size_t citp_environ_count_args(const char* arg, va_list args) CI_HF; -extern void citp_environ_handle_args(char** argv, const char* arg, - va_list args, char*** env_ptr) CI_HF; -extern char* const* citp_environ_check_preload(char* const* env, - size_t* bytes_reqd) CI_HF; -extern void citp_environ_make_preload(char* const* env, char** new_env, - size_t new_env_bytes) CI_HF; -extern int citp_environ_init(void) CI_HF; +extern void citp_environ_handle_args( + char** argv, const char* arg, va_list args, char*** env_ptr) CI_HF; +extern char* const* citp_environ_check_preload( + char* const* env, size_t* bytes_reqd) CI_HF; +extern void citp_environ_make_preload( + char* const* env, char** new_env, size_t new_env_bytes) CI_HF; +extern int citp_environ_init(void) CI_HF; /********************************************************************** @@ -967,8 +973,7 @@ extern int citp_environ_init(void) CI_HF; */ extern int citp_sock_fcntl_os_sock(citp_sock_fdi* epi, int fd, int cmd, - long arg, const char* cmd_str, - int* fcntl_result) CI_HF; + long arg, const char* cmd_str, int* fcntl_result) CI_HF; /*! Handler for fcntl() cmds that are common across sockets. * @@ -980,7 +985,7 @@ extern int citp_sock_fcntl_os_sock(citp_sock_fdi* epi, int fd, int cmd, */ extern int citp_sock_fcntl(citp_sock_fdi*, int fd, int cmd, long arg) CI_HF; -#define ci_major(dev) ((dev) & 0xff00) +#define ci_major(dev) ((dev) &0xff00) /********************************************************************** * poll, select, epoll @@ -992,10 +997,9 @@ extern int citp_sock_fcntl(citp_sock_fdi*, int fd, int cmd, long arg) CI_HF; * At exit time, if *timeout_ms!=0 and rc==0, caller should block in system * call for the specified timeout. */ -int citp_ul_do_poll(struct pollfd*__restrict__ fds, nfds_t nfds, - ci_uint64 timeout_ms, ci_uint64 *used_ms, - citp_lib_context_t *lib_context, - const sigset_t *sigmask); +int citp_ul_do_poll(struct pollfd* __restrict__ fds, nfds_t nfds, + ci_uint64 timeout_ms, ci_uint64* used_ms, citp_lib_context_t* lib_context, + const sigset_t* sigmask); /* Generic select/pselect implementation. * This function is called after citp_enter_lib(), and it MUST NOT call * citp_exit_lib(). @@ -1003,9 +1007,8 @@ int citp_ul_do_poll(struct pollfd*__restrict__ fds, nfds_t nfds, * call for the specified timeout. */ int citp_ul_do_select(int nfds, fd_set* rds, fd_set* wrs, fd_set* exs, - ci_uint64 timeout_ms, ci_uint64 *used_ms, - citp_lib_context_t *lib_context, - const sigset_t *sigmask); + ci_uint64 timeout_ms, ci_uint64* used_ms, citp_lib_context_t* lib_context, + const sigset_t* sigmask); /* ppoll/pselect common code. * @@ -1043,9 +1046,8 @@ int citp_ul_do_select(int nfds, fd_set* rds, fd_set* wrs, fd_set* exs, * to the latency-critical path without any visible benefit. */ -static inline int -citp_ul_pwait_spin_pre(citp_lib_context_t *lib_context, - const sigset_t *sigmask, sigset_t *sigsaved) +static inline int citp_ul_pwait_spin_pre(citp_lib_context_t* lib_context, + const sigset_t* sigmask, sigset_t* sigsaved) { Log_POLL(log("%s(%p,%p)", __func__, sigmask, sigsaved)); citp_exit_lib(lib_context, CI_FALSE); @@ -1056,8 +1058,8 @@ citp_ul_pwait_spin_pre(citp_lib_context_t *lib_context, return 0; sigprocmask(SIG_SETMASK, sigmask, NULL); - if(CI_UNLIKELY( lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_HAVE_PENDING )) { + if( CI_UNLIKELY( + lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_HAVE_PENDING) ) { sigprocmask(SIG_SETMASK, sigsaved, NULL); Log_POLL(log("%s: interrupted", __func__)); errno = EINTR; @@ -1065,14 +1067,13 @@ citp_ul_pwait_spin_pre(citp_lib_context_t *lib_context, } return 0; } -static inline void -citp_ul_pwait_spin_done(citp_lib_context_t *lib_context, - sigset_t *sigsaved, int *p_rc) +static inline void citp_ul_pwait_spin_done( + citp_lib_context_t* lib_context, sigset_t* sigsaved, int* p_rc) { Log_POLL(log("%s(%p,%d)", __func__, sigsaved, *p_rc)); sigprocmask(SIG_BLOCK, sigsaved, NULL); - if(CI_UNLIKELY( lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_HAVE_PENDING )) { + if( CI_UNLIKELY( + lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_HAVE_PENDING) ) { Log_POLL(log("%s: interrupted", __func__)); errno = EINTR; *p_rc = -1; @@ -1086,8 +1087,8 @@ citp_ul_pwait_spin_done(citp_lib_context_t *lib_context, /* As citp_poll_if_needed(), but leaves the stack locked after polling. */ -static inline int __citp_poll_if_needed(ci_netif* ni, ci_uint64 recent_frc, - int is_spinning) +static inline int __citp_poll_if_needed( + ci_netif* ni, ci_uint64 recent_frc, int is_spinning) { if( ci_netif_may_poll(ni) && ci_netif_need_poll_maybe_spinning(ni, recent_frc, is_spinning) && @@ -1106,8 +1107,8 @@ static inline int __citp_poll_if_needed(ci_netif* ni, ci_uint64 recent_frc, * * Used by poll(), select() and epoll_wait(). */ -static inline int citp_poll_if_needed(ci_netif* ni, ci_uint64 recent_frc, - int is_spinning) +static inline int citp_poll_if_needed( + ci_netif* ni, ci_uint64 recent_frc, int is_spinning) { int rc = __citp_poll_if_needed(ni, recent_frc, is_spinning); if( rc != 0 ) @@ -1117,26 +1118,27 @@ static inline int citp_poll_if_needed(ci_netif* ni, ci_uint64 recent_frc, /* Query onload driver for the cpu_khz value */ -void citp_oo_get_cpu_khz(ci_uint32* cpu_khz); +void citp_oo_get_cpu_khz(ci_uint32* cpu_khz); ci_inline ci_uint64 citp_usec_to_cycles64(unsigned usec) -{ return (ci_uint64) usec * citp.cpu_khz / 1000; } +{ + return (ci_uint64) usec * citp.cpu_khz / 1000; +} -extern int citp_sock_is_spinning(citp_fdinfo* fdi); +extern int citp_sock_is_spinning(citp_fdinfo* fdi); /********************************************************************** * Utils */ -ci_inline void -ms2timespec(ci_uint64 timeout, ci_uint64 spent, struct timespec* tv) +ci_inline void ms2timespec( + ci_uint64 timeout, ci_uint64 spent, struct timespec* tv) { if( timeout > spent ) { - tv->tv_sec = (timeout - spent) / 1000; + tv->tv_sec = (timeout - spent) / 1000; tv->tv_nsec = ((timeout - spent) % 1000) * 1000000; - } - else { + } else { tv->tv_sec = tv->tv_nsec = 0; } } @@ -1156,7 +1158,7 @@ ci_inline int citp_getpid(void) * fdtable_locked == false means that we do not know (typically from * ci_log). */ -extern void __oo_service_fd(bool fdtable_locked); +extern void __oo_service_fd(bool fdtable_locked); ci_inline int oo_service_fd(void) { if( citp.onload_fd < 0 ) @@ -1167,5 +1169,5 @@ ci_inline int oo_service_fd(void) extern void oo_signal_terminate(int signum); -#endif /* __CI_TRANSPORT_INTERNAL_H__ */ +#endif /* __CI_TRANSPORT_INTERNAL_H__ */ /*! \cidoxg_end */ diff --git a/src/lib/transport/unix/mmake.mk b/src/lib/transport/unix/mmake.mk index da265c867..88cc4d2f9 100644 --- a/src/lib/transport/unix/mmake.mk +++ b/src/lib/transport/unix/mmake.mk @@ -8,6 +8,9 @@ ifeq ($(ISA),i386) BUILD_TREE_COPY := mapfile.ilp32 endif +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu + TARGET := libcitransport0.so MMAKE_TYPE := DLL @@ -15,7 +18,7 @@ LDEP := $(CITPCOMMON_LIB_DEPEND) $(CIIP_LIB_DEPEND) $(CPLANE_LIB_DEPEND) \ $(CITOOLS_LIB_DEPEND) $(CIUL_LIB_DEPEND) LLNK := $(LINK_CITPCOMMON_LIB) $(LINK_CIIP_LIB) $(LINK_CPLANE_LIB) \ - $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) + $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) $(MMAKE_DPDK_LIBS) LIB_SRCS := \ startup.c \ @@ -44,7 +47,8 @@ LIB_SRCS := \ wqlock.c \ poll_select.c \ passthrough_fd.c \ - utils.c + utils.c \ + dpdk.c MMAKE_OBJ_PREFIX := ci_tp_unix_ LIB_OBJS := $(LIB_SRCS:%.c=$(MMAKE_OBJ_PREFIX)%.o) diff --git a/src/lib/transport/unix/netif_init.c b/src/lib/transport/unix/netif_init.c index e18266dc1..5129526ef 100644 --- a/src/lib/transport/unix/netif_init.c +++ b/src/lib/transport/unix/netif_init.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file netif_init.c + *//*! \file netif_init.c ** ** \author stg ** \brief Common functionality used by TCP & UDP @@ -10,7 +10,7 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_unix */ #include @@ -22,8 +22,8 @@ #include -#define LPF "citp_netif_" -#define LPFIN "-> " LPF +#define LPF "citp_netif_" +#define LPFIN "-> " LPF #define LPFOUT "<- " LPF @@ -35,44 +35,43 @@ int citp_netif_init_ctor(void) citp_cmn_netif_init_ctor(CITP_OPTS.netif_dtor); - return 0; + return dpdk_init(); } /* Storage for stackname context across fork() */ static struct oo_stackname_state stackname_config_across_fork; /* Storage for library context across fork() */ -static citp_lib_context_t citp_lib_context_across_fork; +static citp_lib_context_t citp_lib_context_across_fork; /*! Handles user-level netif internals pre fork() */ -static void citp_netif_pre_fork_hook(void); +static void citp_netif_pre_fork_hook(void); /*! Handles user-level netif internals post fork() in the parent */ -static void citp_netif_parent_fork_hook(void); +static void citp_netif_parent_fork_hook(void); /* Handles user-level netif internals post fork() in the child */ -static void citp_netif_child_fork_hook(void); +static void citp_netif_child_fork_hook(void); /* I do not understand why, but __register_atfork seems to work better than * __libc_atfork */ -extern int __register_atfork(void (*prepare)(void), void (*parent)(void), - void (*child)(void), void *dso); +extern int __register_atfork(void (*prepare)(void), void (*parent)(void), + void (*child)(void), void* dso); -int ci_setup_fork(void) +int ci_setup_fork(void) { - Log_CALL(ci_log("%s()", __FUNCTION__)); - return __register_atfork(citp_netif_pre_fork_hook, - citp_netif_parent_fork_hook, - citp_netif_child_fork_hook, NULL); + Log_CALL(ci_log("%s()", __FUNCTION__)); + return __register_atfork(citp_netif_pre_fork_hook, + citp_netif_parent_fork_hook, citp_netif_child_fork_hook, NULL); } /* Handles user-level netif internals pre fork() */ static void citp_netif_pre_fork_hook(void) { - struct oo_stackname_state *stackname_state; + struct oo_stackname_state* stackname_state; /* If we have not inited fork hook, how can we get here in the first * place? */ - if( citp.init_level < CITP_INIT_FORK_HOOKS) { + if( citp.init_level < CITP_INIT_FORK_HOOKS ) { ci_assert(0); return; } @@ -105,9 +104,9 @@ static void citp_netif_pre_fork_hook(void) return; stackname_state = oo_stackname_thread_get(); - memcpy(&stackname_config_across_fork, stackname_state, - sizeof(stackname_config_across_fork)); - + memcpy(&stackname_config_across_fork, stackname_state, + sizeof(stackname_config_across_fork)); + /* If the call to _fork() subsequently fails we potentially have * marked all of our netifs as shared when ideally we shouldn't * have. However, this is non-fatal and is probably the least of @@ -123,7 +122,7 @@ static void citp_netif_parent_fork_hook(void) { /* If we have not inited fork hook, how can we get here in the first * place? */ - if( citp.init_level < CITP_INIT_FORK_HOOKS) { + if( citp.init_level < CITP_INIT_FORK_HOOKS ) { ci_assert(0); return; } @@ -132,12 +131,12 @@ static void citp_netif_parent_fork_hook(void) pthread_mutex_unlock(&citp_pkt_map_lock); oo_rwlock_unlock_write(&citp_dup2_lock); - if( citp.init_level < CITP_INIT_FDTABLE) + if( citp.init_level < CITP_INIT_FDTABLE ) goto unlock_fork; - else if( citp.init_level < CITP_INIT_NETIF) + else if( citp.init_level < CITP_INIT_NETIF ) goto unlock; - if( CITP_OPTS.fork_netif == CI_UNIX_FORK_NETIF_PARENT ) + if( CITP_OPTS.fork_netif == CI_UNIX_FORK_NETIF_PARENT ) __citp_netif_mark_all_dont_use(); unlock: @@ -152,7 +151,7 @@ static void citp_netif_child_fork_hook(void) { /* If we have not inited fork hook, how can we get here in the first * place? */ - if( citp.init_level < CITP_INIT_FORK_HOOKS) { + if( citp.init_level < CITP_INIT_FORK_HOOKS ) { ci_assert(0); return; } @@ -179,13 +178,13 @@ static void citp_netif_child_fork_hook(void) oo_rwlock_ctor(&citp_dup2_lock); pthread_mutex_init(&citp_pkt_map_lock, NULL); - if( citp.init_level < CITP_INIT_FDTABLE) + if( citp.init_level < CITP_INIT_FDTABLE ) return; pthread_mutex_lock(&citp_dup_lock); CITP_FDTABLE_LOCK(); - if( citp.init_level < CITP_INIT_NETIF) + if( citp.init_level < CITP_INIT_NETIF ) goto setup_fdtable; citp_setup_logging_prefix(); @@ -193,7 +192,7 @@ static void citp_netif_child_fork_hook(void) oo_stackname_update(&stackname_config_across_fork); - if( CITP_OPTS.fork_netif == CI_UNIX_FORK_NETIF_CHILD ) + if( CITP_OPTS.fork_netif == CI_UNIX_FORK_NETIF_CHILD ) __citp_netif_mark_all_dont_use(); setup_fdtable: @@ -233,7 +232,7 @@ void citp_netif_pre_bproc_move_hook(void) * time of the bproc_move(). */ __citp_netif_unprotect_all(); - + CITP_FDTABLE_UNLOCK(); } @@ -248,34 +247,36 @@ static void ci_netif_check_process_config(ci_netif* ni) #if CI_CFG_FD_CACHING if( ni->state->opts.sock_cache_max > 0 ) { if( citp_fdtable_not_mt_safe() ) { - NI_LOG(ni, CONFIG_WARNINGS, "Socket caching is not supported when " - "EF_FDS_MT_SAFE=0, and has been disabled"); + NI_LOG(ni, CONFIG_WARNINGS, + "Socket caching is not supported when " + "EF_FDS_MT_SAFE=0, and has been disabled"); citp_netif_cache_disable(); - } - else if( CITP_OPTS.ul_epoll != 3 ) - NI_LOG(ni, CONFIG_WARNINGS, "Sockets that are added to an epoll set can " - "only be cached if EF_UL_EPOLL=3"); + } else if( CITP_OPTS.ul_epoll != 3 ) + NI_LOG(ni, CONFIG_WARNINGS, + "Sockets that are added to an epoll set can " + "only be cached if EF_UL_EPOLL=3"); } - if( (NI_OPTS(ni).scalable_filter_enable) && - (CITP_OPTS.ul_epoll != 1) && (CITP_OPTS.ul_epoll != 3) ) { - NI_LOG(ni, CONFIG_WARNINGS, "When using a scalable filters mode handover " - "of TCP sockets in an epoll set is only " - "supported if EF_UL_EPOLL=1 or 3."); + if( (NI_OPTS(ni).scalable_filter_enable) && (CITP_OPTS.ul_epoll != 1) && + (CITP_OPTS.ul_epoll != 3) ) { + NI_LOG(ni, CONFIG_WARNINGS, + "When using a scalable filters mode handover " + "of TCP sockets in an epoll set is only " + "supported if EF_UL_EPOLL=1 or 3."); } #endif if( NI_OPTS(ni).scalable_filter_enable && CITP_OPTS.stack_per_thread ) { - NI_LOG(ni, CONFIG_WARNINGS, "EF_STACK_PER_THREAD=1 cannot be used in " - "scalable filters mode as a single filter " - "configuration can only be used by one stack."); + NI_LOG(ni, CONFIG_WARNINGS, + "EF_STACK_PER_THREAD=1 cannot be used in " + "scalable filters mode as a single filter " + "configuration can only be used by one stack."); } } /* Platform specific code, called after netif construction */ -void citp_netif_ctor_hook(ci_netif* ni, int realloc) +void citp_netif_ctor_hook(ci_netif* ni, int realloc) { - - if (!realloc) + if( ! realloc ) /* Protect the netif's FD table entry */ __citp_fdtable_reserve(ci_netif_get_driver_handle(ni), 1); @@ -284,11 +285,14 @@ void citp_netif_ctor_hook(ci_netif* ni, int realloc) /* Platform specific code, called proir to netif destruction */ -void citp_netif_free_hook(ci_netif* ni) +void citp_netif_free_hook(ci_netif* ni) { #if CI_CFG_FD_CACHING citp_uncache_fds_ul(ni); #endif + + dpdk_cleanup(); + /* Unprotect the netif's FD table entry */ __citp_fdtable_reserve(ci_netif_get_driver_handle(ni), 0); } diff --git a/src/lib/transport/unix/tcp_fd.c b/src/lib/transport/unix/tcp_fd.c index 9e5830d2f..88301341c 100644 --- a/src/lib/transport/unix/tcp_fd.c +++ b/src/lib/transport/unix/tcp_fd.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk ** \brief Sockets interface to user level TCP @@ -30,7 +30,7 @@ #include -#define LPF "citp_tcp_" +#define LPF "citp_tcp_" #if CI_CFG_FD_CACHING int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts); @@ -41,35 +41,37 @@ int ci_tcp_close(ci_netif* netif, ci_tcp_state* ts); #if CI_CFG_FD_CACHING #define CI_CACHE_FIXUP_FLAGS (O_NONBLOCK | O_CLOEXEC) -static int -citp_tcp_cached_fixup_flags(ci_netif* ni, ci_tcp_state* ts, int fd, int flags) +static int citp_tcp_cached_fixup_flags( + ci_netif* ni, ci_tcp_state* ts, int fd, int flags) { int rc = 0; /* Socket caching is only supported on linux, where these are identical */ CI_BUILD_ASSERT(O_NONBLOCK == O_NDELAY); - if( !!(flags & O_NONBLOCK) != - !!(ts->s.b.sb_aflags & CI_SB_AFLAG_O_NONBLOCK) ) { + if( ! ! (flags & O_NONBLOCK) != + ! ! (ts->s.b.sb_aflags & CI_SB_AFLAG_O_NONBLOCK) ) { /* Flip the value of the onload flag */ ci_atomic32_merge(&ts->s.b.sb_aflags, ~ts->s.b.sb_aflags, - CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY); + CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY); /* And tell others that our flag is to be trusted, * but the OS flag is not. */ ci_atomic32_or(&ts->s.b.sb_aflags, CI_SB_AFLAG_O_NONBLOCK_UNSYNCED); } - if( !!(flags & O_CLOEXEC) != - !!(ts->s.b.sb_aflags & CI_SB_AFLAG_O_CLOEXEC) ) { + if( ! ! (flags & O_CLOEXEC) != + ! ! (ts->s.b.sb_aflags & CI_SB_AFLAG_O_CLOEXEC) ) { /* Set new value */ rc = ci_sys_fcntl(fd, F_SETFD, (flags & O_CLOEXEC) ? FD_CLOEXEC : 0); /* Flip the value of the onload flag */ if( rc == 0 ) - ci_atomic32_merge(&ts->s.b.sb_aflags, ~ts->s.b.sb_aflags, - CI_SB_AFLAG_O_CLOEXEC); + ci_atomic32_merge( + &ts->s.b.sb_aflags, ~ts->s.b.sb_aflags, CI_SB_AFLAG_O_CLOEXEC); else - NI_LOG(ni, RESOURCE_WARNINGS, "%s: Failed to modify O_CLOEXEC setting of" - " cached socket to new value", __FUNCTION__); + NI_LOG(ni, RESOURCE_WARNINGS, + "%s: Failed to modify O_CLOEXEC setting of" + " cached socket to new value", + __FUNCTION__); } return rc; @@ -89,8 +91,7 @@ citp_tcp_cached_fixup_flags(ci_netif* ni, ci_tcp_state* ts, int fd, int flags) * hold the stack lock. */ static ci_fd_t citp_tcp_ep_acquire_fd(ci_netif* netif, ci_tcp_state* ts, - ci_tcp_socket_listen* listener, - int domain, int type, int flags) + ci_tcp_socket_listen* listener, int domain, int type, int flags) { ci_fd_t fd = -1; #if CI_CFG_FD_CACHING @@ -102,10 +103,11 @@ static ci_fd_t citp_tcp_ep_acquire_fd(ci_netif* netif, ci_tcp_state* ts, /* As well as protecting the explicit fdtable operations that follow, the * fdtable lock prevents a probe of the new fd until we've finished setting * it up. */ - if( fdtable_strict() ) CITP_FDTABLE_LOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_LOCK(); #if CI_CFG_FD_CACHING - from_cache = ci_tcp_is_cached(ts); + from_cache = ci_tcp_is_cached(ts); pid_matches = ts->cached_on_pid == citp_getpid(); /* It is possible that someone is concurrently trying to dup2/3 onto the @@ -120,10 +122,9 @@ static ci_fd_t citp_tcp_ep_acquire_fd(ci_netif* netif, ci_tcp_state* ts, * consider only doing this check if fdtable_strict()... */ if( (from_cache != 0) && - !(ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && - pid_matches ) { - int prev = citp_fdtable_new_fd_set(ts->cached_on_fd, fdip_busy, - fdtable_strict()); + ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && pid_matches ) { + int prev = + citp_fdtable_new_fd_set(ts->cached_on_fd, fdip_busy, fdtable_strict()); /* Now we're in one of two states: * - there was dup2/3 in progress onto our fd, but it's now completed @@ -137,55 +138,57 @@ static ci_fd_t citp_tcp_ep_acquire_fd(ci_netif* netif, ci_tcp_state* ts, has_fd = ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD); if( ! from_cache ) - ci_assert_equal(S_TO_EPS(netif,ts)->fd, CI_FD_BAD); + ci_assert_equal(S_TO_EPS(netif, ts)->fd, CI_FD_BAD); if( (from_cache == 0) || (! has_fd || ! pid_matches) ) { if( ! pid_matches ) - Log_EP(ci_log("%s: calling sock attach ep %d:%d", __FUNCTION__, NI_ID(netif), S_SP(ts))); + Log_EP(ci_log("%s: calling sock attach ep %d:%d", __FUNCTION__, + NI_ID(netif), S_SP(ts))); #endif /* Need to create new fd */ ci_fd_t stack_fd = ci_netif_get_driver_handle(netif); - oo_sp sp = S_SP(ts); - fd = ( listener != NULL ) ? - ci_tcp_helper_tcp_accept_sock_attach(stack_fd, sp, flags) : - ci_tcp_helper_sock_attach(stack_fd, sp, domain, type); + oo_sp sp = S_SP(ts); + fd = (listener != NULL) + ? ci_tcp_helper_tcp_accept_sock_attach(stack_fd, sp, flags) + : ci_tcp_helper_sock_attach(stack_fd, sp, domain, type); if( fd < 0 ) { - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); return fd; } citp_fdtable_new_fd_set(fd, fdip_busy, fdtable_strict()); #if CI_CFG_FD_CACHING - } - else { + } else { /* Got endpoint with fd belonging to current process */ ci_assert_equal(ts->cached_on_pid, citp_getpid()); fd = ts->cached_on_fd; // See bug 78546 - //ci_assert_equal(fd, S_TO_EPS(netif, ts)->fd); + // ci_assert_equal(fd, S_TO_EPS(netif, ts)->fd); - /* It's possible that the cached socket has different flags from those - * requested - if so we need to sort that out. - */ + /* It's possible that the cached socket has different flags from those + * requested - if so we need to sort that out. + */ citp_tcp_cached_fixup_flags(netif, ts, fd, flags); ts->s.domain = domain; - /* We're reusing a cached socket. We don't attach, but need to set the - * flags that would be set on attach. We also clear the cached_on_fd - * state. - * - * This state must be consistent before we add the entry to the fdtable. - */ + /* We're reusing a cached socket. We don't attach, but need to set the + * flags that would be set on attach. We also clear the cached_on_fd + * state. + * + * This state must be consistent before we add the entry to the fdtable. + */ ci_atomic32_and(&ts->s.b.sb_aflags, - ~(CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_TCP_IN_ACCEPTQ | - CI_SB_AFLAG_IN_CACHE | CI_SB_AFLAG_IN_PASSIVE_CACHE)); - ts->cached_on_fd = -1; + ~(CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_TCP_IN_ACCEPTQ | + CI_SB_AFLAG_IN_CACHE | CI_SB_AFLAG_IN_PASSIVE_CACHE)); + ts->cached_on_fd = -1; ts->cached_on_pid = -1; } #endif - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); /* By this point, [ts] should have had its cache bit cleared. */ ci_assert(! ci_tcp_is_cached(ts)); @@ -198,7 +201,7 @@ static ci_fd_t citp_tcp_ep_acquire_fd(ci_netif* netif, ci_tcp_state* ts, ci_fd_t ci_tcp_ep_ctor(citp_socket* ep, ci_netif* netif, int domain, int type) { ci_tcp_state* ts = NULL; - ci_fd_t fd; + ci_fd_t fd; ci_assert(ep); ci_assert(netif); @@ -216,23 +219,24 @@ ci_fd_t ci_tcp_ep_ctor(citp_socket* ep, ci_netif* netif, int domain, int type) ci_netif_unlock(netif); if( ts == NULL ) { - LOG_E(ci_log("%s: [%d] out of socket buffers", __FUNCTION__,NI_ID(netif))); + LOG_E( + ci_log("%s: [%d] out of socket buffers", __FUNCTION__, NI_ID(netif))); return -EMFILE; } fd = citp_tcp_ep_acquire_fd(netif, ts, NULL, domain, type, - type + type #if CI_CFG_FD_CACHING - & CI_CACHE_FIXUP_FLAGS + & CI_CACHE_FIXUP_FLAGS #endif - ); + ); if( fd < 0 ) { if( fd == -EAFNOSUPPORT ) LOG_U(ci_log("%s: citp_tcp_ep_acquire_fd (domain=%d, type=%d) failed %d", - __FUNCTION__, domain, type, fd)); + __FUNCTION__, domain, type, fd)); else LOG_E(ci_log("%s: citp_tcp_ep_acquire_fd (domain=%d, type=%d) failed %d", - __FUNCTION__, domain, type, fd)); + __FUNCTION__, domain, type, fd)); return fd; } @@ -249,7 +253,7 @@ ci_fd_t ci_tcp_ep_ctor(citp_socket* ep, ci_netif* netif, int domain, int type) ts->s.laddr = addr_any; #endif ep->netif = netif; - ep->s = &ts->s; + ep->s = &ts->s; #ifndef NDEBUG /* We hold the only reference to [ep] and its fd is marked busy, so its @@ -265,13 +269,12 @@ ci_fd_t ci_tcp_ep_ctor(citp_socket* ep, ci_netif* netif, int domain, int type) #endif -static int -citp_tcp_socket(int domain, int type, int protocol) +static int citp_tcp_socket(int domain, int type, int protocol) { - citp_fdinfo* fdi; + citp_fdinfo* fdi; citp_sock_fdi* epi; - int fd, rc; - ci_netif* ni; + int fd, rc; + ci_netif* ni; Log_VSS(ci_log(LPF "socket(%d, %d, %d)", domain, type, protocol)); @@ -298,7 +301,7 @@ citp_tcp_socket(int domain, int type, int protocol) goto fail2; } - if((fd = ci_tcp_ep_ctor( &epi->sock, ni, domain, type)) < 0) { + if( (fd = ci_tcp_ep_ctor(&epi->sock, ni, domain, type)) < 0 ) { Log_U(ci_log(LPF "socket: tcp_ep_ctor failed")); errno = -fd; goto fail3; @@ -311,21 +314,22 @@ citp_tcp_socket(int domain, int type, int protocol) ci_atomic32_and(&epi->sock.s->b.sb_aflags, ~CI_SB_AFLAG_NOT_READY); citp_fdtable_insert(fdi, fd, 0); - Log_VSS(ci_log(LPF "socket(%d, %d, %d) = "EF_FMT, domain, - type, protocol, NI_ID(ni), SC_FMT(epi->sock.s), fd)); + Log_VSS(ci_log(LPF "socket(%d, %d, %d) = " EF_FMT, domain, type, protocol, + NI_ID(ni), SC_FMT(epi->sock.s), fd)); return fd; - fail3: +fail3: if( CITP_OPTS.no_fail && errno != ELIBACC ) CITP_STATS_NETIF(++ni->state->stats.tcp_handover_socket); citp_netif_release_ref(ni, 0); - fail2: +fail2: CI_FREE_OBJ(epi); - fail1: +fail1: /* BUG1408: Fail gracefully. We let the OS have a go at this so long as it's * not been caused by a driver/library mis-match */ if( CITP_OPTS.no_fail && errno != ELIBACC ) { - Log_U(ci_log("%s: failed (errno:%d) - PASSING TO OS", __FUNCTION__, errno)); + Log_U( + ci_log("%s: failed (errno:%d) - PASSING TO OS", __FUNCTION__, errno)); return CI_SOCKET_HANDOVER; } return -1; @@ -334,8 +338,8 @@ citp_tcp_socket(int domain, int type, int protocol) citp_fdinfo* citp_tcp_dup(citp_fdinfo* orig_fdi) { - citp_socket* orig_sock = fdi_to_socket(orig_fdi); - citp_sock_fdi* sock_fdi = CI_ALLOC_OBJ(citp_sock_fdi); + citp_socket* orig_sock = fdi_to_socket(orig_fdi); + citp_sock_fdi* sock_fdi = CI_ALLOC_OBJ(citp_sock_fdi); if( sock_fdi ) { citp_fdinfo_init(&sock_fdi->fdinfo, orig_fdi->protocol); sock_fdi->sock = *orig_sock; @@ -347,9 +351,9 @@ citp_fdinfo* citp_tcp_dup(citp_fdinfo* orig_fdi) ci_inline ci_uint64 linger_hash(ci_sock_cmn* s) { - return (ci_uint64)(sock_lport_be16(s) << 16) | - (ci_uint64)sock_rport_be16(s) | - ((ci_uint64)sock_raddr_be32(s) << 32); + return (ci_uint64) (sock_lport_be16(s) << 16) | + (ci_uint64) sock_rport_be16(s) | + ((ci_uint64) sock_raddr_be32(s) << 32); } #if CI_CFG_FD_CACHING @@ -358,19 +362,20 @@ static void citp_tcp_close(citp_fdinfo* fdinfo) citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); if( epi->sock.s->b.state == CI_TCP_LISTEN ) { - ci_netif* ni = epi->sock.netif; + ci_netif* ni = epi->sock.netif; ci_tcp_socket_listen* tls = SOCK_TO_TCP_LISTEN(epi->sock.s); if( ! (tls->s.s_flags & CI_SOCK_FLAG_SCALPASSIVE) ) { struct oo_p_dllink_state fd_list = - oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.fd_states); + oo_p_dllink_sb(ni, &tls->s.b, &tls->epcache.fd_states); struct oo_p_dllink_state l; ci_netif_lock(ni); - oo_p_dllink_for_each(ni, l, fd_list) { + oo_p_dllink_for_each(ni, l, fd_list) + { ci_tcp_state* ts = CI_CONTAINER(ci_tcp_state, epcache_fd_link, l.l); if( ts->cached_on_pid == citp_getpid() && - S_TO_EPS(epi->sock.netif, ts)->fd != CI_FD_BAD) { + S_TO_EPS(epi->sock.netif, ts)->fd != CI_FD_BAD ) { /* Fixme: should we move all the content of * ci_tcp_listen_uncache_fds() here? */ S_TO_EPS(epi->sock.netif, ts)->fd = CI_FD_BAD; @@ -378,6 +383,15 @@ static void citp_tcp_close(citp_fdinfo* fdinfo) } ci_netif_unlock(ni); } + } else if( epi->sock.s->b.state != CI_TCP_CLOSED ) { + int rc; + ci_netif* ni = epi->sock.netif; + ci_netif_lock(ni); + rc = ci_tcp_close(ni, SOCK_TO_TCP(epi->sock.s)); + if( rc != 0 ) { + LOG_TC(ci_log("Failed to close TCP Socket")); + } + ci_netif_unlock(ni); } } #endif @@ -391,7 +405,7 @@ static void citp_tcp_dtor(citp_fdinfo* fdinfo, int fdt_locked) * UL netif structure knows about this. Normal close() is already * handled in the fd caching code, but there are a lot of ways to close * a socket in abnormal way: handover, onload_move_fd, dup2/dup3. - * + * * We can insert this line in tcp_handover() at all, but here is just * one place for all the cases mentioned above. */ @@ -407,8 +421,8 @@ static void tcp_handover(citp_sock_fdi* sock_fdi) /* The O_NONBLOCK flag is not propagated to the O/S socket, so we have to ** fix it up when we handover. */ - ci_sock_cmn* s = sock_fdi->sock.s; - int nonb_switch = -1; + ci_sock_cmn* s = sock_fdi->sock.s; + int nonb_switch = -1; ci_assert_flags(s->b.sb_aflags, CI_SB_AFLAG_OS_BACKED); @@ -416,27 +430,27 @@ static void tcp_handover(citp_sock_fdi* sock_fdi) /* O/S socket is already has O_NONBLOCK. Turn it off? */ if( ! (s->b.sb_aflags & CI_SB_AFLAG_O_NONBLOCK) ) nonb_switch = 0; - } - else if( s->b.sb_aflags & CI_SB_AFLAG_O_NONBLOCK ) + } else if( s->b.sb_aflags & CI_SB_AFLAG_O_NONBLOCK ) nonb_switch = 1; citp_fdinfo_handover(&sock_fdi->fdinfo, nonb_switch); } -static int citp_tcp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, - socklen_t sa_len) +static int citp_tcp_bind( + citp_fdinfo* fdinfo, const struct sockaddr* sa, socklen_t sa_len) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - citp_socket* ep = &epi->sock; - ci_sock_cmn* s = ep->s; - int rc; - -#if !CI_CFG_FAKE_IPV6 - Log_VSS(const struct sockaddr_in* sai = (const struct sockaddr_in*) sa; - ci_log(LPF "bind("EF_FMT", %s:%d, %d)", EF_PRI_ARGS(epi, fdinfo->fd), - (sai != NULL) ? ip_addr_str(sai->sin_addr.s_addr) : "(null)", - (sai != NULL) ? CI_BSWAP_BE16(sai->sin_port) : 0, sa_len)); + citp_socket* ep = &epi->sock; + ci_sock_cmn* s = ep->s; + int rc; + +#if ! CI_CFG_FAKE_IPV6 + Log_VSS( + const struct sockaddr_in* sai = (const struct sockaddr_in*) sa; + ci_log(LPF "bind(" EF_FMT ", %s:%d, %d)", EF_PRI_ARGS(epi, fdinfo->fd), + (sai != NULL) ? ip_addr_str(sai->sin_addr.s_addr) : "(null)", + (sai != NULL) ? CI_BSWAP_BE16(sai->sin_port) : 0, sa_len)); #endif ci_netif_lock_fdi(epi); @@ -454,7 +468,7 @@ static int citp_tcp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, if( fdinfo == NULL ) return ci_sys_bind(fd, sa, sa_len); else { - ci_assert_equal( fdinfo->protocol->type, CITP_PASSTHROUGH_FD); + ci_assert_equal(fdinfo->protocol->type, CITP_PASSTHROUGH_FD); return citp_passthrough_bind(fdinfo, sa, sa_len); } } @@ -470,9 +484,8 @@ static int citp_tcp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, /* The socket has moved so need to reprobe the fd. This will also * map the the new stack into user space of the executing process. */ - fdinfo = citp_reprobe_moved(fdinfo, - CI_FALSE/* ! from_fast_lookup */, - CI_FALSE/* ! fdip_is_busy */); + fdinfo = citp_reprobe_moved(fdinfo, CI_FALSE /* ! from_fast_lookup */, + CI_FALSE /* ! fdip_is_busy */); /* We want to prefault the packets for the new clustered stack. This * is only needed if we successfully reprobed a valid fd. This might @@ -485,15 +498,14 @@ static int citp_tcp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, */ if( fdinfo && fdinfo->protocol == &citp_tcp_protocol_impl ) { epi = fdi_to_sock_fdi(fdinfo); - ep = &epi->sock; + ep = &epi->sock; ci_netif_cluster_prefault(ep->netif); - } - else { + } else { CI_SET_ERROR(rc, EBADF); } } #else - (void)s; /* appease compiler when NDEBUG */ + (void) s; /* appease compiler when NDEBUG */ #endif if( fdinfo ) @@ -501,8 +513,7 @@ static int citp_tcp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, return rc; } -static bool -tcp_rc_means_handover(int rc) +static bool tcp_rc_means_handover(int rc) { /* ENOMEM or EBUSY means we are out of some sort of resource, so hand * this socket over to the OS. @@ -512,21 +523,22 @@ tcp_rc_means_handover(int rc) * Onload iptables so traffic should go via the OS. The case of Onload * iptables preventing filter insertion on only some interfaces is already * handled correctly in ci_tcp_listen(). */ - return rc == CI_SOCKET_HANDOVER - || ( (rc < 0) && CITP_OPTS.no_fail && - ( errno == ENOMEM || errno == EBUSY || errno == ENOBUFS || - errno == ERFKILL || errno == ENOENT ) ); + return rc == CI_SOCKET_HANDOVER || + ((rc < 0) && CITP_OPTS.no_fail && + (errno == ENOMEM || errno == EBUSY || errno == ENOBUFS || + errno == ERFKILL || errno == ENOENT)); } static int citp_tcp_listen(citp_fdinfo* fdinfo, int backlog) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSS(ci_log(LPF "listen("EF_FMT", %d)", EF_PRI_ARGS(epi,fdinfo->fd), - backlog)); + Log_VSS(ci_log( + LPF "listen(" EF_FMT ", %d)", EF_PRI_ARGS(epi, fdinfo->fd), backlog)); - if( epi->sock.s->s_flags & (CI_SOCK_FLAGS_SCALABLE & ~CI_SOCK_FLAG_SCALPASSIVE) ) { + if( epi->sock.s->s_flags & + (CI_SOCK_FLAGS_SCALABLE & ~CI_SOCK_FLAG_SCALPASSIVE) ) { /* We do not support IP_TRANSPARENT on listening sockets. If this has * already been bound then we're past the point where we should have * created the OS socket, otherwise we can just handover. @@ -535,16 +547,15 @@ static int citp_tcp_listen(citp_fdinfo* fdinfo, int backlog) * then we hand over sockets as soon as IP_TRANSPARENT is applied. */ if( epi->sock.s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND ) { - NI_LOG(epi->sock.netif, USAGE_WARNINGS, "Listening sockets using " - "socket option IP_TRANSPARENT cannot be accelerated"); + NI_LOG(epi->sock.netif, USAGE_WARNINGS, + "Listening sockets using " + "socket option IP_TRANSPARENT cannot be accelerated"); rc = CI_SOCKET_HANDOVER; - } - else { + } else { errno = EINVAL; - rc = -1; + rc = -1; } - } - else { + } else { rc = ci_tcp_listen(&(epi->sock), fdinfo->fd, backlog); } @@ -560,21 +571,20 @@ static int citp_tcp_listen(citp_fdinfo* fdinfo, int backlog) return rc; } - citp_fdinfo_release_ref( fdinfo, 0 ); + citp_fdinfo_release_ref(fdinfo, 0); return rc; } -static int citp_tcp_accept_os(citp_sock_fdi* epi, int fd, - struct sockaddr* sa, socklen_t* p_sa_len, - int flags) +static int citp_tcp_accept_os(citp_sock_fdi* epi, int fd, struct sockaddr* sa, + socklen_t* p_sa_len, int flags) { int rc; - rc = oo_os_sock_accept(epi->sock.netif, SC_SP(epi->sock.s), - sa, p_sa_len, flags); - Log_VSS(ci_log(LPF "accept("EF_FMT", sa, %d) = SYSTEM FD %d", - EF_PRI_ARGS(epi,fd), p_sa_len ? *p_sa_len:-1, rc)); + rc = oo_os_sock_accept( + epi->sock.netif, SC_SP(epi->sock.s), sa, p_sa_len, flags); + Log_VSS(ci_log(LPF "accept(" EF_FMT ", sa, %d) = SYSTEM FD %d", + EF_PRI_ARGS(epi, fd), p_sa_len ? *p_sa_len : -1, rc)); if( rc >= 0 ) citp_fdtable_passthru(rc, 0); else @@ -583,10 +593,9 @@ static int citp_tcp_accept_os(citp_sock_fdi* epi, int fd, } -static int citp_tcp_accept_complete(ci_netif* ni, - struct sockaddr* sa, socklen_t* p_sa_len, - ci_tcp_socket_listen* listener, - ci_tcp_state* ts, int newfd) +static int citp_tcp_accept_complete(ci_netif* ni, struct sockaddr* sa, + socklen_t* p_sa_len, ci_tcp_socket_listen* listener, ci_tcp_state* ts, + int newfd) { CITP_STATS_NETIF(++ni->state->stats.ul_accepts); @@ -594,13 +603,12 @@ static int citp_tcp_accept_complete(ci_netif* ni, ci_tcp_get_peer_addr(ts, sa, p_sa_len); Log_VSS(ci_log(LPF "%d ACCEPTING %d " IPX_FMT - ":%u rcv=%08x-%08x snd=%08x-%08x-%08x " - "enq=%08x", S_FMT(listener), S_FMT(ts), - IPX_ARG(AF_IP(tcp_ipx_raddr(ts))), - (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_dest_be16), - tcp_rcv_nxt(ts), tcp_rcv_wnd_right_edge_sent(ts), - tcp_snd_una(ts), tcp_snd_nxt(ts), ts->snd_max, - tcp_enq_nxt(ts))); + ":%u rcv=%08x-%08x snd=%08x-%08x-%08x " + "enq=%08x", + S_FMT(listener), S_FMT(ts), IPX_ARG(AF_IP(tcp_ipx_raddr(ts))), + (unsigned) CI_BSWAP_BE16(TS_IPX_TCP(ts)->tcp_dest_be16), tcp_rcv_nxt(ts), + tcp_rcv_wnd_right_edge_sent(ts), tcp_snd_una(ts), tcp_snd_nxt(ts), + ts->snd_max, tcp_enq_nxt(ts))); /* Considered safe to take inode/uid from listening socket. As this * socket is necessarily in the same stack as the listener we know that @@ -618,19 +626,19 @@ static int citp_tcp_accept_complete(ci_netif* ni, #define CI_ACCEPT_FAKED_UP -3 static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, - struct sockaddr* sa, socklen_t* p_sa_len, - int flags, citp_waitable* w) + struct sockaddr* sa, socklen_t* p_sa_len, int flags, citp_waitable* w) { - ci_netif *ani; - oo_sp sp = w->moved_to_sock_id; - ci_uint32 stack_id = w->moved_to_stack_id; + ci_netif* ani; + oo_sp sp = w->moved_to_sock_id; + ci_uint32 stack_id = w->moved_to_stack_id; citp_sock_fdi* newepi; - citp_fdinfo* newfdi; - citp_waitable *neww; - ci_tcp_state* ts; - int newfd, rc; + citp_fdinfo* newfdi; + citp_waitable* neww; + ci_tcp_state* ts; + int newfd, rc; - if( fdtable_strict() ) CITP_FDTABLE_LOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_LOCK(); rc = citp_netif_by_id(stack_id, &ani, fdtable_strict()); if( rc != 0 ) { @@ -638,38 +646,41 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, * and return it to the user. We've lost all the data we might have * received via this connection. */ ci_tcp_state* ts; - static int printed = 0; + static int printed = 0; - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); if( ! printed ) { - ci_log("EF_TCP_SERVER_LOOPBACK=2 limitation: the real client has gone, " - "faking it up. All data sent via this loopback connection " - "is lost."); + ci_log( + "EF_TCP_SERVER_LOOPBACK=2 limitation: the real client has gone, " + "faking it up. All data sent via this loopback connection " + "is lost."); printed = 1; } CITP_STATS_TCP_LISTEN(++listener->stats.n_accept_loop2_closed); ci_assert_equal(w->sb_aflags, - CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_NOT_READY | - CI_SB_AFLAG_MOVED_AWAY); + CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_NOT_READY | CI_SB_AFLAG_MOVED_AWAY); w->sb_aflags = CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_TCP_IN_ACCEPTQ | CI_SB_AFLAG_NOT_READY; - ci_tcp_state_init(ni, &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp, 0); - ts = &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp; + ci_tcp_state_init( + ni, &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp, 0); + ts = &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp; - ts->tcpflags = CI_TCPT_FLAG_LOOP_FAKE | CI_TCPT_FLAG_PASSIVE_OPENED; - ts->s.domain = AF_INET; - tcp_laddr_be32(ts) = sock_laddr_be32(&listener->s) == INADDR_ANY ? - INADDR_LOOPBACK : sock_laddr_be32(&listener->s); + ts->tcpflags = CI_TCPT_FLAG_LOOP_FAKE | CI_TCPT_FLAG_PASSIVE_OPENED; + ts->s.domain = AF_INET; + tcp_laddr_be32(ts) = sock_laddr_be32(&listener->s) == INADDR_ANY + ? INADDR_LOOPBACK + : sock_laddr_be32(&listener->s); tcp_lport_be16(ts) = sock_lport_be16(&listener->s); tcp_raddr_be32(ts) = INADDR_LOOPBACK; tcp_rport_be16(ts) = 0; /* We do not have any hint about this port! */ - ts->s.tx_errno = EPIPE; - ts->s.rx_errno = CI_SHUT_RD; - ts->s.so_error = ECONNRESET; + ts->s.tx_errno = EPIPE; + ts->s.rx_errno = CI_SHUT_RD; + ts->s.so_error = ECONNRESET; return CI_ACCEPT_FAKED_UP; } @@ -681,23 +692,25 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, ci_netif_unlock(ni); - newfd = ci_tcp_helper_tcp_accept_sock_attach(ci_netif_get_driver_handle(ani), - sp, flags); + newfd = ci_tcp_helper_tcp_accept_sock_attach( + ci_netif_get_driver_handle(ani), sp, flags); if( newfd < 0 ) { citp_netif_release_ref(ani, fdtable_strict()); - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); return -1; } citp_fdtable_new_fd_set(newfd, fdip_busy, fdtable_strict()); - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); Log_EP(ci_log("%s: %d:%d accepted fd=%d %d:%d", __FUNCTION__, - ni->state->stack_id, S_ID(listener), newfd, - ani->state->stack_id, OO_SP_TO_INT(sp))); + ni->state->stack_id, S_ID(listener), newfd, ani->state->stack_id, + OO_SP_TO_INT(sp))); /* Check that this ts looks in the way we expect; * there is no guarantee that it is the same stack it used to be. */ neww = SP_TO_WAITABLE(ani, sp); - if( !(neww->state & CI_TCP_STATE_TCP) || neww->state == CI_TCP_LISTEN ) { + if( ! (neww->state & CI_TCP_STATE_TCP) || neww->state == CI_TCP_LISTEN ) { errno = EINVAL; goto fail; } @@ -705,13 +718,13 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, ts = SP_TO_TCP(ani, sp); if( sock_lport_be16(&ts->s) != sock_lport_be16(&listener->s) || (sock_laddr_be32(&listener->s) != INADDR_ANY && - (sock_laddr_be32(&listener->s) != sock_laddr_be32(&ts->s)) )) { + (sock_laddr_be32(&listener->s) != sock_laddr_be32(&ts->s))) ) { errno = EINVAL; goto fail; } - ci_assert(!(ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); - ci_assert(!(ts->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ)); + ci_assert(! (ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); + ci_assert(! (ts->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ)); newepi = CI_ALLOC_OBJ(citp_sock_fdi); if( newepi == 0 ) { @@ -723,7 +736,7 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, #if CI_CFG_FD_CACHING newfdi->can_cache = 0; #endif - newepi->sock.s = &ts->s; + newepi->sock.s = &ts->s; newepi->sock.netif = ani; /* get new file descriptor into table */ @@ -733,8 +746,10 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, return citp_tcp_accept_complete(ni, sa, p_sa_len, listener, ts, newfd); fail: - Log_E (ci_log(LPF "failed to get accepted socket from alien stack [%d]:" - " errno=%d", NI_ID(ani), errno)); + Log_E( + ci_log(LPF "failed to get accepted socket from alien stack [%d]:" + " errno=%d", + NI_ID(ani), errno)); ef_onload_driver_close(newfd); citp_netif_release_ref(ani, 0); return -1; @@ -743,22 +758,21 @@ static int citp_tcp_accept_alien(ci_netif* ni, ci_tcp_socket_listen* listener, static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, - ci_tcp_socket_listen* listener, - struct sockaddr* sa, socklen_t* p_sa_len, - int flags) + ci_tcp_socket_listen* listener, struct sockaddr* sa, socklen_t* p_sa_len, + int flags) { citp_sock_fdi* newepi; - citp_fdinfo* newfdi; - ci_tcp_state* ts; + citp_fdinfo* newfdi; + ci_tcp_state* ts; citp_waitable* w; - int newfd; + int newfd; #if CI_CFG_FD_CACHING int from_cache; #endif int unlocked = 0; - Log_VSS(ci_log(LPF "accept(%d:%d, sa, %d)", fdinfo->fd, - S_FMT(listener), p_sa_len ? *p_sa_len : -1)); + Log_VSS(ci_log(LPF "accept(%d:%d, sa, %d)", fdinfo->fd, S_FMT(listener), + p_sa_len ? *p_sa_len : -1)); #if CI_CFG_FD_CACHING redo: #endif @@ -783,11 +797,11 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, ts = &CI_CONTAINER(citp_waitable_obj, waitable, w)->tcp; #if CI_CFG_FD_CACHING if( S_TO_EPS(ni, ts)->fd != CI_FD_BAD ) { - /* we have fd to ep already this also means we are not at risk of concurrent - * sys_close() - * and are able to fixup state to reflect it coming from our cache */ + /* we have fd to ep already this also means we are not at risk of + * concurrent sys_close() and are able to fixup state to reflect it coming + * from our cache */ ci_assert_nflags(ts->s.b.sb_aflags, CI_SB_AFLAG_IN_CACHE_NO_FD); - ts->cached_on_fd = S_TO_EPS(ni,ts)->fd; + ts->cached_on_fd = S_TO_EPS(ni, ts)->fd; ts->cached_on_pid = citp_getpid(); } from_cache = ci_tcp_is_cached(ts); @@ -796,24 +810,24 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, * But faked-up loopback connection can't be cached, so we are safe * here. */ ci_assert(! unlocked); - oo_p_dllink_del_init(ni, oo_p_dllink_sb(ni, &ts->s.b, - &ts->epcache_fd_link)); + oo_p_dllink_del_init( + ni, oo_p_dllink_sb(ni, &ts->s.b, &ts->epcache_fd_link)); } #endif if( ! unlocked ) ci_sock_unlock(ni, &listener->s.b); - newfd = citp_tcp_ep_acquire_fd(ni, ts, listener, ts->s.domain, SOCK_STREAM, - flags); + newfd = citp_tcp_ep_acquire_fd( + ni, ts, listener, ts->s.domain, SOCK_STREAM, flags); if( newfd < 0 ) { - Log_E(ci_log(LPF "%s: citp_tcp_ep_acquire_fd failed: %d", - __FUNCTION__, newfd)); + Log_E(ci_log( + LPF "%s: citp_tcp_ep_acquire_fd failed: %d", __FUNCTION__, newfd)); ci_sock_lock(ni, &listener->s.b); ci_assert(ts->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ); #if CI_CFG_FD_CACHING if( newfd == -ENOANO ) { Log_EP(ci_log("%s: [%d:%d]. puttint accepted socket back on acceptq", - __FUNCTION__, NI_ID(ni), S_SP(ts))); + __FUNCTION__, NI_ID(ni), S_SP(ts))); ci_tcp_acceptq_put_back_tail(ni, listener, &ts->s.b); CITP_STATS_NETIF_INC(ni, accept_attach_fd_retry); sched_yield(); @@ -831,16 +845,16 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, /* Whether [ts] came from the cache or not, we need to create the u/l state * for the fd (i.e. fdinfo). */ - ci_assert(!(ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); - ci_assert(!(ts->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ)); + ci_assert(! (ts->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); + ci_assert(! (ts->s.b.sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ)); newepi = CI_ALLOC_OBJ(citp_sock_fdi); if( newepi == 0 ) { - Log_E (ci_log(LPF "accept: newepi malloc failed")); + Log_E(ci_log(LPF "accept: newepi malloc failed")); citp_fdtable_busy_clear(newfd, fdip_unknown, 0); /* FIXME close the EP in case of shared EP cache */ ci_tcp_helper_close_no_trampoline(newfd); - S_TO_EPS(ni,ts)->fd = CI_FD_BAD; + S_TO_EPS(ni, ts)->fd = CI_FD_BAD; return -1; } newfdi = &newepi->fdinfo; @@ -848,7 +862,7 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, #if CI_CFG_FD_CACHING newfdi->can_cache = 1; #endif - newepi->sock.s = &ts->s; + newepi->sock.s = &ts->s; newepi->sock.netif = ni; citp_netif_add_ref(ni); @@ -856,11 +870,11 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, if( from_cache ) { ci_atomic32_inc(&ni->state->passive_cache_avail_stack); ci_atomic32_inc(&listener->cache_avail_sock); - ci_assert_le(ni->state->passive_cache_avail_stack, - ni->state->opts.sock_cache_max); + ci_assert_le( + ni->state->passive_cache_avail_stack, ni->state->opts.sock_cache_max); if( ~NI_OPTS(ni).scalable_filter_mode & CITP_SCALABLE_MODE_PASSIVE ) - ci_assert_le(listener->cache_avail_sock, - ni->state->opts.per_sock_cache_max); + ci_assert_le( + listener->cache_avail_sock, ni->state->opts.per_sock_cache_max); } #endif @@ -873,32 +887,29 @@ static int citp_tcp_accept_ul(citp_fdinfo* fdinfo, ci_netif* ni, } -static int citp_tcp_accept(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len, - int flags, - citp_lib_context_t* lib_context) +static int citp_tcp_accept(citp_fdinfo* fdinfo, struct sockaddr* sa, + socklen_t* p_sa_len, int flags, citp_lib_context_t* lib_context) { ci_tcp_socket_listen* listener; - citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - ci_netif* ni; - int have_polled = 0; - ci_uint64 start_frc = 0 /* for effing stoopid compilers */; - int rc = 0; - ci_uint64 max_spin; - int spin_limit_by_so = 0; - int timeout; - unsigned tcp_accept_spin = oo_per_thread_get()->spinstate & - (1 << ONLOAD_SPIN_TCP_ACCEPT); - - ni = epi->sock.netif; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + ci_netif* ni; + ci_uint64 start_frc = 0 /* for effing stoopid compilers */; + int rc = 0; + ci_uint64 max_spin; + int spin_limit_by_so = 0; + int timeout; + unsigned tcp_accept_spin = + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_ACCEPT); + + ni = epi->sock.netif; /* Prepare to spin if necessary */ max_spin = epi->sock.s->b.spin_cycles; if( epi->sock.s->so.rcvtimeo_msec && tcp_accept_spin ) { - ci_uint64 max_so_spin = (ci_uint64)epi->sock.s->so.rcvtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) epi->sock.s->so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= max_spin ) { - max_spin = max_so_spin; + max_spin = max_so_spin; spin_limit_by_so = 1; } } @@ -918,30 +929,28 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, } if( ci_tcp_acceptq_n(listener) ) { - ci_sock_lock(ni, &listener->s.b); - if( ci_tcp_acceptq_not_empty(listener) ) { - /* delayed error report (after a connect came) */ - if( CI_UNLIKELY(p_sa_len == NULL && sa != NULL) ) { - ci_sock_unlock(ni, &listener->s.b); - CI_SET_ERROR(rc, EFAULT); - return rc; - } - return citp_tcp_accept_ul(fdinfo, ni, listener, sa, p_sa_len, flags); + ci_sock_lock(ni, &listener->s.b); + if( ci_tcp_acceptq_not_empty(listener) ) { + /* delayed error report (after a connect came) */ + if( CI_UNLIKELY(p_sa_len == NULL && sa != NULL) ) { + ci_sock_unlock(ni, &listener->s.b); + CI_SET_ERROR(rc, EFAULT); + return rc; } - ci_sock_unlock(ni, &listener->s.b); + return citp_tcp_accept_ul(fdinfo, ni, listener, sa, p_sa_len, flags); + } + ci_sock_unlock(ni, &listener->s.b); } /* User-level accept queue is empty. Are we up-to-date? */ - if( ! have_polled ) { - have_polled = 1; - ci_frc64(&start_frc); - if( ci_netif_may_poll(ni) && ci_netif_need_poll_frc(ni, start_frc) && - ci_netif_trylock(ni) ) { - int any_evs = ci_netif_poll(ni); - ci_netif_unlock(ni); - if( any_evs ) goto check_ul_accept_q; - } + ci_frc64(&start_frc); + if( ci_netif_may_poll(ni) && ci_netif_need_poll_frc(ni, start_frc) && + ci_netif_trylock(ni) ) { + int any_evs = ci_netif_poll(ni); + ci_netif_unlock(ni); + if( any_evs ) + goto check_ul_accept_q; } /* What about the O/S socket? */ @@ -949,19 +958,20 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, if( listener->s.os_sock_status & OO_OS_STATUS_RX ) { rc = citp_tcp_accept_os(epi, fdinfo->fd, sa, p_sa_len, flags); if( rc >= 0 ) { - CITP_STATS_TCP_LISTEN(++listener->stats.n_accept_os); - ++ni->state->stats.tcp_accept_os; - goto unlock_out; + CITP_STATS_TCP_LISTEN(++listener->stats.n_accept_os); + ++ni->state->stats.tcp_accept_os; + goto unlock_out; } - if( errno != EAGAIN ) goto unlock_out; + if( errno != EAGAIN ) + goto unlock_out; } } - if( listener->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | - CI_SB_AFLAG_O_NDELAY) ) { + if( listener->s.b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) { CITP_STATS_NETIF(++ni->state->stats.accept_eagain); errno = EAGAIN; - rc = -1; + rc = -1; goto unlock_out; } @@ -976,38 +986,38 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, ni->state->stats.spin_tcp_accept++; #endif if( ci_netif_may_poll(ni) && ci_netif_need_poll_frc(ni, now_frc) ) { - if( ci_netif_trylock(ni) ) { - ci_netif_poll(ni); + if( ci_netif_trylock(ni) ) { + ci_netif_poll(ni); ci_netif_unlock(ni); - } - } - else if( ! ni->state->is_spinner ) + } + } else if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; - if(CI_UNLIKELY( lib_context->thread->sig.c.aflags & - OO_SIGNAL_FLAG_HAVE_PENDING )) { + if( CI_UNLIKELY(lib_context->thread->sig.c.aflags & + OO_SIGNAL_FLAG_HAVE_PENDING) ) { if( listener->s.so.rcvtimeo_msec ) { ni->state->is_spinner = 0; - errno = EINTR; + errno = EINTR; return -1; } /* run any pending signals: */ { int inside_lib = - oo_exit_lib_temporary_begin(&lib_context->thread->sig); + oo_exit_lib_temporary_begin(&lib_context->thread->sig); oo_exit_lib_temporary_end(&lib_context->thread->sig, inside_lib); } - if( ~lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_NEED_RESTART ) { + if( ~lib_context->thread->sig.c.aflags & + OO_SIGNAL_FLAG_NEED_RESTART ) { ni->state->is_spinner = 0; - errno = EINTR; + errno = EINTR; return -1; } if( oo_atomic_read(&fdinfo->ref_count) == 1 ) { ni->state->is_spinner = 0; - errno = EBADF; + errno = EBADF; return -1; } } @@ -1024,7 +1034,7 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, { struct pollfd pfd; - pfd.fd = fdinfo->fd; + pfd.fd = fdinfo->fd; pfd.events = POLLIN; if( timeout == 0 ) @@ -1037,7 +1047,7 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, * * See also ci_udp_recvmsg(). */ - restart_select: + restart_select: citp_exit_lib(lib_context, FALSE); rc = ci_sys_poll(&pfd, 1, timeout); citp_reenter_lib(lib_context); @@ -1046,11 +1056,11 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, goto check_ul_accept_q; else if( rc == 0 ) { errno = EAGAIN; - rc = -1; - } - else if( errno == EINTR && - (lib_context->thread->sig.c.aflags & OO_SIGNAL_FLAG_NEED_RESTART) && - timeout == -1 ) { + rc = -1; + } else if( errno == EINTR && + (lib_context->thread->sig.c.aflags & + OO_SIGNAL_FLAG_NEED_RESTART) && + timeout == -1 ) { /* Before restarting because of SA_RESTART, let's check the fd was * not closed. One refcount is ours - so we exit if it is the last * one. */ @@ -1062,24 +1072,23 @@ static int citp_tcp_accept(citp_fdinfo* fdinfo, } } - unlock_out: +unlock_out: ni->state->is_spinner = 0; return rc; } -static int citp_tcp_connect(citp_fdinfo* fdinfo, - const struct sockaddr* sa, socklen_t sa_len, - citp_lib_context_t* lib_context) +static int citp_tcp_connect(citp_fdinfo* fdinfo, const struct sockaddr* sa, + socklen_t sa_len, citp_lib_context_t* lib_context) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - ci_sock_cmn* s = epi->sock.s; - int rc; - int moved = 0; + ci_sock_cmn* s = epi->sock.s; + int rc; + int moved = 0; -#if !CI_CFG_FAKE_IPV6 +#if ! CI_CFG_FAKE_IPV6 Log_VSS(const struct sockaddr_in* sai = (const struct sockaddr_in*) sa; - ci_log(LPF "connect("EF_FMT", %s:%d, %d)", - EF_PRI_ARGS(epi,fdinfo->fd), + ci_log(LPF "connect(" EF_FMT ", %s:%d, %d)", + EF_PRI_ARGS(epi, fdinfo->fd), (sai != NULL) ? ip_addr_str(sai->sin_addr.s_addr) : "(null)", (sai != NULL) ? CI_BSWAP_BE16(sai->sin_port) : 0, sa_len)); #endif @@ -1095,18 +1104,18 @@ static int citp_tcp_connect(citp_fdinfo* fdinfo, */ if( (s->s_flags & CI_SOCK_FLAG_TPROXY) && (s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND) ) { - NI_LOG(epi->sock.netif, USAGE_WARNINGS, "Sockets using socket option " - "IP_TRANSPARENT must explicitly bind to a port to be accelerated"); + NI_LOG(epi->sock.netif, USAGE_WARNINGS, + "Sockets using socket option " + "IP_TRANSPARENT must explicitly bind to a port to be accelerated"); rc = CI_SOCKET_HANDOVER; - } - else { - rc = ci_tcp_connect( &epi->sock, sa, sa_len, fdinfo->fd, &moved); + } else { + rc = ci_tcp_connect(&epi->sock, sa, sa_len, fdinfo->fd, &moved); } if( moved ) { citp_fdinfo* new_fdinfo; - int reprobe_rc = citp_reprobe_moved_common(fdinfo, CI_FALSE, CI_FALSE, - &new_fdinfo); + int reprobe_rc = + citp_reprobe_moved_common(fdinfo, CI_FALSE, CI_FALSE, &new_fdinfo); fdinfo = new_fdinfo; if( fdinfo == NULL ) { /* Most probably, it is EMFILE, but we can't know for sure. @@ -1118,7 +1127,7 @@ static int citp_tcp_connect(citp_fdinfo* fdinfo, /* Possibly we also should handover. To do it properly, we need * current epi value. */ epi = fdi_to_sock_fdi(fdinfo); - s = epi->sock.s; + s = epi->sock.s; } if( tcp_rc_means_handover(rc) ) { @@ -1127,20 +1136,19 @@ static int citp_tcp_connect(citp_fdinfo* fdinfo, * been bound (ie they wouldn't have an os socket even if they weren't * tproxy. */ - if( !(s->s_flags & CI_SOCK_FLAG_TPROXY) || - (s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND) ) { + if( ! (s->s_flags & CI_SOCK_FLAG_TPROXY) || + (s->s_flags & CI_SOCK_FLAG_CONNECT_MUST_BIND) ) { int fd = fdinfo->fd; - rc = 0; + rc = 0; ci_netif_lock_fdi(epi); if( ~epi->sock.s->b.sb_aflags & CI_SB_AFLAG_OS_BACKED ) { - rc = ci_tcp_helper_os_sock_create_and_set(epi->sock.netif, fdinfo->fd, - epi->sock.s, - -1, 0, NULL, 0); + rc = ci_tcp_helper_os_sock_create_and_set( + epi->sock.netif, fdinfo->fd, epi->sock.s, -1, 0, NULL, 0); } ci_netif_unlock_fdi(epi); if( rc < 0 ) { /* Too bad, but we can't do anything. Return to the user. */ - citp_fdinfo_release_ref( fdinfo, 0 ); + citp_fdinfo_release_ref(fdinfo, 0); RET_WITH_ERRNO(-rc); } @@ -1154,38 +1162,36 @@ static int citp_tcp_connect(citp_fdinfo* fdinfo, rc = ci_sys_connect(fd, sa, sa_len); citp_reenter_lib(lib_context); return rc; - } - else { - ci_assert_equal( fdinfo->protocol->type, CITP_PASSTHROUGH_FD); + } else { + ci_assert_equal(fdinfo->protocol->type, CITP_PASSTHROUGH_FD); return citp_passthrough_connect(fdinfo, sa, sa_len, lib_context); } - } - else { - NI_LOG(epi->sock.netif, USAGE_WARNINGS, "Sockets using socket option " - "IP_TRANSPARENT cannot be handed over after bind"); + } else { + NI_LOG(epi->sock.netif, USAGE_WARNINGS, + "Sockets using socket option " + "IP_TRANSPARENT cannot be handed over after bind"); errno = EINVAL; - rc = -1; + rc = -1; } } - citp_fdinfo_release_ref( fdinfo, 0 ); + citp_fdinfo_release_ref(fdinfo, 0); return rc; } #if CI_CFG_FD_CACHING -static void citp_tcp_close_cached(citp_fdinfo* fdinfo, - struct oo_p_dllink_state cache_pending, - int active) +static void citp_tcp_close_cached( + citp_fdinfo* fdinfo, struct oo_p_dllink_state cache_pending, int active) { - ci_socket_cache_t* cache = CI_CONTAINER(ci_socket_cache_t, pending, - cache_pending.l); - citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - ci_sock_cmn* s = epi->sock.s; - ci_netif* netif = epi->sock.netif; - ci_tcp_state* ts = SOCK_TO_TCP(s); + ci_socket_cache_t* cache = + CI_CONTAINER(ci_socket_cache_t, pending, cache_pending.l); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + ci_sock_cmn* s = epi->sock.s; + ci_netif* netif = epi->sock.netif; + ci_tcp_state* ts = SOCK_TO_TCP(s); struct oo_p_dllink_state link; - ci_assert(!ci_tcp_is_cached(ts)); + ci_assert(! ci_tcp_is_cached(ts)); /* We've decided to cache. There are two lots of things to do. Firstly, * set up the state needed to cache: @@ -1203,21 +1209,22 @@ static void citp_tcp_close_cached(citp_fdinfo* fdinfo, * We don't go via citp_waitable_all_fds_gone as we must not set the * ORPHAN flag - we remain attached to our fd. */ - ci_atomic32_dec((volatile ci_uint32*)CI_NETIF_PTR(netif, - cache->avail_stack)); + ci_atomic32_dec( + (volatile ci_uint32*) CI_NETIF_PTR(netif, cache->avail_stack)); ci_assert_ge(cache->avail_stack, 0); - ci_assert_lt(*(ci_uint32*)CI_NETIF_PTR(netif, cache->avail_stack), - netif->state->opts.sock_cache_max); + ci_assert_lt(*(ci_uint32*) CI_NETIF_PTR(netif, cache->avail_stack), + netif->state->opts.sock_cache_max); if( S_TO_EPS(netif, ts)->fd != CI_FD_BAD ) ci_assert_equal(fdinfo->fd, S_TO_EPS(netif, ts)->fd); - ts->cached_on_fd = fdinfo->fd; + ts->cached_on_fd = fdinfo->fd; ts->cached_on_pid = citp_getpid(); - ci_assert(!(s->b.sb_aflags & CI_SB_AFLAG_NOT_READY)); - ci_atomic32_or(&s->b.sb_aflags, CI_SB_AFLAG_NOT_READY | CI_SB_AFLAG_IN_CACHE - | (active ? 0 : CI_SB_AFLAG_IN_PASSIVE_CACHE)); + ci_assert(! (s->b.sb_aflags & CI_SB_AFLAG_NOT_READY)); + ci_atomic32_or( + &s->b.sb_aflags, CI_SB_AFLAG_NOT_READY | CI_SB_AFLAG_IN_CACHE | + (active ? 0 : CI_SB_AFLAG_IN_PASSIVE_CACHE)); /* If this socket was previously accepted from cache it may already be on * the connected list, so it needs removing before pushing to the pending @@ -1238,18 +1245,18 @@ static void citp_tcp_close_cached(citp_fdinfo* fdinfo, /* We calculate cache->fd_states state pointer from cache_pending * and offest between these 2 lists in the cache structure. */ if( ! oo_p_dllink_concurrent_add(netif, - oo_p_dllink_statep(netif, cache_pending.p + - ((uintptr_t)&cache->fd_states - (uintptr_t)&cache->pending)), - link) ) { + oo_p_dllink_statep( + netif, cache_pending.p + ((uintptr_t) &cache->fd_states - + (uintptr_t) &cache->pending)), + link) ) { /* When cache is shared sys_close will only release FD and * decrease reference on system file. However, we need this * endpoint to be really closed */ S_TO_EPS(netif, ts)->fd = CI_FD_BAD; ci_tcp_helper_close_no_trampoline(ts->cached_on_fd); - } - else { + } else { /* store sys fd for reuse */ - S_TO_EPS(netif,ts)->fd = fdinfo->fd; + S_TO_EPS(netif, ts)->fd = fdinfo->fd; } /* We're more of a kidnapped child than an orphan, but we still need to @@ -1258,7 +1265,7 @@ static void citp_tcp_close_cached(citp_fdinfo* fdinfo, * * NB. This socket cannot now be added to the deferred list, because * no-one has a reference to it. - */ + */ ci_netif_purge_deferred_socket_list(netif); /* We also need to remove the socket from the post-poll list. It may @@ -1279,8 +1286,7 @@ static void citp_tcp_close_cached(citp_fdinfo* fdinfo, */ if( ts->s.b.state != CI_TCP_CLOSED ) { ci_tcp_close(netif, ts); - } - else { + } else { /* Only active cached sockets can go directly to the cached list - we * can only cache passive sockets that still have their hw filter ref. */ @@ -1291,8 +1297,8 @@ static void citp_tcp_close_cached(citp_fdinfo* fdinfo, } -static void citp_tcp_close_passive_cached(ci_netif* netif, citp_fdinfo* fdinfo, - ci_tcp_socket_listen* tls) +static void citp_tcp_close_passive_cached( + ci_netif* netif, citp_fdinfo* fdinfo, ci_tcp_socket_listen* tls) { struct oo_p_dllink_state cache_pending; ci_atomic32_dec(&tls->cache_avail_sock); @@ -1303,18 +1309,16 @@ static void citp_tcp_close_passive_cached(ci_netif* netif, citp_fdinfo* fdinfo, if( (tls->s.s_flags & CI_SOCK_FLAG_SCALPASSIVE) == 0 ) cache_pending = oo_p_dllink_sb(netif, &tls->s.b, &tls->epcache.pending); else - cache_pending = oo_p_dllink_ptr(netif, - &netif->state->passive_scalable_cache.pending); + cache_pending = + oo_p_dllink_ptr(netif, &netif->state->passive_scalable_cache.pending); citp_tcp_close_cached(fdinfo, cache_pending, 0); } static void citp_tcp_close_active_cached(ci_netif* netif, citp_fdinfo* fdinfo) { - citp_tcp_close_cached(fdinfo, - oo_p_dllink_ptr(netif, - &netif->state->active_cache.pending), - 1); + citp_tcp_close_cached( + fdinfo, oo_p_dllink_ptr(netif, &netif->state->active_cache.pending), 1); } @@ -1325,16 +1329,17 @@ static void citp_tcp_close_active_cached(ci_netif* netif, citp_fdinfo* fdinfo) /* Check whether a socket's local port is in the list of permitted ports for * caching. */ -static int citp_tcp_cache_port_eligible(ci_sock_cmn* s) { - struct ci_port_list *sock_cache_port; +static int citp_tcp_cache_port_eligible(ci_sock_cmn* s) +{ + struct ci_port_list* sock_cache_port; if( CITP_OPTS.sock_cache_ports == 0 ) return 1; CI_DLLIST_FOR_EACH2(struct ci_port_list, sock_cache_port, link, - (ci_dllist*)(ci_uintptr_t)CITP_OPTS.sock_cache_ports) - if( sock_cache_port->port == sock_lport_be16(s) ) - return 1; + (ci_dllist*) (ci_uintptr_t) CITP_OPTS.sock_cache_ports) + if( sock_cache_port->port == sock_lport_be16(s) ) + return 1; return 0; } @@ -1348,14 +1353,14 @@ static int citp_tcp_cache_port_eligible(ci_sock_cmn* s) { */ static int citp_tcp_cache(citp_fdinfo* fdinfo) { - int rc = 0; - citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - ci_sock_cmn* s = epi->sock.s; - ci_tcp_state* ts; - ci_netif* netif = epi->sock.netif; + int rc = 0; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + ci_sock_cmn* s = epi->sock.s; + ci_tcp_state* ts; + ci_netif* netif = epi->sock.netif; ci_tcp_socket_listen* tls; - Log_VSS(ci_log(LPF "cache("EF_FMT")", EF_PRI_ARGS(epi, fdinfo->fd))); + Log_VSS(ci_log(LPF "cache(" EF_FMT ")", EF_PRI_ARGS(epi, fdinfo->fd))); /* We don't cache OS-backed sockets as managing the backing socket would * require going into the kernel. This stops us from caching listening @@ -1375,10 +1380,10 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) Log_EP(ci_log("FD %d not cached - SO_LINGER set", fdinfo->fd)); return 0; } - + /* Loopback sockets lack hw filter - shouldn't cache. */ if( OO_SP_NOT_NULL(ts->local_peer) && - ts->tcpflags & CI_TCPT_FLAG_PASSIVE_OPENED) { + ts->tcpflags & CI_TCPT_FLAG_PASSIVE_OPENED ) { Log_EP(ci_log("FD %d not cached - accelerated loopback", fdinfo->fd)); return 0; } @@ -1389,21 +1394,21 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) */ if( s->b.sb_aflags & (CI_SB_AFLAG_O_ASYNC | CI_SB_AFLAG_O_APPEND) ) { Log_EP(ci_log("FD %d not cached - invalid flags set 0x%x", fdinfo->fd, - s->b.sb_aflags & (CI_SB_AFLAG_O_ASYNC | CI_SB_AFLAG_O_APPEND))); + s->b.sb_aflags & (CI_SB_AFLAG_O_ASYNC | CI_SB_AFLAG_O_APPEND))); return 0; } /* We'd need to go into the kernel to reset sigown - shouldn't cache */ if( s->b.sigown != 0 ) { Log_EP(ci_log("FD %d not cached - owner's PID is set to %d", fdinfo->fd, - s->b.sigown)); + s->b.sigown)); return 0; } /* We may not be cacheable, for example if we've been duped, or added to * a ul_epoll=2 set. */ - if( !fdinfo->can_cache ) { + if( ! fdinfo->can_cache ) { Log_EP(ci_log("FD %d not cached - fdinfo not cacheable", fdinfo->fd)); return 0; } @@ -1433,9 +1438,8 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) /* We need to decide whether this socket should go on the passive- or * active-open cache, as the remaining work is different in each case. */ if( ts->tcpflags & CI_TCPT_FLAG_PASSIVE_OPENED ) { - oo_sp sock = ci_netif_listener_lookup(netif, sock_af_space(s), - sock_ipx_laddr(s), - sock_lport_be16(s)); + oo_sp sock = ci_netif_listener_lookup( + netif, sock_af_space(s), sock_ipx_laddr(s), sock_lport_be16(s)); if( OO_SP_IS_NULL(sock) ) { /* If the listener has been closed, we can't cache this socket. */ rc = 0; @@ -1448,8 +1452,8 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) /* We limit the maximum number of sockets cached in a stack. */ if( netif->state->passive_cache_avail_stack == 0 ) { - Log_EP(ci_log("FD %d not cached - passive stack limit reached", - fdinfo->fd)); + Log_EP(ci_log( + "FD %d not cached - passive stack limit reached", fdinfo->fd)); CITP_STATS_NETIF(++netif->state->stats.passive_sockcache_stacklim); goto unlock_out; } @@ -1457,22 +1461,23 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) /* The tcp state needs to still have its filters, or we'd have to go into * kernel anyway. */ - if( !(s->b.state & CI_TCP_STATE_TCP_CONN) ) { + if( ! (s->b.state & CI_TCP_STATE_TCP_CONN) ) { Log_EP(ci_log("FD %d not cached - not in suitable state (0x%x)", - fdinfo->fd, s->b.state)); + fdinfo->fd, s->b.state)); goto unlock_out; } if( s->s_flags & CI_SOCK_FLAG_FILTER ) { - Log_EP(ci_log("FD %d not cached - full match hw filter is installed", - fdinfo->fd)); + Log_EP(ci_log( + "FD %d not cached - full match hw filter is installed", fdinfo->fd)); goto unlock_out; } tls = SP_TO_TCP_LISTEN(netif, sock); if( tls->cache_avail_sock == 0 ) { - Log_EP(ci_log("FD %d not cached - per-socket limit reached", fdinfo->fd)); + Log_EP( + ci_log("FD %d not cached - per-socket limit reached", fdinfo->fd)); CITP_STATS_NETIF(++netif->state->stats.sockcache_socklim); goto unlock_out; } @@ -1480,24 +1485,24 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) /* Woohoo! Cache this sucker! */ citp_tcp_close_passive_cached(netif, fdinfo, tls); Log_EP(ci_log("FD %d cached on passive-open cache", fdinfo->fd)); - } - else { + } else { /* Non-scalable non-closed sockets might carry some other state that prevails our partial cache-based reinitialisation. Lack of hw filter and lack of backing socket are not enough to make this sockets cacheable */ if( (s->s_flags & CI_SOCK_FLAGS_SCALABLE) == 0 && - !(s->b.state == CI_TCP_CLOSED && - (s->s_flags & CI_SOCK_FLAG_BOUND) == 0) ) { - Log_EP(ci_log("FD %d not cached - active nonscalable socket", fdinfo->fd)); + ! (s->b.state == CI_TCP_CLOSED && + (s->s_flags & CI_SOCK_FLAG_BOUND) == 0) ) { + Log_EP( + ci_log("FD %d not cached - active nonscalable socket", fdinfo->fd)); goto unlock_out; } #if ! CI_CFG_IPV6 /* Don't cache IPv6 sockets */ if( s->domain != AF_INET ) { - Log_EP(ci_log("FD %d not cached - non-IPv4 domain %d", - fdinfo->fd, s->domain)); + Log_EP(ci_log( + "FD %d not cached - non-IPv4 domain %d", fdinfo->fd, s->domain)); CITP_STATS_NETIF(++netif->state->stats.active_sockcache_non_ip4); goto unlock_out; } @@ -1505,8 +1510,8 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) /* We limit the maximum number of sockets cached in a stack. */ if( netif->state->active_cache_avail_stack == 0 ) { - Log_EP(ci_log("FD %d not cached - active stack limit reached", - fdinfo->fd)); + Log_EP( + ci_log("FD %d not cached - active stack limit reached", fdinfo->fd)); CITP_STATS_NETIF(++netif->state->stats.active_sockcache_stacklim); goto unlock_out; } @@ -1518,7 +1523,7 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) rc = 1; CITP_STATS_NETIF(++netif->state->stats.sockcache_cached); - unlock_out: +unlock_out: ci_netif_unlock_fdi(epi); return rc; } @@ -1528,21 +1533,22 @@ static int citp_tcp_cache(citp_fdinfo* fdinfo) static int citp_tcp_shutdown(citp_fdinfo* fdinfo, int how) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSS(ci_log(LPF "shutdown("EF_FMT", %d)", EF_PRI_ARGS(epi,fdinfo->fd), how)); + Log_VSS(ci_log( + LPF "shutdown(" EF_FMT ", %d)", EF_PRI_ARGS(epi, fdinfo->fd), how)); rc = ci_tcp_shutdown(&(epi->sock), how, fdinfo->fd); return rc; } -static int citp_tcp_getsockname(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len) +static int citp_tcp_getsockname( + citp_fdinfo* fdinfo, struct sockaddr* sa, socklen_t* p_sa_len) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSC(ci_log(LPF "getsockname("EF_FMT")", EF_PRI_ARGS(epi,fdinfo->fd))); + Log_VSC(ci_log(LPF "getsockname(" EF_FMT ")", EF_PRI_ARGS(epi, fdinfo->fd))); rc = ci_tcp_getsockname(&epi->sock, fdinfo->fd, sa, p_sa_len); if( rc == 0 ) __citp_getsockname(epi->sock.s, sa, p_sa_len); @@ -1550,13 +1556,13 @@ static int citp_tcp_getsockname(citp_fdinfo* fdinfo, } -static int citp_tcp_getpeername(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len) +static int citp_tcp_getpeername( + citp_fdinfo* fdinfo, struct sockaddr* sa, socklen_t* p_sa_len) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSC(ci_log(LPF "getpeername("EF_FMT")", EF_PRI_ARGS(epi,fdinfo->fd))); + Log_VSC(ci_log(LPF "getpeername(" EF_FMT ")", EF_PRI_ARGS(epi, fdinfo->fd))); ci_netif_lock_fdi(epi); rc = ci_tcp_getpeername(&epi->sock, sa, p_sa_len); ci_netif_unlock_fdi(epi); @@ -1564,34 +1570,34 @@ static int citp_tcp_getpeername(citp_fdinfo* fdinfo, } -static int citp_tcp_getsockopt(citp_fdinfo* fdinfo, int level, - int optname, void* optval, socklen_t* optlen) +static int citp_tcp_getsockopt(citp_fdinfo* fdinfo, int level, int optname, + void* optval, socklen_t* optlen) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSC(ci_log(LPF "getsockopt("EF_FMT", %d, %d)", - EF_PRI_ARGS(epi,fdinfo->fd), level, optname)); + Log_VSC(ci_log(LPF "getsockopt(" EF_FMT ", %d, %d)", + EF_PRI_ARGS(epi, fdinfo->fd), level, optname)); ci_netif_lock_count(epi->sock.netif, getsockopt_ni_lock_contends); - rc = ci_tcp_getsockopt(&epi->sock, fdinfo->fd, - level, optname, optval, optlen); + rc = ci_tcp_getsockopt( + &epi->sock, fdinfo->fd, level, optname, optval, optlen); ci_netif_unlock_fdi(epi); return rc; } -static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, - int optname, const void* optval, socklen_t optlen) +static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, int optname, + const void* optval, socklen_t optlen) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; - Log_VSC(ci_log(LPF "setsockopt("EF_FMT", %d, %d)", - EF_PRI_ARGS(epi,fdinfo->fd), level, optname)); + Log_VSC(ci_log(LPF "setsockopt(" EF_FMT ", %d, %d)", + EF_PRI_ARGS(epi, fdinfo->fd), level, optname)); - rc = ci_tcp_setsockopt(&epi->sock, fdinfo->fd, - level, optname, optval, optlen); + rc = ci_tcp_setsockopt( + &epi->sock, fdinfo->fd, level, optname, optval, optlen); if( rc == CI_SOCKET_HANDOVER ) { CITP_STATS_NETIF(++epi->sock.netif->state->stats.tcp_handover_setsockopt); @@ -1612,13 +1618,11 @@ static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, ci_netif_lock_fdi(epi); ci_tcp_helper_ep_clear_filters( - ci_netif_get_driver_handle(epi->sock.netif), - SC_SP(epi->sock.s), 0); + ci_netif_get_driver_handle(epi->sock.netif), SC_SP(epi->sock.s), 0); ci_netif_unlock_fdi(epi); citp_fdinfo_release_ref(fdinfo, 0); return 0; - } - else if( epi->sock.s->b.state == CI_TCP_CLOSED ) { + } else if( epi->sock.s->b.state == CI_TCP_CLOSED ) { ci_netif_lock_fdi(epi); if( (epi->sock.s->b.sb_aflags & CI_SB_AFLAG_OS_BACKED) == 0 ) { /* Non os-backed TCP sockets are one of three things: @@ -1633,22 +1637,22 @@ static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, * For tproxy bound sockets we can't handover, so we fail. */ if( (SOCK_TO_TCP(epi->sock.s)->tcpflags & - CI_TCPT_FLAG_PASSIVE_OPENED) ) { + CI_TCPT_FLAG_PASSIVE_OPENED) ) { ci_netif_unlock_fdi(epi); RET_WITH_ERRNO(EINVAL); - } - else if( (epi->sock.s->s_flags & CI_SOCK_FLAG_TPROXY) && - (epi->sock.s->s_flags & CI_SOCK_FLAG_PORT_BOUND) ) { + } else if( (epi->sock.s->s_flags & CI_SOCK_FLAG_TPROXY) && + (epi->sock.s->s_flags & CI_SOCK_FLAG_PORT_BOUND) ) { ci_netif_unlock_fdi(epi); - NI_LOG(epi->sock.netif, USAGE_WARNINGS, "Sockets that have been " - "bound with IP_TRANSPARENT set cannot be handed over, and " - "socket option %d %d requires handover", level, optname); + NI_LOG(epi->sock.netif, USAGE_WARNINGS, + "Sockets that have been " + "bound with IP_TRANSPARENT set cannot be handed over, and " + "socket option %d %d requires handover", + level, optname); RET_WITH_ERRNO(EINVAL); } rc = ci_tcp_helper_os_sock_create_and_set(epi->sock.netif, fdinfo->fd, - epi->sock.s, level, optname, - optval, optlen); + epi->sock.s, level, optname, optval, optlen); if( rc < 0 ) { ci_netif_unlock_fdi(epi); RET_WITH_ERRNO(-rc); @@ -1659,14 +1663,12 @@ static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, ci_assert_flags(epi->sock.s->b.sb_aflags, CI_SB_AFLAG_OS_BACKED); tcp_handover(epi); return 0; - } - else /* Can't handover connected socket */ + } else /* Can't handover connected socket */ RET_WITH_ERRNO(EINVAL); } #if CI_CFG_ENDPOINT_MOVE - if( rc == 0 && - (epi->sock.s->s_flags & CI_SOCK_FLAG_PORT_BOUND) != 0 && + if( rc == 0 && (epi->sock.s->s_flags & CI_SOCK_FLAG_PORT_BOUND) != 0 && (epi->sock.s->s_flags & CI_SOCK_FLAG_FILTER) == 0 && ci_opt_is_setting_reuseport(level, optname, optval, optlen) != 0 ) /* If the following fails, we are not undoing the bind() done @@ -1677,10 +1679,9 @@ static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, /* The socket has moved so need to reprobe the fd. This will also * map the the new stack into user space of the executing process. */ - fdinfo = citp_reprobe_moved(fdinfo, - CI_FALSE/* ! from_fast_lookup */, - CI_FALSE/* ! fdip_is_busy */); - epi = fdi_to_sock_fdi(fdinfo); + fdinfo = citp_reprobe_moved(fdinfo, CI_FALSE /* ! from_fast_lookup */, + CI_FALSE /* ! fdip_is_busy */); + epi = fdi_to_sock_fdi(fdinfo); ci_netif_cluster_prefault(epi->sock.netif); } #endif @@ -1692,11 +1693,12 @@ static int citp_tcp_setsockopt(citp_fdinfo* fdinfo, int level, static int citp_tcp_recv(citp_fdinfo* fdinfo, struct msghdr* msg, int flags) { - citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); ci_tcp_recvmsg_args a; - int rc; + int rc; - if (epi->sock.s->b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK|CI_SB_AFLAG_O_NDELAY)) + if( epi->sock.s->b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) flags |= MSG_DONTWAIT; if( (flags & (MSG_WAITALL | ONLOAD_MSG_ONEPKT)) == @@ -1706,75 +1708,75 @@ static int citp_tcp_recv(citp_fdinfo* fdinfo, struct msghdr* msg, int flags) return -1; }; - Log_V(ci_log(LPF "recv("EF_FMT", len=%d, "CI_SOCKCALL_FLAGS_FMT")", - EF_PRI_ARGS(epi,fdinfo->fd), - ci_iovec_bytes(msg->msg_iov, msg->msg_iovlen), - CI_SOCKCALL_FLAGS_PRI_ARG(flags))); + Log_V(ci_log(LPF "recv(" EF_FMT ", len=%d, " CI_SOCKCALL_FLAGS_FMT ")", + EF_PRI_ARGS(epi, fdinfo->fd), + ci_iovec_bytes(msg->msg_iov, msg->msg_iovlen), + CI_SOCKCALL_FLAGS_PRI_ARG(flags))); if( epi->sock.s->b.state != CI_TCP_LISTEN ) { if( (msg->msg_iovlen == 0 || msg->msg_iov == NULL) && ! (flags & MSG_ERRQUEUE) ) { - msg->msg_flags = 0; + msg->msg_flags = 0; msg->msg_controllen = 0; return 0; } - ci_tcp_recvmsg_args_init(&a, epi->sock.netif, SOCK_TO_TCP(epi->sock.s), - msg, flags); + ci_tcp_recvmsg_args_init( + &a, epi->sock.netif, SOCK_TO_TCP(epi->sock.s), msg, flags); rc = ci_tcp_recvmsg(&a); - Log_V(ci_log(LPF "recv("EF_FMT") = %d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); + Log_V( + ci_log(LPF "recv(" EF_FMT ") = %d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); return rc; } CI_SET_ERROR(rc, SOCK_RX_ERRNO(epi->sock.s)); - Log_V(ci_log(LPF "recv("EF_FMT") = %d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); + Log_V(ci_log(LPF "recv(" EF_FMT ") = %d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); return rc; } -static int citp_tcp_recvmmsg(citp_fdinfo* fdinfo, struct mmsghdr* msg, - unsigned vlen, int flags, - ci_recvmmsg_timespec* timeout) +static int citp_tcp_recvmmsg(citp_fdinfo* fdinfo, struct mmsghdr* msg, + unsigned vlen, int flags, ci_recvmmsg_timespec* timeout) { - Log_E(ci_log("%s: TCP fd recvmmsg not supported by OpenOnload", - __FUNCTION__)); + Log_E( + ci_log("%s: TCP fd recvmmsg not supported by OpenOnload", __FUNCTION__)); errno = ENOSYS; return -1; } -static int citp_tcp_sendmmsg(citp_fdinfo* fdinfo, struct mmsghdr* msg, - unsigned vlen, int flags) +static int citp_tcp_sendmmsg( + citp_fdinfo* fdinfo, struct mmsghdr* msg, unsigned vlen, int flags) { - Log_E(ci_log("%s: TCP fd sendmmsg not supported by OpenOnload", - __FUNCTION__)); + Log_E( + ci_log("%s: TCP fd sendmmsg not supported by OpenOnload", __FUNCTION__)); errno = ENOSYS; return -1; } -static int citp_tcp_send(citp_fdinfo* fdinfo, const struct msghdr* msg, - int flags) +static int citp_tcp_send( + citp_fdinfo* fdinfo, const struct msghdr* msg, int flags) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - int rc; + int rc; ci_assert(msg != NULL); - if( epi->sock.s->b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | - CI_SB_AFLAG_O_NDELAY) ) { + if( epi->sock.s->b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) { flags |= MSG_DONTWAIT; } - if(CI_LIKELY( msg->msg_iov != NULL && msg->msg_iovlen > 0 )) { + if( CI_LIKELY(msg->msg_iov != NULL && msg->msg_iovlen > 0) ) { ci_uint32 state; - Log_V(ci_log(LPF "send("EF_FMT", len=%d, "CI_SOCKCALL_FLAGS_FMT")", - EF_PRI_ARGS(epi,fdinfo->fd), - ci_iovec_bytes(msg->msg_iov, msg->msg_iovlen), - CI_SOCKCALL_FLAGS_PRI_ARG(flags))); + Log_V(ci_log(LPF "send(" EF_FMT ", len=%d, " CI_SOCKCALL_FLAGS_FMT ")", + EF_PRI_ARGS(epi, fdinfo->fd), + ci_iovec_bytes(msg->msg_iov, msg->msg_iovlen), + CI_SOCKCALL_FLAGS_PRI_ARG(flags))); state = OO_ACCESS_ONCE(epi->sock.s->b.state); - /* Process CI_TCP_CLOSED without entering ci_tcp_sendmsg() because TCP state - * can be changed under our feet and we do not want to meet CI_TCP_LISTEN - * state inside ci_tcp_sendmsg(). */ + /* Process CI_TCP_CLOSED without entering ci_tcp_sendmsg() because TCP + * state can be changed under our feet and we do not want to meet + * CI_TCP_LISTEN state inside ci_tcp_sendmsg(). */ if( CI_UNLIKELY(state == CI_TCP_CLOSED || state == CI_TCP_LISTEN || state == CI_TCP_INVALID) ) { if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) @@ -1783,31 +1785,27 @@ static int citp_tcp_send(citp_fdinfo* fdinfo, const struct msghdr* msg, CI_SET_ERROR(rc, rc); else CI_SET_ERROR(rc, EPIPE); - } - else { + } else { rc = ci_tcp_sendmsg(epi->sock.netif, SOCK_TO_TCP(epi->sock.s), - msg->msg_iov, msg->msg_iovlen, flags); + msg->msg_iov, msg->msg_iovlen, flags); } - } - else if( msg != NULL && msg->msg_iovlen == 0 ) { + } else if( msg != NULL && msg->msg_iovlen == 0 ) { if( epi->sock.s->tx_errno ) { errno = epi->sock.s->tx_errno; - rc = -1; - } - else { + rc = -1; + } else { rc = 0; } - } - else { + } else { errno = EFAULT; - rc = -1; + rc = -1; } if( rc == -1 && errno == EPIPE && ! (flags & MSG_NOSIGNAL) ) { - oo_resource_op(ci_netif_get_driver_handle(epi->sock.netif), - OO_IOC_KILL_SELF_SIGPIPE, NULL); + oo_resource_op(ci_netif_get_driver_handle(epi->sock.netif), + OO_IOC_KILL_SELF_SIGPIPE, NULL); } - Log_V(log(LPF "send("EF_FMT") = %d", EF_PRI_ARGS(epi,fdinfo->fd),rc)); + Log_V(log(LPF "send(" EF_FMT ") = %d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); return rc; } @@ -1820,28 +1818,28 @@ static int citp_tcp_fcntl(citp_fdinfo* fdinfo, int cmd, long arg) static int citp_tcp_ioctl(citp_fdinfo* fdinfo, int request, void* arg) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); - int rc; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + int rc; - Log_VSC(ci_log(LPF "ioctl("EF_FMT", %d, %#lx)", - EF_PRI_ARGS(epi,fdinfo->fd), - request, (long) arg)); + Log_VSC(ci_log(LPF "ioctl(" EF_FMT ", %d, %#lx)", + EF_PRI_ARGS(epi, fdinfo->fd), request, (long) arg)); rc = ci_tcp_ioctl(&epi->sock, fdinfo->fd, request, arg); - Log_VSC(ci_log(LPF "ioctl: "EF_FMT" rc=%d", EF_PRI_ARGS(epi,fdinfo->fd),rc)); + Log_VSC( + ci_log(LPF "ioctl: " EF_FMT " rc=%d", EF_PRI_ARGS(epi, fdinfo->fd), rc)); if( rc < -1 ) CI_SET_ERROR(rc, -rc); return rc; } -/* ATTENTION! This function should be kept is sync with +/* ATTENTION! This function should be kept is sync with * ci_tcp_poll_events_listen() and ci_tcp_poll_events_nolisten() */ static int citp_tcp_select(citp_fdinfo* fdi, int* n, int rd, int wr, int ex, - struct oo_ul_select_state*__restrict__ ss) + struct oo_ul_select_state* __restrict__ ss) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdi); - ci_sock_cmn* s = epi->sock.s; - ci_netif* ni = epi->sock.netif; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); + ci_sock_cmn* s = epi->sock.s; + ci_netif* ni = epi->sock.netif; #if CI_CFG_SPIN_STATS if( CI_UNLIKELY(! ss->stat_incremented) ) { @@ -1857,28 +1855,26 @@ static int citp_tcp_select(citp_fdinfo* fdi, int* n, int rd, int wr, int ex, * Everything else goes via ci_tcp_poll_events_nolisten() */ if( (s->b.state & CI_TCP_STATE_SYNCHRONISED) && s->tx_errno == 0 ) { ci_tcp_state* ts = SOCK_TO_TCP(s); - if( rd && ( ci_tcp_recv_not_blocked(ts) - || ci_tcp_poll_timestamp_q_nonempty(ni, ts) ) ) { - FD_SET(fdi->fd, ss->rdu); - ++*n; + if( rd && (ci_tcp_recv_not_blocked(ts) || + ci_tcp_poll_timestamp_q_nonempty(ni, ts)) ) { + FD_SET(fdi->fd, ss->rdu); + ++*n; } - if( wr && ( ci_tcp_tx_advertise_space(ni, ts) - || ci_tcp_poll_timestamp_q_nonempty(ni, ts) ) ) { - FD_SET(fdi->fd, ss->wru); - ++*n; + if( wr && (ci_tcp_tx_advertise_space(ni, ts) || + ci_tcp_poll_timestamp_q_nonempty(ni, ts)) ) { + FD_SET(fdi->fd, ss->wru); + ++*n; } if( ex && ci_tcp_poll_events_nolisten_haspri(ni, ts) ) { FD_SET(fdi->fd, ss->exu); ++*n; } - } - else if( s->b.state == CI_TCP_LISTEN ) { + } else if( s->b.state == CI_TCP_LISTEN ) { if( rd && ci_tcp_poll_events_listen(ni, SOCK_TO_TCP_LISTEN(s)) ) { FD_SET(fdi->fd, ss->rdu); ++*n; } - } - else { + } else { /* slow path: instead of copying ci_tcp_poll_events_nolisten(), just * call it. And avoid races by calling ci_tcp_poll_events(). */ unsigned mask = ci_tcp_poll_events(ni, s); @@ -1899,24 +1895,23 @@ static int citp_tcp_select(citp_fdinfo* fdi, int* n, int rd, int wr, int ex, return 1; } -static int citp_tcp_poll(citp_fdinfo*__restrict__ fdi, - struct pollfd*__restrict__ pfd, - struct oo_ul_poll_state*__restrict__ ps) +static int citp_tcp_poll(citp_fdinfo* __restrict__ fdi, + struct pollfd* __restrict__ pfd, struct oo_ul_poll_state* __restrict__ ps) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdi); - ci_sock_cmn* s = epi->sock.s; - ci_netif* ni = epi->sock.netif; - unsigned mask; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); + ci_sock_cmn* s = epi->sock.s; + ci_netif* ni = epi->sock.netif; + unsigned mask; #if CI_CFG_SPIN_STATS ni->state->stats.spin_poll++; #endif - mask = ci_tcp_poll_events(ni, s); + mask = ci_tcp_poll_events(ni, s); pfd->revents = mask & (pfd->events | POLLERR | POLLHUP); if( pfd->revents == 0 ) if( citp_poll_if_needed(ni, ps->this_poll_frc, ps->ul_poll_spin) ) { - mask = ci_tcp_poll_events(ni, s); + mask = ci_tcp_poll_events(ni, s); pfd->revents = mask & (pfd->events | POLLERR | POLLHUP); } @@ -1924,20 +1919,18 @@ static int citp_tcp_poll(citp_fdinfo*__restrict__ fdi, } - #include "ul_epoll.h" /* More-or-less copy of citp_tcp_poll */ -static int citp_tcp_epoll(citp_fdinfo*__restrict__ fdi, - struct citp_epoll_member*__restrict__ eitem, - struct oo_ul_epoll_state*__restrict__ eps, - int* stored_event) +static int citp_tcp_epoll(citp_fdinfo* __restrict__ fdi, + struct citp_epoll_member* __restrict__ eitem, + struct oo_ul_epoll_state* __restrict__ eps, int* stored_event) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_sock_cmn* s = epi->sock.s; - ci_netif* ni = epi->sock.netif; - ci_uint64 sleep_seq; - ci_uint32 mask; - int seq_mismatch = 0; + ci_sock_cmn* s = epi->sock.s; + ci_netif* ni = epi->sock.netif; + ci_uint64 sleep_seq; + ci_uint32 mask; + int seq_mismatch = 0; #if CI_CFG_SPIN_STATS if( CI_UNLIKELY(! eps->stat_incremented) ) { @@ -1947,28 +1940,26 @@ static int citp_tcp_epoll(citp_fdinfo*__restrict__ fdi, #endif /* Try to return a result without polling if we can. */ - sleep_seq = s->b.sleep_seq.all; - mask = ci_tcp_poll_events(ni, s); - *stored_event = citp_ul_epoll_set_ul_events(eps, eitem, mask, sleep_seq, - &s->b.sleep_seq.all, - &seq_mismatch); + sleep_seq = s->b.sleep_seq.all; + mask = ci_tcp_poll_events(ni, s); + *stored_event = citp_ul_epoll_set_ul_events( + eps, eitem, mask, sleep_seq, &s->b.sleep_seq.all, &seq_mismatch); /* Try a poll if we don't already have events. If this is an ordered wait * (ie we have ordering_info) another netif poll will be too late, so don't * bother. */ - if( (*stored_event == 0) && !eps->ordering_info ) { + if( (*stored_event == 0) && ! eps->ordering_info ) { if( citp_poll_if_needed(ni, eps->this_poll_frc, eps->ul_epoll_spin) ) { - sleep_seq = s->b.sleep_seq.all; - mask = ci_tcp_poll_events(ni, s); - seq_mismatch = 0; - *stored_event = citp_ul_epoll_set_ul_events(eps, eitem, mask, sleep_seq, - &s->b.sleep_seq.all, - &seq_mismatch); + sleep_seq = s->b.sleep_seq.all; + mask = ci_tcp_poll_events(ni, s); + seq_mismatch = 0; + *stored_event = citp_ul_epoll_set_ul_events( + eps, eitem, mask, sleep_seq, &s->b.sleep_seq.all, &seq_mismatch); } } /* We shouldn't have stored an event if there was a mismatch */ - ci_assert( !(seq_mismatch == 1 && *stored_event == 1) ); + ci_assert(! (seq_mismatch == 1 && *stored_event == 1)); return seq_mismatch; } @@ -1978,36 +1969,35 @@ ci_uint64 citp_sock_sleep_seq(citp_fdinfo* fdi) } -static int citp_tcp_zc_send(citp_fdinfo* fdi, struct onload_zc_mmsg* msg, - int flags) +static int citp_tcp_zc_send( + citp_fdinfo* fdi, struct onload_zc_mmsg* msg, int flags) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_netif* ni = epi->sock.netif; - ci_tcp_state *ts = SOCK_TO_TCP(epi->sock.s); - int rc = 0; + ci_netif* ni = epi->sock.netif; + ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); + int rc = 0; if( epi->sock.s->b.state != CI_TCP_LISTEN ) { if( flags & ~ONLOAD_ZC_SEND_FLAGS_MASK ) { msg->rc = -EINVAL; - rc = 1; + rc = 1; } - - if( epi->sock.s->b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | - CI_SB_AFLAG_O_NDELAY) ) + + if( epi->sock.s->b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) flags |= MSG_DONTWAIT; if( rc == 0 ) rc = ci_tcp_zc_send(ni, ts, msg, flags); - } - else { + } else { msg->rc = -epi->sock.s->tx_errno; - rc = 1; + rc = 1; } ci_assert_equal(rc, 1); if( msg->rc == -EPIPE && ! (flags & MSG_NOSIGNAL) ) { - oo_resource_op(ci_netif_get_driver_handle(epi->sock.netif), - OO_IOC_KILL_SELF_SIGPIPE, NULL); + oo_resource_op(ci_netif_get_driver_handle(epi->sock.netif), + OO_IOC_KILL_SELF_SIGPIPE, NULL); } return rc; } @@ -2015,16 +2005,16 @@ static int citp_tcp_zc_send(citp_fdinfo* fdi, struct onload_zc_mmsg* msg, static int citp_tcp_zc_recv(citp_fdinfo* fdi, struct onload_zc_recv_args* args) { - citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); ci_tcp_recvmsg_args a; - int rc; + int rc; ci_tcp_recvmsg_args_init(&a, epi->sock.netif, SOCK_TO_TCP(epi->sock.s), - &args->msg.msghdr, args->flags); + &args->msg.msghdr, args->flags); /* Pointless for TCP, but we allow it to be specified anyway because it's * not strictly meaningless. */ - a.flags &=~ ONLOAD_MSG_RECV_OS_INLINE; + a.flags &= ~ONLOAD_MSG_RECV_OS_INLINE; if( (a.flags & (MSG_WAITALL | ONLOAD_MSG_ONEPKT)) == (MSG_WAITALL | ONLOAD_MSG_ONEPKT) ) { @@ -2040,32 +2030,31 @@ static int citp_tcp_zc_recv(citp_fdinfo* fdi, struct onload_zc_recv_args* args) return -EINVAL; } - if (epi->sock.s->b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK|CI_SB_AFLAG_O_NDELAY)) + if( epi->sock.s->b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) a.flags |= MSG_DONTWAIT; - Log_V(ci_log(LPF "zc_recv("EF_FMT", "CI_SOCKCALL_FLAGS_FMT")", - EF_PRI_ARGS(epi, fdi->fd), - CI_SOCKCALL_FLAGS_PRI_ARG(a.flags))); + Log_V(ci_log(LPF "zc_recv(" EF_FMT ", " CI_SOCKCALL_FLAGS_FMT ")", + EF_PRI_ARGS(epi, fdi->fd), CI_SOCKCALL_FLAGS_PRI_ARG(a.flags))); if( epi->sock.s->b.state != CI_TCP_LISTEN ) rc = ci_tcp_zc_recvmsg(&a, args); else rc = -SOCK_RX_ERRNO(epi->sock.s); - Log_V(ci_log(LPF "zc_recv("EF_FMT") = %d", EF_PRI_ARGS(epi, fdi->fd), rc)); + Log_V(ci_log(LPF "zc_recv(" EF_FMT ") = %d", EF_PRI_ARGS(epi, fdi->fd), rc)); return rc; } -static int citp_tcp_recvmsg_kernel(citp_fdinfo* fdi, struct msghdr *msg, - int flags) +static int citp_tcp_recvmsg_kernel( + citp_fdinfo* fdi, struct msghdr* msg, int flags) { return -EOPNOTSUPP; } static int citp_tcp_zc_recv_filter(citp_fdinfo* fdi, - onload_zc_recv_filter_callback filter, - void* cb_arg, int flags) + onload_zc_recv_filter_callback filter, void* cb_arg, int flags) { #if CI_CFG_ZC_RECV_FILTER return -EOPNOTSUPP; @@ -2075,13 +2064,12 @@ static int citp_tcp_zc_recv_filter(citp_fdinfo* fdi, } int citp_tcp_tmpl_alloc(citp_fdinfo* fdi, const struct iovec* initial_msg, - int mlen, struct oo_msg_template** omt_pp, - unsigned flags) + int mlen, struct oo_msg_template** omt_pp, unsigned flags) { #if CI_CFG_PIO citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); - ci_netif* ni = epi->sock.netif; + ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); + ci_netif* ni = epi->sock.netif; ci_assert(ts->s.b.state != CI_TCP_LISTEN); return ci_tcp_tmpl_alloc(ni, ts, omt_pp, initial_msg, mlen, flags); @@ -2094,15 +2082,14 @@ int citp_tcp_tmpl_alloc(citp_fdinfo* fdi, const struct iovec* initial_msg, } -int -citp_tcp_tmpl_update(citp_fdinfo* fdi, struct oo_msg_template* omt, - const struct onload_template_msg_update_iovec* updates, - int ulen, unsigned flags) +int citp_tcp_tmpl_update(citp_fdinfo* fdi, struct oo_msg_template* omt, + const struct onload_template_msg_update_iovec* updates, int ulen, + unsigned flags) { #if CI_CFG_PIO citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); - ci_netif* ni = epi->sock.netif; + ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); + ci_netif* ni = epi->sock.netif; ci_assert(ts->s.b.state != CI_TCP_LISTEN); return ci_tcp_tmpl_update(ni, ts, omt, updates, ulen, flags); @@ -2116,8 +2103,8 @@ int citp_tcp_tmpl_abort(citp_fdinfo* fdi, struct oo_msg_template* omt) { #if CI_CFG_PIO citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); - ci_netif* ni = epi->sock.netif; + ci_tcp_state* ts = SOCK_TO_TCP(epi->sock.s); + ci_netif* ni = epi->sock.netif; ci_assert(ts->s.b.state != CI_TCP_LISTEN); return ci_tcp_tmpl_abort(ni, ts, omt); @@ -2128,35 +2115,34 @@ int citp_tcp_tmpl_abort(citp_fdinfo* fdi, struct oo_msg_template* omt) #if CI_CFG_TIMESTAMPING -static int -citp_tcp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, - struct timespec* next_out, int* bytes_out) +static int citp_tcp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, + struct timespec* next_out, int* bytes_out) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_sock_cmn* s = epi->sock.s; - ci_tcp_state* ts; + ci_sock_cmn* s = epi->sock.s; + ci_tcp_state* ts; ci_ip_pkt_fmt* pkt; - *bytes_out = 0; + *bytes_out = 0; next_out->tv_sec = 0; if( s->b.state != CI_TCP_LISTEN ) { ts = SOCK_TO_TCP(s); - + if( OO_SP_NOT_NULL(ts->local_peer) ) return 0; ci_sock_lock(epi->sock.netif, &ts->s.b); - if( tcp_rcv_usr(ts) <= 0 || OO_PP_IS_NULL(ts->recv1_extract)) { + if( tcp_rcv_usr(ts) <= 0 || OO_PP_IS_NULL(ts->recv1_extract) ) { ci_sock_unlock(epi->sock.netif, &ts->s.b); return 0; } pkt = PKT_CHK_NNL(epi->sock.netif, ts->recv1_extract); if( oo_offbuf_is_empty(&pkt->buf) ) { - if( OO_PP_IS_NULL(pkt->next) ) { + if( OO_PP_IS_NULL(pkt->next) ) { ci_sock_unlock(epi->sock.netif, &ts->s.b); - return 0; /* recv1 is empty. */ + return 0; /* recv1 is empty. */ } pkt = PKT_CHK_NNL(epi->sock.netif, pkt->next); ci_assert(oo_offbuf_not_empty(&pkt->buf)); @@ -2164,13 +2150,12 @@ citp_tcp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, do { struct timespec stamp; - ci_rx_pkt_timespec(pkt, &stamp, - NI_OPTS(epi->sock.netif).rx_timestamping_ordering); + ci_rx_pkt_timespec( + pkt, &stamp, NI_OPTS(epi->sock.netif).rx_timestamping_ordering); if( citp_timespec_compare(&stamp, limit) < 1 ) { *bytes_out += oo_offbuf_left(&pkt->buf); - } - else { + } else { *next_out = stamp; break; } @@ -2178,8 +2163,7 @@ citp_tcp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, pkt = PKT_CHK_NNL(epi->sock.netif, pkt->next); else break; - } - while( 1 ); + } while( 1 ); ci_sock_unlock(epi->sock.netif, &ts->s.b); } @@ -2190,19 +2174,17 @@ citp_tcp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, int citp_sock_is_spinning(citp_fdinfo* fdi) { - return !!fdi_to_sock_fdi(fdi)->sock.s->b.spin_cycles; + return ! ! fdi_to_sock_fdi(fdi)->sock.s->b.spin_cycles; } - -enum onload_delegated_send_rc -citp_tcp_ds_prepare(citp_fdinfo* fdi, int size, unsigned flags, - struct onload_delegated_send* out) +enum onload_delegated_send_rc citp_tcp_ds_prepare(citp_fdinfo* fdi, int size, + unsigned flags, struct onload_delegated_send* out) { - citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_netif* ni = epi->sock.netif; - ci_sock_cmn* s = epi->sock.s; - ci_tcp_state* ts; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); + ci_netif* ni = epi->sock.netif; + ci_sock_cmn* s = epi->sock.s; + ci_tcp_state* ts; enum onload_delegated_send_rc rc = ONLOAD_DELEGATED_SEND_RC_OK; enum onload_delegated_send_rc rc1; @@ -2211,7 +2193,7 @@ citp_tcp_ds_prepare(citp_fdinfo* fdi, int size, unsigned flags, #if CI_CFG_TIMESTAMPING || (s->timestamping_flags & ONLOAD_SOF_TIMESTAMPING_STREAM) #endif - ) + ) return ONLOAD_DELEGATED_SEND_RC_BAD_SOCKET; ts = SOCK_TO_TCP(epi->sock.s); if( ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE ) @@ -2227,27 +2209,26 @@ citp_tcp_ds_prepare(citp_fdinfo* fdi, int size, unsigned flags, } /* Calculate the windows */ - out->mss = tcp_eff_mss(ts); - out->send_wnd = CI_MIN(SEQ_SUB(ts->snd_max, tcp_snd_nxt(ts)), - ci_tcp_tx_send_space(ni, ts) * tcp_eff_mss(ts)); - out->cong_wnd = ts->cwnd + ts->cwnd_extra - ci_tcp_inflight(ts); + out->mss = tcp_eff_mss(ts); + out->send_wnd = CI_MIN(SEQ_SUB(ts->snd_max, tcp_snd_nxt(ts)), + ci_tcp_tx_send_space(ni, ts) * tcp_eff_mss(ts)); + out->cong_wnd = ts->cwnd + ts->cwnd_extra - ci_tcp_inflight(ts); out->user_size = size; if( out->cong_wnd < out->mss ) { - ci_assert( ci_ip_queue_not_empty(&ts->retrans) ); + ci_assert(ci_ip_queue_not_empty(&ts->retrans)); rc = ONLOAD_DELEGATED_SEND_RC_NOCWIN; /* We allow user to violate congestion window, and intentionally fill * in the headers in this case. */ } if( out->send_wnd <= 0 ) { out->send_wnd = 0; - rc = ONLOAD_DELEGATED_SEND_RC_NOWIN; + rc = ONLOAD_DELEGATED_SEND_RC_NOWIN; goto unlock_out; } rc1 = ci_tcp_ds_fill_headers(ni, ts, flags, out->headers, &out->headers_len, - &out->ip_tcp_hdr_len, - &out->tcp_seq_offset, &out->ip_len_offset); + &out->ip_tcp_hdr_len, &out->tcp_seq_offset, &out->ip_len_offset); if( rc1 != ONLOAD_DELEGATED_SEND_RC_OK ) { rc = rc1; goto unlock_out; @@ -2256,18 +2237,18 @@ citp_tcp_ds_prepare(citp_fdinfo* fdi, int size, unsigned flags, /* Tell TCP state to be ready for ACKs from future */ ts->snd_delegated = CI_MIN(size, out->send_wnd); - unlock_out: +unlock_out: ci_netif_unlock(ni); return rc; } -int citp_tcp_ds_complete(citp_fdinfo* fdi, const ci_iovec *iov, int iovlen, - int flags) +int citp_tcp_ds_complete( + citp_fdinfo* fdi, const ci_iovec* iov, int iovlen, int flags) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_netif* ni = epi->sock.netif; - ci_sock_cmn* s = epi->sock.s; - int rc; + ci_netif* ni = epi->sock.netif; + ci_sock_cmn* s = epi->sock.s; + int rc; if( (~s->b.state & CI_TCP_STATE_TCP) || s->b.state == CI_TCP_LISTEN ) { errno = EINVAL; @@ -2278,7 +2259,7 @@ int citp_tcp_ds_complete(citp_fdinfo* fdi, const ci_iovec *iov, int iovlen, if( rc == -1 && errno == EPIPE && ! (flags & MSG_NOSIGNAL) ) { oo_resource_op(ci_netif_get_driver_handle(epi->sock.netif), - OO_IOC_KILL_SELF_SIGPIPE, NULL); + OO_IOC_KILL_SELF_SIGPIPE, NULL); } return rc; } @@ -2286,7 +2267,7 @@ int citp_tcp_ds_complete(citp_fdinfo* fdi, const ci_iovec *iov, int iovlen, int citp_tcp_ds_cancel(citp_fdinfo* fdi) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - ci_sock_cmn* s = epi->sock.s; + ci_sock_cmn* s = epi->sock.s; if( (~s->b.state & CI_TCP_STATE_TCP) || s->b.state == CI_TCP_LISTEN ) { errno = ENOTTY; @@ -2298,52 +2279,50 @@ int citp_tcp_ds_cancel(citp_fdinfo* fdi) } -citp_protocol_impl citp_tcp_protocol_impl = { - .type = CITP_TCP_SOCKET, - .ops = { - .socket = citp_tcp_socket, +citp_protocol_impl citp_tcp_protocol_impl = { .type = CITP_TCP_SOCKET, + .ops = { + .socket = citp_tcp_socket, #if CI_CFG_FD_CACHING - .close = citp_tcp_close, + .close = citp_tcp_close, #endif - .dtor = citp_tcp_dtor, - .dup = citp_tcp_dup, - .bind = citp_tcp_bind, - .listen = citp_tcp_listen, - .accept = citp_tcp_accept, - .connect = citp_tcp_connect, - .shutdown = citp_tcp_shutdown, - .getsockname = citp_tcp_getsockname, - .getpeername = citp_tcp_getpeername, - .getsockopt = citp_tcp_getsockopt, - .setsockopt = citp_tcp_setsockopt, - .recv = citp_tcp_recv, - .recvmmsg = citp_tcp_recvmmsg, - .send = citp_tcp_send, - .sendmmsg = citp_tcp_sendmmsg, - .fcntl = citp_tcp_fcntl, - .ioctl = citp_tcp_ioctl, - .select = citp_tcp_select, - .poll = citp_tcp_poll, - .epoll = citp_tcp_epoll, - .sleep_seq = citp_sock_sleep_seq, - .zc_send = citp_tcp_zc_send, - .zc_recv = citp_tcp_zc_recv, - .zc_recv_filter = citp_tcp_zc_recv_filter, - .recvmsg_kernel = citp_tcp_recvmsg_kernel, - .tmpl_alloc = citp_tcp_tmpl_alloc, - .tmpl_update = citp_tcp_tmpl_update, - .tmpl_abort = citp_tcp_tmpl_abort, + .dtor = citp_tcp_dtor, + .dup = citp_tcp_dup, + .bind = citp_tcp_bind, + .listen = citp_tcp_listen, + .accept = citp_tcp_accept, + .connect = citp_tcp_connect, + .shutdown = citp_tcp_shutdown, + .getsockname = citp_tcp_getsockname, + .getpeername = citp_tcp_getpeername, + .getsockopt = citp_tcp_getsockopt, + .setsockopt = citp_tcp_setsockopt, + .recv = citp_tcp_recv, + .recvmmsg = citp_tcp_recvmmsg, + .send = citp_tcp_send, + .sendmmsg = citp_tcp_sendmmsg, + .fcntl = citp_tcp_fcntl, + .ioctl = citp_tcp_ioctl, + .select = citp_tcp_select, + .poll = citp_tcp_poll, + .epoll = citp_tcp_epoll, + .sleep_seq = citp_sock_sleep_seq, + .zc_send = citp_tcp_zc_send, + .zc_recv = citp_tcp_zc_recv, + .zc_recv_filter = citp_tcp_zc_recv_filter, + .recvmsg_kernel = citp_tcp_recvmsg_kernel, + .tmpl_alloc = citp_tcp_tmpl_alloc, + .tmpl_update = citp_tcp_tmpl_update, + .tmpl_abort = citp_tcp_tmpl_abort, #if CI_CFG_TIMESTAMPING - .ordered_data = citp_tcp_ordered_data, + .ordered_data = citp_tcp_ordered_data, #endif - .is_spinning = citp_sock_is_spinning, + .is_spinning = citp_sock_is_spinning, #if CI_CFG_FD_CACHING - .cache = citp_tcp_cache, + .cache = citp_tcp_cache, #endif - .dsend_prepare = citp_tcp_ds_prepare, - .dsend_complete = citp_tcp_ds_complete, - .dsend_cancel = citp_tcp_ds_cancel, - } -}; + .dsend_prepare = citp_tcp_ds_prepare, + .dsend_complete = citp_tcp_ds_complete, + .dsend_cancel = citp_tcp_ds_cancel, + } }; /*! \cidoxg_end */ diff --git a/src/lib/transport/unix/zc_intercept.c b/src/lib/transport/unix/zc_intercept.c index 24aa81e7d..f51747041 100644 --- a/src/lib/transport/unix/zc_intercept.c +++ b/src/lib/transport/unix/zc_intercept.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2011-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author kjm ** \brief Intercept of zero-copy API calls @@ -34,29 +34,29 @@ static int fd_to_stack(int fd, ci_netif** pni, citp_fdinfo** pfdi) int rc; citp_sock_fdi* epi; citp_fdinfo* fdi = citp_fdtable_lookup(fd); - if( ! fdi ) /* Not an Onload socket */ + if( ! fdi ) /* Not an Onload socket */ return -ESOCKTNOSUPPORT; switch( citp_fdinfo_get_type(fdi) ) { - case CITP_UDP_SOCKET: - case CITP_TCP_SOCKET: - epi = fdi_to_sock_fdi(fdi); - *pfdi = fdi; - *pni = epi->sock.netif; - return 0; - case CITP_EPOLL_FD: - rc = -ENOTSOCK; - break; - case CITP_PIPE_FD: - rc = -ENOTSOCK; - break; - case CITP_PASSTHROUGH_FD: - rc = -ESOCKTNOSUPPORT; - break; - default: - LOG_U(log("%s: unknown fdinfo type %d", __FUNCTION__, - citp_fdinfo_get_type(fdi))); - rc = -EINVAL; + case CITP_UDP_SOCKET: + case CITP_TCP_SOCKET: + epi = fdi_to_sock_fdi(fdi); + *pfdi = fdi; + *pni = epi->sock.netif; + return 0; + case CITP_EPOLL_FD: + rc = -ENOTSOCK; + break; + case CITP_PIPE_FD: + rc = -ENOTSOCK; + break; + case CITP_PASSTHROUGH_FD: + rc = -ESOCKTNOSUPPORT; + break; + default: + LOG_U(log("%s: unknown fdinfo type %d", __FUNCTION__, + citp_fdinfo_get_type(fdi))); + rc = -EINVAL; } citp_fdinfo_release_ref(fdi, 0); return rc; @@ -66,7 +66,8 @@ static int fd_to_stack(int fd, ci_netif** pni, citp_fdinfo** pfdi) static bool txqs_have_reached(ci_netif* ni, const uint32_t* dest) { int i; - OO_STACK_FOR_EACH_INTF_I(ni, i) { + OO_STACK_FOR_EACH_INTF_I(ni, i) + { int32_t diff = dest[i] - ni->state->nic[i].tx_dmaq_done_seq; if( diff > 0 ) return false; @@ -91,7 +92,7 @@ int onload_zc_await_stack_sync(int fd) int tries = 0; ci_netif_lock(ni); OO_STACK_FOR_EACH_INTF_I(ni, i) - added[i] = ni->state->nic[i].tx_dmaq_insert_seq; + added[i] = ni->state->nic[i].tx_dmaq_insert_seq; while( ! txqs_have_reached(ni, added) ) { if( ++tries > 100 ) { /* This hack exists for the purpose of coping with NIC reset. The @@ -115,22 +116,20 @@ int onload_zc_await_stack_sync(int fd) } - int onload_zc_alloc_buffers(int fd, struct onload_zc_iovec* iovecs, - int iovecs_len, - enum onload_zc_buffer_type_flags flags) + int iovecs_len, enum onload_zc_buffer_type_flags flags) { int rc = 0, i; citp_lib_context_t lib_context; citp_fdinfo* fdi; citp_sock_fdi* epi; ci_netif* ni; - ci_ip_pkt_fmt *pkt; + ci_ip_pkt_fmt* pkt; unsigned max_len; ci_tcp_state* ts = NULL; - Log_CALL(ci_log("%s(%d, %p, %d, %x)", __FUNCTION__, fd, iovecs, - iovecs_len, flags)); + Log_CALL(ci_log( + "%s(%d, %p, %d, %x)", __FUNCTION__, fd, iovecs, iovecs_len, flags)); citp_enter_lib(&lib_context); @@ -152,42 +151,39 @@ int onload_zc_alloc_buffers(int fd, struct onload_zc_iovec* iovecs, goto out; } /* Make sure this is clear as it affects behaviour when freeing */ - pkt->rx_flags &=~ CI_PKT_RX_FLAG_KEEP; + pkt->rx_flags &= ~CI_PKT_RX_FLAG_KEEP; pkt->user_refcount = CI_ZC_USER_REFCOUNT_ONE; iovecs[i].buf = zc_pktbuf_to_handle(pkt); if( flags & ONLOAD_ZC_BUFFER_HDR_TCP ) { if( ts != NULL ) { oo_tx_pkt_layout_init(pkt); - iovecs[i].iov_base = ((char *)oo_tx_ip_hdr(pkt)) + - ts->outgoing_hdrs_len; + iovecs[i].iov_base = + ((char*) oo_tx_ip_hdr(pkt)) + ts->outgoing_hdrs_len; max_len = tcp_eff_mss(ts); - } - else { + } else { /* Best guess. We can fix it up later. Magic 12 leaves * space for time stamp option (common case) */ oo_tx_pkt_layout_init(pkt); iovecs[i].iov_base = - (uint8_t*) oo_tx_ip_data(pkt) + sizeof(ci_tcp_hdr) + 12; + (uint8_t*) oo_tx_ip_data(pkt) + sizeof(ci_tcp_hdr) + 12; } - } - else if( flags & ONLOAD_ZC_BUFFER_HDR_UDP ) { + } else if( flags & ONLOAD_ZC_BUFFER_HDR_UDP ) { oo_tx_pkt_layout_init(pkt); iovecs[i].iov_base = - (uint8_t*) oo_tx_ip_data(pkt) + sizeof(ci_udp_hdr); - } - else + (uint8_t*) oo_tx_ip_data(pkt) + sizeof(ci_udp_hdr); + } else iovecs[i].iov_base = PKT_START(pkt); - iovecs[i].iov_len = CI_CFG_PKT_BUF_SIZE - - ((char *)iovecs[i].iov_base - (char *)pkt); + iovecs[i].iov_len = + CI_CFG_PKT_BUF_SIZE - ((char*) iovecs[i].iov_base - (char*) pkt); if( iovecs[i].iov_len > max_len ) iovecs[i].iov_len = max_len; } ni->state->n_async_pkts += iovecs_len; - out: + out: ci_netif_unlock(ni); citp_fdinfo_release_ref(fdi, 0); - } + } citp_exit_lib(&lib_context, TRUE); Log_CALL_RESULT(rc); @@ -215,7 +211,7 @@ int onload_zc_release_buffers(int fd, onload_zc_handle* bufs, int bufs_len) pkt = zc_handle_to_pktbuf(bufs[i]); if( pkt->stack_id != ni->state->stack_id ) { LOG_U(log("%s: attempt to free buffer from stack %d to stack %d", - __FUNCTION__, pkt->stack_id, ni->state->stack_id)); + __FUNCTION__, pkt->stack_id, ni->state->stack_id)); rc = -EINVAL; break; } @@ -223,16 +219,16 @@ int onload_zc_release_buffers(int fd, onload_zc_handle* bufs, int bufs_len) if( rc == 0 ) { for( i = 0; i < bufs_len; ++i ) { pkt = zc_handle_to_pktbuf(bufs[i]); - pkt->pio_addr = -1; /* Got reused by user_refcount */ + pkt->pio_addr = -1; /* Got reused by user_refcount */ /* If we are releasing a packet without the RX_FLAG then the user - * allocated and then freed the packet (without using it). - * We detect this to decrement n_asyn_pkts. - * RX packets (kept via ONLOAD_ZC_KEEP) are counted differently - * so don't decrement here. (But may release) - */ + * allocated and then freed the packet (without using it). + * We detect this to decrement n_asyn_pkts. + * RX packets (kept via ONLOAD_ZC_KEEP) are counted differently + * so don't decrement here. (But may release) + */ rx_pkt = pkt->flags & CI_PKT_FLAG_RX; released = ci_netif_pkt_release_check_keep(ni, pkt); - if ( ! rx_pkt ) { + if( ! rx_pkt ) { ci_assert(released == 1); (void) released; --ni->state->n_async_pkts; @@ -241,7 +237,7 @@ int onload_zc_release_buffers(int fd, onload_zc_handle* bufs, int bufs_len) } ci_netif_unlock(ni); citp_fdinfo_release_ref(fdi, 0); - } + } citp_exit_lib(&lib_context, TRUE); Log_CALL_RESULT(rc); @@ -250,8 +246,8 @@ int onload_zc_release_buffers(int fd, onload_zc_handle* bufs, int bufs_len) } -int onload_zc_query_rx_memregs(int fd, struct onload_zc_iovec* iov, - int* iovecs_len, int flags) +int onload_zc_query_rx_memregs( + int fd, struct onload_zc_iovec* iov, int* iovecs_len, int flags) { int rc = 0; unsigned i; @@ -259,8 +255,8 @@ int onload_zc_query_rx_memregs(int fd, struct onload_zc_iovec* iov, citp_fdinfo* fdi; ci_netif* ni; - Log_CALL(ci_log("%s(%d, %p, %p, %d)", - __FUNCTION__, fd, iov, iovecs_len, flags)); + Log_CALL( + ci_log("%s(%d, %p, %p, %d)", __FUNCTION__, fd, iov, iovecs_len, flags)); citp_enter_lib(&lib_context); @@ -322,7 +318,8 @@ int onload_zc_recv(int fd, struct onload_zc_recv_args* args) citp_lib_context_t lib_context; citp_fdinfo* fdi; - Log_CALL(ci_log("%s(%d, %p(flags=%x))", __FUNCTION__, fd, args, args->flags)); + Log_CALL( + ci_log("%s(%d, %p(flags=%x))", __FUNCTION__, fd, args, args->flags)); if( (fdi = citp_fdtable_lookup_fast(&lib_context, fd)) ) { rc = citp_fdinfo_get_ops(fdi)->zc_recv(fdi, args); @@ -338,7 +335,6 @@ int onload_zc_recv(int fd, struct onload_zc_recv_args* args) } - int onload_zc_send(struct onload_zc_mmsg* msgs, int mlen, int flags) { int done = 0, last_fd = -1, i; @@ -362,7 +358,7 @@ int onload_zc_send(struct onload_zc_mmsg* msgs, int mlen, int flags) last_fd = msgs[i].fd; } - CI_TRY_EQ( citp_fdinfo_get_ops(fdi)->zc_send(fdi, &msgs[i], flags), 1); + CI_TRY_EQ(citp_fdinfo_get_ops(fdi)->zc_send(fdi, &msgs[i], flags), 1); /* If we got an error, return the number of msgs that have had * rc set and exit. fd_op should have updated msgs.rc appropriately */ @@ -371,7 +367,7 @@ int onload_zc_send(struct onload_zc_mmsg* msgs, int mlen, int flags) goto out; } - out: +out: if( fdi != NULL ) citp_fdinfo_release_ref(fdi, 0); @@ -386,15 +382,15 @@ int onload_zc_send(struct onload_zc_mmsg* msgs, int mlen, int flags) } -int onload_set_recv_filter(int fd, onload_zc_recv_filter_callback filter, - void* cb_arg, int flags) +int onload_set_recv_filter( + int fd, onload_zc_recv_filter_callback filter, void* cb_arg, int flags) { int rc; citp_lib_context_t lib_context; citp_fdinfo* fdi; - Log_CALL(ci_log("%s(%d, %p, %p, %x)", __FUNCTION__, fd, filter, - cb_arg, flags)); + Log_CALL( + ci_log("%s(%d, %p, %p, %x)", __FUNCTION__, fd, filter, cb_arg, flags)); if( (fdi = citp_fdtable_lookup_fast(&lib_context, fd)) ) { rc = citp_fdinfo_get_ops(fdi)->zc_recv_filter(fdi, filter, cb_arg, flags); @@ -425,12 +421,13 @@ static int verify_addrspace_override(ci_netif* ni) /* Only EF100 hardware supports address space overrides. Fail if the * machine only contains older NICs. */ - OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { + OO_STACK_FOR_EACH_INTF_I(ni, nic_i) + { if( ci_netif_vi(ni, nic_i)->nic_type.arch == EF_VI_ARCH_EF100 ) has_ef100 = 1; } - if( !has_ef100 ) + if( ! has_ef100 ) return -EINVAL; /* Address space override is only allowed in physical addressing @@ -447,17 +444,17 @@ static bool have_unsupported_nic(ci_netif* ni) int nic_i; OO_STACK_FOR_EACH_INTF_I(ni, nic_i) - if( ci_netif_vi(ni, nic_i)->nic_type.arch == EF_VI_ARCH_AF_XDP || - ci_netif_vi(ni, nic_i)->nic_type.nic_flags & EFHW_VI_NIC_CTPIO_ONLY ) - return true; + if( ci_netif_vi(ni, nic_i)->nic_type.arch == EF_VI_ARCH_AF_XDP || + ci_netif_vi(ni, nic_i)->nic_type.arch == EF_VI_ARCH_SWXTCH || + ci_netif_vi(ni, nic_i)->nic_type.nic_flags & EFHW_VI_NIC_CTPIO_ONLY ) + return true; return false; } int onload_zc_register_buffers(int fd, ef_addrspace addr_space, - uint64_t base_ptr, uint64_t len, int flags, - onload_zc_handle* handle) + uint64_t base_ptr, uint64_t len, int flags, onload_zc_handle* handle) { int rc; citp_lib_context_t lib_context; @@ -465,7 +462,7 @@ int onload_zc_register_buffers(int fd, ef_addrspace addr_space, ci_netif* ni; Log_CALL(ci_log("%s(%d, %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %d, %p)", - __FUNCTION__, fd, addr_space, base_ptr, len, flags, handle)); + __FUNCTION__, fd, addr_space, base_ptr, len, flags, handle)); citp_enter_lib(&lib_context); @@ -480,29 +477,27 @@ int onload_zc_register_buffers(int fd, ef_addrspace addr_space, rc = -E2BIG; else if( (rc = fd_to_stack(fd, &ni, &fdi)) == 0 ) { int num_pages = len >> EF_VI_NIC_PAGE_SHIFT; - struct ci_zc_usermem* um = malloc(sizeof(struct ci_zc_usermem) + - sizeof(um->hw_addrs[0]) * num_pages * - oo_stack_intf_max(ni)); + struct ci_zc_usermem* um = + malloc(sizeof(struct ci_zc_usermem) + + sizeof(um->hw_addrs[0]) * num_pages * oo_stack_intf_max(ni)); if( ! um ) rc = -ENOMEM; else if( addr_space != EF_ADDRSPACE_LOCAL && (rc = verify_addrspace_override(ni)) < 0 ) { /* error code already set appropriately */ - } - else if( have_unsupported_nic(ni) ) { + } else if( have_unsupported_nic(ni) ) { /* Because these NICs don't support checksum offload, the code necessary * to compute checksums on the host is gnarly and thus non-existant. */ rc = -ENOTSUP; - } - else { + } else { um->addr_space = addr_space; um->base = base_ptr; um->size = len; if( addr_space == EF_ADDRSPACE_LOCAL ) - rc = ci_tcp_helper_zc_register_buffers(ni, (void*)(uintptr_t)base_ptr, - num_pages, um->hw_addrs, - &um->kernel_id); + rc = + ci_tcp_helper_zc_register_buffers(ni, (void*) (uintptr_t) base_ptr, + num_pages, um->hw_addrs, &um->kernel_id); if( rc == 0 ) *handle = zc_usermem_to_handle(um); @@ -552,7 +547,7 @@ int onload_zc_unregister_buffers(int fd, onload_zc_handle handle, int flags) } -int onload_recvmsg_kernel(int fd, struct msghdr *msg, int flags) +int onload_recvmsg_kernel(int fd, struct msghdr* msg, int flags) { int rc; citp_lib_context_t lib_context; @@ -570,7 +565,7 @@ int onload_recvmsg_kernel(int fd, struct msghdr *msg, int flags) } Log_CALL_RESULT(rc); - return rc; + return rc; } diff --git a/src/tests/ef_vi/mmake.mk b/src/tests/ef_vi/mmake.mk index b2ed50efb..17f3d6e37 100644 --- a/src/tests/ef_vi/mmake.mk +++ b/src/tests/ef_vi/mmake.mk @@ -16,6 +16,9 @@ TARGETS := $(TEST_APPS:%=$(AppPattern)) MMAKE_LIBS := $(LINK_CIUL_LIB) $(LINK_CIAPP_LIB) MMAKE_LIB_DEPS := $(CIUL_LIB_DEPEND) $(CIAPP_LIB_DEPEND) +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + all: $(TARGETS) diff --git a/src/tests/rtt/mmake.mk b/src/tests/rtt/mmake.mk index d63d8e26d..1ff2de062 100644 --- a/src/tests/rtt/mmake.mk +++ b/src/tests/rtt/mmake.mk @@ -14,5 +14,8 @@ clean: MMAKE_LIBS := $(LINK_CIAPP_LIB) $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) MMAKE_LIB_DEPS := $(CIAPP_LIB_DEPEND) $(CITOOLS_LIB_DEPEND) $(CIUL_LIB_DEPEND) +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + rtt: rtt.o rtt_socket.o rtt_efvi.o diff --git a/src/tests/trade_sim/mmake.mk b/src/tests/trade_sim/mmake.mk index a36197087..31121eef6 100644 --- a/src/tests/trade_sim/mmake.mk +++ b/src/tests/trade_sim/mmake.mk @@ -12,6 +12,9 @@ all: $(TARGETS) clean: @$(MakeClean) +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + exchange: exchange.o utils.o exchange: MMAKE_LIBS += $(LINK_ONLOAD_EXT_LIB) diff --git a/src/tests/unit/mmake.mk b/src/tests/unit/mmake.mk index 15f9ddcb7..16175dadb 100644 --- a/src/tests/unit/mmake.mk +++ b/src/tests/unit/mmake.mk @@ -19,6 +19,9 @@ TARGETS := $(TESTS:%=$(AppPattern)) OBJECTS := $(TESTS:%=%.o) PASSED := $(TESTS:%=%.passed) +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + # Library objects names are mangled with a prefix. Deal with that madness here. LIB_PREFIXES := transport/common/ci_tp_common_ transport/ip/ci_ip_ lib_prefix = $(notdir $(filter $(dir $(1))%,$(LIB_PREFIXES))) diff --git a/src/tools/ip/mmake.mk b/src/tools/ip/mmake.mk index 85c43797c..5fd2537dd 100644 --- a/src/tools/ip/mmake.mk +++ b/src/tools/ip/mmake.mk @@ -34,6 +34,9 @@ MMAKE_LIB_DEPS := $(CIIP_LIB_DEPEND) $(CIAPP_LIB_DEPEND) \ MMAKE_STACKDUMP_LIBS := $(LINK_ONLOAD_EXT_LIB) MMAKE_STACKDUMP_DEPS := $(ONLOAD_EXT_LIB_DEPEND) +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + all: $(TARGETS) $(onload_stackdump): stackdump.o libstack.o onload.config.o $(MMAKE_LIB_DEPS) $(MMAKE_STACKDUMP_DEPS) diff --git a/src/tools/onload_remote_monitor/mmake.mk b/src/tools/onload_remote_monitor/mmake.mk index b45ca0d03..201d9d749 100644 --- a/src/tools/onload_remote_monitor/mmake.mk +++ b/src/tools/onload_remote_monitor/mmake.mk @@ -29,6 +29,9 @@ MMAKE_LIBS := $(LINK_CIIP_LIB) $(LINK_CIAPP_LIB) $(MMAKE_LIBS_LIBPCAP) \ -lpthread $(LINK_CPLANE_LIB) MMAKE_INCLUDE += -I$(TOPPATH)/src/tools/ip +MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs + LIBS += $(MMAKE_LIBS) $(ZMQ_LIBS) INCS += $(MMAKE_INCLUDE) $(ZMQ_INCS) DEPS += $(OBJS) $(MMAKE_LIB_DEPS) diff --git a/test_programs/mock_xnic/Makefile b/test_programs/mock_xnic/Makefile new file mode 100644 index 000000000..eb6a14f1c --- /dev/null +++ b/test_programs/mock_xnic/Makefile @@ -0,0 +1,21 @@ +FLAGS = -march=native -O3 -msse3 +INCLUDES = -I./ +LFLAGS = -L/usr/local/lib/x86_64-linux-gnu +LIBS = -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs +SRCS = main.c mp_commands.c +OBJS = $(SRCS:.c=.o) +MAIN = xnic_data + +.PHONY: depend clean + +all: $(MAIN) + @echo done + +$(MAIN): $(OBJS) + $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS) + +.c.o: + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + $(RM) *.o *~ $(MAIN) diff --git a/test_programs/mock_xnic/README.md b/test_programs/mock_xnic/README.md new file mode 100644 index 000000000..c0dae8f7b --- /dev/null +++ b/test_programs/mock_xnic/README.md @@ -0,0 +1,14 @@ +This test application is intended to behave semi-similar to how our xNIC implementation would. There currently is no code +for Tunneling and Untunneling multicast traffic, but it is easy to see how we could implement that in the receive/transmit +functions. + +This was pieced together from two dpdk samples. The first being `simple_mp` and the other being `???`. + +Build and run with: +`make` + +`sudo ./xnic_data ` +E.G. +`sudo ./xnic_data -l 2-3 -w "06e6:00:02.0" --vdev="net_vdev_netvsc0,iface=eth1" --proc-type=primary` + +To quit the application literally type `quit`. Thats leftovers from the `simple_mp`. diff --git a/test_programs/mock_xnic/main.c b/test_programs/mock_xnic/main.c new file mode 100644 index 000000000..f72635daa --- /dev/null +++ b/test_programs/mock_xnic/main.c @@ -0,0 +1,432 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ + +/* + * This sample application is a simple multi-process application which + * demostrates sharing of queues and memory pools between processes, and + * using those queues/pools for communication between the processes. + * + * Application is designed to run with two processes, a primary and a + * secondary, and each accepts commands on the commandline, the most + * important of which is "send", which just sends a string to the other + * process. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mp_commands.h" + +#define RTE_LOGTYPE_APP RTE_LOGTYPE_USER1 +#define DEBUG_TX 1 +#define DEBUG_RX 1 + +static const char *_TX_RING = "TX_RING"; +static const char *_TX_PREP_RING = "TX_PREP_RING"; +static const char *_RX_PREP_RING = "RX_PREP_RING"; +static const char *_TX_COMP_RING = "TX_COMP_RING"; +static const char *_RX_RING = "RX_RING"; +static const char *_RX_FILL_RING = "RX_FILL_RING"; +static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; + +struct rte_ring *tx_ring, *tx_completion_ring, *rx_ring, *rx_fill_ring; + +static const unsigned MAX_MESSAGE_SIZE = 2048; + +#define RX_RING_SIZE 1024 +#define TX_RING_SIZE 1024 + +#define NUM_MBUFS 8192 +#define MBUF_CACHE_SIZE 0 +#define BURST_SIZE 32 + +struct rte_mempool *mbuf_pool; +volatile int quit = 0; + +struct rte_mbuf *tx_bufs[BURST_SIZE]; +struct rte_mbuf *rx_bufs[BURST_SIZE]; +struct rte_mbuf *rx_drop_bufs[BURST_SIZE]; +struct rte_mbuf *rx_final_bufs[BURST_SIZE]; + +static const struct rte_eth_conf port_conf_default = { + .rxmode = { + .max_rx_pkt_len = RTE_ETHER_MAX_LEN, + }, +}; + +/* basicfwd.c: Basic DPDK skeleton forwarding example. */ + +/* + * Initializes a given port using global settings and with the RX buffers + * coming from the mbuf_pool passed as a parameter. + */ +static inline int port_init(uint16_t port) +{ + struct rte_eth_conf port_conf = port_conf_default; + const uint16_t rx_rings = 1, tx_rings = 1; + uint16_t nb_rxd = RX_RING_SIZE; + uint16_t nb_txd = TX_RING_SIZE; + int retval; + uint16_t q; + struct rte_eth_dev_info dev_info; + struct rte_eth_txconf txconf; + + if( ! rte_eth_dev_is_valid_port(port) ) + return -1; + + retval = rte_eth_dev_info_get(port, &dev_info); + if( retval != 0 ) { + printf("Error during getting device (port %u) info: %s\n", port, + strerror(-retval)); + return retval; + } + + if( dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE ) + port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE; + + /* Configure the Ethernet device. */ + retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); + if( retval != 0 ) + return retval; + + retval = rte_eth_dev_adjust_nb_rx_tx_desc(port, &nb_rxd, &nb_txd); + if( retval != 0 ) + return retval; + + /* Allocate and set up 1 RX queue per Ethernet port. */ + for( q = 0; q < rx_rings; q++ ) { + retval = rte_eth_rx_queue_setup( + port, q, nb_rxd, rte_eth_dev_socket_id(port), NULL, mbuf_pool); + if( retval < 0 ) + return retval; + } + + txconf = dev_info.default_txconf; + txconf.offloads = port_conf.txmode.offloads; + /* Allocate and set up 1 TX queue per Ethernet port. */ + for( q = 0; q < tx_rings; q++ ) { + retval = rte_eth_tx_queue_setup( + port, q, nb_txd, rte_eth_dev_socket_id(port), NULL); + if( retval < 0 ) + return retval; + } + + /* Start the Ethernet port. */ + retval = rte_eth_dev_start(port); + if( retval < 0 ) + return retval; + + /* Display the port MAC address. */ + struct rte_ether_addr addr; + retval = rte_eth_macaddr_get(port, &addr); + if( retval != 0 ) + return retval; + + printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 + " %02" PRIx8 " %02" PRIx8 "\n", + port, addr.addr_bytes[0], addr.addr_bytes[1], addr.addr_bytes[2], + addr.addr_bytes[3], addr.addr_bytes[4], addr.addr_bytes[5]); + + /* Enable RX in promiscuous mode for the Ethernet device. */ + retval = rte_eth_promiscuous_enable(port); + if( retval != 0 ) + return retval; + + return 0; +} + +static inline int init_ports(void) +{ + uint16_t portid; + + /* Initialize all ports. */ + RTE_ETH_FOREACH_DEV(portid) + { + if( port_init(portid) != 0 ) { + printf("Cannot init port %d \n", portid); + return -1; + } + } + + return 0; +} + +static void print_mbufs(struct rte_mbuf **mbufs, int length, char *type) +{ + if( length != 0 ) { + printf("TYPE: %s\n", type); + } + for( int i = 0; i < length; i++ ) { + uint8_t *data = rte_pktmbuf_mtod(mbufs[i], uint8_t *); + int data_len = rte_pktmbuf_data_len(mbufs[i]); + printf("Data Len: %d\n", data_len); + for( int j = 0; j < data_len; j++ ) { + printf("%02X ", data[j]); + } + printf("\n"); + } +} + + +static int receive(uint16_t port) +{ + int should_drop = 0; + int allowed = rte_ring_dequeue_burst( + rx_fill_ring, (void **) &rx_bufs[0], BURST_SIZE, NULL); + if( allowed == 0 ) { + allowed = BURST_SIZE; + should_drop = 1; + *rx_bufs = *rx_drop_bufs; + } + + uint16_t recv = rte_eth_rx_burst(port, 0, &rx_bufs[0], allowed); + + if( should_drop ) { + if( recv != 0 ) { + printf("DROPPING RECV. No fill packets\n"); + } + return 0; + } + + int enqueueCount = 0; + for( int i = 0; i < recv; i++ ) { + struct rte_ether_hdr *eth_h = + rte_pktmbuf_mtod(rx_bufs[i], struct rte_ether_hdr *); + // drop this because it's breaking everything for now + if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_IPV6 ) { + rte_ring_enqueue(rx_fill_ring, &rx_bufs[i]); + } else if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_ARP ) { + struct rte_arp_hdr *arp = (struct rte_arp_hdr *) (eth_h + 1); + if( ntohs(arp->arp_opcode) == RTE_ARP_OP_REPLY ) { + char ethStr[50]; + struct in_addr add; + add.s_addr = arp->arp_data.arp_sip; + rte_ether_format_addr(ethStr, 50, &arp->arp_data.arp_sha); + char *ipAddr = inet_ntoa(add); + char str[100]; + sprintf(str, "ip neigh replace %s dev eth1 lladdr %s nud reachable", + ipAddr, ethStr); + printf("running system command: %s\n", str); + if( system(str) != 0 ) { + printf("Failed to add neighbor\n"); + } + } + + // unsure whether to recycle this packet or send it along + rte_ring_enqueue(rx_fill_ring, &rx_bufs[i]); + // rx_final_bufs[enqueueCount++] = rx_bufs[i]; + } else { + rx_final_bufs[enqueueCount++] = rx_bufs[i]; + } + } + +#if DEBUG_RX + print_mbufs(rx_final_bufs, enqueueCount, "RX"); +#endif + + if( recv != allowed ) { + rte_ring_enqueue_bulk( + rx_fill_ring, (void **) &rx_bufs[recv - 1], allowed - recv, NULL); + } + + if( enqueueCount != 0 ) { + if( rte_ring_enqueue_bulk( + rx_ring, (void **) &rx_final_bufs[0], enqueueCount, NULL) == 0 ) { + printf("FAILED TO HAND TO RX RING"); + } + } + + return recv; +} + +static int transmit(uint16_t port) +{ + // might be better to manually move the consumer tail manually? + int allowed = + rte_ring_dequeue_burst(tx_ring, (void **) &tx_bufs, BURST_SIZE, NULL); + if( allowed == 0 ) { + return 0; + } + +#if DEBUG_TX + print_mbufs(tx_bufs, allowed, "TX"); +#endif + + uint16_t txed = rte_eth_tx_burst(port, 0, &tx_bufs[0], allowed); + + rte_ring_enqueue_bulk(tx_completion_ring, (void **) &tx_bufs[0], txed, NULL); + + if( txed != allowed ) { + // PUT back unused bufs? This is almost certainly problematic + // rte_ring_enqueue_bulk(tx_ring, (void **)&tx_bufs[txed - 1], allowed - + // txed, NULL); + printf("DROPPING A PACKET\n"); + } + + return txed; +} + +static int lcore_run(__attribute__((unused)) void *arg) +{ + /* Check that there is an even number of ports to send/receive on. */ + int nb_ports = rte_eth_dev_count_avail(); + if( nb_ports < 1 ) { + printf("ERROR: failed to init. Bad number of ports: %d\n", nb_ports); + return -1; + } + unsigned lcore_id = rte_lcore_id(); + uint16_t port; + + printf("Starting core %u\n", lcore_id); + + int inited = init_ports(); + if( inited < 0 ) { + rte_eal_cleanup(); + rte_exit(-1, "Failed to init ports\n"); + } + + printf("Ports initialized\n"); + + /* + * Check that the port is on the same NUMA node as the polling thread + * for best performance. + */ + RTE_ETH_FOREACH_DEV(port) + { + if( rte_eth_dev_socket_id(port) > 0 && + rte_eth_dev_socket_id(port) != (int) rte_socket_id() ) + printf( + "WARNING, port %u is on remote NUMA node to " + "polling thread.\n\tPerformance will " + "not be optimal.\n", + port); + + printf("Using PORT: %d\n", port); + + while( ! quit ) { + int recved = receive(port); + int sent = transmit(port); + if( recved == 0 && sent == 0 ) { + usleep(10); + } + } + } + + return 0; +} + +static void signal_handler(int signum) +{ + /* When we receive a RTMIN or SIGINT signal, stop kni processing */ + if( signum == SIGRTMIN || signum == SIGINT ) { + printf("\nSIGRTMIN/SIGINT received. processing stopping.\n"); + quit = 1; + return; + } +} + +int main(int argc, char **argv) +{ + const unsigned flags = 0; + const unsigned ring_size = 512; + const unsigned fill_ring_size = 1024; + const unsigned pool_size = 1024; + const unsigned pool_cache = 0; + const unsigned priv_data_sz = 0; + + int ret; + unsigned lcore_id; + + signal(SIGRTMIN, signal_handler); + signal(SIGINT, signal_handler); + + ret = rte_eal_init(argc, argv); + if( ret < 0 ) + rte_exit(EXIT_FAILURE, "Cannot init EAL\n"); + + if( rte_eal_process_type() != RTE_PROC_PRIMARY ) { + rte_exit(EXIT_FAILURE, "This program must be run as primary"); + } + + tx_ring = rte_ring_create(_TX_RING, ring_size, SOCKET_ID_ANY, flags); + rx_ring = rte_ring_create(_RX_RING, ring_size, SOCKET_ID_ANY, flags); + rx_fill_ring = + rte_ring_create(_RX_FILL_RING, fill_ring_size, SOCKET_ID_ANY, flags); + tx_completion_ring = + rte_ring_create(_TX_COMP_RING, ring_size, SOCKET_ID_ANY, flags); + + mbuf_pool = rte_pktmbuf_pool_create(_RX_MBUF_POOL, NUM_MBUFS * 1, + MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY); + rte_ring_create(_TX_PREP_RING, ring_size, SOCKET_ID_ANY, 0); + rte_ring_create(_RX_PREP_RING, ring_size, SOCKET_ID_ANY, 0); + + if( tx_ring == NULL ) + rte_exit(EXIT_FAILURE, "Problem getting sending ring\n"); + if( rx_ring == NULL ) + rte_exit(EXIT_FAILURE, "Problem getting receiving ring\n"); + if( rx_fill_ring == NULL ) + rte_exit(EXIT_FAILURE, "Problem getting fill ring\n"); + if( tx_completion_ring == NULL ) + rte_exit(EXIT_FAILURE, "Problem getting comp ring\n"); + if( mbuf_pool == NULL ) + rte_exit(EXIT_FAILURE, "Problem getting message pool\n"); + + // reserve some rx bufs to keep things empty + if( rte_mempool_get_bulk( + mbuf_pool, (void **) &rx_drop_bufs[0], BURST_SIZE) != 0 ) { + RTE_LOG(ERR, APP, "Unable to get objects from mempool\n"); + } else { + RTE_LOG(INFO, APP, "GOT DATA SUCCESSFULLY %d \n", + rte_mempool_avail_count(mbuf_pool)); + } + + RTE_LOG(INFO, APP, "Finished Process Init.\n"); + + /* call lcore_recv() on every slave lcore */ + RTE_LCORE_FOREACH_SLAVE(lcore_id) + { + rte_eal_remote_launch(lcore_run, NULL, lcore_id); + } + + printf("MAIN CORE: %d\n", rte_lcore_id()); + /* call cmd prompt on master lcore */ + struct cmdline *cl = cmdline_stdin_new(simple_mp_ctx, "\nsimple_mp > "); + if( cl == NULL ) + rte_exit(EXIT_FAILURE, "Cannot create cmdline instance\n"); + cmdline_interact(cl); + cmdline_stdin_exit(cl); + + rte_eal_mp_wait_lcore(); + return 0; +} diff --git a/test_programs/mock_xnic/mp_commands.c b/test_programs/mock_xnic/mp_commands.c new file mode 100644 index 000000000..4f9bad285 --- /dev/null +++ b/test_programs/mock_xnic/mp_commands.c @@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "mp_commands.h" + +/**********************************************************/ + +/**********************************************************/ + +struct cmd_quit_result { + cmdline_fixed_string_t quit; +}; + +static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, __attribute__((unused)) void *data) +{ + quit = 1; + cmdline_quit(cl); +} + +cmdline_parse_token_string_t cmd_quit_quit = + TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); + +cmdline_parse_inst_t cmd_quit = { + .f = cmd_quit_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "close the application", + .tokens = { + /* token list, NULL terminated */ + (void *)&cmd_quit_quit, + NULL, + }, +}; + +/**********************************************************/ + +struct cmd_help_result { + cmdline_fixed_string_t help; +}; + +static void cmd_help_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, __attribute__((unused)) void *data) +{ + cmdline_printf(cl, + "Simple demo example of multi-process in RTE\n\n" + "This is a readline-like interface that can be used to\n" + "send commands to the simple app. Commands supported are:\n\n" + "- send [string]\n" + "- help\n" + "- quit\n\n"); +} + +cmdline_parse_token_string_t cmd_help_help = + TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help"); + +cmdline_parse_inst_t cmd_help = { + .f = cmd_help_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "show help", + .tokens = { + /* token list, NULL terminated */ + (void *)&cmd_help_help, + NULL, + }, +}; + +/****** CONTEXT (list of instruction) */ +cmdline_parse_ctx_t simple_mp_ctx[] = { + (cmdline_parse_inst_t *) &cmd_quit, + (cmdline_parse_inst_t *) &cmd_help, + NULL, +}; diff --git a/test_programs/mock_xnic/mp_commands.h b/test_programs/mock_xnic/mp_commands.h new file mode 100644 index 000000000..5d67413e7 --- /dev/null +++ b/test_programs/mock_xnic/mp_commands.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ + +#ifndef _SIMPLE_MP_COMMANDS_H_ +#define _SIMPLE_MP_COMMANDS_H_ + +extern struct rte_ring *send_ring; +extern struct rte_mempool *message_pool; +extern volatile int quit; + +extern cmdline_parse_ctx_t simple_mp_ctx[]; + +#endif /* _SIMPLE_MP_COMMANDS_H_ */ diff --git a/test_programs/tcp_receiver.py b/test_programs/tcp_receiver.py new file mode 100644 index 000000000..8e3bd51df --- /dev/null +++ b/test_programs/tcp_receiver.py @@ -0,0 +1,20 @@ +import socket + +HOST = "10.2.164.5" +PORT = 31339 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((HOST, PORT)) + s.listen() + print("Listening on port: "+str(PORT)) + while True: + conn, addr = s.accept() + with conn: + print(f"Connected by {addr}") + while True: + data = conn.recv(1024) + if not data: + break + print(f"Received {data}") + #conn.sendall(data) + #conn.shutdown(socket.SHUT_RDWR) diff --git a/test_programs/tcp_sender.py b/test_programs/tcp_sender.py new file mode 100644 index 000000000..a0cd0cbd1 --- /dev/null +++ b/test_programs/tcp_sender.py @@ -0,0 +1,18 @@ +import socket +import time + +import socket + +HOST = "10.2.164.7" +PORT = 31330 + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((HOST, PORT)) + print("connected") + for i in range(0, 5): + s.sendall(b"Hello, world") + print(f"Sent") + #data = s.recv(1024) + time.sleep(1) + + #s.shutdown(socket.SHUT_RDWR) diff --git a/test_programs/udp_receiver.py b/test_programs/udp_receiver.py new file mode 100644 index 000000000..7c96a6c6c --- /dev/null +++ b/test_programs/udp_receiver.py @@ -0,0 +1,11 @@ +import socket + +server_address = '10.2.164.5' +server_port = 31337 + +with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: + s.bind((server_address, server_port)) + print("Binding to " + server_address + ":" + str(server_port)) + while True: + payload, client_address = s.recvfrom(1024) + print(str(payload)) diff --git a/test_programs/udp_sender.py b/test_programs/udp_sender.py new file mode 100644 index 000000000..0aaa425f3 --- /dev/null +++ b/test_programs/udp_sender.py @@ -0,0 +1,15 @@ +import socket +import time + +server_address = '10.2.164.7' +server_port = 31337 + +with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as client_socket: + client_socket.connect((server_address, server_port)) + print("connected on port: ", client_socket.getsockname()[1]) + + for i in range(0, 5): + message = 'Hello World' + client_socket.send(message.encode()) + print('sent') + time.sleep(1) From 318c28f5b24bc26a31757090d0ec21bc129b8eb5 Mon Sep 17 00:00:00 2001 From: Kyle Kyrazis Date: Fri, 28 Oct 2022 14:10:43 +0000 Subject: [PATCH 2/5] Disable loading the xdp programs --- scripts/onload_profiles/swxtch.opf | 1 + scripts/swxtch_init.sh | 1 - src/include/etherfabric/ef_vi.h | 236 +++--- src/lib/efhw/af_xdp.c | 1068 ++++++++++++---------------- src/lib/transport/unix/dpdk.c | 25 +- 5 files changed, 610 insertions(+), 721 deletions(-) diff --git a/scripts/onload_profiles/swxtch.opf b/scripts/onload_profiles/swxtch.opf index 7a7ea1d78..90e12c6b9 100644 --- a/scripts/onload_profiles/swxtch.opf +++ b/scripts/onload_profiles/swxtch.opf @@ -5,3 +5,4 @@ onload_set EF_TCP_RECV_SPIN 1 onload_set EF_TCP_SEND_SPIN 1 onload_set EF_UDP_RECV_SPIN 1 onload_set EF_UDP_SEND_SPIN 1 +#onload_set EF_UNIX_LOG 0x8 # this is a crappy bitmask that can be found in opts_citp_def.h and it only seems to kind of work diff --git a/scripts/swxtch_init.sh b/scripts/swxtch_init.sh index b0ba41bc3..5daf9bbf2 100755 --- a/scripts/swxtch_init.sh +++ b/scripts/swxtch_init.sh @@ -1,5 +1,4 @@ #! /bin/bash -sudo ethtool -K eth1 lro off sudo ~/onload/build/x86_64_linux-$(uname -r)/driver/linux/load.sh onload echo eth1 | sudo tee /sys/module/sfc_resource/afxdp/register diff --git a/src/include/etherfabric/ef_vi.h b/src/include/etherfabric/ef_vi.h index 4560295cb..1b3bbc202 100644 --- a/src/include/etherfabric/ef_vi.h +++ b/src/include/etherfabric/ef_vi.h @@ -87,7 +87,7 @@ typedef uint32_t ef_eventq_ptr; /*! \brief An address */ typedef uint64_t ef_addr; /*! \brief An address of an I/O area for a virtual interface */ -typedef char* ef_vi_ioaddr_t; +typedef char* ef_vi_ioaddr_t; /*! \brief Reference to a non-local address space */ typedef uint64_t ef_addrspace; @@ -462,7 +462,7 @@ typedef struct { /** base address of the buffer */ ef_addr iov_base EF_VI_ALIGN(8); /** length of the buffer */ - unsigned iov_len; + unsigned iov_len; } ef_iovec; #define EF_RIOV_FLAG_TRANSLATE_ADDR 0x1 @@ -475,9 +475,9 @@ typedef struct { /** base address of the buffer */ ef_addr iov_base EF_VI_ALIGN(8); /** length of the buffer */ - unsigned iov_len; - uint32_t flags; /* EF_RIOV_FLAG_* */ - ef_addrspace addrspace; + unsigned iov_len; + uint32_t flags; /* EF_RIOV_FLAG_* */ + ef_addrspace addrspace; } ef_remote_iovec; @@ -500,84 +500,84 @@ typedef struct { /*! \brief Flags that can be requested when allocating an ef_vi */ enum ef_vi_flags { /** Default setting */ - EF_VI_FLAGS_DEFAULT = 0x0, + EF_VI_FLAGS_DEFAULT = 0x0, /** Receive iSCSI header digest enable: hardware verifies header digest ** (CRC) when packet is iSCSI */ - EF_VI_ISCSI_RX_HDIG = 0x2, + EF_VI_ISCSI_RX_HDIG = 0x2, /** Transmit iSCSI header digest enable: hardware calculates and inserts ** header digest (CRC) when packet is iSCSI */ - EF_VI_ISCSI_TX_HDIG = 0x4, + EF_VI_ISCSI_TX_HDIG = 0x4, /** Receive iSCSI data digest enable: hardware verifies data digest (CRC) ** when packet is iSCSI */ - EF_VI_ISCSI_RX_DDIG = 0x8, + EF_VI_ISCSI_RX_DDIG = 0x8, /** Transmit iSCSI data digest enable: hardware calculates and inserts ** data digest (CRC) when packet is iSCSI */ - EF_VI_ISCSI_TX_DDIG = 0x10, + EF_VI_ISCSI_TX_DDIG = 0x10, /** Use physically addressed TX descriptor ring */ - EF_VI_TX_PHYS_ADDR = 0x20, + EF_VI_TX_PHYS_ADDR = 0x20, /** Use physically addressed RX descriptor ring */ - EF_VI_RX_PHYS_ADDR = 0x40, + EF_VI_RX_PHYS_ADDR = 0x40, /** IP checksum calculation and replacement is disabled */ - EF_VI_TX_IP_CSUM_DIS = 0x80, + EF_VI_TX_IP_CSUM_DIS = 0x80, /** TCP/UDP checksum calculation and replacement is disabled */ EF_VI_TX_TCPUDP_CSUM_DIS = 0x100, /** Drop transmit packets that are not TCP or UDP */ - EF_VI_TX_TCPUDP_ONLY = 0x200, + EF_VI_TX_TCPUDP_ONLY = 0x200, /** Drop packets with a mismatched IP source address ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_IP = 0x400, /* Siena only */ + EF_VI_TX_FILTER_IP = 0x400, /* Siena only */ /** Drop packets with a mismatched MAC source address ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MAC = 0x800, /* Siena only */ + EF_VI_TX_FILTER_MAC = 0x800, /* Siena only */ /** Set lowest bit of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_1 = 0x1000, /* Siena only */ + EF_VI_TX_FILTER_MASK_1 = 0x1000, /* Siena only */ /** Set lowest 2 bits of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_2 = 0x2000, /* Siena only */ + EF_VI_TX_FILTER_MASK_2 = 0x2000, /* Siena only */ /** Set lowest 3 bits of queue ID to 0 when matching within filter block ** (5000 and 6000 series only) */ - EF_VI_TX_FILTER_MASK_3 = (0x1000 | 0x2000), /* Siena only */ + EF_VI_TX_FILTER_MASK_3 = (0x1000 | 0x2000), /* Siena only */ /** Disable using TX descriptor push, so always use doorbell for transmit */ - EF_VI_TX_PUSH_DISABLE = 0x4000, + EF_VI_TX_PUSH_DISABLE = 0x4000, /** Always use TX descriptor push, so never use doorbell for transmit ** (7000 series and newer) */ - EF_VI_TX_PUSH_ALWAYS = 0x8000, /* ef10 only */ + EF_VI_TX_PUSH_ALWAYS = 0x8000, /* ef10 only */ /** Add timestamp to received packets (7000 series and newer) */ - EF_VI_RX_TIMESTAMPS = 0x10000, /* ef10 only */ + EF_VI_RX_TIMESTAMPS = 0x10000, /* ef10 only */ /** Add timestamp to transmitted packets (7000 series and newer), ** cannot be combined with EF_VI_TX_ALT */ - EF_VI_TX_TIMESTAMPS = 0x20000, /* ef10 only */ + EF_VI_TX_TIMESTAMPS = 0x20000, /* ef10 only */ /* Flag EF_VI_TX_LOOPBACK (0x40000) has been removed. Similar * functionality can now be achieved with protection domain and * EF_PD_MCAST_LOOP flag. * Flag value 0x40000 is not to be reused. */ /** Enable packed stream mode for received packets (7000 series and newer) */ - EF_VI_RX_PACKED_STREAM = 0x80000, /* ef10 only */ + EF_VI_RX_PACKED_STREAM = 0x80000, /* ef10 only */ /** Use 64KiB packed stream buffers, instead of the 1024KiB default (7000 * series and newer) */ EF_VI_RX_PS_BUF_SIZE_64K = 0x100000, /* ef10 only */ /** Enable RX event merging mode for received packets; ** see ef_vi_receive_unbundle() and ef_vi_receive_get_bytes() for more ** details on using RX event merging mode */ - EF_VI_RX_EVENT_MERGE = 0x200000, /* ef10 only */ + EF_VI_RX_EVENT_MERGE = 0x200000, /* ef10 only */ /** Enable the "TX alternatives" feature (8000 series and newer), ** cannot be combined with EF_VI_TX_TIMESTAMPS */ - EF_VI_TX_ALT = 0x400000, + EF_VI_TX_ALT = 0x400000, /** Controls whether the hardware event timer is enabled (8000 series and ** newer) */ - EF_VI_ENABLE_EV_TIMER = 0x800000, + EF_VI_ENABLE_EV_TIMER = 0x800000, /** Enable the "cut-through PIO" feature (X2000 series and newer). */ - EF_VI_TX_CTPIO = 0x1000000, + EF_VI_TX_CTPIO = 0x1000000, /** When using CTPIO, prevent poisoned frames from reaching the wire (X2000 ** series and newer). */ EF_VI_TX_CTPIO_NO_POISON = 0x2000000, /** Zerocopy - relevant for AF_XDP */ - EF_VI_RX_ZEROCOPY = 0x4000000, + EF_VI_RX_ZEROCOPY = 0x4000000, /** Support ef_vi_transmit_memcpy() (SN1000 series and newer). */ - EF_VI_ALLOW_MEMCPY = 0x8000000, + EF_VI_ALLOW_MEMCPY = 0x8000000, /** Disallow efct backward-compatibility emulation */ - EF_VI_EFCT_UNIQUEUE = 0x10000000, + EF_VI_EFCT_UNIQUEUE = 0x10000000, /** Require no shared traffic on the receive queue(s) of this application. */ /** Useful only for X3 series: other cards never use shared queues. ** Exclusive queues have two effects: @@ -586,7 +586,7 @@ enum ef_vi_flags { ** application ** -# This application can guarantee that it will not receive any packets ** for which it did not explicitly add a filter */ - EF_VI_RX_EXCLUSIVE = 0x20000000, + EF_VI_RX_EXCLUSIVE = 0x20000000, }; @@ -603,15 +603,15 @@ enum ef_vi_out_flags { */ enum ef_vi_rx_discard_err_flags { /** TCP or UDP checksum error */ - EF_VI_DISCARD_RX_L4_CSUM_ERR = 0x1, + EF_VI_DISCARD_RX_L4_CSUM_ERR = 0x1, /** IP checksum error */ - EF_VI_DISCARD_RX_L3_CSUM_ERR = 0x2, + EF_VI_DISCARD_RX_L3_CSUM_ERR = 0x2, /** Ethernet FCS error */ - EF_VI_DISCARD_RX_ETH_FCS_ERR = 0x4, + EF_VI_DISCARD_RX_ETH_FCS_ERR = 0x4, /** Ethernet frame length error */ - EF_VI_DISCARD_RX_ETH_LEN_ERR = 0x8, + EF_VI_DISCARD_RX_ETH_LEN_ERR = 0x8, /** To be discard in software (includes frame length error) */ - EF_VI_DISCARD_RX_TOBE_DISC = 0x10, /* Siena only */ + EF_VI_DISCARD_RX_TOBE_DISC = 0x10, /* Siena only */ /* Inner TCP or UDP checksum error */ EF_VI_DISCARD_RX_INNER_L4_CSUM_ERR = 0x20, /* Inner IP checksum error */ @@ -623,7 +623,7 @@ enum ef_vi_rx_discard_err_flags { /*! \brief Timestamp formats supported by various cards. */ enum ef_timestamp_format { - TS_FORMAT_SECONDS_27FRACTION = 0, + TS_FORMAT_SECONDS_27FRACTION = 0, TS_FORMAT_SECONDS_QTR_NANOSECONDS = 1 }; @@ -695,19 +695,19 @@ typedef struct { */ typedef struct { /** Descriptors posted to the nic */ - uint32_t posted; + uint32_t posted; /** Descriptors added to the ring */ - uint32_t added; + uint32_t added; /** Descriptors removed from the ring */ - uint32_t removed; + uint32_t removed; /** Packets received as part of a jumbo (7000-series only) */ - uint32_t in_jumbo; /* ef10 only */ + uint32_t in_jumbo; /* ef10 only */ /** Bytes received as part of a jumbo (7000-series only) */ - uint32_t bytes_acc; /* ef10 only */ + uint32_t bytes_acc; /* ef10 only */ /** Last descriptor index completed (7000-series only) */ - uint16_t last_desc_i; /* ef10 only */ + uint16_t last_desc_i; /* ef10 only */ /** Credit for packed stream handling (7000-series only) */ - uint16_t rx_ps_credit_avail; /* ef10 only */ + uint16_t rx_ps_credit_avail; /* ef10 only */ ef_vi_efct_rxq_ptr rxq_ptr[EF_VI_MAX_EFCT_RXQS]; /* efct only */ } ef_vi_rxq_state; @@ -719,19 +719,19 @@ typedef struct { /** Event queue pointer */ ef_eventq_ptr evq_ptr; /** For internal use only */ - int32_t evq_clear_stride; + int32_t evq_clear_stride; /** Timestamp (major part) */ - uint32_t sync_timestamp_major; + uint32_t sync_timestamp_major; /** Timestamp (minor part) */ - uint32_t sync_timestamp_minor; + uint32_t sync_timestamp_minor; /** Smallest possible seconds value for given sync_timestamp_major */ - uint32_t sync_timestamp_minimum; + uint32_t sync_timestamp_minimum; /** Timestamp synchronized with adapter */ - uint32_t sync_timestamp_synchronised; /* with adapter */ + uint32_t sync_timestamp_synchronised; /* with adapter */ /** Unsolicited credit sequence */ - uint32_t unsol_credit_seq; + uint32_t unsol_credit_seq; /** Time synchronization flags */ - uint32_t sync_flags; + uint32_t sync_flags; } ef_eventq_state; /*! \brief TX descriptor ring @@ -740,11 +740,11 @@ typedef struct { */ typedef struct { /** Mask for indexes within ring, to wrap around */ - uint32_t mask; + uint32_t mask; /** Maximum space in the cut-through FIFO, reduced to account for header */ - uint32_t ct_fifo_bytes; + uint32_t ct_fifo_bytes; /** Pointer to descriptors */ - void* descriptors; + void* descriptors; /** Pointer to IDs */ uint32_t* ids; } ef_vi_txq; @@ -755,9 +755,9 @@ typedef struct { */ typedef struct { /** Mask for indexes within ring, to wrap around */ - uint32_t mask; + uint32_t mask; /** Pointer to descriptors */ - void* descriptors; + void* descriptors; /** Pointer to IDs */ uint32_t* ids; } ef_vi_rxq; @@ -776,9 +776,9 @@ typedef struct { #else /** contiguous area of superbuf memory */ const char* superbuf; - uint64_t* current_mappings; + uint64_t* current_mappings; #endif - uint32_t config_generation; + uint32_t config_generation; ef_vi_efct_superbuf_refresh_t* refresh_func; } ef_vi_efct_rxq; @@ -819,7 +819,7 @@ struct ef_vi_nic_type { /** Architecture of the NIC */ unsigned char arch; /** Variant of the NIC */ - char variant; + char variant; /** Revision of the NIC */ unsigned char revision; /** Flags indicating hardware features */ @@ -852,11 +852,11 @@ struct ef_pio; */ enum ef_vi_tx_extra_flags { /** Enable use of the mark field. */ - EF_VI_TX_EXTRA_MARK = 0x1, + EF_VI_TX_EXTRA_MARK = 0x1, /** True to enable use of the ingress_mport field. */ - EF_VI_TX_EXTRA_INGRESS_MPORT = 0x2, + EF_VI_TX_EXTRA_INGRESS_MPORT = 0x2, /** True to enable use of the egress_mport field. */ - EF_VI_TX_EXTRA_EGRESS_MPORT = 0x4, + EF_VI_TX_EXTRA_EGRESS_MPORT = 0x4, /** Capsule metadata is present as prefix to frame data. */ EF_VI_TX_EXTRA_CAPSULE_METADATA = 0x8, }; @@ -866,11 +866,11 @@ struct ef_vi_tx_extra { /** Flags indicating which options to apply. */ enum ef_vi_tx_extra_flags flags; /** Packet mark value. */ - uint32_t mark; + uint32_t mark; /** Port used to enter virtual switch. */ - uint16_t ingress_mport; + uint16_t ingress_mport; /** Port used to leave virtual switch. */ - uint16_t egress_mport; + uint16_t egress_mport; }; /*! \brief A virtual interface. @@ -884,112 +884,112 @@ struct ef_vi_tx_extra { */ typedef struct ef_vi { /** True if the virtual interface has been initialized */ - unsigned inited; + unsigned inited; /** The resource ID of the virtual interface */ - unsigned vi_resource_id; + unsigned vi_resource_id; /** The instance ID of the virtual interface */ - unsigned vi_i; + unsigned vi_i; /** NIC-global ID of this virtual interface, or -1 */ - unsigned abs_idx; + unsigned abs_idx; /** fd used for original initialisation */ - ef_driver_handle dh; + ef_driver_handle dh; /** The length of a receive buffer */ - unsigned rx_buffer_len; + unsigned rx_buffer_len; /** The length of the prefix at the start of a received packet */ - unsigned rx_prefix_len; + unsigned rx_prefix_len; /** efct: The last call to transmit_ctpio didn't have space; remember this * for the call to ctpio_fallback */ - uint8_t last_ctpio_failed; + uint8_t last_ctpio_failed; /** The mask to select which errors cause a discard event */ - uint64_t rx_discard_mask; + uint64_t rx_discard_mask; /** The timestamp correction (ticks) for received packets */ - int rx_ts_correction; + int rx_ts_correction; /** The offset to packet length in receive buffer */ - unsigned rx_pkt_len_offset; + unsigned rx_pkt_len_offset; /** The mask of packet length in receive buffer */ - unsigned rx_pkt_len_mask; + unsigned rx_pkt_len_mask; /** The timestamp correction (ns) for transmitted packets */ - int tx_ts_correction_ns; + int tx_ts_correction_ns; /** The timestamp format used by the hardware */ - enum ef_timestamp_format ts_format; + enum ef_timestamp_format ts_format; /** Pointer to virtual interface memory */ - char* vi_mem_mmap_ptr; + char* vi_mem_mmap_ptr; /** Length of virtual interface memory */ - int vi_mem_mmap_bytes; + int vi_mem_mmap_bytes; /** Pointer to virtual interface I/O region */ - char* vi_io_mmap_ptr; + char* vi_io_mmap_ptr; /** Length of virtual interface I/O region */ - int vi_io_mmap_bytes; + int vi_io_mmap_bytes; /** Pointer to CTPIO region */ - char* vi_ctpio_mmap_ptr; + char* vi_ctpio_mmap_ptr; /** Controls rate of writes into CTPIO aperture */ - uint32_t vi_ctpio_wb_ticks; + uint32_t vi_ctpio_wb_ticks; /** Length of region allocated at ep_state */ - int ep_state_bytes; + int ep_state_bytes; /** True if the virtual interface is in a cluster */ - int vi_clustered; + int vi_clustered; /** True if packed stream mode is enabled for the virtual interface */ - int vi_is_packed_stream; + int vi_is_packed_stream; /** True if no special mode is enabled for the virtual interface */ - int vi_is_normal; + int vi_is_normal; /** The packed stream buffer size for the virtual interface */ - unsigned vi_ps_buf_size; + unsigned vi_ps_buf_size; /** I/O address for the virtual interface */ - ef_vi_ioaddr_t io; + ef_vi_ioaddr_t io; /** Programmed I/O region linked to the virtual interface */ - struct ef_pio* linked_pio; + struct ef_pio* linked_pio; /** Base of the event queue for the virtual interface */ - char* evq_base; + char* evq_base; /** Mask for offsets within the event queue for the virtual interface */ - unsigned evq_mask; + unsigned evq_mask; /** True if the event queue uses phase bits */ - int evq_phase_bits; + int evq_phase_bits; /** The timer quantum for the virtual interface, in nanoseconds */ - unsigned timer_quantum_ns; + unsigned timer_quantum_ns; /** The threshold at which to switch from using TX descriptor push to ** using a doorbell */ - unsigned tx_push_thresh; + unsigned tx_push_thresh; /** The TX descriptor ring for the virtual interface */ - ef_vi_txq vi_txq; + ef_vi_txq vi_txq; /** The RX descriptor ring for the virtual interface */ - ef_vi_rxq vi_rxq; + ef_vi_rxq vi_rxq; /** The state of the virtual interface */ - ef_vi_state* ep_state; + ef_vi_state* ep_state; /** The flags for the virtual interface */ - enum ef_vi_flags vi_flags; + enum ef_vi_flags vi_flags; /** Flags returned when the virtual interface is allocated */ - enum ef_vi_out_flags vi_out_flags; + enum ef_vi_out_flags vi_out_flags; /** Statistics for the virtual interface */ - ef_vi_stats* vi_stats; + ef_vi_stats* vi_stats; /** Virtual queues for the virtual interface */ - struct ef_vi* vi_qs[EF_VI_MAX_QS]; + struct ef_vi* vi_qs[EF_VI_MAX_QS]; /** Number of virtual queues for the virtual interface */ - int vi_qs_n; + int vi_qs_n; /** Id of queue a pending PFTF packet belongs to */ - uint8_t future_qid; + uint8_t future_qid; /** Attached rxqs for efct VIs (NB: not necessarily in rxq order) */ - ef_vi_efct_rxq efct_rxq[EF_VI_MAX_EFCT_RXQS]; + ef_vi_efct_rxq efct_rxq[EF_VI_MAX_EFCT_RXQS]; /** efct kernel/userspace shared queue area. */ struct efab_efct_rxq_uk_shm_base* efct_shm; /** 1 + highest allowed index of a used element in efct_rxq */ - int max_efct_rxq; + int max_efct_rxq; /** Number of TX alternatives for the virtual interface */ - unsigned tx_alt_num; + unsigned tx_alt_num; /** Mapping from end-user TX alternative IDs to hardware IDs */ - unsigned* tx_alt_id2hw; + unsigned* tx_alt_id2hw; /** Mapping from hardware TX alternative IDs to end-user IDs */ - unsigned* tx_alt_hw2id; + unsigned* tx_alt_hw2id; /** The type of NIC hosting the virtual interface */ - struct ef_vi_nic_type nic_type; + struct ef_vi_nic_type nic_type; /** Callback to invoke AF_XDP send operations */ int (*xdp_kick)(struct ef_vi*); @@ -1176,7 +1176,7 @@ extern const char* ef_vi_driver_interface_str(void); ** When a large packet is received that is scattered over multiple packet ** buffers, the prefix is only present in the first buffer. */ -ef_vi_inline int ef_vi_receive_prefix_len(const ef_vi* vi) +ef_vi_inline int ef_vi_receive_prefix_len(const ef_vi* vi) { return vi->rx_prefix_len; } @@ -2389,8 +2389,10 @@ ef_vi_inline int ef_eventq_has_event(const ef_vi* vi) switch( vi->nic_type.arch ) { case EF_VI_ARCH_AF_XDP: return efxdp_ef_eventq_check_event(vi, 0); +#ifndef __KERNEL__ case EF_VI_ARCH_SWXTCH: return efswxtch_ef_eventq_check_event(vi); +#endif case EF_VI_ARCH_EFCT: return efct_ef_eventq_check_event(vi); default: @@ -2483,7 +2485,7 @@ ef_vi_inline int ef_eventq_has_many_events(const ef_vi* evq, int n_events) ** may get up to one event for each descriptor plus two further events per ** packet. */ -extern int ef_eventq_capacity(ef_vi* vi); +extern int ef_eventq_capacity(ef_vi* vi); /*! \brief Get the current offset into the event queue. @@ -2520,9 +2522,9 @@ typedef struct { /** The type of layout */ enum ef_vi_layout_type evle_type; /** Offset to the data */ - int evle_offset; + int evle_offset; /** Description of the layout */ - const char* evle_description; + const char* evle_description; } ef_vi_layout_entry; diff --git a/src/lib/efhw/af_xdp.c b/src/lib/efhw/af_xdp.c index 6f268aa52..06048881f 100644 --- a/src/lib/efhw/af_xdp.c +++ b/src/lib/efhw/af_xdp.c @@ -30,8 +30,8 @@ int enable_af_xdp_flow_filters = 1; module_param(enable_af_xdp_flow_filters, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(enable_af_xdp_flow_filters, - "Enables flow filter use for AF_XDP devices "); +MODULE_PARM_DESC( + enable_af_xdp_flow_filters, "Enables flow filter use for AF_XDP devices "); /* filter id when no actual filter is installed */ #define AF_XDP_NO_FILTER_MAGIC_ID 0x7FFFFF00 @@ -80,12 +80,12 @@ static int __sys_call_area_alloc(struct sys_call_area* area, const char* func) * etc. */ EFHW_ASSERT(current); - EFHW_ASSERT( ! (current->flags & PF_WQ_WORKER) ); - EFHW_ASSERT( ! (current->flags & PF_KTHREAD) ); + EFHW_ASSERT(! (current->flags & PF_WQ_WORKER)); + EFHW_ASSERT(! (current->flags & PF_KTHREAD)); area->user_addr = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, 0); + MAP_ANONYMOUS | MAP_PRIVATE, 0); if( area->user_addr == 0 ) { EFHW_ERR("%s: ERROR: failed to allocate a page via vm_mmap()", func); return -ENOMEM; @@ -109,26 +109,24 @@ static void* sys_call_area_ptr(struct sys_call_area* area) return page_address(area->page); } -static unsigned long -sys_call_area_user_addr(struct sys_call_area* area, void* ptr) +static unsigned long sys_call_area_user_addr( + struct sys_call_area* area, void* ptr) { return area->user_addr + - ((uintptr_t)ptr - (uintptr_t)sys_call_area_ptr(area)); + ((uintptr_t) ptr - (uintptr_t) sys_call_area_ptr(area)); } #define UMEM_BLOCK (PAGE_SIZE / sizeof(void*)) -#define MAX_PDS 256 +#define MAX_PDS 256 /* A block of addresses of user memory pages */ -struct umem_block -{ +struct umem_block { void* addrs[UMEM_BLOCK]; }; /* A collection of all the user memory pages for a VI */ -struct umem_pages -{ +struct umem_pages { long page_count; long block_count; long used_page_count; @@ -137,8 +135,7 @@ struct umem_pages }; /* Resources for waiting for and handling events */ -struct event_waiter -{ +struct event_waiter { struct wait_queue_entry wait; struct efhw_nic* nic; @@ -147,8 +144,7 @@ struct event_waiter }; /* Per-VI AF_XDP resources */ -struct efhw_af_xdp_vi -{ +struct efhw_af_xdp_vi { struct socket* sock; int owner_id; int rxq_capacity; @@ -160,16 +156,14 @@ struct efhw_af_xdp_vi struct event_waiter waiter; }; -struct protection_domain -{ +struct protection_domain { struct umem_pages umem; long buffer_table_count; long freed_buffer_table_count; }; /* Per-NIC AF_XDP resources */ -struct efhw_nic_af_xdp -{ +struct efhw_nic_af_xdp { struct file* map; struct efhw_af_xdp_vi* vi; struct protection_domain* pd; @@ -182,7 +176,8 @@ struct efhw_nic_af_xdp * *---------------------------------------------------------------------------*/ -/* Free the collection of page addresses. Does not free the pages themselves. */ +/* Free the collection of page addresses. Does not free the pages themselves. + */ static void umem_pages_free(struct umem_pages* pages) { long block; @@ -226,7 +221,8 @@ static void** umem_pages_addr_ptr(struct umem_pages* pages, long index) return &pages->blocks[index / UMEM_BLOCK]->addrs[index % UMEM_BLOCK]; } -static void umem_pages_set_addr(struct umem_pages* pages, long page, void* addr) +static void umem_pages_set_addr( + struct umem_pages* pages, long page, void* addr) { *umem_pages_addr_ptr(pages, page) = addr; if( page > pages->used_page_count ) @@ -245,7 +241,8 @@ static void* umem_pages_get_addr(struct umem_pages* pages, long page) *---------------------------------------------------------------------------*/ /* Get the VI with the given instance number */ -static struct efhw_af_xdp_vi* vi_by_instance(struct efhw_nic* nic, int instance) +static struct efhw_af_xdp_vi* vi_by_instance( + struct efhw_nic* nic, int instance) { struct efhw_nic_af_xdp* xdp = nic->arch_extra; @@ -256,7 +253,8 @@ static struct efhw_af_xdp_vi* vi_by_instance(struct efhw_nic* nic, int instance) } /* Get the VI with the given owner ID */ -static struct protection_domain* pd_by_owner(struct efhw_nic* nic, int owner_id) +static struct protection_domain* pd_by_owner( + struct efhw_nic* nic, int owner_id) { struct efhw_nic_af_xdp* xdp = nic->arch_extra; @@ -274,11 +272,10 @@ static struct protection_domain* pd_by_owner(struct efhw_nic* nic, int owner_id) /* Invoke the bpf() syscall args is assumed to be kernel memory */ -noinline -static int xdp_sys_bpf(int cmd, unsigned long user_addr) +noinline static int xdp_sys_bpf(int cmd, unsigned long user_addr) { - int rc = SYSCALL_DISPATCHn(3, bpf, (int, unsigned long, size_t), - cmd, user_addr, sizeof(union bpf_attr)); + int rc = SYSCALL_DISPATCHn(3, bpf, (int, unsigned long, size_t), cmd, + user_addr, sizeof(union bpf_attr)); if( rc < 0 ) EFHW_ERR("%s: sys_bpf(%d) failed: %d", __func__, cmd, rc); return rc; @@ -321,47 +318,7 @@ static int xdp_map_create(struct sys_call_area* area, int max_entries) * See af_xdp_bpf.c for the program's source and compilation guidelines. */ static int xdp_prog_load(struct sys_call_area* area, int map_fd) { - const uint64_t const_prog[] = { - 0x00000002000000b7, 0x0000000000041361, - 0x0000000000001261, 0x00000000000024bf, - 0x0000002600000407, 0x000000000012342d, - 0x0000000000002379, 0xffffffff00000418, - 0x0000ffff00000000, 0x000000000000435f, - 0x00000000000d431d, 0x00000000000c2369, - 0x0000008100020355, 0x0000000000102369, - 0x0000000400000207, 0x0000000800080355, - 0x0000000000172271, 0x0000001100010215, - 0x0000000600050255, 0x0000000000101261, - 0x0000000000000118, /* <-- insert map_fd here */ - 0x0000000000000000, - 0x00000002000003b7, 0x0000003300000085, - 0x0000000000000095, - }; - - uint64_t* prog; - char* license; - union bpf_attr* attr; - - attr = sys_call_area_ptr(area); - memset(attr, 0, sizeof(*attr)); - - license = (void*)(attr + 1); -#define LICENSE "GPL" - strncpy(license, LICENSE, strlen(LICENSE) + 1); - - prog = (void*)(license + strlen(LICENSE) + 1); -#undef LICENSE - memcpy(prog, const_prog, sizeof(const_prog)); - prog[20] |= 0x1000; /* "immediate" flag */ - prog[20] |= (uint64_t) map_fd << 32; /* immediate value */ - - attr->prog_type = BPF_PROG_TYPE_XDP; - attr->insn_cnt = sizeof(const_prog) / sizeof(struct bpf_insn); - attr->insns = sys_call_area_user_addr(area, prog); - attr->license = sys_call_area_user_addr(area, license); - strncpy(attr->prog_name, "xdpsock", strlen("xdpsock")); - - return xdp_sys_bpf(BPF_PROG_LOAD, sys_call_area_user_addr(area, attr)); + return 0; } /* Update an element in the XDP socket map (using fds) */ @@ -379,8 +336,8 @@ static int xdp_map_update_fd(int map_fd, int key, int sock_fd) attr = sys_call_area_ptr(&area); memset(attr, 0, sizeof(*attr)); - key_user = (void*)(attr + 1); - sock_user = (void*)(key_user + 1); + key_user = (void*) (attr + 1); + sock_user = (void*) (key_user + 1); *key_user = key; *sock_user = sock_fd; @@ -395,8 +352,8 @@ static int xdp_map_update_fd(int map_fd, int key, int sock_fd) } /* Update an element in the XDP socket map (using file pointers) */ -static int xdp_map_update(struct efhw_nic_af_xdp* af_xdp, int key, - struct file* sock) +static int xdp_map_update( + struct efhw_nic_af_xdp* af_xdp, int key, struct file* sock) { int rc, map_fd, sock_fd; @@ -424,36 +381,21 @@ static int xdp_map_update(struct efhw_nic_af_xdp* af_xdp, int key, } /* Bind an AF_XDP socket to an interface */ -static int xdp_bind(struct socket* sock, int ifindex, unsigned queue, unsigned flags) +static int xdp_bind( + struct socket* sock, int ifindex, unsigned queue, unsigned flags) { - struct sockaddr_xdp sxdp = {}; - - sxdp.sxdp_family = PF_XDP; - sxdp.sxdp_ifindex = ifindex; - sxdp.sxdp_queue_id = queue; - sxdp.sxdp_flags = flags; - - return kernel_bind(sock, (struct sockaddr*)&sxdp, sizeof(sxdp)); + return 0; } /* Link an XDP program to an interface */ static int xdp_set_link(struct net_device* dev, struct bpf_prog* prog) { - struct netdev_bpf bpf = { - .command = XDP_SETUP_PROG, - .prog = prog - }; - - if( !dev->netdev_ops->ndo_bpf ) { - EFHW_ERR("%s: %s does not support XDP", __FUNCTION__, dev->name); - return -ENOSYS; - } - - return dev->netdev_ops->ndo_bpf(dev, &bpf); + return 0; } /* Fault handler to provide buffer memory pages for our user mapping */ -static vm_fault_t xdp_umem_fault(struct vm_fault* vmf) { +static vm_fault_t xdp_umem_fault(struct vm_fault* vmf) +{ struct umem_pages* pages = vmf->vma->vm_private_data; struct page* page; @@ -479,13 +421,11 @@ static vm_fault_t xdp_umem_fault(struct vm_fault* vmf) { return 0; } -static struct vm_operations_struct vm_ops = { - .fault = xdp_umem_fault -}; +static struct vm_operations_struct vm_ops = { .fault = xdp_umem_fault }; /* Register user memory with an XDP socket */ static int xdp_register_umem(struct socket* sock, struct umem_pages* pages, - int chunk_size, int headroom) + int chunk_size, int headroom) { struct vm_area_struct* vma; int rc = -EFAULT; @@ -494,11 +434,9 @@ static int xdp_register_umem(struct socket* sock, struct umem_pages* pages, * a flags fields added in 5.4. We don't currently need to set any flags, * so just zero everything we don't use. */ - struct xdp_umem_reg mr = { - .len = pages->used_page_count << PAGE_SHIFT, + struct xdp_umem_reg mr = { .len = pages->used_page_count << PAGE_SHIFT, .chunk_size = chunk_size, - .headroom = headroom - }; + .headroom = headroom }; mr.addr = vm_mmap(NULL, 0, mr.len, PROT_READ | PROT_WRITE, MAP_SHARED, 0); if( offset_in_page(mr.addr) ) @@ -515,20 +453,19 @@ static int xdp_register_umem(struct socket* sock, struct umem_pages* pages, vma->vm_private_data = pages; vma->vm_ops = &vm_ops; - rc = sock_ops_setsockopt(sock, SOL_XDP, XDP_UMEM_REG, - (char*)&mr, sizeof(mr)); + rc = sock_ops_setsockopt( + sock, SOL_XDP, XDP_UMEM_REG, (char*) &mr, sizeof(mr)); vm_munmap(mr.addr, mr.len); return rc; } /* Create the rings for an AF_XDP socket and associated umem */ -static int xdp_create_ring(struct socket* sock, - struct efhw_page_map* page_map, void* kern_mem_base, - int capacity, int desc_size, int sockopt, long pgoff, - const struct xdp_ring_offset* xdp_offset, - struct efab_af_xdp_offsets_ring* kern_offset, - struct efab_af_xdp_offsets_ring* user_offset) +static int xdp_create_ring(struct socket* sock, struct efhw_page_map* page_map, + void* kern_mem_base, int capacity, int desc_size, int sockopt, long pgoff, + const struct xdp_ring_offset* xdp_offset, + struct efab_af_xdp_offsets_ring* kern_offset, + struct efab_af_xdp_offsets_ring* user_offset) { int rc; unsigned long map_size, addr, pfn, pages; @@ -538,24 +475,23 @@ static int xdp_create_ring(struct socket* sock, user_base = page_map->n_pages << PAGE_SHIFT; - rc = sock_ops_setsockopt(sock, SOL_XDP, sockopt, - (char*)&capacity, sizeof(int)); + rc = sock_ops_setsockopt( + sock, SOL_XDP, sockopt, (char*) &capacity, sizeof(int)); if( rc < 0 ) return rc; map_size = xdp_offset->desc + (capacity + 1) * desc_size; addr = vm_mmap(sock->file, 0, map_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, pgoff); + MAP_SHARED | MAP_POPULATE, pgoff); if( IS_ERR_VALUE(addr) ) - return addr; + return addr; mmap_write_lock(current->mm); vma = find_vma(current->mm, addr); if( vma == NULL ) { rc = -EFAULT; - } - else { + } else { rc = follow_pfn(vma, addr, &pfn); pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } @@ -574,20 +510,19 @@ static int xdp_create_ring(struct socket* sock, kern_base = ring_base - kern_mem_base; kern_offset->producer = kern_base + xdp_offset->producer; kern_offset->consumer = kern_base + xdp_offset->consumer; - kern_offset->desc = kern_base + xdp_offset->desc; + kern_offset->desc = kern_base + xdp_offset->desc; user_offset->producer = user_base + xdp_offset->producer; user_offset->consumer = user_base + xdp_offset->consumer; - user_offset->desc = user_base + xdp_offset->desc; + user_offset->desc = user_base + xdp_offset->desc; return 0; } static int xdp_create_rings(struct socket* sock, - struct efhw_page_map* page_map, void* kern_mem_base, - long rxq_capacity, long txq_capacity, - struct efab_af_xdp_offsets_rings* kern_offsets, - struct efab_af_xdp_offsets_rings* user_offsets) + struct efhw_page_map* page_map, void* kern_mem_base, long rxq_capacity, + long txq_capacity, struct efab_af_xdp_offsets_rings* kern_offsets, + struct efab_af_xdp_offsets_rings* user_offsets) { int rc; struct sys_call_area rw_area; @@ -603,16 +538,15 @@ static int xdp_create_rings(struct socket* sock, return rc; mmap_offsets = sys_call_area_ptr(&rw_area); - optlen = (void*)(mmap_offsets + 1); + optlen = (void*) (mmap_offsets + 1); *optlen = sizeof(*mmap_offsets); /* For linux<=5.7 you can use kernel_getsockopt(), * but newer versions does not have this function, so we have all that * sys_call_area_*() calls. */ rc = sock->ops->getsockopt(sock, SOL_XDP, XDP_MMAP_OFFSETS, - (void*)sys_call_area_user_addr(&rw_area, - mmap_offsets), - (void*)sys_call_area_user_addr(&rw_area, optlen)); + (void*) sys_call_area_user_addr(&rw_area, mmap_offsets), + (void*) sys_call_area_user_addr(&rw_area, optlen)); /* Security consideration: mmap_offsets is located in untrusted user * memory. I.e. the process can overwrite all this data. @@ -629,35 +563,32 @@ static int xdp_create_rings(struct socket* sock, } EFHW_ASSERT(*optlen == sizeof(*mmap_offsets)); - rc = xdp_create_ring(sock, page_map, kern_mem_base, - rxq_capacity, sizeof(struct xdp_desc), - XDP_RX_RING, XDP_PGOFF_RX_RING, - &mmap_offsets->rx, &kern_offsets->rx, &user_offsets->rx); + rc = xdp_create_ring(sock, page_map, kern_mem_base, rxq_capacity, + sizeof(struct xdp_desc), XDP_RX_RING, XDP_PGOFF_RX_RING, + &mmap_offsets->rx, &kern_offsets->rx, &user_offsets->rx); if( rc < 0 ) goto out; - rc = xdp_create_ring(sock, page_map, kern_mem_base, - txq_capacity, sizeof(struct xdp_desc), - XDP_TX_RING, XDP_PGOFF_TX_RING, - &mmap_offsets->tx, &kern_offsets->tx, &user_offsets->tx); + rc = xdp_create_ring(sock, page_map, kern_mem_base, txq_capacity, + sizeof(struct xdp_desc), XDP_TX_RING, XDP_PGOFF_TX_RING, + &mmap_offsets->tx, &kern_offsets->tx, &user_offsets->tx); if( rc < 0 ) goto out; - rc = xdp_create_ring(sock, page_map, kern_mem_base, - rxq_capacity, sizeof(uint64_t), - XDP_UMEM_FILL_RING, XDP_UMEM_PGOFF_FILL_RING, - &mmap_offsets->fr, &kern_offsets->fr, &user_offsets->fr); + rc = xdp_create_ring(sock, page_map, kern_mem_base, rxq_capacity, + sizeof(uint64_t), XDP_UMEM_FILL_RING, XDP_UMEM_PGOFF_FILL_RING, + &mmap_offsets->fr, &kern_offsets->fr, &user_offsets->fr); if( rc < 0 ) goto out; - rc = xdp_create_ring(sock, page_map, kern_mem_base, - txq_capacity, sizeof(uint64_t), - XDP_UMEM_COMPLETION_RING, XDP_UMEM_PGOFF_COMPLETION_RING, - &mmap_offsets->cr, &kern_offsets->cr, &user_offsets->cr); + rc = xdp_create_ring(sock, page_map, kern_mem_base, txq_capacity, + sizeof(uint64_t), XDP_UMEM_COMPLETION_RING, + XDP_UMEM_PGOFF_COMPLETION_RING, &mmap_offsets->cr, &kern_offsets->cr, + &user_offsets->cr); if( rc < 0 ) goto out; - out: +out: sys_call_area_unpin(&rw_area); return rc; } @@ -677,7 +608,7 @@ static void xdp_release_pd(struct efhw_nic* nic, int owner) static void xdp_release_vi(struct efhw_nic* nic, struct efhw_af_xdp_vi* vi) { - if( !vi->sock ) + if( ! vi->sock ) /* We expect uninitialized vi in cases where af_xdp_init() * has not been called after enabling evq. * This can happen on cleanup from failure of stack allocation */ @@ -717,9 +648,8 @@ static void* af_xdp_mem(struct efhw_nic* nic, int instance) return vi ? &vi->kernel_offsets : NULL; } -static int af_xdp_init(struct efhw_nic* nic, int instance, - int chunk_size, int headroom, - struct efhw_page_map* page_map) +static int af_xdp_init(struct efhw_nic* nic, int instance, int chunk_size, + int headroom, struct efhw_page_map* page_map) { int rc; struct efhw_af_xdp_vi* vi; @@ -729,9 +659,7 @@ static int af_xdp_init(struct efhw_nic* nic, int instance, struct file* file; struct efab_af_xdp_offsets* user_offsets; - if( chunk_size == 0 || - chunk_size < headroom || - chunk_size > PAGE_SIZE || + if( chunk_size == 0 || chunk_size < headroom || chunk_size > PAGE_SIZE || PAGE_SIZE % chunk_size != 0 ) return -EINVAL; @@ -764,7 +692,7 @@ static int af_xdp_init(struct efhw_nic* nic, int instance, rc = efhw_page_alloc_zeroed(&vi->user_offsets_page); if( rc < 0 ) goto out_free_sock; - user_offsets = (void*)efhw_page_ptr(&vi->user_offsets_page); + user_offsets = (void*) efhw_page_ptr(&vi->user_offsets_page); rc = efhw_page_map_add_page(page_map, &vi->user_offsets_page); if( rc < 0 ) @@ -774,9 +702,8 @@ static int af_xdp_init(struct efhw_nic* nic, int instance, if( rc < 0 ) goto out_free_user_offsets; - rc = xdp_create_rings(sock, page_map, &vi->kernel_offsets, - vi->rxq_capacity, vi->txq_capacity, - &vi->kernel_offsets.rings, &user_offsets->rings); + rc = xdp_create_rings(sock, page_map, &vi->kernel_offsets, vi->rxq_capacity, + vi->txq_capacity, &vi->kernel_offsets.rings, &user_offsets->rings); if( rc < 0 ) goto out_free_user_offsets; @@ -807,19 +734,19 @@ static int af_xdp_init(struct efhw_nic* nic, int instance, user_offsets->mmap_bytes = efhw_page_map_bytes(page_map); return 0; - xdp_bind_failed: - out_free_user_offsets: +xdp_bind_failed: +out_free_user_offsets: efhw_page_free(&vi->user_offsets_page); - out_free_sock: +out_free_sock: fput(file); memset(vi, 0, sizeof(*vi)); return rc; } -static int af_xdp_dmaq_kick(struct efhw_nic *nic, int instance) +static int af_xdp_dmaq_kick(struct efhw_nic* nic, int instance) { struct efhw_af_xdp_vi* vi; - struct msghdr msg = {.msg_flags = MSG_DONTWAIT}; + struct msghdr msg = { .msg_flags = MSG_DONTWAIT }; vi = vi_by_instance(nic, instance); if( vi == NULL ) return -ENODEV; @@ -832,146 +759,130 @@ static int af_xdp_dmaq_kick(struct efhw_nic *nic, int instance) * Initialisation and configuration discovery * *---------------------------------------------------------------------------*/ -static int -af_xdp_nic_license_check(struct efhw_nic *nic, const uint32_t feature, - int* licensed) +static int af_xdp_nic_license_check( + struct efhw_nic* nic, const uint32_t feature, int* licensed) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return 0; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return 0; } -static int -af_xdp_nic_v3_license_check(struct efhw_nic *nic, const uint64_t app_id, - int* licensed) +static int af_xdp_nic_v3_license_check( + struct efhw_nic* nic, const uint64_t app_id, int* licensed) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return 0; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return 0; } -static int -af_xdp_nic_license_challenge(struct efhw_nic *nic, - const uint32_t feature, - const uint8_t* challenge, - uint32_t* expiry, - uint8_t* signature) +static int af_xdp_nic_license_challenge(struct efhw_nic* nic, + const uint32_t feature, const uint8_t* challenge, uint32_t* expiry, + uint8_t* signature) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return 0; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return 0; } -static int -af_xdp_nic_v3_license_challenge(struct efhw_nic *nic, - const uint64_t app_id, - const uint8_t* challenge, - uint32_t* expiry, - uint32_t* days, - uint8_t* signature, - uint8_t* base_mac, - uint8_t* vadaptor_mac) +static int af_xdp_nic_v3_license_challenge(struct efhw_nic* nic, + const uint64_t app_id, const uint8_t* challenge, uint32_t* expiry, + uint32_t* days, uint8_t* signature, uint8_t* base_mac, + uint8_t* vadaptor_mac) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return 0; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return 0; } -static void -af_xdp_nic_tweak_hardware(struct efhw_nic *nic) +static void af_xdp_nic_tweak_hardware(struct efhw_nic* nic) { - nic->pio_num = 0; - nic->pio_size = 0; - nic->tx_alts_vfifos = 0; - nic->tx_alts_cp_bufs = 0; - nic->tx_alts_cp_buf_size = 0; - nic->rx_variant = 0; - nic->tx_variant = 0; - nic->rx_prefix_len = 0; - nic->flags = NIC_FLAG_RX_ZEROCOPY /* TODO AFXDP: hardcoded for now */ - | NIC_FLAG_RX_FILTER_TYPE_IP_LOCAL /* only wild filters */ - | NIC_FLAG_USERSPACE_PRIME /* no explicit priming needed */ - ; + nic->pio_num = 0; + nic->pio_size = 0; + nic->tx_alts_vfifos = 0; + nic->tx_alts_cp_bufs = 0; + nic->tx_alts_cp_buf_size = 0; + nic->rx_variant = 0; + nic->tx_variant = 0; + nic->rx_prefix_len = 0; + nic->flags = NIC_FLAG_RX_ZEROCOPY /* TODO AFXDP: hardcoded for now */ + | NIC_FLAG_RX_FILTER_TYPE_IP_LOCAL /* only wild filters */ + | NIC_FLAG_USERSPACE_PRIME /* no explicit priming needed */ + ; } - -static int -__af_xdp_nic_init_hardware(struct efhw_nic *nic, - struct efhw_ev_handler *ev_handlers, - const uint8_t *mac_addr, - struct sys_call_area* sys_call_area) +static int __af_xdp_nic_init_hardware(struct efhw_nic* nic, + struct efhw_ev_handler* ev_handlers, const uint8_t* mac_addr, + struct sys_call_area* sys_call_area) { - int map_fd, rc; - struct bpf_prog* prog; - struct efhw_nic_af_xdp* xdp; - - xdp = kzalloc(sizeof(*xdp) + - nic->vi_lim * sizeof(struct efhw_af_xdp_vi) + - MAX_PDS * sizeof(struct protection_domain), - GFP_KERNEL); - if( xdp == NULL ) - return -ENOMEM; + int map_fd, rc; + struct bpf_prog* prog; + struct efhw_nic_af_xdp* xdp; - nic->ev_handlers = ev_handlers; - xdp->vi = (struct efhw_af_xdp_vi*) (xdp + 1); - xdp->pd = (struct protection_domain*) (xdp->vi + nic->vi_lim); - - rc = map_fd = xdp_map_create(sys_call_area, nic->vi_lim); - if( rc < 0 ) - goto fail_map; + xdp = kzalloc(sizeof(*xdp) + nic->vi_lim * sizeof(struct efhw_af_xdp_vi) + + MAX_PDS * sizeof(struct protection_domain), + GFP_KERNEL); + if( xdp == NULL ) + return -ENOMEM; - rc = xdp_prog_load(sys_call_area, map_fd); - if( rc < 0 ) - goto fail; + nic->ev_handlers = ev_handlers; + xdp->vi = (struct efhw_af_xdp_vi*) (xdp + 1); + xdp->pd = (struct protection_domain*) (xdp->vi + nic->vi_lim); - prog = bpf_prog_get_type_dev(rc, BPF_PROG_TYPE_XDP, 1); - ci_close_fd(rc); - if( IS_ERR(prog) ) { - rc = PTR_ERR(prog); - goto fail; - } + rc = map_fd = xdp_map_create(sys_call_area, nic->vi_lim); + if( rc < 0 ) + goto fail_map; - rc = xdp_set_link(nic->net_dev, prog); - if( rc < 0 ) - goto fail; + rc = xdp_prog_load(sys_call_area, map_fd); + if( rc < 0 ) + goto fail; + ci_close_fd(rc); + + /* + prog = bpf_prog_get_type_dev(rc, BPF_PROG_TYPE_XDP, 1); + if( IS_ERR(prog) ) { + rc = PTR_ERR(prog); + goto fail; + } + */ + + rc = xdp_set_link(nic->net_dev, prog); + if( rc < 0 ) + goto fail; - xdp->map = fget(map_fd); - ci_close_fd(map_fd); + xdp->map = fget(map_fd); + ci_close_fd(map_fd); - nic->arch_extra = xdp; - memcpy(nic->mac_addr, mac_addr, ETH_ALEN); + nic->arch_extra = xdp; + memcpy(nic->mac_addr, mac_addr, ETH_ALEN); - af_xdp_nic_tweak_hardware(nic); - return 0; + af_xdp_nic_tweak_hardware(nic); + return 0; fail: - ci_close_fd(map_fd); + ci_close_fd(map_fd); fail_map: - kfree(xdp); - return rc; + kfree(xdp); + return rc; } -static int -af_xdp_nic_init_hardware(struct efhw_nic *nic, - struct efhw_ev_handler *ev_handlers, - const uint8_t *mac_addr) +static int af_xdp_nic_init_hardware(struct efhw_nic* nic, + struct efhw_ev_handler* ev_handlers, const uint8_t* mac_addr) { - int rc; - struct sys_call_area area; + int rc; + struct sys_call_area area; - rc = sys_call_area_alloc(&area); - if( rc < 0 ) - return rc; + rc = sys_call_area_alloc(&area); + if( rc < 0 ) + return rc; - rc = __af_xdp_nic_init_hardware(nic, ev_handlers, mac_addr, &area); + rc = __af_xdp_nic_init_hardware(nic, ev_handlers, mac_addr, &area); - sys_call_area_free(&area); + sys_call_area_free(&area); - return rc; + return rc; } -static void -af_xdp_nic_release_hardware(struct efhw_nic* nic) +static void af_xdp_nic_release_hardware(struct efhw_nic* nic) { struct efhw_nic_af_xdp* xdp = nic->arch_extra; xdp_set_link(nic->net_dev, NULL); @@ -987,8 +898,8 @@ af_xdp_nic_release_hardware(struct efhw_nic* nic) * *--------------------------------------------------------------------*/ -static int wait_callback(struct wait_queue_entry* wait, unsigned mode, - int flags, void* key) +static int wait_callback( + struct wait_queue_entry* wait, unsigned mode, int flags, void* key) { struct event_waiter* w = container_of(wait, struct event_waiter, wait); efhw_handle_wakeup_event(w->nic, w->evq, w->budget); @@ -998,9 +909,8 @@ static int wait_callback(struct wait_queue_entry* wait, unsigned mode, /* This function will enable the given event queue with the requested * properties. */ -static int -af_xdp_nic_event_queue_enable(struct efhw_nic *nic, uint32_t client_id, - struct efhw_evq_params *params) +static int af_xdp_nic_event_queue_enable( + struct efhw_nic* nic, uint32_t client_id, struct efhw_evq_params* params) { struct efhw_af_xdp_vi* vi = vi_by_instance(nic, params->evq); @@ -1021,24 +931,22 @@ af_xdp_nic_event_queue_enable(struct efhw_nic *nic, uint32_t client_id, return 0; } -static void -af_xdp_nic_event_queue_disable(struct efhw_nic *nic, uint32_t client_id, - uint evq, int time_sync_events_enabled) +static void af_xdp_nic_event_queue_disable(struct efhw_nic* nic, + uint32_t client_id, uint evq, int time_sync_events_enabled) { - struct efhw_af_xdp_vi* vi = vi_by_instance(nic, evq); - if( vi != NULL ) - xdp_release_vi(nic, vi); + struct efhw_af_xdp_vi* vi = vi_by_instance(nic, evq); + if( vi != NULL ) + xdp_release_vi(nic, vi); } -static void -af_xdp_nic_wakeup_request(struct efhw_nic *nic, volatile void __iomem* io_page, - int vi_id, int rptr) +static void af_xdp_nic_wakeup_request( + struct efhw_nic* nic, volatile void __iomem* io_page, int vi_id, int rptr) { } -static void af_xdp_nic_sw_event(struct efhw_nic *nic, int data, int evq) +static void af_xdp_nic_sw_event(struct efhw_nic* nic, int data, int evq) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); } /*-------------------------------------------------------------------- @@ -1047,12 +955,12 @@ static void af_xdp_nic_sw_event(struct efhw_nic *nic, int data, int evq) * *--------------------------------------------------------------------*/ -static int -af_xdp_handle_event(struct efhw_nic *nic, efhw_event_t *ev, int budget) +static int af_xdp_handle_event( + struct efhw_nic* nic, efhw_event_t* ev, int budget) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - EFHW_ASSERT(0); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + EFHW_ASSERT(0); + return -EOPNOTSUPP; } @@ -1063,21 +971,19 @@ af_xdp_handle_event(struct efhw_nic *nic, efhw_event_t *ev, int budget) *---------------------------------------------------------------------------*/ -static int -af_xdp_tx_alt_alloc(struct efhw_nic *nic, int tx_q_id, int num_alt, - int num_32b_words, unsigned *cp_id_out, unsigned *alt_ids_out) +static int af_xdp_tx_alt_alloc(struct efhw_nic* nic, int tx_q_id, int num_alt, + int num_32b_words, unsigned* cp_id_out, unsigned* alt_ids_out) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } -static int -af_xdp_tx_alt_free(struct efhw_nic *nic, int num_alt, unsigned cp_id, - const unsigned *alt_ids) +static int af_xdp_tx_alt_free( + struct efhw_nic* nic, int num_alt, unsigned cp_id, const unsigned* alt_ids) { - EFHW_ASSERT(0); - return -EOPNOTSUPP; + EFHW_ASSERT(0); + return -EOPNOTSUPP; } @@ -1088,9 +994,8 @@ af_xdp_tx_alt_free(struct efhw_nic *nic, int num_alt, unsigned cp_id, *---------------------------------------------------------------------------*/ -static int -af_xdp_dmaq_tx_q_init(struct efhw_nic *nic, uint32_t client_id, - struct efhw_dmaq_params *params) +static int af_xdp_dmaq_tx_q_init( + struct efhw_nic* nic, uint32_t client_id, struct efhw_dmaq_params* params) { struct efhw_af_xdp_vi* vi = vi_by_instance(nic, params->evq); if( vi == NULL ) @@ -1104,9 +1009,8 @@ af_xdp_dmaq_tx_q_init(struct efhw_nic *nic, uint32_t client_id, } -static int -af_xdp_dmaq_rx_q_init(struct efhw_nic *nic, uint32_t client_id, - struct efhw_dmaq_params *params) +static int af_xdp_dmaq_rx_q_init( + struct efhw_nic* nic, uint32_t client_id, struct efhw_dmaq_params* params) { struct efhw_af_xdp_vi* vi = vi_by_instance(nic, params->evq); if( vi == NULL ) @@ -1120,7 +1024,7 @@ af_xdp_dmaq_rx_q_init(struct efhw_nic *nic, uint32_t client_id, } -static size_t af_xdp_max_shared_rxqs(struct efhw_nic *nic) +static size_t af_xdp_max_shared_rxqs(struct efhw_nic* nic) { return 0; } @@ -1132,27 +1036,26 @@ static size_t af_xdp_max_shared_rxqs(struct efhw_nic *nic) *--------------------------------------------------------------------*/ -static int af_xdp_flush_tx_dma_channel(struct efhw_nic *nic, - uint32_t client_id, uint dmaq, uint evq) +static int af_xdp_flush_tx_dma_channel( + struct efhw_nic* nic, uint32_t client_id, uint dmaq, uint evq) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } -static int af_xdp_flush_rx_dma_channel(struct efhw_nic *nic, - uint32_t client_id, uint dmaq) +static int af_xdp_flush_rx_dma_channel( + struct efhw_nic* nic, uint32_t client_id, uint dmaq) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } -static int af_xdp_translate_dma_addrs(struct efhw_nic* nic, - const dma_addr_t *src, dma_addr_t *dst, - int n) +static int af_xdp_translate_dma_addrs( + struct efhw_nic* nic, const dma_addr_t* src, dma_addr_t* dst, int n) { - return -EOPNOTSUPP; + return -EOPNOTSUPP; } /*-------------------------------------------------------------------- @@ -1161,13 +1064,12 @@ static int af_xdp_translate_dma_addrs(struct efhw_nic* nic, * *--------------------------------------------------------------------*/ -static const int __af_xdp_nic_buffer_table_get_orders[] = {0,1,2,3,4,5,6,7,8,9,10}; +static const int __af_xdp_nic_buffer_table_get_orders[] = { 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10 }; -static int -af_xdp_nic_buffer_table_alloc(struct efhw_nic *nic, int owner, int order, - struct efhw_buffer_table_block **block_out, - int reset_pending) +static int af_xdp_nic_buffer_table_alloc(struct efhw_nic* nic, int owner, + int order, struct efhw_buffer_table_block** block_out, int reset_pending) { struct efhw_buffer_table_block* block; struct protection_domain* pd = pd_by_owner(nic, owner); @@ -1204,19 +1106,16 @@ af_xdp_nic_buffer_table_alloc(struct efhw_nic *nic, int owner, int order, } -static int -af_xdp_nic_buffer_table_realloc(struct efhw_nic *nic, int owner, int order, - struct efhw_buffer_table_block *block) +static int af_xdp_nic_buffer_table_realloc(struct efhw_nic* nic, int owner, + int order, struct efhw_buffer_table_block* block) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } -static void -af_xdp_nic_buffer_table_free(struct efhw_nic *nic, - struct efhw_buffer_table_block *block, - int reset_pending) +static void af_xdp_nic_buffer_table_free(struct efhw_nic* nic, + struct efhw_buffer_table_block* block, int reset_pending) { int owner = block->btb_hw.ef10.handle >> 8; kfree(block); @@ -1224,11 +1123,9 @@ af_xdp_nic_buffer_table_free(struct efhw_nic *nic, } -static int -af_xdp_nic_buffer_table_set(struct efhw_nic *nic, - struct efhw_buffer_table_block *block, - int first_entry, int n_entries, - dma_addr_t *dma_addrs) +static int af_xdp_nic_buffer_table_set(struct efhw_nic* nic, + struct efhw_buffer_table_block* block, int first_entry, int n_entries, + dma_addr_t* dma_addrs) { int i, j, owner, order; long page; @@ -1242,26 +1139,27 @@ af_xdp_nic_buffer_table_set(struct efhw_nic *nic, /* We are mapping between two address types. * - * block->btb_vaddr stores the byte offset within the umem block, suitable for - * use with AF_XDP descriptor queues. This is eventually used to provide the - * "user" addresses returned from efrm_pd_dma_map, which in turn provide the - * packet "dma" addresses posted to ef_vi, which are passed on to AF_XDP. + * block->btb_vaddr stores the byte offset within the umem block, suitable + * for use with AF_XDP descriptor queues. This is eventually used to provide + * the "user" addresses returned from efrm_pd_dma_map, which in turn provide + * the packet "dma" addresses posted to ef_vi, which are passed on to AF_XDP. * (Note: "user" and "dma" don't mean userland and DMA in this context). * - * dma_addr is the corresponding kernel address, which we use to calculate the - * addresses to store in vi->addrs, and later map into userland. This comes - * from the "dma" (or "pci") addresses obtained by efrm_pd_dma_map which, for - * a non-PCI device, are copied from the provided kernel addresses. - * (Note: "dma" and "pci" don't mean DMA and PCI in this context either). + * dma_addr is the corresponding kernel address, which we use to calculate + * the addresses to store in vi->addrs, and later map into userland. This + * comes from the "dma" (or "pci") addresses obtained by efrm_pd_dma_map + * which, for a non-PCI device, are copied from the provided kernel + * addresses. (Note: "dma" and "pci" don't mean DMA and PCI in this context + * either). * * We get one umem address giving the start of each buffer table block. The * block might contain several consecutive pages, which might be compound * (but all with the same order). * - * We store one kernel address for each single page in the umem block. This is - * somewhat profligate with memory; we could store one per buffer table block, - * or one per compound page, with a slightly more complicated lookup when - * finding each page during mmap. + * We store one kernel address for each single page in the umem block. This + * is somewhat profligate with memory; we could store one per buffer table + * block, or one per compound page, with a slightly more complicated lookup + * when finding each page during mmap. */ page = (block->btb_vaddr >> PAGE_SHIFT) + (first_entry << order); @@ -1269,7 +1167,7 @@ af_xdp_nic_buffer_table_set(struct efhw_nic *nic, return -EINVAL; for( i = 0; i < n_entries; ++i ) { - char* dma_addr = (char*)dma_addrs[i]; + char* dma_addr = (char*) dma_addrs[i]; for( j = 0; j < (1 << order); ++j, ++page, dma_addr += PAGE_SIZE ) umem_pages_set_addr(&pd->umem, page, dma_addr); } @@ -1278,10 +1176,8 @@ af_xdp_nic_buffer_table_set(struct efhw_nic *nic, } -static void -af_xdp_nic_buffer_table_clear(struct efhw_nic *nic, - struct efhw_buffer_table_block *block, - int first_entry, int n_entries) +static void af_xdp_nic_buffer_table_clear(struct efhw_nic* nic, + struct efhw_buffer_table_block* block, int first_entry, int n_entries) { } @@ -1292,21 +1188,19 @@ af_xdp_nic_buffer_table_clear(struct efhw_nic *nic, * *--------------------------------------------------------------------*/ -static int -af_xdp_nic_set_tx_port_sniff(struct efhw_nic *nic, int instance, int enable, - int rss_context) +static int af_xdp_nic_set_tx_port_sniff( + struct efhw_nic* nic, int instance, int enable, int rss_context) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } -static int -af_xdp_nic_set_port_sniff(struct efhw_nic *nic, int instance, int enable, - int promiscuous, int rss_context) +static int af_xdp_nic_set_port_sniff(struct efhw_nic* nic, int instance, + int enable, int promiscuous, int rss_context) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } /*-------------------------------------------------------------------- @@ -1315,12 +1209,11 @@ af_xdp_nic_set_port_sniff(struct efhw_nic *nic, int instance, int enable, * *--------------------------------------------------------------------*/ -static int -af_xdp_get_rx_error_stats(struct efhw_nic *nic, int instance, - void *data, int data_len, int do_reset) +static int af_xdp_get_rx_error_stats( + struct efhw_nic* nic, int instance, void* data, int data_len, int do_reset) { - EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); - return -EOPNOTSUPP; + EFHW_ERR("%s: FIXME AF_XDP", __FUNCTION__); + return -EOPNOTSUPP; } /*-------------------------------------------------------------------- @@ -1329,24 +1222,23 @@ af_xdp_get_rx_error_stats(struct efhw_nic *nic, int instance, * *--------------------------------------------------------------------*/ -static int -af_xdp_client_alloc(struct efhw_nic *nic, uint32_t parent, uint32_t *id) +static int af_xdp_client_alloc( + struct efhw_nic* nic, uint32_t parent, uint32_t* id) { - return -ENOSYS; + return -ENOSYS; } -static int -af_xdp_client_free(struct efhw_nic *nic, uint32_t id) +static int af_xdp_client_free(struct efhw_nic* nic, uint32_t id) { - return -ENOSYS; + return -ENOSYS; } -static int -af_xdp_vi_set_user(struct efhw_nic *nic, uint32_t vi_instance, uint32_t user) +static int af_xdp_vi_set_user( + struct efhw_nic* nic, uint32_t vi_instance, uint32_t user) { - return -ENOSYS; + return -ENOSYS; } /*-------------------------------------------------------------------- @@ -1354,172 +1246,164 @@ af_xdp_vi_set_user(struct efhw_nic *nic, uint32_t vi_instance, uint32_t user) * Filtering * *--------------------------------------------------------------------*/ -static int -af_xdp_rss_alloc(struct efhw_nic *nic, const u32 *indir, const u8 *key, - u32 nic_rss_flags, int num_qs, u32 *rss_context_out) -{ - return -ENOSYS; -} - -static int -af_xdp_rss_update(struct efhw_nic *nic, const u32 *indir, const u8 *key, - u32 nic_rss_flags, u32 rss_context) -{ - return -ENOSYS; -} - -static int -af_xdp_rss_free(struct efhw_nic *nic, u32 rss_context) -{ - return -ENOSYS; -} - -static int -af_xdp_rss_flags(struct efhw_nic *nic, u32 *flags_out) -{ - return -ENOSYS; -} - -static int af_xdp_efx_spec_to_ethtool_flow(struct efx_filter_spec* efx_spec, - struct ethtool_rx_flow_spec* fs) -{ - /* In order to support different driver capabilities we need to - * always install the same filter type. This means that we will - * always use a 3-tuple IP filter, even if a 5-tuple was requested. - * Although this can in theory match traffic not destined for us, in - * practice common usage means that it's sufficiently specific. - * - * The ethtool interface does not complain if a duplicate filter is - * inserted, and does not reference count such filters. That causes - * issues for the case where onload tries to replace a wild match - * filter with a full match filter, as it will add the new full match - * before removing the original wild. However, we treat both of these - * as the same 3-tuple and so the net result is that we remove the - * filter entirely. This occurs in two circumstances: - * - closing a listening socket with accepted sockets still open - * - connecting an already bound UDP socket - * We can avoid the first by setting oof_shared_keep_thresh=0 when - * using AF_XDP. - * The second is a rare case, and the failure mode here is to fall - * back to traffic via the kernel, so I'm living with it for now. - */ - - int rc = efx_spec_to_ethtool_flow(efx_spec, fs); - if (rc < 0) - return rc; - - switch (fs->flow_type) { - case UDP_V4_FLOW: - if (fs->m_u.udp_ip4_spec.tos) - return -EOPNOTSUPP; - fs->h_u.udp_ip4_spec.ip4src = 0; - fs->h_u.udp_ip4_spec.psrc = 0; - fs->m_u.udp_ip4_spec.ip4src = 0; - fs->m_u.udp_ip4_spec.psrc = 0; - break; - case TCP_V4_FLOW: - if (fs->m_u.tcp_ip4_spec.tos) - return -EOPNOTSUPP; - fs->h_u.tcp_ip4_spec.ip4src = 0; - fs->h_u.tcp_ip4_spec.psrc = 0; - fs->m_u.tcp_ip4_spec.ip4src = 0; - fs->m_u.tcp_ip4_spec.psrc = 0; - break; - default: - /* FIXME AF_XDP need to check whether we can install both IPv6 - * and IPv4 filters. For now just support IPv4. - */ - return -EOPNOTSUPP; - } - - /* TODO AF_XDP: for now assume dmaq_id matches NIC channel - * based on insight into efhw/af_xdp.c */ - fs->ring_cookie = efx_spec->dmaq_id; - - return 0; -} - -static int -af_xdp_filter_insert(struct efhw_nic *nic, struct efx_filter_spec *spec, - int *rxq, const struct cpumask *mask, unsigned flags) -{ - struct net_device *dev = nic->net_dev; - int rc; - struct ethtool_rxnfc info; - const struct ethtool_ops *ops; - struct cmd_context ctx; - - if (!enable_af_xdp_flow_filters) - return AF_XDP_NO_FILTER_MAGIC_ID; /* pretend a filter is installed */ - memset(&info, 0, sizeof(info)); - info.cmd = ETHTOOL_SRXCLSRLINS; - rc = af_xdp_efx_spec_to_ethtool_flow(spec, &info.fs); - if ( rc < 0 ) - return rc; - - rtnl_lock(); - - ops = dev->ethtool_ops; - if (!ops->set_rxnfc) { - rc = -EOPNOTSUPP; - goto unlock_out; - } - - ctx.netdev = dev; - rc = rmgr_set_location(&ctx, &info.fs); - if ( rc < 0 ) - goto unlock_out; - - rc = ops->set_rxnfc(dev, &info); - if ( rc >= 0 ) - rc = info.fs.location; +static int af_xdp_rss_alloc(struct efhw_nic* nic, const u32* indir, + const u8* key, u32 nic_rss_flags, int num_qs, u32* rss_context_out) +{ + return -ENOSYS; +} + +static int af_xdp_rss_update(struct efhw_nic* nic, const u32* indir, + const u8* key, u32 nic_rss_flags, u32 rss_context) +{ + return -ENOSYS; +} + +static int af_xdp_rss_free(struct efhw_nic* nic, u32 rss_context) +{ + return -ENOSYS; +} + +static int af_xdp_rss_flags(struct efhw_nic* nic, u32* flags_out) +{ + return -ENOSYS; +} + +static int af_xdp_efx_spec_to_ethtool_flow( + struct efx_filter_spec* efx_spec, struct ethtool_rx_flow_spec* fs) +{ + /* In order to support different driver capabilities we need to + * always install the same filter type. This means that we will + * always use a 3-tuple IP filter, even if a 5-tuple was requested. + * Although this can in theory match traffic not destined for us, in + * practice common usage means that it's sufficiently specific. + * + * The ethtool interface does not complain if a duplicate filter is + * inserted, and does not reference count such filters. That causes + * issues for the case where onload tries to replace a wild match + * filter with a full match filter, as it will add the new full match + * before removing the original wild. However, we treat both of these + * as the same 3-tuple and so the net result is that we remove the + * filter entirely. This occurs in two circumstances: + * - closing a listening socket with accepted sockets still open + * - connecting an already bound UDP socket + * We can avoid the first by setting oof_shared_keep_thresh=0 when + * using AF_XDP. + * The second is a rare case, and the failure mode here is to fall + * back to traffic via the kernel, so I'm living with it for now. + */ + + int rc = efx_spec_to_ethtool_flow(efx_spec, fs); + if( rc < 0 ) + return rc; + + switch( fs->flow_type ) { + case UDP_V4_FLOW: + if( fs->m_u.udp_ip4_spec.tos ) + return -EOPNOTSUPP; + fs->h_u.udp_ip4_spec.ip4src = 0; + fs->h_u.udp_ip4_spec.psrc = 0; + fs->m_u.udp_ip4_spec.ip4src = 0; + fs->m_u.udp_ip4_spec.psrc = 0; + break; + case TCP_V4_FLOW: + if( fs->m_u.tcp_ip4_spec.tos ) + return -EOPNOTSUPP; + fs->h_u.tcp_ip4_spec.ip4src = 0; + fs->h_u.tcp_ip4_spec.psrc = 0; + fs->m_u.tcp_ip4_spec.ip4src = 0; + fs->m_u.tcp_ip4_spec.psrc = 0; + break; + default: + /* FIXME AF_XDP need to check whether we can install both IPv6 + * and IPv4 filters. For now just support IPv4. + */ + return -EOPNOTSUPP; + } + + /* TODO AF_XDP: for now assume dmaq_id matches NIC channel + * based on insight into efhw/af_xdp.c */ + fs->ring_cookie = efx_spec->dmaq_id; + + return 0; +} + +static int af_xdp_filter_insert(struct efhw_nic* nic, + struct efx_filter_spec* spec, int* rxq, const struct cpumask* mask, + unsigned flags) +{ + struct net_device* dev = nic->net_dev; + int rc; + struct ethtool_rxnfc info; + const struct ethtool_ops* ops; + struct cmd_context ctx; + + if( ! enable_af_xdp_flow_filters ) + return AF_XDP_NO_FILTER_MAGIC_ID; /* pretend a filter is installed */ + memset(&info, 0, sizeof(info)); + info.cmd = ETHTOOL_SRXCLSRLINS; + rc = af_xdp_efx_spec_to_ethtool_flow(spec, &info.fs); + if( rc < 0 ) + return rc; + + rtnl_lock(); + + ops = dev->ethtool_ops; + if( ! ops->set_rxnfc ) { + rc = -EOPNOTSUPP; + goto unlock_out; + } + + ctx.netdev = dev; + rc = rmgr_set_location(&ctx, &info.fs); + if( rc < 0 ) + goto unlock_out; + + rc = ops->set_rxnfc(dev, &info); + if( rc >= 0 ) + rc = info.fs.location; unlock_out: - rtnl_unlock(); - return rc; + rtnl_unlock(); + return rc; } -static void -af_xdp_filter_remove(struct efhw_nic *nic, int filter_id) +static void af_xdp_filter_remove(struct efhw_nic* nic, int filter_id) { - struct net_device *dev = nic->net_dev; - struct ethtool_rxnfc info; - const struct ethtool_ops *ops; + struct net_device* dev = nic->net_dev; + struct ethtool_rxnfc info; + const struct ethtool_ops* ops; - if (filter_id == AF_XDP_NO_FILTER_MAGIC_ID) - return; + if( filter_id == AF_XDP_NO_FILTER_MAGIC_ID ) + return; - memset(&info, 0, sizeof(info)); - info.cmd = ETHTOOL_SRXCLSRLDEL; - info.fs.location = filter_id; + memset(&info, 0, sizeof(info)); + info.cmd = ETHTOOL_SRXCLSRLDEL; + info.fs.location = filter_id; - rtnl_lock(); - ops = dev->ethtool_ops; - if (ops->set_rxnfc) - ops->set_rxnfc(dev, &info); - rtnl_unlock(); + rtnl_lock(); + ops = dev->ethtool_ops; + if( ops->set_rxnfc ) + ops->set_rxnfc(dev, &info); + rtnl_unlock(); } -static int -af_xdp_filter_redirect(struct efhw_nic *nic, int filter_id, - struct efx_filter_spec *spec) +static int af_xdp_filter_redirect( + struct efhw_nic* nic, int filter_id, struct efx_filter_spec* spec) { - /* This error code is proxied by efrm_filter_redirect() and goes to - * oo_hw_filter_set_hwport(). Do not change this value without - * looking in there. */ - return -ENODEV; + /* This error code is proxied by efrm_filter_redirect() and goes to + * oo_hw_filter_set_hwport(). Do not change this value without + * looking in there. */ + return -ENODEV; } -static int -af_xdp_multicast_block(struct efhw_nic *nic, bool block) +static int af_xdp_multicast_block(struct efhw_nic* nic, bool block) { - return -ENOSYS; + return -ENOSYS; } -static int -af_xdp_unicast_block(struct efhw_nic *nic, bool block) +static int af_xdp_unicast_block(struct efhw_nic* nic, bool block) { - return -ENOSYS; + return -ENOSYS; } /*-------------------------------------------------------------------- @@ -1527,16 +1411,15 @@ af_xdp_unicast_block(struct efhw_nic *nic, bool block) * vports * *--------------------------------------------------------------------*/ -static int -af_xdp_vport_alloc(struct efhw_nic *nic, u16 vlan_id, u16 *vport_handle_out) +static int af_xdp_vport_alloc( + struct efhw_nic* nic, u16 vlan_id, u16* vport_handle_out) { - return -ENOSYS; + return -ENOSYS; } -static int -af_xdp_vport_free(struct efhw_nic *nic, u16 vport_handle) +static int af_xdp_vport_free(struct efhw_nic* nic, u16 vport_handle) { - return -ENOSYS; + return -ENOSYS; } /*-------------------------------------------------------------------- @@ -1544,25 +1427,22 @@ af_xdp_vport_free(struct efhw_nic *nic, u16 vport_handle) * Device * *--------------------------------------------------------------------*/ -static struct pci_dev* -af_xdp_get_pci_dev(struct efhw_nic *nic) +static struct pci_dev* af_xdp_get_pci_dev(struct efhw_nic* nic) { - return NULL; + return NULL; } -static int -af_xdp_vi_io_region(struct efhw_nic *nic, int instance, size_t* size_out, - resource_size_t* addr_out) +static int af_xdp_vi_io_region(struct efhw_nic* nic, int instance, + size_t* size_out, resource_size_t* addr_out) { - *size_out = 0; - return 0; + *size_out = 0; + return 0; } -static int -af_xdp_inject_reset_ev(struct efhw_nic* nic, void* base, unsigned capacity, - const volatile uint32_t* evq_ptr) +static int af_xdp_inject_reset_ev(struct efhw_nic* nic, void* base, + unsigned capacity, const volatile uint32_t* evq_ptr) { - return -EOPNOTSUPP; + return -EOPNOTSUPP; } /*-------------------------------------------------------------------- @@ -1570,10 +1450,10 @@ af_xdp_inject_reset_ev(struct efhw_nic* nic, void* base, unsigned capacity, * CTPIO * *--------------------------------------------------------------------*/ -static int -af_xdp_ctpio_addr(struct efhw_nic* nic, int instance, resource_size_t* addr) +static int af_xdp_ctpio_addr( + struct efhw_nic* nic, int instance, resource_size_t* addr) { - return -ENOSYS; + return -ENOSYS; } /*-------------------------------------------------------------------- @@ -1583,58 +1463,58 @@ af_xdp_ctpio_addr(struct efhw_nic* nic, int instance, resource_size_t* addr) *--------------------------------------------------------------------*/ struct efhw_func_ops af_xdp_char_functional_units = { - af_xdp_nic_init_hardware, - af_xdp_nic_tweak_hardware, - af_xdp_nic_release_hardware, - af_xdp_nic_event_queue_enable, - af_xdp_nic_event_queue_disable, - af_xdp_nic_wakeup_request, - af_xdp_nic_sw_event, - af_xdp_handle_event, - af_xdp_dmaq_tx_q_init, - af_xdp_dmaq_rx_q_init, - af_xdp_flush_tx_dma_channel, - af_xdp_flush_rx_dma_channel, - af_xdp_translate_dma_addrs, - __af_xdp_nic_buffer_table_get_orders, - sizeof(__af_xdp_nic_buffer_table_get_orders) / - sizeof(__af_xdp_nic_buffer_table_get_orders[0]), - af_xdp_nic_buffer_table_alloc, - af_xdp_nic_buffer_table_realloc, - af_xdp_nic_buffer_table_free, - af_xdp_nic_buffer_table_set, - af_xdp_nic_buffer_table_clear, - af_xdp_nic_set_port_sniff, - af_xdp_nic_set_tx_port_sniff, - af_xdp_nic_license_challenge, - af_xdp_nic_license_check, - af_xdp_nic_v3_license_challenge, - af_xdp_nic_v3_license_check, - af_xdp_get_rx_error_stats, - af_xdp_tx_alt_alloc, - af_xdp_tx_alt_free, - af_xdp_client_alloc, - af_xdp_client_free, - af_xdp_vi_set_user, - af_xdp_rss_alloc, - af_xdp_rss_update, - af_xdp_rss_free, - af_xdp_rss_flags, - af_xdp_filter_insert, - af_xdp_filter_remove, - af_xdp_filter_redirect, - af_xdp_multicast_block, - af_xdp_unicast_block, - af_xdp_vport_alloc, - af_xdp_vport_free, - af_xdp_dmaq_kick, - af_xdp_mem, - af_xdp_init, - af_xdp_get_pci_dev, - af_xdp_vi_io_region, - af_xdp_inject_reset_ev, - af_xdp_ctpio_addr, - af_xdp_max_shared_rxqs, + af_xdp_nic_init_hardware, + af_xdp_nic_tweak_hardware, + af_xdp_nic_release_hardware, + af_xdp_nic_event_queue_enable, + af_xdp_nic_event_queue_disable, + af_xdp_nic_wakeup_request, + af_xdp_nic_sw_event, + af_xdp_handle_event, + af_xdp_dmaq_tx_q_init, + af_xdp_dmaq_rx_q_init, + af_xdp_flush_tx_dma_channel, + af_xdp_flush_rx_dma_channel, + af_xdp_translate_dma_addrs, + __af_xdp_nic_buffer_table_get_orders, + sizeof(__af_xdp_nic_buffer_table_get_orders) / + sizeof(__af_xdp_nic_buffer_table_get_orders[0]), + af_xdp_nic_buffer_table_alloc, + af_xdp_nic_buffer_table_realloc, + af_xdp_nic_buffer_table_free, + af_xdp_nic_buffer_table_set, + af_xdp_nic_buffer_table_clear, + af_xdp_nic_set_port_sniff, + af_xdp_nic_set_tx_port_sniff, + af_xdp_nic_license_challenge, + af_xdp_nic_license_check, + af_xdp_nic_v3_license_challenge, + af_xdp_nic_v3_license_check, + af_xdp_get_rx_error_stats, + af_xdp_tx_alt_alloc, + af_xdp_tx_alt_free, + af_xdp_client_alloc, + af_xdp_client_free, + af_xdp_vi_set_user, + af_xdp_rss_alloc, + af_xdp_rss_update, + af_xdp_rss_free, + af_xdp_rss_flags, + af_xdp_filter_insert, + af_xdp_filter_remove, + af_xdp_filter_redirect, + af_xdp_multicast_block, + af_xdp_unicast_block, + af_xdp_vport_alloc, + af_xdp_vport_free, + af_xdp_dmaq_kick, + af_xdp_mem, + af_xdp_init, + af_xdp_get_pci_dev, + af_xdp_vi_io_region, + af_xdp_inject_reset_ev, + af_xdp_ctpio_addr, + af_xdp_max_shared_rxqs, }; #endif /* EFHW_HAS_AF_XDP */ diff --git a/src/lib/transport/unix/dpdk.c b/src/lib/transport/unix/dpdk.c index 1451ce7c0..7aa30a0b6 100644 --- a/src/lib/transport/unix/dpdk.c +++ b/src/lib/transport/unix/dpdk.c @@ -1,6 +1,16 @@ #include #include "internal.h" +static const char *__dpdk_eal_argv[] = { "-l", "1", "--proc-type=secondary", + "--log-level", "0" }; + +/* These values should be kept in sync with the argv list above. The last two + * should always be the log level so that we can conditionally enable or + * disable verbose logging by simply changing the number of args passed to + * dpdk*/ +static const int __dpdk_eal_argc = 5; +static const int __dpdk_eal_verbose_argc = __dpdk_eal_argc - 2; + int dpdk_cleanup(void) { rte_eal_cleanup(); @@ -9,22 +19,19 @@ int dpdk_cleanup(void) int dpdk_init(void) { - char *argv[] = { - "-l", - "1", - "--proc-type=secondary", - }; - int ret; - ret = rte_eal_init(3, argv); + int argc = __dpdk_eal_argc; + Log_V(ci_log("Enabling Verbose DPDK initialization logging"); + argc = __dpdk_eal_verbose_argc); + ret = rte_eal_init(argc, __dpdk_eal_argv); if( ret < 0 ) { - LOG_S(ci_log("Unable to intialize DPDK")); + LOG_U(ci_log("Unable to intialize DPDK")); return -1; } ret = rte_eal_primary_proc_alive(NULL); if( ret == 0 ) { - LOG_S(ci_log("DPDK Primary process is not alive")); + LOG_U(ci_log("DPDK Primary process is not alive")); dpdk_cleanup(); return -2; } From 4601431f3fd0b73ca48b7fe31086a46f098b7947 Mon Sep 17 00:00:00 2001 From: Kyle Kyrazis Date: Tue, 1 Nov 2022 21:24:09 +0000 Subject: [PATCH 3/5] Working version --- scripts/onload_profiles/swxtch.opf | 4 +- src/include/etherfabric/ef_vi.h | 4 + src/lib/ciul/efswxtch_vi.c | 260 +++++++++------ src/lib/transport/ip/netif.c | 128 ++++---- src/lib/transport/ip/netif_event.c | 280 ++++++++-------- src/lib/transport/ip/netif_init.c | 442 +++++++++++++------------- src/lib/transport/ip/udp_recv.c | 306 +++++++++--------- src/lib/transport/unix/dpdk.c | 2 +- test_programs/mock_xnic/Makefile | 2 +- test_programs/mock_xnic/main.c | 251 +++++++++------ test_programs/mock_xnic/mp_commands.c | 38 +++ test_programs/mock_xnic/mp_commands.h | 5 +- 12 files changed, 950 insertions(+), 772 deletions(-) diff --git a/scripts/onload_profiles/swxtch.opf b/scripts/onload_profiles/swxtch.opf index 90e12c6b9..d06dfba1d 100644 --- a/scripts/onload_profiles/swxtch.opf +++ b/scripts/onload_profiles/swxtch.opf @@ -1,8 +1,8 @@ -onload_set EF_SPIN_USEC 10000000000 +onload_set EF_SPIN_USEC 10000000000000 onload_set EF_TCP_CONNECT_SPIN 1 onload_set EF_TCP_ACCEPT_SPIN 1 onload_set EF_TCP_RECV_SPIN 1 onload_set EF_TCP_SEND_SPIN 1 onload_set EF_UDP_RECV_SPIN 1 onload_set EF_UDP_SEND_SPIN 1 -#onload_set EF_UNIX_LOG 0x8 # this is a crappy bitmask that can be found in opts_citp_def.h and it only seems to kind of work +#onload_set EF_UNIX_LOG 0xFFFFFFFFFFF # this is a crappy bitmask that can be found in opts_citp_def.h and it only seems to kind of work diff --git a/src/include/etherfabric/ef_vi.h b/src/include/etherfabric/ef_vi.h index 1b3bbc202..ed2f65515 100644 --- a/src/include/etherfabric/ef_vi.h +++ b/src/include/etherfabric/ef_vi.h @@ -1068,6 +1068,7 @@ typedef struct ef_vi { struct ef_vi* vi, char* output_buffer, int event_index); void (*tx_fill_pkt)( struct ef_vi* vi, const char* output_buffer, const unsigned len); + int (*refill_rx)(struct ef_vi* vi); } ops; /**< Driver-dependent operations. */ /* Doxygen comment above is documentation for the ops member of ef_vi */ @@ -2466,6 +2467,9 @@ ef_vi_inline int ef_eventq_has_many_events(const ef_vi* evq, int n_events) #define ef_fill_tx_data(evq, pkt, len) \ (evq)->ops.tx_fill_pkt((evq), (pkt), (len)) +/* This will refil the rx fill queue to the level indicated by the netif */ +#define ef_resume_rx(evq) (evq)->ops.refill_rx((evq)) + /*! \brief Returns the capacity of an event queue ** ** \param vi The event queue to query. diff --git a/src/lib/ciul/efswxtch_vi.c b/src/lib/ciul/efswxtch_vi.c index 9c07397dd..e389c1a2a 100644 --- a/src/lib/ciul/efswxtch_vi.c +++ b/src/lib/ciul/efswxtch_vi.c @@ -7,39 +7,44 @@ /* The names of the rings must match what is in the swxtch primary process */ -static const char *_TX_RING = "TX_RING"; +static const char *_TX_RING = "TX_RING"; static const char *_TX_COMP_RING = "TX_COMP_RING"; -static const char *_RX_RING = "RX_RING"; +static const char *_RX_RING = "RX_RING"; static const char *_RX_FILL_RING = "RX_FILL_RING"; static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; static const char *_TX_PREP_RING = "TX_PREP_RING"; static const char *_RX_PREP_RING = "RX_PREP_RING"; +static const char *_RX_PENDING_RING = "RX_PENDING_RING"; typedef struct swxtch_rings { - struct rte_mempool *mempool; - struct rte_ring *rx_fill_ring; - struct rte_ring *rx_ring; - struct rte_ring *tx_ring; - struct rte_ring *tx_comp_ring; - struct rte_ring *tx_prep_ring; - struct rte_ring *rx_prep_ring; + struct rte_mempool *mempool; // basic mempool to pull mbufs from + struct rte_ring *rx_fill_ring; // rx fill ring to fill indicate to that + // rx packets can be received + struct rte_ring *rx_ring; // ring containing rx packets + struct rte_ring *tx_ring; // ring contain packets to send + struct rte_ring *tx_comp_ring; // ring containing packets that were sent + // the prep rings are semi hacky and are used as a staging area for + // rx|tx_init before _push is called + struct rte_ring *tx_prep_ring; + struct rte_ring *rx_prep_ring; + // in between polling and reading rx packets live here + struct rte_ring *rx_pending_ring; } swxtch_rings; static swxtch_rings m_rings; -static struct rte_mbuf - *pending_evs[16]; // 16 is the exact size of the event request - +// drain a ring on startup to free any stuck mbufs void efswxtch_drain_ring(struct rte_ring *ring) { - unsigned available = 0; - int count = 0; - int burst_size = 32; + unsigned available = 0; + int count = 0; + int burst_size = 32; struct rte_mbuf *bufs[burst_size]; do { count = rte_ring_dequeue_burst( ring, (void **) &bufs[0], burst_size, &available); + rte_pktmbuf_free_bulk(bufs, count); } while( available != 0 ); } @@ -47,22 +52,24 @@ void efswxtch_drain_ring(struct rte_ring *ring) void efswxtch_drain_rings(void) { efswxtch_drain_ring(m_rings.rx_fill_ring); + efswxtch_drain_ring(m_rings.tx_ring); efswxtch_drain_ring(m_rings.rx_ring); efswxtch_drain_ring(m_rings.rx_prep_ring); efswxtch_drain_ring(m_rings.tx_prep_ring); efswxtch_drain_ring(m_rings.tx_comp_ring); - efswxtch_drain_ring(m_rings.tx_ring); + efswxtch_drain_ring(m_rings.rx_pending_ring); } int efswxtch_init_rings(void) { - m_rings.mempool = rte_mempool_lookup(_RX_MBUF_POOL); + m_rings.mempool = rte_mempool_lookup(_RX_MBUF_POOL); m_rings.rx_fill_ring = rte_ring_lookup(_RX_FILL_RING); - m_rings.rx_ring = rte_ring_lookup(_RX_RING); - m_rings.tx_ring = rte_ring_lookup(_TX_RING); + m_rings.rx_ring = rte_ring_lookup(_RX_RING); + m_rings.tx_ring = rte_ring_lookup(_TX_RING); m_rings.tx_comp_ring = rte_ring_lookup(_TX_COMP_RING); m_rings.tx_prep_ring = rte_ring_lookup(_TX_PREP_RING); m_rings.rx_prep_ring = rte_ring_lookup(_RX_PREP_RING); + m_rings.rx_pending_ring = rte_ring_lookup(_RX_PENDING_RING); if( m_rings.mempool == NULL ) { ef_log("NO MEMPOOL"); return -1; @@ -91,12 +98,31 @@ int efswxtch_init_rings(void) ef_log("NO RX PREP RING"); return -1; } + if( m_rings.rx_pending_ring == NULL ) { + ef_log("NO RX Pending RING"); + return -1; + } efswxtch_drain_rings(); return 0; } +// Enqueues as many mbufs as it can. Returns false if not all are enqueued and +// will free any mbufs that aren't enqueued +static int efswxtch_ef_vi_safe_enqueue( + struct rte_ring *ring, struct rte_mbuf **mbufs, unsigned count) +{ + unsigned enq = rte_ring_enqueue_burst(ring, (void **) mbufs, count, NULL); + if( enq != count ) { + ef_log("Only enqueued %d:%d on ring: %s", enq, count, ring->name); + rte_pktmbuf_free_bulk((struct rte_mbuf **) &mbufs[enq], count - enq); + return 0; + } + + return 1; +} + static void efswxtch_ef_vi_tx_fill_pkt( ef_vi *vi, const char *pkt, const unsigned len) { @@ -104,7 +130,8 @@ static void efswxtch_ef_vi_tx_fill_pkt( if( rte_mempool_get_bulk(m_rings.mempool, (void **) mbufs, 1) == 0 ) { memcpy(rte_pktmbuf_mtod(mbufs[0], char *), pkt, len); mbufs[0]->data_len = len; - rte_ring_enqueue_bulk(m_rings.tx_prep_ring, (void *) mbufs, 1, NULL); + efswxtch_ef_vi_safe_enqueue( + m_rings.tx_prep_ring, (struct rte_mbuf **) mbufs, 1); } else { ef_log("failed to fill tx packet. Out of buffers"); } @@ -113,9 +140,9 @@ static void efswxtch_ef_vi_tx_fill_pkt( static int efswxtch_ef_vi_transmitv_init( ef_vi *vi, const ef_iovec *iov, int iov_len, ef_request_id dma_id) { - ef_vi_txq *q = &vi->vi_txq; + ef_vi_txq *q = &vi->vi_txq; ef_vi_txq_state *qs = &vi->ep_state->txq; - int i; + int i; if( iov_len != 1 ) return -EINVAL; /* Multiple buffers per packet not supported */ @@ -131,12 +158,12 @@ static int efswxtch_ef_vi_transmitv_init( static void efswxtch_ef_vi_transmit_push(ef_vi *vi) { struct rte_mbuf *mbufs[EF_VI_TRANSMIT_BATCH]; - int removed; + int removed; removed = rte_ring_dequeue_burst( m_rings.tx_prep_ring, (void **) mbufs, EF_VI_TRANSMIT_BATCH, NULL); if( removed != 0 ) { - rte_ring_enqueue_bulk(m_rings.tx_ring, (void **) mbufs, removed, NULL); + efswxtch_ef_vi_safe_enqueue(m_rings.tx_ring, mbufs, removed); } else { ef_log("pushing but have no data"); } @@ -146,7 +173,7 @@ static int efswxtch_ef_vi_transmit( ef_vi *vi, ef_addr base, int len, ef_request_id dma_id) { ef_iovec iov = { base, len }; - int rc = efswxtch_ef_vi_transmitv_init(vi, &iov, 1, dma_id); + int rc = efswxtch_ef_vi_transmitv_init(vi, &iov, 1, dma_id); if( rc == 0 ) { wmb(); efswxtch_ef_vi_transmit_push(vi); @@ -267,18 +294,24 @@ static int efswxtch_ef_vi_transmit_memcpy_sync( static int efswxtch_ef_vi_receive_init( ef_vi *vi, ef_addr addr, ef_request_id dma_id) { - ef_vi_rxq *q = &vi->vi_rxq; + ef_vi_rxq *q = &vi->vi_rxq; ef_vi_rxq_state *qs = &vi->ep_state->rxq; struct rte_mbuf *mbufs[1]; - int i; + int i; if( qs->added - qs->removed >= q->mask ) return -EAGAIN; - i = qs->added++ & q->mask; + i = qs->added++ & q->mask; q->ids[i] = dma_id; - if( rte_mempool_get_bulk(m_rings.mempool, (void **) mbufs, 1) == 0 ) { - rte_ring_enqueue_bulk(m_rings.rx_prep_ring, (void *) mbufs, 1, NULL); + if( rte_mempool_get(m_rings.mempool, (void **) &mbufs[0]) == 0 ) { + if( ! efswxtch_ef_vi_safe_enqueue(m_rings.rx_prep_ring, mbufs, 1) ) { + return -2; + } + } else { + ef_log("Unable to get mbuf to enqueue on the rx prep ring: %d left", + rte_mempool_avail_count(m_rings.mempool)); + return -1; } return 0; @@ -286,20 +319,20 @@ static int efswxtch_ef_vi_receive_init( static void efswxtch_ef_vi_receive_push(ef_vi *vi) { - int size = rte_ring_get_capacity(m_rings.rx_prep_ring); - struct rte_mbufs *mbufs[size]; - int dequeued = rte_ring_dequeue_burst( - m_rings.rx_prep_ring, (void **) &mbufs[0], size, NULL); + int size = rte_ring_count(m_rings.rx_prep_ring); + struct rte_mbuf *mbufs[size]; + int dequeued = rte_ring_dequeue_burst( + m_rings.rx_prep_ring, (void **) &mbufs[0], size, NULL); if( dequeued == 0 ) { ef_log("failed to get rx prep ring buffs"); return; } - if( rte_ring_enqueue_bulk( - m_rings.rx_fill_ring, (void **) &mbufs[0], dequeued, NULL) == 0 ) { - ef_log("failed to enqueue on the fill ring"); - } + + efswxtch_ef_vi_safe_enqueue( + m_rings.rx_fill_ring, (struct rte_mbuf **) &mbufs[0], dequeued); } + static void efswxtch_ef_eventq_prime(ef_vi *vi) { // TODO @@ -307,50 +340,61 @@ static void efswxtch_ef_eventq_prime(ef_vi *vi) static void efswxtch_rx_fill_pkt(ef_vi *vi, char *pkt, int index) { - struct rte_mbuf *mbuf = pending_evs[index]; - memcpy(pkt, rte_pktmbuf_mtod(mbuf, unsigned char *), - rte_pktmbuf_data_len(mbuf)); - rte_pktmbuf_free(mbuf); + struct rte_mbuf *mbuf[1]; + if( rte_ring_dequeue(m_rings.rx_pending_ring, (void **) &mbuf[0]) != 0 ) { + ef_log("Nothing to fill in the rx pkts"); + return; + } + memcpy(pkt, rte_pktmbuf_mtod(mbuf[0], unsigned char *), + rte_pktmbuf_data_len(mbuf[0])); + if( mbuf[0] == NULL ) { + ef_log("freeing NULL"); + } else { + rte_pktmbuf_free(mbuf[0]); + } } static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) { // n is the index of the current event we're filling in. consists of both RX // events and TX completion events - int n = 0, count = 0; - unsigned available = 0, page = 0; + int n = 0, count = 0; + unsigned available = 0, page = 0; - ef_vi_rxq *rx_q = &vi->vi_rxq; - ef_vi_txq *tx_q = &vi->vi_txq; + ef_vi_rxq *rx_q = &vi->vi_rxq; + ef_vi_txq *tx_q = &vi->vi_txq; ef_vi_rxq_state *rx_qs = &vi->ep_state->rxq; ef_vi_txq_state *tx_qs = &vi->ep_state->txq; + + // tx_bufs can be large because we can confirm up EF_VI_TRANSMIT_BATCH per + // event. We can have at most 1 RX event per RX packet struct rte_mbuf *rx_bufs[evs_len]; struct rte_mbuf *tx_bufs[EF_VI_TRANSMIT_BATCH]; - do { - count = rte_ring_dequeue_burst( - m_rings.rx_ring, (void **) rx_bufs, evs_len, &available); - for( int i = 0; i < count; i++ ) { - unsigned desc_i = rx_qs->removed++ & rx_q->mask; - evs[n].rx.type = EF_EVENT_TYPE_RX; - evs[n].rx.q_id = 0; - evs[n].rx.rq_id = rx_q->ids[desc_i]; // dma_id - - // mark the descriptor reusable - rx_q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ - - evs[n].rx.flags = EF_EVENT_FLAG_SOP; - evs[n].rx.len = rte_pktmbuf_data_len(rx_bufs[i]); - evs[n].rx.ofs = 0; - - pending_evs[n] = rx_bufs[i]; - ++n; - } - } while( available != 0 && n < evs_len ); + count = rte_ring_dequeue_burst( + m_rings.rx_ring, (void **) rx_bufs, evs_len, NULL); + for( int i = 0; i < count; i++ ) { + unsigned desc_i = rx_qs->removed & rx_q->mask; + evs[n].rx.type = EF_EVENT_TYPE_RX; + evs[n].rx.q_id = 0; + evs[n].rx.rq_id = rx_q->ids[desc_i]; // dma_id + ++rx_qs->removed; + + // mark the descriptor reusable + rx_q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ + + evs[n].rx.flags = EF_EVENT_FLAG_SOP; + evs[n].rx.len = rte_pktmbuf_data_len(rx_bufs[i]); + evs[n].rx.ofs = 0; + ++n; + } + + efswxtch_ef_vi_safe_enqueue( + m_rings.rx_pending_ring, (struct rte_mbuf **) rx_bufs, count); if( n < evs_len ) { available = 0; - page = 0; + page = 0; do { // TX can acknowledge multiple at once using the last id count = rte_ring_dequeue_burst(m_rings.tx_comp_ring, (void **) tx_bufs, @@ -359,12 +403,13 @@ static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) int desc_id = (tx_qs->removed + count + (EF_VI_TRANSMIT_BATCH * page)) & tx_q->mask; - evs[n].tx.type = EF_EVENT_TYPE_TX; + evs[n].tx.type = EF_EVENT_TYPE_TX; evs[n].tx.desc_id = desc_id; - evs[n].tx.flags = 0; - evs[n].tx.q_id = 0; + evs[n].tx.flags = 0; + evs[n].tx.q_id = 0; ++n; ++page; + rte_pktmbuf_free_bulk(tx_bufs, count); } } while( available != 0 && n < evs_len ); @@ -399,39 +444,60 @@ int efswxtch_ef_eventq_check_event(const ef_vi *_vi) rte_ring_count(m_rings.tx_comp_ring) > 0; } +static int efswxtch_ef_vi_refill_rx(ef_vi *vi) +{ + unsigned existing_count = rte_ring_count(m_rings.rx_fill_ring); + unsigned count_needed = + vi->ep_state->rxq.added - vi->ep_state->rxq.removed - existing_count; + if( count_needed > 0 ) { + struct rte_mbuf *pkts[count_needed]; + if( rte_mempool_get_bulk(m_rings.mempool, (void **) pkts, count_needed) != + 0 ) { + ef_log("Unabble to refil the RX fill packets"); + return 0; + } + + return efswxtch_ef_vi_safe_enqueue( + m_rings.rx_fill_ring, pkts, count_needed); + } + + return 1; +} + void efswxtch_vi_init(ef_vi *vi) { efswxtch_init_rings(); - vi->ops.transmit = efswxtch_ef_vi_transmit; - vi->ops.transmitv = efswxtch_ef_vi_transmitv; - vi->ops.transmitv_init = efswxtch_ef_vi_transmitv_init; - vi->ops.transmit_push = efswxtch_ef_vi_transmit_push; - vi->ops.transmit_pio = efswxtch_ef_vi_transmit_pio; - vi->ops.transmit_copy_pio = efswxtch_ef_vi_transmit_copy_pio; - vi->ops.transmit_pio_warm = efswxtch_ef_vi_transmit_pio_warm; + vi->ops.transmit = efswxtch_ef_vi_transmit; + vi->ops.transmitv = efswxtch_ef_vi_transmitv; + vi->ops.transmitv_init = efswxtch_ef_vi_transmitv_init; + vi->ops.transmit_push = efswxtch_ef_vi_transmit_push; + vi->ops.transmit_pio = efswxtch_ef_vi_transmit_pio; + vi->ops.transmit_copy_pio = efswxtch_ef_vi_transmit_copy_pio; + vi->ops.transmit_pio_warm = efswxtch_ef_vi_transmit_pio_warm; vi->ops.transmit_copy_pio_warm = efswxtch_ef_vi_transmit_copy_pio_warm; - vi->ops.transmitv_ctpio = efswxtch_ef_vi_transmitv_ctpio; - vi->ops.transmitv_ctpio_copy = efswxtch_ef_vi_transmitv_ctpio_copy; - vi->ops.transmit_alt_select = efswxtch_ef_vi_transmit_alt_select; + vi->ops.transmitv_ctpio = efswxtch_ef_vi_transmitv_ctpio; + vi->ops.transmitv_ctpio_copy = efswxtch_ef_vi_transmitv_ctpio_copy; + vi->ops.transmit_alt_select = efswxtch_ef_vi_transmit_alt_select; vi->ops.transmit_alt_select_default = efswxtch_ef_vi_transmit_alt_select_normal; - vi->ops.transmit_alt_stop = efswxtch_ef_vi_transmit_alt_stop; - vi->ops.transmit_alt_go = efswxtch_ef_vi_transmit_alt_go; + vi->ops.transmit_alt_stop = efswxtch_ef_vi_transmit_alt_stop; + vi->ops.transmit_alt_go = efswxtch_ef_vi_transmit_alt_go; vi->ops.transmit_alt_discard = efswxtch_ef_vi_transmit_alt_discard; - vi->ops.receive_init = efswxtch_ef_vi_receive_init; - vi->ops.receive_push = efswxtch_ef_vi_receive_push; - vi->ops.eventq_poll = efswxtch_ef_eventq_poll; - vi->ops.eventq_prime = efswxtch_ef_eventq_prime; - vi->ops.eventq_timer_prime = efswxtch_ef_eventq_timer_prime; - vi->ops.eventq_timer_run = efswxtch_ef_eventq_timer_run; - vi->ops.eventq_timer_clear = efswxtch_ef_eventq_timer_clear; - vi->ops.eventq_timer_zero = efswxtch_ef_eventq_timer_zero; - vi->ops.transmit_memcpy = efswxtch_ef_vi_transmit_memcpy; + vi->ops.receive_init = efswxtch_ef_vi_receive_init; + vi->ops.receive_push = efswxtch_ef_vi_receive_push; + vi->ops.eventq_poll = efswxtch_ef_eventq_poll; + vi->ops.eventq_prime = efswxtch_ef_eventq_prime; + vi->ops.eventq_timer_prime = efswxtch_ef_eventq_timer_prime; + vi->ops.eventq_timer_run = efswxtch_ef_eventq_timer_run; + vi->ops.eventq_timer_clear = efswxtch_ef_eventq_timer_clear; + vi->ops.eventq_timer_zero = efswxtch_ef_eventq_timer_zero; + vi->ops.transmit_memcpy = efswxtch_ef_vi_transmit_memcpy; vi->ops.transmit_memcpy_sync = efswxtch_ef_vi_transmit_memcpy_sync; - vi->ops.rx_fill_pkt = efswxtch_rx_fill_pkt; - vi->ops.tx_fill_pkt = efswxtch_ef_vi_tx_fill_pkt; + vi->ops.rx_fill_pkt = efswxtch_rx_fill_pkt; + vi->ops.tx_fill_pkt = efswxtch_ef_vi_tx_fill_pkt; + vi->ops.refill_rx = efswxtch_ef_vi_refill_rx; if( vi->vi_flags & EF_VI_TX_CTPIO ) { - vi->ops.transmit_ctpio_fallback = efswxtch_ef_vi_transmit_ctpio_fallback; + vi->ops.transmit_ctpio_fallback = efswxtch_ef_vi_transmit_ctpio_fallback; vi->ops.transmitv_ctpio_fallback = efswxtch_ef_vi_transmitv_ctpio_fallback; } else { vi->ops.transmit_ctpio_fallback = @@ -440,8 +506,8 @@ void efswxtch_vi_init(ef_vi *vi) efswxtch_ef_vi_transmitv_ctpio_fallback_not_supp; } - vi->rx_buffer_len = 2048; - vi->rx_prefix_len = 0; + vi->rx_buffer_len = 2048; + vi->rx_prefix_len = 0; vi->evq_phase_bits = 1; /* We set this flag for ef_eventq_has_event */ - vi->nic_type.arch = EF_VI_ARCH_SWXTCH; + vi->nic_type.arch = EF_VI_ARCH_SWXTCH; } diff --git a/src/lib/transport/ip/netif.c b/src/lib/transport/ip/netif.c index 291dc5554..23679bbe6 100644 --- a/src/lib/transport/ip/netif.c +++ b/src/lib/transport/ip/netif.c @@ -37,10 +37,10 @@ char* CI_NETIF_PTR(ci_netif* ni, oo_p off) ci_inline void ci_netif_timeout_set_timer(ci_netif* ni, ci_iptime_t prev_time) { ci_iptime_t time = 0; /* shut up gcc */ - int i, found = 0; + int i, found = 0; for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { - ci_tcp_state* ts; + ci_tcp_state* ts; struct oo_p_dllink_state timeout_q = oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); @@ -51,7 +51,7 @@ ci_inline void ci_netif_timeout_set_timer(ci_netif* ni, ci_iptime_t prev_time) return; if( ! found || TIME_LT(ts->t_last_sent, time) ) { found = 1; - time = ts->t_last_sent; + time = ts->t_last_sent; } } /* We can be called both from timer handler (when the timer is not @@ -69,7 +69,7 @@ ci_inline void ci_netif_timeout_set_timer(ci_netif* ni, ci_iptime_t prev_time) /*! add a state to the timeout list */ ci_inline void ci_netif_timeout_add(ci_netif* ni, ci_tcp_state* ts, int idx) { - int is_first; + int is_first; struct oo_p_dllink_state my_list = oo_p_dllink_ptr(ni, &ni->state->timeout_q[idx]); struct oo_p_dllink_state other_list = @@ -102,7 +102,7 @@ ci_inline void ci_netif_timeout_add(ci_netif* ni, ci_tcp_state* ts, int idx) /*! remove a state from the timeout list */ void ci_netif_timeout_remove(ci_netif* ni, ci_tcp_state* ts) { - int is_first, idx; + int is_first, idx; struct oo_p_dllink_state link = oo_p_dllink_sb(ni, &ts->s.b, &ts->timeout_q_link); @@ -200,7 +200,7 @@ void ci_netif_timeout_state(ci_netif* ni) /* check last active state of each connection in TIME_WAIT */ for( i = 0; i < OO_TIMEOUT_Q_MAX; i++ ) { - ci_tcp_state* ts; + ci_tcp_state* ts; struct oo_p_dllink_state list = oo_p_dllink_ptr(ni, &ni->state->timeout_q[i]); @@ -372,7 +372,7 @@ void ci_netif_fin_timeout_enter(ci_netif* ni, ci_tcp_state* ts) static int ci_netif_try_to_reap_udp_recv_q( ci_netif* ni, ci_udp_recv_q* recv_q, int* add_to_reap_list) { - int freed_n; + int freed_n; ci_uint32 reaped_b4 = recv_q->pkts_reaped; ci_udp_recv_q_reap(ni, recv_q); freed_n = recv_q->pkts_reaped - reaped_b4; @@ -389,11 +389,11 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) struct oo_p_dllink_state reap_list = oo_p_dllink_ptr(ni, &ni->state->reap_list); struct oo_p_dllink_state lnk, tmp; - oo_p lnk_to_stop = OO_P_NULL; - citp_waitable_obj* wo; - int freed_n = 0; - int add_to_reap_list; - int reap_harder = + oo_p lnk_to_stop = OO_P_NULL; + citp_waitable_obj* wo; + int freed_n = 0; + int add_to_reap_list; + int reap_harder = ni->packets->sets_n == ni->packets->sets_max || ni->state->mem_pressure; if( oo_p_dllink_is_empty(ni, reap_list) ) @@ -417,8 +417,8 @@ void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) wo = CI_CONTAINER(citp_waitable_obj, sock.reap_link, lnk.l); if( wo->waitable.state & CI_TCP_STATE_TCP_CONN ) { - ci_tcp_state* ts = &wo->tcp; - ci_int32 q_num_b4 = ts->recv1.num; + ci_tcp_state* ts = &wo->tcp; + ci_int32 q_num_b4 = ts->recv1.num; ci_tcp_rx_reap_rxq_bufs(ni, ts); freed_n += q_num_b4 - ts->recv1.num; @@ -528,7 +528,7 @@ void ci_netif_rxq_low_on_recv(ci_netif* ni, ci_sock_cmn* s, int bytes_freed) void ci_netif_mem_pressure_pkt_pool_fill(ci_netif* ni) { ci_ip_pkt_fmt* pkt; - int intf_i, n = 0; + int intf_i, n = 0; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) n += (2 * CI_CFG_RX_DESC_BATCH); while( ni->state->mem_pressure_pkt_pool_n < n && @@ -536,8 +536,8 @@ void ci_netif_mem_pressure_pkt_pool_fill(ci_netif* ni) pkt->flags |= CI_PKT_FLAG_RX; ++ni->state->n_rx_pkts; ++ni->state->mem_pressure_pkt_pool_n; - pkt->refcount = 0; - pkt->next = ni->state->mem_pressure_pkt_pool; + pkt->refcount = 0; + pkt->next = ni->state->mem_pressure_pkt_pool; ni->state->mem_pressure_pkt_pool = OO_PKT_P(pkt); } } @@ -591,7 +591,7 @@ int ci_netif_mem_pressure_try_exit(ci_netif* ni) * * Returns true if we do exit critical memory pressure. */ - int intf_i, pkts_needed = 0; + int intf_i, pkts_needed = 0; ci_ip_pkt_fmt* pkt; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) @@ -641,8 +641,8 @@ static int __ci_netif_rx_post( ci_netif* ni, ef_vi* vi, int intf_i, int bufset_id, int max) { ci_ip_pkt_fmt* pkt; - int i; - int posted = 0; + int i; + int posted = 0; oo_pktbuf_set* bufset = &ni->packets->set[bufset_id]; ci_assert_ge(max, CI_CFG_RX_DESC_BATCH); @@ -657,10 +657,10 @@ static int __ci_netif_rx_post( ci_assert(OO_PP_NOT_NULL(bufset->free)); pkt = PKT(ni, bufset->free); ci_assert(OO_PP_EQ(bufset->free, OO_PKT_P(pkt))); - bufset->free = pkt->next; + bufset->free = pkt->next; pkt->refcount = 1; pkt->flags |= CI_PKT_FLAG_RX; - pkt->intf_i = intf_i; + pkt->intf_i = intf_i; pkt->pkt_start_off = ef_vi_receive_prefix_len(vi); ci_netif_poison_rx_pkt(pkt); ef_vi_receive_init( @@ -713,9 +713,9 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) ** reduce resource consumption for apps that have few sockets. */ ci_ip_pkt_fmt* pkt; - int max_n_to_post, rx_allowed, n_to_post, n_posted = 0; - int bufset_id = NI_PKT_SET(netif); - int ask_for_more_packets = 0; + int max_n_to_post, rx_allowed, n_to_post, n_posted = 0; + int bufset_id = NI_PKT_SET(netif); + int ask_for_more_packets = 0; if( vi->nic_type.arch == EF_VI_ARCH_EFCT ) return 0; @@ -724,7 +724,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) ci_assert(ci_netif_rx_vi_space(netif, vi) >= CI_CFG_RX_DESC_BATCH); max_n_to_post = ci_netif_rx_vi_space(netif, vi); - rx_allowed = NI_OPTS(netif).max_rx_packets - netif->state->n_rx_pkts; + rx_allowed = NI_OPTS(netif).max_rx_packets - netif->state->n_rx_pkts; if( max_n_to_post > rx_allowed ) goto rx_limited; not_rx_limited: @@ -739,7 +739,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) do { int n; n_to_post = CI_MIN(max_n_to_post, netif->packets->set[bufset_id].n_free); - n = __ci_netif_rx_post(netif, vi, intf_i, bufset_id, n_to_post); + n = __ci_netif_rx_post(netif, vi, intf_i, bufset_id, n_to_post); max_n_to_post -= n; n_posted += n; ci_assert_ge(max_n_to_post, 0); @@ -790,7 +790,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) * buffers for exactly this purpose, so make sure we can use them * here. */ - rx_allowed = CI_CFG_RX_DESC_BATCH; + rx_allowed = CI_CFG_RX_DESC_BATCH; max_n_to_post = ci_netif_rx_vi_space(netif, vi); } #endif @@ -838,7 +838,7 @@ int ci_netif_rx_post(ci_netif* netif, int intf_i, ef_vi* vi) CITP_STATS_NETIF_INC(netif, reap_buf_limited); ci_netif_try_to_reap(netif, max_n_to_post); max_n_to_post = CI_MIN(max_n_to_post, netif->packets->n_free); - bufset_id = ci_netif_pktset_best(netif); + bufset_id = ci_netif_pktset_best(netif); if( bufset_id != -1 && netif->packets->set[bufset_id].n_free >= CI_CFG_RX_DESC_BATCH ) goto good_bufset; @@ -944,7 +944,7 @@ int ci_netif_lock_or_defer_work(ci_netif* ni, citp_waitable* w) } } else { w->next_id = v & CI_EPLOCK_NETIF_SOCKET_LIST; - new_v = (v & ~CI_EPLOCK_NETIF_SOCKET_LIST) | (W_ID(w) + 1); + new_v = (v & ~CI_EPLOCK_NETIF_SOCKET_LIST) | (W_ID(w) + 1); if( ci_cas64u_succeed(&ni->state->lock.lock, v, new_v) ) { ++ni->state->defer_work_count; return 0; @@ -958,15 +958,15 @@ static void ci_netif_perform_deferred_socket_work( ci_netif* ni, unsigned sock_id) { citp_waitable* w; - oo_sp sockp; + oo_sp sockp; ci_assert(ci_netif_is_locked(ni)); do { ci_assert(sock_id > 0); --sock_id; - sockp = OO_SP_FROM_INT(ni, sock_id); - w = SP_TO_WAITABLE(ni, sockp); + sockp = OO_SP_FROM_INT(ni, sock_id); + w = SP_TO_WAITABLE(ni, sockp); sock_id = w->next_id; ci_bit_clear(&w->sb_aflags, CI_SB_AFLAG_DEFERRED_BIT); CITP_STATS_NETIF(++ni->state->stats.deferred_work); @@ -1131,9 +1131,9 @@ ci_uint64 ci_netif_unlock_slow_common( struct oo_p_dllink_state post_poll_list = oo_p_dllink_ptr(ni, &ni->state->post_poll_list); struct oo_p_dllink_state lnk, tmp_lnk; - citp_waitable* w; - struct oo_wakeup_eps op; - oo_sp eps[64]; + citp_waitable* w; + struct oo_wakeup_eps op; + oo_sp eps[64]; op.eps_num = 0; CI_USER_PTR_SET(op.eps, eps); @@ -1142,7 +1142,7 @@ ci_uint64 ci_netif_unlock_slow_common( { oo_p_dllink_del_init(ni, lnk); - w = CI_CONTAINER(citp_waitable, post_poll_link, lnk.l); + w = CI_CONTAINER(citp_waitable, post_poll_link, lnk.l); eps[op.eps_num++] = w->bufid; /* Todo: we'd better allocate larger eps and wake up all @@ -1353,7 +1353,7 @@ static inline void ci_netif_put_ready_list_one( { while( ! oo_p_dllink_is_empty(ni, list) ) { struct oo_p_dllink_state lnk = oo_p_dllink_statep(ni, list.l->next); - ci_sb_epoll_state* epoll = + ci_sb_epoll_state* epoll = CI_CONTAINER(ci_sb_epoll_state, e[id].ready_link, lnk.l); oo_p_dllink_del(ni, lnk); @@ -1417,8 +1417,8 @@ int ci_netif_raw_send( ci_netif* ni, int intf_i, const ci_iovec* iov, int iovlen) { ci_ip_pkt_fmt* pkt; - ci_uint8* p; - int i; + ci_uint8* p; + int i; ci_netif_lock(ni); pkt = ci_netif_pkt_alloc(ni, 0); @@ -1430,8 +1430,8 @@ int ci_netif_raw_send( return -ENETDOWN; pkt->pkt_start_off = 0; - pkt->buf_len = 0; - p = pkt->dma_start; + pkt->buf_len = 0; + p = pkt->dma_start; for( i = 0; i < iovlen; i++ ) { if( p + CI_IOVEC_LEN(iov) - (ci_uint8*) pkt > CI_CFG_PKT_BUF_SIZE ) { ci_netif_pkt_release(ni, pkt); @@ -1569,8 +1569,8 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif* ni, ci_addr_t laddr, struct { ci_ip6_addr_t raddr; ci_ip6_addr_t laddr; - ci_uint16 rport_be16; - ci_uint16 lport_be16; + ci_uint16 rport_be16; + ci_uint16 lport_be16; } __attribute__((packed)) data; int data_size = sizeof(data); memcpy(data.raddr, raddr.ip6, sizeof(ci_ip6_addr_t)); @@ -1592,7 +1592,7 @@ static ci_uint32 __ci_netif_active_wild_hash(ci_netif* ni, ci_addr_t laddr, ci_uint16 rport_be16; ci_uint16 lport_be16; } __attribute__((packed)) data = { raddr.ip4, laddr.ip4, rport, lport }; - int data_size = sizeof(data); + int data_size = sizeof(data); #ifndef __KERNEL__ /* N.B.: Only the lower byte is guaranteed to be accurate here, but this @@ -1640,7 +1640,7 @@ struct oo_p_dllink_state ci_netif_get_active_wild_list( { struct oo_p_dllink* table = ci_netif_active_wild_pool_table(ni, aw_pool); struct oo_p_dllink_state list; - ci_uint32 bucket, hash1, hash2; + ci_uint32 bucket, hash1, hash2; ci_assert(ci_netif_is_locked(ni)); @@ -1650,7 +1650,7 @@ struct oo_p_dllink_state ci_netif_get_active_wild_list( list.p = OO_P_NULL; do { - ci_active_wild* aw; + ci_active_wild* aw; struct oo_p_dllink_state link; list = oo_p_dllink_ptr(ni, &table[bucket]); @@ -1665,7 +1665,7 @@ struct oo_p_dllink_state ci_netif_get_active_wild_list( /* The list is non-empty, so look at one of the active wilds contained in * it in order to determine and check the local address. */ link = oo_p_dllink_statep(ni, list.l->next); - aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); + aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); if( CI_IPX_ADDR_EQ(sock_ipx_laddr(&aw->s), laddr) ) return list; @@ -1764,11 +1764,11 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, ci_uint32* prev_seq_out) { ci_active_wild* aw; - ci_uint16 lport; - ci_addr_t laddr_aw = + ci_uint16 lport; + ci_addr_t laddr_aw = NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; - int af_space = AF_SPACE_FLAG_IP4; - oo_sp sp; + int af_space = AF_SPACE_FLAG_IP4; + oo_sp sp; struct oo_p_dllink_state list; struct oo_p_dllink_state link, tmp; struct oo_p_dllink_state last; @@ -1784,7 +1784,7 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, *prev_seq_out = 0; - list = ci_netif_get_active_wild_list(ni, aw_pool, laddr_aw); + list = ci_netif_get_active_wild_list(ni, aw_pool, laddr_aw); if( list.p == OO_P_NULL ) return OO_SP_NULL; @@ -1802,7 +1802,7 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, oo_p_dllink_del(ni, link); oo_p_dllink_add_tail(ni, list, link); - aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); + aw = CI_CONTAINER(ci_active_wild, pool_link, link.l); lport = sock_lport_be16(&aw->s); @@ -1818,7 +1818,7 @@ static oo_sp __ci_netif_active_wild_pool_get(ci_netif* ni, int aw_pool, if( OO_SP_NOT_NULL(sp) ) { ci_sock_cmn* s = ID_TO_SOCK(ni, sp); if( s->b.state == CI_TCP_TIME_WAIT ) { - ci_uint32 seq; + ci_uint32 seq; /* This 4-tuple is in use as TIME_WAIT, but it is safe to re-use * TIME_WAIT for active open. We ensure we use an initial sequence * number that is a long way from the one used by the old socket. @@ -1882,8 +1882,8 @@ static oo_sp __ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, ci_addr_t raddr, unsigned rport, ci_uint16* port_out, ci_uint32* prev_seq_out) { - int aw_pool; - int offset; + int aw_pool; + int offset; oo_sp aw = OO_SP_NULL; ci_assert(ci_netif_is_locked(ni)); @@ -1919,7 +1919,7 @@ oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, ci_addr_t raddr, /* If we failed to get an active wild try and grow the pool */ while( active_wild == OO_SP_NULL && ni->state->active_wild_n < NI_OPTS(ni).tcp_shared_local_ports_max ) { - int rc; + int rc; ci_addr_t laddr_aw = NI_OPTS(ni).tcp_shared_local_ports_per_ip ? laddr : addr_any; LOG_TC(ci_log( @@ -1963,7 +1963,7 @@ oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, ci_addr_t raddr, */ void ci_netif_active_wild_sharer_closed(ci_netif* ni, ci_sock_cmn* s) { - oo_sp id; + oo_sp id; ci_active_wild* aw; id = ci_netif_filter_lookup(ni, sock_af_space(s), sock_ipx_laddr(s), @@ -1972,7 +1972,7 @@ void ci_netif_active_wild_sharer_closed(ci_netif* ni, ci_sock_cmn* s) if( OO_SP_NOT_NULL(id) ) { aw = SP_TO_ACTIVE_WILD(ni, id); ci_assert(aw->s.b.state == CI_TCP_STATE_ACTIVE_WILD); - aw->expiry = ci_ip_time_now(ni) + NI_CONF(ni).tconst_2msl_time; + aw->expiry = ci_ip_time_now(ni) + NI_CONF(ni).tconst_2msl_time; aw->last_laddr = sock_ipx_laddr(s); aw->last_raddr = sock_ipx_raddr(s); aw->last_rport = sock_rport_be16(s); @@ -1994,7 +1994,7 @@ void oo_tcpdump_free_pkts(ci_netif* ni, ci_uint16 i) do { oo_pkt_p id = ni->state->dump_queue[i % CI_CFG_DUMPQUEUE_LEN]; if( id != OO_PP_NULL ) { - ci_ip_pkt_fmt* pkt = PKT_CHK(ni, id); + ci_ip_pkt_fmt* pkt = PKT_CHK(ni, id); ni->state->dump_queue[i % CI_CFG_DUMPQUEUE_LEN] = OO_PP_NULL; ci_wmb(); ci_netif_pkt_release(ni, pkt); @@ -2008,7 +2008,7 @@ void oo_tcpdump_free_pkts(ci_netif* ni, ci_uint16 i) static void sw_update_cb(void* arg, void* data) { - ci_netif* ni = arg; + ci_netif* ni = arg; struct oo_sw_filter_op* op = data; ci_assert(ci_netif_is_locked(ni)); @@ -2038,8 +2038,8 @@ void ci_netif_handle_actions(ci_netif* ni) static void close_cb(void* arg, void* data) { - ci_netif* ni = arg; - oo_sp* id_p = data; + ci_netif* ni = arg; + oo_sp* id_p = data; ci_assert(ci_netif_is_locked(ni)); ci_assert(IS_VALID_SOCK_P(ni, *id_p)); diff --git a/src/lib/transport/ip/netif_event.c b/src/lib/transport/ip/netif_event.c index f5cb70763..3a7ae977d 100644 --- a/src/lib/transport/ip/netif_event.c +++ b/src/lib/transport/ip/netif_event.c @@ -46,8 +46,8 @@ #ifndef __KERNEL__ enum { FUTURE_DROP = 0x01, - FUTURE_IP4 = 0x02, - FUTURE_TCP = 0x04, /* else UDP */ + FUTURE_IP4 = 0x02, + FUTURE_TCP = 0x04, /* else UDP */ FUTURE_NONE = 0, FUTURE_UDP4 = FUTURE_IP4, @@ -73,14 +73,14 @@ struct oo_rx_state { /* Without RX Merge: A running total of bytes received for this packet * With RX Merge: The full length of this packet */ - int frag_bytes; + int frag_bytes; }; static int ci_ip_csum_correct(ci_ip4_hdr* ip, int max_ip_len) { unsigned csum; - int ip_len; + int ip_len; if( max_ip_len < CI_IP4_IHL(ip) ) return 0; @@ -96,10 +96,10 @@ static int ci_ip_csum_correct(ci_ip4_hdr* ip, int max_ip_len) static int ci_tcp_csum_correct(ci_ip_pkt_fmt* pkt, int ip_paylen) { - int af = oo_pkt_af(pkt); - ci_ipx_hdr_t* ipx = oo_ipx_hdr(pkt); - ci_tcp_hdr* tcp = ipx_hdr_data(af, ipx); - int tcp_hlen = CI_TCP_HDR_LEN(tcp); + int af = oo_pkt_af(pkt); + ci_ipx_hdr_t* ipx = oo_ipx_hdr(pkt); + ci_tcp_hdr* tcp = ipx_hdr_data(af, ipx); + int tcp_hlen = CI_TCP_HDR_LEN(tcp); if( tcp_hlen < sizeof(ci_tcp_hdr) ) return 0; @@ -121,17 +121,17 @@ static void ci_parse_rx_vlan(ci_ip_pkt_fmt* pkt) p_ether_type = &(oo_ether_hdr(pkt)->ether_type); if( *p_ether_type != CI_ETHERTYPE_8021Q ) { pkt->pkt_eth_payload_off = pkt->pkt_start_off + ETH_HLEN; - pkt->vlan = 0; + pkt->vlan = 0; } else { pkt->pkt_eth_payload_off = pkt->pkt_start_off + ETH_HLEN + ETH_VLAN_HLEN; - pkt->vlan = CI_BSWAP_BE16(p_ether_type[1]) & 0xfff; + pkt->vlan = CI_BSWAP_BE16(p_ether_type[1]) & 0xfff; } } int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size) { - int error = 0; + int error = 0; char* options = (char*) ip + sizeof(ci_ip4_hdr); char* opt_end = (char*) ip + hdr_size; @@ -186,16 +186,16 @@ int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size) static void record_rx_timestamp(ci_netif* netif, ci_netif_state_nic_t* nsn, ci_ip_pkt_fmt* pkt, ef_timespec stamp, unsigned sync_flags) { - int tsf = (NI_OPTS(netif).timestamping_reporting & + int tsf = (NI_OPTS(netif).timestamping_reporting & CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) - ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC - : EF_VI_SYNC_FLAG_CLOCK_SET; - pkt->hw_stamp.tv_sec = stamp.tv_sec; + ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC + : EF_VI_SYNC_FLAG_CLOCK_SET; + pkt->hw_stamp.tv_sec = stamp.tv_sec; pkt->hw_stamp.tv_nsec = stamp.tv_nsec = (stamp.tv_nsec & ~CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC) | ((sync_flags & tsf) ? CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC : 0); nsn->last_rx_timestamp = pkt->hw_stamp; - nsn->last_sync_flags = sync_flags; + nsn->last_sync_flags = sync_flags; LOG_NR(log(LPF "RX id=%d timestamp: %lu.%09lu sync %d", OO_PKT_FMT(pkt), (long) stamp.tv_sec, stamp.tv_nsec, sync_flags)); @@ -205,14 +205,14 @@ static void get_rx_timestamp(ci_netif* netif, ci_ip_pkt_fmt* pkt) { #if CI_CFG_TIMESTAMPING ci_netif_state_nic_t* nsn = &netif->state->nic[pkt->intf_i]; - ef_vi* vi = ci_netif_vi(netif, pkt->intf_i); + ef_vi* vi = ci_netif_vi(netif, pkt->intf_i); if( (vi->nic_type.arch != EF_VI_ARCH_EFCT) && (nsn->oo_vi_flags & OO_VI_FLAGS_RX_HW_TS_EN) ) { - unsigned sync_flags; + unsigned sync_flags; ef_timespec stamp; - int rc = ef_vi_receive_get_timestamp_with_sync_flags( - vi, PKT_START(pkt) - nsn->rx_prefix_len, &stamp, &sync_flags); + int rc = ef_vi_receive_get_timestamp_with_sync_flags( + vi, PKT_START(pkt) - nsn->rx_prefix_len, &stamp, &sync_flags); if( rc == 0 ) record_rx_timestamp(netif, nsn, pkt, stamp, sync_flags); @@ -261,7 +261,7 @@ static void handle_rx_pkt( * length of the whole frame. Each scatter fragment has its [buf] field * initialised with the delivered frame payload. */ - int not_fast, ip_paylen, hdr_size; + int not_fast, ip_paylen, hdr_size; ci_uint16 ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); @@ -276,7 +276,7 @@ static void handle_rx_pkt( /* Is this an IP packet? */ if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP) ) { - int ip_tot_len; + int ip_tot_len; ci_ip4_hdr* ip = oo_ip_hdr(pkt); #if CI_CFG_IPV6 pkt->flags &= ~CI_PKT_FLAG_IS_IP6; @@ -324,7 +324,7 @@ static void handle_rx_pkt( if( CI_LIKELY(not_fast == 0) ) { char* payload = (char*) ip + hdr_size; - ip_paylen = ip_tot_len - hdr_size; + ip_paylen = ip_tot_len - hdr_size; /* This will go negative if the ip_tot_len was too small even ** for the IP header. The ULP is expected to notice... */ @@ -386,7 +386,7 @@ static void handle_rx_pkt( #if CI_CFG_IPV6 else if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP6) ) { ci_ip6_hdr* ip6_hdr = oo_ip6_hdr(pkt); - void* payload = ip6_hdr + 1; + void* payload = ip6_hdr + 1; LOG_NR(log( LPF "RX id=%d ip6_proto=0x%x", OO_PKT_FMT(pkt), ip6_hdr->next_hdr)); @@ -468,13 +468,13 @@ static ci_ip_pkt_fmt* alloc_rx_efct_pkt(ci_netif* ni, int intf_i, int pay_len) if( CI_UNLIKELY(! pkt) ) return NULL; pkt->pkt_start_off = 0; - pkt->intf_i = intf_i; + pkt->intf_i = intf_i; pkt->flags |= CI_PKT_FLAG_RX; ci_assert_equal(pkt->rx_flags, 0); ci_assert_flags(ni->state->nic[intf_i].oo_vi_flags, OO_VI_FLAGS_RX_SHARED); pkt->rx_flags = CI_PKT_RX_FLAG_RX_SHARED; pkt->refcount = 1; - pkt->pay_len = pay_len; + pkt->pay_len = pay_len; ++ni->state->n_rx_pkts; return pkt; } @@ -486,7 +486,7 @@ static void get_efct_timestamp( ci_netif_state_nic_t* nsn = &netif->state->nic[pkt->intf_i]; if( nsn->oo_vi_flags & OO_VI_FLAGS_RX_HW_TS_EN ) { - unsigned sync_flags; + unsigned sync_flags; ef_timespec stamp; int rc = efct_vi_rxpkt_get_timestamp(vi, pkt_id, &stamp, &sync_flags); @@ -536,11 +536,11 @@ static unsigned convert_discard_flags_efct_ef10(unsigned flags) static int convert_efct_to_pkts( ci_netif* ni, int intf_i, ef_event* evs, int n_evs) { - int i; + int i; ef_vi* evq = ci_netif_vi(ni, intf_i); for( i = 0; i < n_evs; ++i ) { - ef_event new_ev; + ef_event new_ev; ci_ip_pkt_fmt* pkt; if( EF_EVENT_TYPE(evs[i]) == EF_EVENT_TYPE_RX_REF ) { @@ -566,12 +566,12 @@ static int convert_efct_to_pkts( copy_efct_to_pkt(ni, evq, evs[i].rx_ref.pkt_id, pkt); efct_vi_rxpkt_release(evq, evs[i].rx_ref.pkt_id); - new_ev.rx.q_id = evs[i].rx_ref.q_id; + new_ev.rx.q_id = evs[i].rx_ref.q_id; new_ev.rx.rq_id = OO_PKT_ID(pkt); - new_ev.rx.len = evs[i].rx_ref.len; + new_ev.rx.len = evs[i].rx_ref.len; new_ev.rx.flags = EF_EVENT_FLAG_SOP; - new_ev.rx.ofs = 0; - evs[i] = new_ev; + new_ev.rx.ofs = 0; + evs[i] = new_ev; } return n_evs; } @@ -580,7 +580,7 @@ static int convert_efct_to_pkts( int ci_netif_evq_poll(ci_netif* ni, int intf_i) { ef_vi* evq = ci_netif_vi(ni, intf_i); - int n_evs; + int n_evs; size_t evs_per_poll = ef_vi_flags(evq) & EF_VI_RX_EVENT_MERGE ? NI_OPTS(ni).evs_per_poll / 4 : NI_OPTS(ni).evs_per_poll; @@ -624,13 +624,13 @@ int ci_netif_evq_poll(ci_netif* ni, int intf_i) { struct ef_vi_rvq_rx_iter ri; - uint32_t id; - size_t len = 0; /* placate compiler */ + uint32_t id; + size_t len = 0; /* placate compiler */ ef_vi_evq_rx_iter_set(&ri, evq, ev, n_evs); while( (id = ef_vi_evq_rx_iter_next(&ri, &id, &len)) != 0 ) { - oo_pkt_p pp; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; OO_PP_INIT(ni, pp, id); @@ -733,7 +733,7 @@ ci_inline int handle_rx_pre_future( * [pkt->frag_next] and [pkt->pay_len] may be invalid. */ ci_uint16 ether_type; - int valid_bytes = CI_CACHE_LINE_SIZE - pkt->pkt_start_off; + int valid_bytes = CI_CACHE_LINE_SIZE - pkt->pkt_start_off; #if CI_CFG_RANDOM_DROP && ! defined(__KERNEL__) if( CI_UNLIKELY(rand() < NI_OPTS(ni).rx_drop_rate) ) { @@ -747,16 +747,16 @@ ci_inline int handle_rx_pre_future( ci_parse_rx_vlan(pkt); ci_assert_le(pkt->pkt_eth_payload_off, valid_bytes); - ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); + ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); pkt->tstamp_frc = IPTIMER_STATE(ni)->frc; if( ether_type == CI_ETHERTYPE_IP ) { - ci_ip4_hdr* ip = oo_ip_hdr(pkt); - int hdr_size = CI_IP4_IHL(ip); - int ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - int ip_paylen = ip_tot_len - hdr_size; - int ip_payload_offset = pkt->pkt_eth_payload_off + hdr_size; - void* payload = (char*) ip + hdr_size; + ci_ip4_hdr* ip = oo_ip_hdr(pkt); + int hdr_size = CI_IP4_IHL(ip); + int ip_tot_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); + int ip_paylen = ip_tot_len - hdr_size; + int ip_payload_offset = pkt->pkt_eth_payload_off + hdr_size; + void* payload = (char*) ip + hdr_size; if( ip_payload_offset > valid_bytes || (hdr_size > sizeof(ci_ip4_hdr) && @@ -830,7 +830,7 @@ ci_inline void handle_rx_post_future(ci_netif* ni, ci_assert_nequal(status, FUTURE_NONE); if( CI_LIKELY(status & FUTURE_IP4) ) { - int ip_tot_len; + int ip_tot_len; ci_ip4_hdr* ip = oo_ip_hdr(pkt); LOG_NR(log(LPF "RX id=%d ip_proto=0x%x", OO_PKT_FMT(pkt), @@ -857,9 +857,9 @@ ci_inline void handle_rx_post_future(ci_netif* ni, ** transport's responsibility to check these as necessary. */ if( CI_LIKELY(ip_tot_len <= pkt->pay_len - oo_pre_l3_len(pkt)) ) { - int hdr_size = CI_IP4_IHL(ip); - void* payload = (char*) ip + hdr_size; - int len = ip_tot_len - hdr_size; + int hdr_size = CI_IP4_IHL(ip); + void* payload = (char*) ip + hdr_size; + int len = ip_tot_len - hdr_size; /* This will go negative if the ip_tot_len was too small even ** for the IP header. The ULP is expected to notice... */ @@ -917,17 +917,17 @@ static void handle_rx_scatter_last_frag( pkt->n_buffers = 1; while( 1 ) { /* reverse the chain of fragments */ - next_p = s->frag_pkt->frag_next; + next_p = s->frag_pkt->frag_next; s->frag_pkt->frag_next = OO_PKT_P(pkt); s->frag_pkt->n_buffers = pkt->n_buffers + 1; if( OO_PP_IS_NULL(next_p) ) break; - pkt = s->frag_pkt; + pkt = s->frag_pkt; s->frag_pkt = PKT(ni, next_p); } - s->rx_pkt = s->frag_pkt; + s->rx_pkt = s->frag_pkt; s->rx_pkt->pay_len = s->frag_bytes; - s->frag_pkt = NULL; + s->frag_pkt = NULL; ASSERT_VALID_PKT(ni, s->rx_pkt); } @@ -949,7 +949,7 @@ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, ci_assert_le( frame_bytes, (int) (CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))); - s->frag_pkt = pkt; + s->frag_pkt = pkt; pkt->buf_len = s->frag_bytes = frame_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), s->frag_bytes); } else { @@ -963,7 +963,7 @@ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, if( flags & EF_EVENT_FLAG_CONT ) { /* Middle fragment. */ pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; + s->frag_pkt = pkt; } else { /* Last fragment. */ handle_rx_scatter_last_frag(ni, s, pkt); @@ -982,7 +982,7 @@ static void handle_rx_scatter(ci_netif* ni, struct oo_rx_state* s, static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, ci_ip_pkt_fmt* pkt, int prefix_bytes, ef_vi* vi, unsigned flags) { - int full_buffer = ef_vi_receive_buffer_len(vi); + int full_buffer = ef_vi_receive_buffer_len(vi); uint16_t pkt_bytes; s->rx_pkt = NULL; @@ -996,7 +996,7 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, /* The packet prefix is present in the first buffer */ pkt->buf_len = full_buffer - prefix_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->buf_len); - s->frag_pkt = pkt; + s->frag_pkt = pkt; s->frag_bytes = pkt_bytes; } else { ci_assert(s->frag_pkt != NULL); @@ -1010,7 +1010,7 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, CI_DEBUG(pkt->pay_len = -1); pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; + s->frag_pkt = pkt; } else { /* Last fragment. */ /* The first buffer contains a prefix, but all intervening buffers are @@ -1029,8 +1029,8 @@ static void handle_rx_scatter_merge(ci_netif* ni, struct oo_rx_state* s, static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt, int frame_len) { - int ip_paylen; - int ip_proto; + int ip_paylen; + int ip_proto; ci_uint16 ether_type; /* Packet reached onload -- so must be IP and must at least reach the TCP @@ -1050,10 +1050,10 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, ether_type = *((ci_uint16*) oo_l3_hdr(pkt) - 1); if( CI_LIKELY(ether_type == CI_ETHERTYPE_IP) ) { - ci_ip4_hdr* ip = oo_ip_hdr(pkt); - int ip_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); - ip_paylen = ip_len - CI_IP4_IHL(ip); - ip_proto = ip->ip_protocol; + ci_ip4_hdr* ip = oo_ip_hdr(pkt); + int ip_len = CI_BSWAP_BE16(ip->ip_tot_len_be16); + ip_paylen = ip_len - CI_IP4_IHL(ip); + ip_proto = ip->ip_protocol; #if CI_CFG_IPV6 pkt->flags &= ~CI_PKT_FLAG_IS_IP6; #endif @@ -1074,8 +1074,8 @@ static int handle_rx_csum_bad(ci_netif* ni, struct ci_netif_poll_state* ps, #if CI_CFG_IPV6 else if( ether_type == CI_ETHERTYPE_IP6 ) { ci_ip6_hdr* ip = oo_ip6_hdr(pkt); - ip_paylen = CI_BSWAP_BE16(ip->payload_len); - ip_proto = ip->next_hdr; + ip_paylen = CI_BSWAP_BE16(ip->payload_len); + ip_proto = ip->next_hdr; pkt->flags |= CI_PKT_FLAG_IS_IP6; if( ip_paylen <= 0 || @@ -1185,8 +1185,8 @@ static void discard_rx_multi_pkts(ci_netif* ni, struct ci_netif_poll_state* ps, static ci_ip_pkt_fmt* rx_multi_get_next_desc( ci_netif* ni, ef_vi* vi, int intf_i) { - ef_request_id di; - oo_pkt_p pp; + ef_request_id di; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; di = ef_vi_rxq_next_desc_id(vi); @@ -1201,10 +1201,10 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, int prefix_bytes, ef_vi* vi, int intf_i, struct ci_netif_poll_state* ps, int q_id) { - int full_buffer = ef_vi_receive_buffer_len(vi); - uint16_t pkt_bytes, total_bytes, cur_bytes; + int full_buffer = ef_vi_receive_buffer_len(vi); + uint16_t pkt_bytes, total_bytes, cur_bytes; ci_ip_pkt_fmt* pkt; - unsigned discard_flags; + unsigned discard_flags; pkt = rx_multi_get_next_desc(ni, vi, intf_i); @@ -1215,7 +1215,7 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, pkt->q_id = q_id; { uint32_t mark; - uint8_t flag; + uint8_t flag; ef_vi_receive_get_user_data(vi, pkt->dma_start, &mark, &flag); pkt->pf.tcp_rx.lo.rx_sock = mark; /* Asserting this solely so that a more efficient assignment can be done. @@ -1253,25 +1253,25 @@ static void handle_rx_multi_pkts(ci_netif* ni, struct oo_rx_state* s, /* The packet prefix is present in the first buffer */ pkt->buf_len = full_buffer - prefix_bytes; oo_offbuf_init(&pkt->buf, PKT_START(pkt), pkt->buf_len); - s->frag_pkt = pkt; + s->frag_pkt = pkt; s->frag_bytes = pkt_bytes; - cur_bytes = full_buffer; + cur_bytes = full_buffer; while( total_bytes - cur_bytes > full_buffer ) { /* - Middle fragments - */ - pkt = rx_multi_get_next_desc(ni, vi, intf_i); + pkt = rx_multi_get_next_desc(ni, vi, intf_i); /* Middle fragments are completely filled, and don't contain a prefix */ pkt->buf_len = full_buffer; oo_offbuf_init(&pkt->buf, pkt->dma_start, pkt->buf_len); CI_DEBUG(pkt->pay_len = -1); pkt->frag_next = OO_PKT_P(s->frag_pkt); - s->frag_pkt = pkt; + s->frag_pkt = pkt; cur_bytes += full_buffer; } /* - Last fragment - */ - pkt = rx_multi_get_next_desc(ni, vi, intf_i); + pkt = rx_multi_get_next_desc(ni, vi, intf_i); /* The first buffer contains a prefix, but all intervening buffers are * are filled, so this contains whatever's leftover. */ @@ -1311,9 +1311,9 @@ static void __handle_rx_discard(ci_netif* ni, struct ci_netif_poll_state* ps, int intf_i, struct oo_rx_state* s, ef_event ev, int frame_len, int discard_type, oo_pkt_p pp) { - int is_frag; + int is_frag; ci_ip_pkt_fmt* pkt; - int handled = 0; + int handled = 0; LOG_U(log(LPF "[%d] intf %d RX_DISCARD %d " EF_EVENT_FMT, NI_ID(ni), intf_i, (int) discard_type, EF_EVENT_PRI_ARG(ev))); @@ -1398,9 +1398,9 @@ static void handle_rx_multi_discard(ci_netif* ni, struct ci_netif_poll_state* ps, int intf_i, struct oo_rx_state* s, ef_event ev, ef_request_id id, ef_vi* vi) { - int discard_type = EF_EVENT_RX_MULTI_DISCARD_TYPE(ev); - uint16_t frame_len; - oo_pkt_p pp; + int discard_type = EF_EVENT_RX_MULTI_DISCARD_TYPE(ev); + uint16_t frame_len; + oo_pkt_p pp; ci_ip_pkt_fmt* pkt; OO_PP_INIT(ni, pp, id); @@ -1426,7 +1426,7 @@ static void process_post_poll_list(ci_netif* ni) struct oo_p_dllink_state tmp_lnk; struct oo_p_dllink_state post_poll_list = oo_p_dllink_ptr(ni, &ni->state->post_poll_list); - int need_wake = 0; + int need_wake = 0; citp_waitable* sb; #if CI_CFG_EPOLL3 int lists_need_wake = 0; @@ -1551,7 +1551,7 @@ static void ci_netif_tx_pkt_complete_udp( ci_netif* netif, struct ci_netif_poll_state* ps, ci_ip_pkt_fmt* pkt) { ci_udp_state* us; - oo_pkt_p frag_next; + oo_pkt_p frag_next; #ifndef NDEBUG { @@ -1618,11 +1618,11 @@ static void ci_netif_rx_pkt_complete_tcp( * ci_tcp_poll_timestamp_q_nonempty() to have changed. If so, we need to * wake. The above if() is technically lax, but it's a very quick way of * detecting when we can avoid the rest of this code. */ - oo_sp sp = pkt->pf.tcp_tx.sock_id; + oo_sp sp = pkt->pf.tcp_tx.sock_id; citp_waitable_obj* wo = SP_TO_WAITABLE_OBJ(ni, sp); if( wo->waitable.state & CI_TCP_STATE_TCP_CONN ) { - ci_tcp_state* ts = &wo->tcp; - unsigned n_bufs = 0; + ci_tcp_state* ts = &wo->tcp; + unsigned n_bufs = 0; ci_ip_pkt_fmt* pp; /* The socket may have been closed (and even reopened) by the time we @@ -1666,11 +1666,11 @@ ci_inline void __ci_netif_tx_pkt_complete(ci_netif* ni, #if CI_CFG_TIMESTAMPING if( pkt->flags & CI_PKT_FLAG_TX_TIMESTAMPED ) { if( ev != NULL && EF_EVENT_TYPE(*ev) == EF_EVENT_TYPE_TX_WITH_TIMESTAMP ) { - int opt_tsf = ((NI_OPTS(ni).timestamping_reporting) & + int opt_tsf = ((NI_OPTS(ni).timestamping_reporting) & CITP_TIMESTAMPING_RECORDING_FLAG_CHECK_SYNC) - ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC - : EF_VI_SYNC_FLAG_CLOCK_SET; - int pkt_tsf = EF_EVENT_TX_WITH_TIMESTAMP_SYNC_FLAGS(*ev); + ? EF_VI_SYNC_FLAG_CLOCK_IN_SYNC + : EF_VI_SYNC_FLAG_CLOCK_SET; + int pkt_tsf = EF_EVENT_TX_WITH_TIMESTAMP_SYNC_FLAGS(*ev); pkt->hw_stamp.tv_sec = EF_EVENT_TX_WITH_TIMESTAMP_SEC(*ev); pkt->hw_stamp.tv_nsec = @@ -1682,7 +1682,7 @@ ci_inline void __ci_netif_tx_pkt_complete(ci_netif* ni, * to ensure client is notified of missing timestamp - * important to keep TCP timestamps in sync with * TCP stream */ - pkt->hw_stamp.tv_sec = 0; + pkt->hw_stamp.tv_sec = 0; pkt->hw_stamp.tv_nsec = 0; } else { if( CI_NETIF_TX_VI(ni, pkt->intf_i, ev->tx_timestamp.q_id)->vi_flags & @@ -1730,24 +1730,24 @@ static int ci_netif_poll_evq( ci_netif* ni, struct ci_netif_poll_state* ps, int intf_i, int n_evs) { struct oo_rx_state s; - ef_vi* evq = ci_netif_vi(ni, intf_i); - unsigned total_evs = 0; - ci_ip_pkt_fmt* pkt; - ef_event* ev = ni->state->events; - int i; - oo_pkt_p pp; - int completed_tx = 0; + ef_vi* evq = ci_netif_vi(ni, intf_i); + unsigned total_evs = 0; + ci_ip_pkt_fmt* pkt; + ef_event* ev = ni->state->events; + int i; + oo_pkt_p pp; + int completed_tx = 0; #ifdef OO_HAS_POLL_IN_KERNEL int poll_in_kernel; #endif - s.frag_pkt = NULL; + s.frag_pkt = NULL; s.frag_bytes = 0; /*??*/ if( OO_PP_NOT_NULL(ni->state->nic[intf_i].rx_frags) ) { pkt = PKT_CHK(ni, ni->state->nic[intf_i].rx_frags); ni->state->nic[intf_i].rx_frags = OO_PP_NULL; - s.frag_pkt = pkt; - s.frag_bytes = pkt->pay_len; + s.frag_pkt = pkt; + s.frag_bytes = pkt->pay_len; CI_DEBUG(pkt->pay_len = -1); } @@ -1831,8 +1831,8 @@ static int ci_netif_poll_evq( else if( CI_LIKELY(EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_TX) ) { ef_request_id* ids = ni->tx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_TX_VI(ni, intf_i, ev[i].tx.q_id); + int n_ids, j; + ef_vi* vi = CI_NETIF_TX_VI(ni, intf_i, ev[i].tx.q_id); CITP_STATS_NETIF_INC(ni, tx_evs); n_ids = ef_vi_transmit_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); @@ -1848,8 +1848,8 @@ static int ci_netif_poll_evq( else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI ) { ef_request_id* ids = ni->rx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); + int n_ids, j; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); CITP_STATS_NETIF_INC(ni, rx_evs); n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); @@ -1879,9 +1879,9 @@ static int ci_netif_poll_evq( } else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI_PKTS ) { - int j, n_pkts; - int q_id = ev[i].rx_multi_pkts.q_id; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, q_id); + int j, n_pkts; + int q_id = ev[i].rx_multi_pkts.q_id; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, q_id); CITP_STATS_NETIF_INC(ni, rx_evs); n_pkts = ev[i].rx_multi_pkts.n_pkts; for( j = 0; j < n_pkts; ++j ) { @@ -1910,9 +1910,9 @@ static int ci_netif_poll_evq( else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_MULTI_DISCARD ) { ef_request_id* ids = ni->rx_events; - int n_ids, j; - ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); - n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); + int n_ids, j; + ef_vi* vi = CI_NETIF_RX_VI(ni, intf_i, ev[i].rx.q_id); + n_ids = ef_vi_receive_unbundle(vi, &ev[i], ids); ci_assert_ge(n_ids, 0); ci_assert_le(n_ids, sizeof(ni->rx_events) / sizeof(ids[0])); total_evs += n_ids - 1; @@ -1923,7 +1923,7 @@ static int ci_netif_poll_evq( else if( EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_REF_DISCARD ) { int pay_len = ev[i].rx_ref_discard.len; - pkt = alloc_rx_efct_pkt(ni, intf_i, pay_len); + pkt = alloc_rx_efct_pkt(ni, intf_i, pay_len); if( pkt ) { __handle_rx_pkt(ni, ps, &s.rx_pkt); copy_efct_to_pkt(ni, evq, ev[i].rx_ref.pkt_id, pkt); @@ -1958,7 +1958,9 @@ static int ci_netif_poll_evq( } #ifndef NDEBUG - if( CI_NETIF_TX_VI(ni, intf_i, 0)->nic_type.arch != EF_VI_ARCH_AF_XDP ) { + if( ! (CI_NETIF_TX_VI(ni, intf_i, 0)->nic_type.arch == EF_VI_ARCH_AF_XDP || + CI_NETIF_TX_VI(ni, intf_i, 0)->nic_type.arch == + EF_VI_ARCH_SWXTCH) ) { int vi_i; int txq_level = 0; for( vi_i = 0; vi_i < ci_netif_num_vis(ni); ++vi_i ) @@ -1980,7 +1982,7 @@ static int ci_netif_poll_evq( ci_netif_ctpio_resume(ni, intf_i); if( s.frag_pkt != NULL ) { - s.frag_pkt->pay_len = s.frag_bytes; + s.frag_pkt->pay_len = s.frag_bytes; ni->state->nic[intf_i].rx_frags = OO_PKT_P(s.frag_pkt); } @@ -1991,8 +1993,8 @@ static int ci_netif_poll_evq( static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) { struct ci_netif_poll_state ps; - int total_evs = 0; - int rc; + int total_evs = 0; + int rc; #if defined(__KERNEL__) || ! defined(NDEBUG) if( ! ci_netif_may_poll_in_kernel(ni, intf_i) ) @@ -2001,7 +2003,7 @@ static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) ci_assert(ci_netif_is_locked(ni)); ps.tx_pkt_free_list_insert = &ps.tx_pkt_free_list; - ps.tx_pkt_free_list_n = 0; + ps.tx_pkt_free_list_n = 0; do { rc = ci_netif_poll_evq(ni, &ps, intf_i, 0); @@ -2038,15 +2040,15 @@ static int ci_netif_poll_intf(ci_netif* ni, int intf_i, int max_evs) #ifndef __KERNEL__ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) { - int i, rc = 0, status; - bool handle_future = false; - struct oo_rx_future future; - ci_uint64 now_frc, max_spin; - ef_vi* evq = ci_netif_vi(ni, intf_i); - ef_event* ev = ni->state->events; + int i, rc = 0, status; + bool handle_future = false; + struct oo_rx_future future; + ci_uint64 now_frc, max_spin; + ef_vi* evq = ci_netif_vi(ni, intf_i); + ef_event* ev = ni->state->events; struct ci_netif_poll_state ps; - ci_ip_pkt_fmt* pkt; - const uint8_t* dma; + ci_ip_pkt_fmt* pkt; + const uint8_t* dma; int (*future_poll)(ef_vi * vi, ef_event * evs, int evs_len) = evq->ops.eventq_poll; @@ -2103,13 +2105,13 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) CITP_STATS_NETIF_INC(ni, rx_evs); ps.tx_pkt_free_list_insert = &ps.tx_pkt_free_list; - ps.tx_pkt_free_list_n = 0; + ps.tx_pkt_free_list_n = 0; /* We expect the completion event within a microsecond or so. The timeout * of 100us is to avoid wedging the stack in the case of hardware * failure/removal or a bug which prevents us getting the event. */ - max_spin = IPTIMER_STATE(ni)->khz / 10000; + max_spin = IPTIMER_STATE(ni)->khz / 10000; ci_prefetch(pkt->dma_start + CI_CACHE_LINE_SIZE); while( (rc = future_poll(evq, ev, EF_VI_EVENT_POLL_MIN_EVS)) == 0 ) { ci_frc64(&now_frc); @@ -2124,14 +2126,15 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) * platforms, there seems to be a small advantage to prefetching a couple * more at this point, ahead of copying the packet data. */ - for( i = 2; i < 5; ++i ) ci_prefetch(dma + i * CI_CACHE_LINE_SIZE); + for( i = 2; i < 5; ++i ) + ci_prefetch(dma + i * CI_CACHE_LINE_SIZE); ++ni->state->in_poll; if( EF_EVENT_TYPE(ev[0]) == EF_EVENT_TYPE_RX ) { ci_assert_equal(OO_PP_ID(OO_PKT_P(pkt)), EF_EVENT_RX_RQ_ID(ev[0])); if( (ev[0].rx.flags & (EF_EVENT_FLAG_SOP | EF_EVENT_FLAG_CONT)) == EF_EVENT_FLAG_SOP ) { - pkt->pay_len = EF_EVENT_RX_BYTES(ev[0]) - evq->rx_prefix_len; + pkt->pay_len = EF_EVENT_RX_BYTES(ev[0]) - evq->rx_prefix_len; handle_future = true; } } else if( EF_EVENT_TYPE(ev[0]) == EF_EVENT_TYPE_RX_REF ) { @@ -2160,7 +2163,8 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) * handle the rest normally. Add one to the returned count to include * the one handled here. */ - for( i = 1; i < rc; ++i ) ev[i - 1] = ev[i]; + for( i = 1; i < rc; ++i ) + ev[i - 1] = ev[i]; rc = 1 + ci_netif_poll_evq(ni, &ps, intf_i, rc - 1); } } else { @@ -2191,9 +2195,9 @@ int ci_netif_poll_intf_future(ci_netif* ni, int intf_i, ci_uint64 start_frc) void ci_netif_loopback_pkts_send(ci_netif* ni) { ci_ip_pkt_fmt* pkt; - oo_pkt_p send_list = OO_PP_ID_NULL; - ci_ipx_hdr_t* ip; - int af; + oo_pkt_p send_list = OO_PP_ID_NULL; + ci_ipx_hdr_t* ip; + int af; #ifdef __KERNEL__ int i = 0; #endif @@ -2210,14 +2214,14 @@ void ci_netif_loopback_pkts_send(ci_netif* ni) return; } #endif - pkt = PKT_CHK(ni, ni->state->looppkts); + pkt = PKT_CHK(ni, ni->state->looppkts); ni->state->looppkts = pkt->next; - pkt->next = send_list; - send_list = OO_PKT_ID(pkt); + pkt->next = send_list; + send_list = OO_PKT_ID(pkt); } while( OO_PP_NOT_NULL(send_list) ) { - pkt = PKT_CHK(ni, send_list); + pkt = PKT_CHK(ni, send_list); send_list = pkt->next; ni->state->n_looppkts--; diff --git a/src/lib/transport/ip/netif_init.c b/src/lib/transport/ip/netif_init.c index 9fd122142..4b2a57249 100644 --- a/src/lib/transport/ip/netif_init.c +++ b/src/lib/transport/ip/netif_init.c @@ -51,11 +51,11 @@ const char* oo_uk_intf_ver = OO_UK_INTF_VER; void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) { - ci_netif_state_nic_t* nn; - ci_netif_state* nis = ni->state; + ci_netif_state_nic_t* nn; + ci_netif_state* nis = ni->state; struct oo_p_dllink_state list; - int nic_i; - int i; + int nic_i; + int i; nis->opts = ni->opts; @@ -87,7 +87,7 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) assert_zero(nis->mem_pressure); nis->mem_pressure_pkt_pool = OO_PP_NULL; assert_zero(nis->mem_pressure_pkt_pool_n); - nis->looppkts = OO_PP_NULL; + nis->looppkts = OO_PP_NULL; nis->n_looppkts = 0; /* Pool of packet buffers for transmit. */ @@ -95,7 +95,7 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) nis->nonb_pkt_pool = CI_ILL_END; /* Deferred packets */ - list = oo_p_dllink_ptr(ni, &nis->deferred_list); + list = oo_p_dllink_ptr(ni, &nis->deferred_list); oo_p_dllink_init(ni, list); list = oo_p_dllink_ptr(ni, &nis->deferred_list_free); oo_p_dllink_init(ni, list); @@ -140,8 +140,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) oo_p_dllink_init(ni, oo_p_dllink_ptr(ni, &nis->reap_list)); - nis->free_eps_head = OO_SP_NULL; - nis->free_eps_num = 0; + nis->free_eps_head = OO_SP_NULL; + nis->free_eps_num = 0; nis->deferred_free_eps_head = CI_ILL_END; assert_zero(nis->n_ep_bufs); nis->max_ep_bufs = NI_OPTS(ni).max_ep_bufs; @@ -150,8 +150,8 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) ni->packets->sets_max = ni->pkt_sets_max; /* Fragmented packet re-assembly list */ - nis->rx_defrag_head = OO_PP_NULL; - nis->rx_defrag_tail = OO_PP_NULL; + nis->rx_defrag_head = OO_PP_NULL; + nis->rx_defrag_tail = OO_PP_NULL; assert_zero(nis->send_may_poll); @@ -173,14 +173,14 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) ci_ip_timer_state_init(ni, cpu_khz); nis->last_spin_poll_frc = IPTIMER_STATE(ni)->frc; - nis->last_sleep_frc = IPTIMER_STATE(ni)->frc; + nis->last_sleep_frc = IPTIMER_STATE(ni)->frc; oo_timesync_update(efab_tcp_driver.timesync); assert_zero(nis->defer_work_count); #if CI_CFG_TCPDUMP - nis->dump_read_i = 0; + nis->dump_read_i = 0; nis->dump_write_i = 0; memset(nis->dump_intf, 0, sizeof(nis->dump_intf)); #endif @@ -224,10 +224,10 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) assert_zero(ni->seq_table[i].route_count); nis->packet_alloc_numa_nodes = 0; - nis->sock_alloc_numa_nodes = 0; - nis->interrupt_numa_nodes = 0; - nis->creation_numa_node = numa_node_id(); - nis->load_numa_node = efab_tcp_driver.load_numa_node; + nis->sock_alloc_numa_nodes = 0; + nis->interrupt_numa_nodes = 0; + nis->creation_numa_node = numa_node_id(); + nis->load_numa_node = efab_tcp_driver.load_numa_node; #if CI_CFG_FD_CACHING list = oo_p_dllink_ptr(ni, &nis->active_cache.cache); @@ -262,21 +262,21 @@ void ci_netif_state_init(ci_netif* ni, int cpu_khz, const char* name) #endif -static int citp_ipstack_params_inited = 0; -static ci_uint32 citp_tcp_sndbuf_min = CI_CFG_TCP_SNDBUF_MIN; -static ci_uint32 citp_tcp_sndbuf_def = CI_CFG_TCP_SNDBUF_DEFAULT; -static ci_uint32 citp_tcp_sndbuf_max = CI_CFG_TCP_SNDBUF_MAX; -static ci_uint32 citp_tcp_rcvbuf_min = CI_CFG_TCP_RCVBUF_MIN; -static ci_uint32 citp_tcp_rcvbuf_def = CI_CFG_TCP_RCVBUF_DEFAULT; -static ci_uint32 citp_tcp_rcvbuf_max = CI_CFG_TCP_RCVBUF_MAX; -static ci_uint32 citp_udp_sndbuf_max = CI_CFG_UDP_SNDBUF_MAX; -static ci_uint32 citp_udp_sndbuf_def = CI_CFG_UDP_SNDBUF_DEFAULT; -static ci_uint32 citp_udp_rcvbuf_max = CI_CFG_UDP_RCVBUF_MAX; -static ci_uint32 citp_udp_rcvbuf_def = CI_CFG_UDP_RCVBUF_DEFAULT; -static ci_uint32 citp_tcp_backlog_max = CI_TCP_LISTENQ_MAX; +static int citp_ipstack_params_inited = 0; +static ci_uint32 citp_tcp_sndbuf_min = CI_CFG_TCP_SNDBUF_MIN; +static ci_uint32 citp_tcp_sndbuf_def = CI_CFG_TCP_SNDBUF_DEFAULT; +static ci_uint32 citp_tcp_sndbuf_max = CI_CFG_TCP_SNDBUF_MAX; +static ci_uint32 citp_tcp_rcvbuf_min = CI_CFG_TCP_RCVBUF_MIN; +static ci_uint32 citp_tcp_rcvbuf_def = CI_CFG_TCP_RCVBUF_DEFAULT; +static ci_uint32 citp_tcp_rcvbuf_max = CI_CFG_TCP_RCVBUF_MAX; +static ci_uint32 citp_udp_sndbuf_max = CI_CFG_UDP_SNDBUF_MAX; +static ci_uint32 citp_udp_sndbuf_def = CI_CFG_UDP_SNDBUF_DEFAULT; +static ci_uint32 citp_udp_rcvbuf_max = CI_CFG_UDP_RCVBUF_MAX; +static ci_uint32 citp_udp_rcvbuf_def = CI_CFG_UDP_RCVBUF_DEFAULT; +static ci_uint32 citp_tcp_backlog_max = CI_TCP_LISTENQ_MAX; static ci_uint32 citp_tcp_adv_win_scale_max = CI_TCP_WSCL_MAX; -static ci_uint32 citp_fin_timeout = CI_CFG_TCP_FIN_TIMEOUT; -static ci_uint32 citp_retransmit_threshold = CI_TCP_RETRANSMIT_THRESHOLD; +static ci_uint32 citp_fin_timeout = CI_CFG_TCP_FIN_TIMEOUT; +static ci_uint32 citp_retransmit_threshold = CI_TCP_RETRANSMIT_THRESHOLD; static ci_uint32 citp_retransmit_threshold_orphan = CI_TCP_RETRANSMIT_THRESHOLD_ORPHAN; static ci_uint32 citp_retransmit_threshold_syn = @@ -284,13 +284,13 @@ static ci_uint32 citp_retransmit_threshold_syn = static ci_uint32 citp_retransmit_threshold_synack = CI_TCP_RETRANSMIT_THRESHOLD_SYN; static ci_uint32 citp_keepalive_probes = CI_TCP_KEEPALIVE_PROBES; -static ci_uint32 citp_keepalive_time = CI_TCP_TCONST_KEEPALIVE_TIME; -static ci_uint32 citp_keepalive_intvl = CI_TCP_TCONST_KEEPALIVE_INTVL; -static ci_uint32 citp_syn_opts = CI_TCPT_SYN_FLAGS; -static ci_uint32 citp_tcp_dsack = CI_CFG_TCP_DSACK; +static ci_uint32 citp_keepalive_time = CI_TCP_TCONST_KEEPALIVE_TIME; +static ci_uint32 citp_keepalive_intvl = CI_TCP_TCONST_KEEPALIVE_INTVL; +static ci_uint32 citp_syn_opts = CI_TCPT_SYN_FLAGS; +static ci_uint32 citp_tcp_dsack = CI_CFG_TCP_DSACK; static ci_uint32 citp_tcp_time_wait_assassinate = CI_CFG_TIME_WAIT_ASSASSINATE; -static ci_uint32 citp_tcp_early_retransmit = 3; /* default as of 3.10 */ -static ci_uint32 citp_challenge_ack_limit = CI_CFG_CHALLENGE_ACK_LIMIT; +static ci_uint32 citp_tcp_early_retransmit = 3; /* default as of 3.10 */ +static ci_uint32 citp_challenge_ack_limit = CI_CFG_CHALLENGE_ACK_LIMIT; static ci_uint32 citp_tcp_invalid_ratelimit = CI_CFG_TCP_OUT_OF_WINDOW_ACK_RATELIMIT; @@ -302,12 +302,12 @@ static ci_uint32 citp_auto_flowlabels = CI_AUTO_FLOWLABELS_DEFAULT; /* Interface for sysctl. */ ci_inline int ci_sysctl_get_values(char* path, ci_uint32* ret, int n) { - char name[CI_CFG_PROC_PATH_LEN_MAX + strlen(CI_CFG_PROC_PATH)]; - char buf[CI_CFG_PROC_LINE_LEN_MAX]; - int buflen; + char name[CI_CFG_PROC_PATH_LEN_MAX + strlen(CI_CFG_PROC_PATH)]; + char buf[CI_CFG_PROC_LINE_LEN_MAX]; + int buflen; char* p = buf; - int fd; - int i = 0; + int fd; + int i = 0; strcpy(name, CI_CFG_PROC_PATH); strncpy(name + strlen(CI_CFG_PROC_PATH), path, CI_CFG_PROC_PATH_LEN_MAX); @@ -491,42 +491,42 @@ void ci_netif_config_opts_defaults(ci_netif_config_opts* opts) /* now modify defaults with information from the operating system */ ci_setup_ipstack_params(); if( citp_ipstack_params_inited ) { - opts->tcp_sndbuf_min = citp_tcp_sndbuf_min; - opts->tcp_sndbuf_def = citp_tcp_sndbuf_def; - opts->tcp_sndbuf_max = citp_tcp_sndbuf_max; - opts->tcp_rcvbuf_min = citp_tcp_rcvbuf_min; - opts->tcp_rcvbuf_def = citp_tcp_rcvbuf_def; - opts->tcp_rcvbuf_max = citp_tcp_rcvbuf_max; - - opts->udp_sndbuf_max = citp_udp_sndbuf_max; - opts->udp_sndbuf_def = citp_udp_sndbuf_def; - opts->udp_rcvbuf_max = citp_udp_rcvbuf_max; - opts->udp_rcvbuf_def = citp_udp_rcvbuf_def; + opts->tcp_sndbuf_min = citp_tcp_sndbuf_min; + opts->tcp_sndbuf_def = citp_tcp_sndbuf_def; + opts->tcp_sndbuf_max = citp_tcp_sndbuf_max; + opts->tcp_rcvbuf_min = citp_tcp_rcvbuf_min; + opts->tcp_rcvbuf_def = citp_tcp_rcvbuf_def; + opts->tcp_rcvbuf_max = citp_tcp_rcvbuf_max; + + opts->udp_sndbuf_max = citp_udp_sndbuf_max; + opts->udp_sndbuf_def = citp_udp_sndbuf_def; + opts->udp_rcvbuf_max = citp_udp_rcvbuf_max; + opts->udp_rcvbuf_def = citp_udp_rcvbuf_def; opts->tcp_backlog_max = citp_tcp_backlog_max; opts->tcp_synrecv_max = citp_tcp_backlog_max * CI_CFG_ASSUME_LISTEN_SOCKS; - opts->tcp_adv_win_scale_max = citp_tcp_adv_win_scale_max; - opts->fin_timeout = citp_fin_timeout; + opts->tcp_adv_win_scale_max = citp_tcp_adv_win_scale_max; + opts->fin_timeout = citp_fin_timeout; - opts->retransmit_threshold = citp_retransmit_threshold; + opts->retransmit_threshold = citp_retransmit_threshold; opts->retransmit_threshold_orphan = citp_retransmit_threshold_orphan; - opts->retransmit_threshold_syn = citp_retransmit_threshold_syn; + opts->retransmit_threshold_syn = citp_retransmit_threshold_syn; opts->retransmit_threshold_synack = citp_retransmit_threshold_synack; - opts->keepalive_probes = citp_keepalive_probes; - opts->keepalive_time = citp_keepalive_time; - opts->keepalive_intvl = citp_keepalive_intvl; + opts->keepalive_probes = citp_keepalive_probes; + opts->keepalive_time = citp_keepalive_time; + opts->keepalive_intvl = citp_keepalive_intvl; - opts->syn_opts = citp_syn_opts; - opts->use_dsack = citp_tcp_dsack; - opts->time_wait_assassinate = citp_tcp_time_wait_assassinate; + opts->syn_opts = citp_syn_opts; + opts->use_dsack = citp_tcp_dsack; + opts->time_wait_assassinate = citp_tcp_time_wait_assassinate; /* Early retransmit itself has gone from modern kernels, so look in an * old kernel's ip-sysctl.txt for the meaning of these values. */ opts->tcp_early_retransmit = citp_tcp_early_retransmit > 0 && citp_tcp_early_retransmit < 4; - opts->tail_drop_probe = citp_tcp_early_retransmit >= 3; + opts->tail_drop_probe = citp_tcp_early_retransmit >= 3; opts->challenge_ack_limit = citp_challenge_ack_limit; - opts->oow_ack_ratelimit = citp_tcp_invalid_ratelimit; + opts->oow_ack_ratelimit = citp_tcp_invalid_ratelimit; #if CI_CFG_IPV6 opts->auto_flowlabels = citp_auto_flowlabels; #endif @@ -538,10 +538,10 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) { ci_uint64 MIN; ci_uint64 MAX; - ci_int64 SMIN; - ci_int64 SMAX; - int _optbits; - int _bitwidth; + ci_int64 SMIN; + ci_int64 SMAX; + int _optbits; + int _bitwidth; /* stop compiler complaining if these values are not used */ (void) MIN; @@ -576,32 +576,32 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) #define CI_CFG_STR_OPT(...) -#define CI_CFG_OPT( \ - env, name, type, doc, bits, group, default, minimum, maximum, pres) \ - { \ - type _val = opts->name; \ - type _max; \ - type _min; \ - _optbits = sizeof(type) * 8; \ - _bitwidth = _CI_CFG_BITVAL##bits; \ - MIN = 0; \ - MAX = ((1ull << (_bitwidth - 1)) << 1) - 1ull; \ - SMAX = MAX >> 1; \ - SMIN = -SMAX - 1; \ - _max = (type) (maximum); /* try to stop the compiler warning */ \ - _min = (type) (minimum); /* about silly comparisons */ \ - if( _val > _max ) { \ - ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ - ") larger than maximum " #maximum " (%" CI_PRIu64 ")", \ - (ci_uint64) _val, (ci_uint64) _max); \ - CI_CFG_REDRESS(opts->name, _max); \ - } \ - if( _val < _min ) { \ - ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ - ") smaller than minimum " #minimum, \ - (ci_uint64) _val); \ - CI_CFG_REDRESS(opts->name, _min); \ - } \ +#define CI_CFG_OPT( \ + env, name, type, doc, bits, group, default, minimum, maximum, pres) \ + { \ + type _val = opts->name; \ + type _max; \ + type _min; \ + _optbits = sizeof(type) * 8; \ + _bitwidth = _CI_CFG_BITVAL##bits; \ + MIN = 0; \ + MAX = ((1ull << (_bitwidth - 1)) << 1) - 1ull; \ + SMAX = MAX >> 1; \ + SMIN = -SMAX - 1; \ + _max = (type) (maximum); /* try to stop the compiler warning */ \ + _min = (type) (minimum); /* about silly comparisons */ \ + if( _val > _max ) { \ + ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ + ") larger than maximum " #maximum " (%" CI_PRIu64 ")", \ + (ci_uint64) _val, (ci_uint64) _max); \ + CI_CFG_REDRESS(opts->name, _max); \ + } \ + if( _val < _min ) { \ + ci_log("config: " CI_CFG_MSG " - option " #name " (%" CI_PRIu64 \ + ") smaller than minimum " #minimum, \ + (ci_uint64) _val); \ + CI_CFG_REDRESS(opts->name, _min); \ + } \ } #include @@ -609,7 +609,7 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) /* EF_MAX_ENDPOINTS should must be divisible by 2048 */ if( opts->max_ep_bufs % EP_BUF_PER_CHUNK != 0 ) { unsigned new_max = opts->max_ep_bufs; - new_max = CI_ROUND_UP(new_max, EP_BUF_PER_CHUNK); + new_max = CI_ROUND_UP(new_max, EP_BUF_PER_CHUNK); ci_log("config: EF_MAX_ENDPOINTS is rounded up from %u to %u", opts->max_ep_bufs, new_max); opts->max_ep_bufs = new_max; @@ -620,7 +620,7 @@ void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) #ifndef __KERNEL__ struct string_to_bitmask { - int stb_index; + int stb_index; const char* const stb_str; }; @@ -702,7 +702,7 @@ static int parse_enum(ci_netif_config_opts* opts, const char* name, const char* const* options, const char* default_val); -void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) +void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) { const char* s; @@ -718,7 +718,7 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->spin_usec = atoi(s); if( opts->spin_usec != 0 ) { /* Don't buzz for too long by default! */ - opts->buzz_usec = CI_MIN(opts->spin_usec, 100); + opts->buzz_usec = CI_MIN(opts->spin_usec, 100); /* Disable EF_INT_DRIVEN by default when spinning. */ opts->int_driven = 0; /* These are only here to expose defaults through stackdump. FIXME: @@ -1168,8 +1168,8 @@ void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) opts->rx_timestamping = atoi(s); static const char* const timestamping_opts[] = { "nic", "cpacket", 0 }; - opts->rx_timestamping_ordering = parse_enum( - opts, "EF_RX_TIMESTAMPING_ORDERING", timestamping_opts, "nic"); + opts->rx_timestamping_ordering = parse_enum( + opts, "EF_RX_TIMESTAMPING_ORDERING", timestamping_opts, "nic"); if( (s = getenv("EF_TX_TIMESTAMPING")) ) opts->tx_timestamping = atoi(s); @@ -1328,7 +1328,7 @@ static int parse_enum(ci_netif_config_opts* opts, const char* name, const char* const* options, const char* default_val) { const char* value; - int i; + int i; if( (value = getenv(name)) == NULL ) value = default_val; @@ -1363,14 +1363,14 @@ static const char* strmchrnul(const char* s, const char* delims) static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, const char** spec_in_out, int* mode_out, ci_int32* ifindex_out) { - char ifname[IFNAMSIZ] = {}; - const char* s = *spec_in_out; + char ifname[IFNAMSIZ] = {}; + const char* s = *spec_in_out; const char* modestr; - ci_int32 ifindex = 0; - int mode = -1; - int rc = 0; + ci_int32 ifindex = 0; + int mode = -1; + int rc = 0; - modestr = strmchrnul(s, "=,"); + modestr = strmchrnul(s, "=,"); strncpy(ifname, s, CI_MIN(modestr - s, sizeof(ifname) - 1)); ifindex = if_nametoindex(ifname); @@ -1391,10 +1391,10 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, /* If the mode is set explicitly then parse that */ if( modestr && modestr != strmchrnul(modestr, ",") ) { int mode_value = CITP_SCALABLE_MODE_NONE; - int mode_set = 0; + int mode_set = 0; struct { const char* name; - int mode; + int mode; } modes[] = { { "transparent_active", CITP_SCALABLE_MODE_TPROXY_ACTIVE }, { "passive", CITP_SCALABLE_MODE_PASSIVE }, @@ -1403,8 +1403,8 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, }; while( modestr != strmchrnul(modestr, ",") ) { const char* mode_end = strmchrnul(modestr, ":,"); - int len = mode_end - modestr; - int i; + int len = mode_end - modestr; + int i; for( i = 0; i < sizeof(modes) / sizeof(*modes); ++i ) if( strncmp(modes[i].name, modestr, len) == 0 && modes[i].name[len] == 0 ) { @@ -1418,9 +1418,9 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, "EF_SCALABLE_FILTERS, token '%s', disabling scalable " "filter mode", modestr); - mode = CITP_SCALABLE_MODE_NONE; + mode = CITP_SCALABLE_MODE_NONE; mode_set = 0; - rc = -EINVAL; + rc = -EINVAL; break; } modestr = mode_end; @@ -1439,7 +1439,7 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, CITP_SCALABLE_MODE_ACTIVE | CITP_SCALABLE_MODE_PASSIVE | CITP_SCALABLE_MODE_RSS }; int n_modes = sizeof(modes_supported) / sizeof(*modes_supported); - int fail = 1; + int fail = 1; int i; mode = mode_value; @@ -1455,7 +1455,7 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, "config: Unsupported scalable " "mode selected, disabling scalable filter mode."); mode = CITP_SCALABLE_MODE_NONE; - rc = -EINVAL; + rc = -EINVAL; } } } @@ -1465,14 +1465,14 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, "from name '%s', disabling scalable filter mode.", ifname); mode = CITP_SCALABLE_MODE_NONE; - rc = -EINVAL; + rc = -EINVAL; } if( modestr && *modestr ) ++modestr; *spec_in_out = modestr; - *mode_out = mode; + *mode_out = mode; *ifindex_out = ifindex; return rc; } @@ -1481,21 +1481,21 @@ static int ci_opts_parse_scalable_filters_nic(ci_netif_config_opts* opts, #define swap(x, y) \ ({ \ typeof(x) t = (x); \ - (x) = (y); \ - (y) = (t); \ + (x) = (y); \ + (y) = (t); \ }) static void ci_netif_config_opts_getenv_ef_scalable_filters( ci_netif_config_opts* opts) { const char* s; - int enable = 0; - int mode = CITP_SCALABLE_MODE_NONE; - int listen_mode = CITP_SCALABLE_LISTEN_BOUND; + int enable = 0; + int mode = CITP_SCALABLE_MODE_NONE; + int listen_mode = CITP_SCALABLE_LISTEN_BOUND; #if CI_CFG_TCP_SHARED_LOCAL_PORTS int active_wilds_need_filter = 1; #endif - int rc = 0; + int rc = 0; ci_int32 ifindexes[2] = {}; /* Nothing is interesting unless EF_SCALABLE_FILTERS is set */ @@ -1639,10 +1639,10 @@ static void ci_netif_config_opts_getenv_ef_scalable_filters( "ignored as no valid config for EF_SCALABLE_FILTERS found."); } opts->scalable_filter_ifindex_passive = ifindexes[1]; - opts->scalable_filter_ifindex_active = ifindexes[0]; - opts->scalable_filter_enable = enable; - opts->scalable_filter_mode = mode; - opts->scalable_listen = listen_mode; + opts->scalable_filter_ifindex_active = ifindexes[0]; + opts->scalable_filter_enable = enable; + opts->scalable_filter_mode = mode; + opts->scalable_listen = listen_mode; #if CI_CFG_TCP_SHARED_LOCAL_PORTS opts->scalable_active_wilds_need_filter = active_wilds_need_filter; #endif @@ -1786,26 +1786,26 @@ static void netif_tcp_helper_munmap(ci_netif* ni) static int netif_tcp_helper_mmap(ci_netif* ni) { ci_netif_state* ns = ni->state; - void* p; - int rc; + void* p; + int rc; /* Initialise all mappings with NULL to roll back in case of error. */ ni->timesync = NULL; - ni->io_ptr = NULL; + ni->io_ptr = NULL; #if CI_CFG_PIO - ni->pio_ptr = NULL; + ni->pio_ptr = NULL; ni->pio_bytes_mapped = 0; #endif #if CI_CFG_CTPIO - ni->ctpio_ptr = NULL; + ni->ctpio_ptr = NULL; ni->ctpio_bytes_mapped = 0; #endif #if CI_CFG_TCP_OFFLOAD_RECYCLER ni->plugin_ptr = NULL; #endif - ni->buf_ptr = NULL; + ni->buf_ptr = NULL; ni->efct_shm_ptr = NULL; - ni->packets = NULL; + ni->packets = NULL; /**************************************************************************** * Create timesync mapping. @@ -1846,7 +1846,7 @@ static int netif_tcp_helper_mmap(ci_netif* ni) LOG_NV(ci_log("%s: oo_resource_mmap pio %d", __FUNCTION__, rc)); goto fail2; } - ni->pio_ptr = (uint8_t*) p; + ni->pio_ptr = (uint8_t*) p; /* Record length actually mapped as the value in the shared state can * change across NIC reboots. */ ni->pio_bytes_mapped = ns->pio_mmap_bytes; @@ -1865,7 +1865,7 @@ static int netif_tcp_helper_mmap(ci_netif* ni) LOG_NV(ci_log("%s: oo_resource_mmap ctpio %d", __FUNCTION__, rc)); goto fail2; } - ni->ctpio_ptr = (uint8_t*) p; + ni->ctpio_ptr = (uint8_t*) p; /* Record length actually mapped as the value in the shared state can * change across NIC reboots. */ ni->ctpio_bytes_mapped = ns->ctpio_mmap_bytes; @@ -1878,7 +1878,7 @@ static int netif_tcp_helper_mmap(ci_netif* ni) */ { bool have_plugin_io = false; - int nic_i; + int nic_i; OO_STACK_FOR_EACH_INTF_I(ni, nic_i) if( ns->nic[nic_i].oo_vi_flags & OO_VI_FLAGS_PLUGIN_IO_EN ) @@ -1936,10 +1936,10 @@ static int netif_tcp_helper_mmap(ci_netif* ni) static int oo_efct_superbuf_config_refresh(ef_vi* vi, int qid) { oo_efct_superbuf_config_refresh_t op; - ef_vi_efct_rxq* rxq = &vi->efct_rxq[qid]; - op.intf_i = rxq->resource_id; - op.qid = qid; - op.max_superbufs = CI_EFCT_MAX_SUPERBUFS; + ef_vi_efct_rxq* rxq = &vi->efct_rxq[qid]; + op.intf_i = rxq->resource_id; + op.qid = qid; + op.max_superbufs = CI_EFCT_MAX_SUPERBUFS; CI_USER_PTR_SET(op.superbufs, rxq->superbuf); CI_USER_PTR_SET(op.current_mappings, rxq->current_mappings); return oo_resource_op(vi->dh, OO_IOC_EFCT_SUPERBUF_CONFIG_REFRESH, &op); @@ -1951,10 +1951,10 @@ static int init_ef_vi(ci_netif* ni, int nic_i, int vi_state_offset, unsigned vi_instance, unsigned abs_idx, int evq_bytes, int txq_size, ef_vi_stats* vi_stats) { - ef_vi_state* state = (void*) ((char*) ni->state + vi_state_offset); - ci_netif_state_nic_t* nsn = &(ni->state->nic[nic_i]); - uint32_t* ids = (void*) (state + 1); - unsigned vi_bar_off = vi_instance * 8192; + ef_vi_state* state = (void*) ((char*) ni->state + vi_state_offset); + ci_netif_state_nic_t* nsn = &(ni->state->nic[nic_i]); + uint32_t* ids = (void*) (state + 1); + unsigned vi_bar_off = vi_instance * 8192; ef_vi_init(vi, ef_vi_arch_from_efhw_arch(nsn->vi_arch), nsn->vi_variant, nsn->vi_revision, nsn->vi_flags, nsn->vi_nic_flags, state); @@ -1962,9 +1962,9 @@ static int init_ef_vi(ci_netif* ni, int nic_i, int vi_state_offset, vi_io_offset += vi_bar_off & (CI_PAGE_SIZE - 1); ef_vi_init_io(vi, ni->io_ptr + vi_io_offset); ef_vi_init_timer(vi, nsn->timer_quantum_ns); - vi->vi_i = vi_instance; + vi->vi_i = vi_instance; vi->abs_idx = abs_idx; - vi->dh = ci_netif_get_driver_handle(ni); + vi->dh = ci_netif_get_driver_handle(ni); *vi_mem_ptr = ef_vi_init_qs(vi, *vi_mem_ptr, ids, evq_bytes / 8, nsn->vi_rxq_size, nsn->rx_prefix_len, txq_size); if( vi->max_efct_rxq ) { @@ -2016,7 +2016,7 @@ static void cleanup_all_vis(ci_netif* ni, unsigned vis_inited) unsigned ci_netif_build_future_intf_mask(ci_netif* ni) { - int nic_i; + int nic_i; unsigned mask = 0; OO_STACK_FOR_EACH_INTF_I(ni, nic_i) @@ -2042,17 +2042,17 @@ unsigned ci_netif_build_future_intf_mask(ci_netif* ni) static int af_xdp_kick(ef_vi* vi) { - ci_netif* ni = vi->xdp_kick_context; - ci_netif_nic_t* nic = CI_CONTAINER(ci_netif_nic_t, vis[0], vi); - uint32_t intf_i = nic - ni->nic_hw; - int fd = ci_netif_get_driver_handle(ni); + ci_netif* ni = vi->xdp_kick_context; + ci_netif_nic_t* nic = CI_CONTAINER(ci_netif_nic_t, vis[0], vi); + uint32_t intf_i = nic - ni->nic_hw; + int fd = ci_netif_get_driver_handle(ni); return oo_resource_op(fd, OO_IOC_AF_XDP_KICK, &intf_i); } static int ci_netif_swxtch_rx_init(ci_netif* ni) { - int nic_i, i, rc, out = 1; + int nic_i, i, rc, out = 1; ef_vi* vi; ci_netif_lock(ni); @@ -2063,7 +2063,7 @@ static int ci_netif_swxtch_rx_init(ci_netif* ni) vi = &ni->nic_hw[nic_i].vis[i]; if( vi->nic_type.arch == EF_VI_ARCH_SWXTCH ) { // reset state - vi->ep_state->rxq.added = 0; + vi->ep_state->rxq.added = 0; vi->ep_state->rxq.removed = 0; if( (rc = ci_netif_rx_post(ni, nic_i, vi)) == 0 ) { LOG_S(ci_log("Unable to initialize swxtch VI with RX Buffers")); @@ -2085,11 +2085,11 @@ static int netif_tcp_helper_build(ci_netif* ni) ** ci_netif_get_driver_handle(ni), ni->tcp_mmap (for user builds only) */ ci_netif_state* ns = ni->state; - int rc, nic_i, size, expected_buf_ofs; - unsigned vi_io_offset, vi_state_offset, vi_efct_shm_offset; - char* vi_mem_ptr; - int vi_state_bytes; - int vis_inited = 0; + int rc, nic_i, size, expected_buf_ofs; + unsigned vi_io_offset, vi_state_offset, vi_efct_shm_offset; + char* vi_mem_ptr; + int vi_state_bytes; + int vis_inited = 0; #if CI_CFG_PIO unsigned pio_io_offset = 0, pio_buf_offset = 0, vi_bar_off; #endif @@ -2115,23 +2115,23 @@ static int netif_tcp_helper_build(ci_netif* ni) ** not, so we keep a count to calculate offsets rather than use ** nic_index. */ - vi_io_offset = 0; - vi_efct_shm_offset = 0; - vi_mem_ptr = ni->buf_ptr; - vi_state_offset = sizeof(*ni->state); + vi_io_offset = 0; + vi_efct_shm_offset = 0; + vi_mem_ptr = ni->buf_ptr; + vi_state_offset = sizeof(*ni->state); ni->future_intf_mask = 0; OO_STACK_FOR_EACH_INTF_I(ni, nic_i) { ci_netif_state_nic_t* nsn = &ns->nic[nic_i]; - ef_vi* vi; - int i; - int num_vis = ci_netif_num_vis(ni); + ef_vi* vi; + int i; + int num_vis = ci_netif_num_vis(ni); /* Get interface properties. */ - rc = oo_cp_get_hwport_properties( - ni->cplane, ns->intf_i_to_hwport[nic_i], NULL, NULL); + rc = oo_cp_get_hwport_properties( + ni->cplane, ns->intf_i_to_hwport[nic_i], NULL, NULL); if( rc < 0 ) goto fail1; @@ -2167,8 +2167,8 @@ static int netif_tcp_helper_build(ci_netif* ni) } vi_state_offset += vi_state_bytes; - vi = ci_netif_vi(ni, nic_i); - vi->xdp_kick = af_xdp_kick; + vi = ci_netif_vi(ni, nic_i); + vi->xdp_kick = af_xdp_kick; vi->xdp_kick_context = ni; ci_assert_equal(vi_state_bytes, ns->vi_state_bytes); @@ -2189,11 +2189,11 @@ static int netif_tcp_helper_build(ci_netif* ni) (uint8_t*) ns + ns->pio_bufs_ofs + pio_buf_offset; pio_buf_offset += nsn->pio_io_len; /* And set up rest of PIO struct so we can call ef_vi_pio_memcpy */ - vi_bar_off = nsn->vi_instance[0] * 8192; + vi_bar_off = nsn->vi_instance[0] * 8192; ni->nic_hw[nic_i].pio.pio_io = ni->pio_ptr + pio_io_offset; ni->nic_hw[nic_i].pio.pio_io += (vi_bar_off + 4096) & (CI_PAGE_SIZE - 1); ni->nic_hw[nic_i].pio.pio_len = nsn->pio_io_len; - vi->linked_pio = &ni->nic_hw[nic_i].pio; + vi->linked_pio = &ni->nic_hw[nic_i].pio; pio_io_offset += nsn->pio_io_mmap_bytes; } #endif @@ -2235,7 +2235,7 @@ static int netif_tcp_helper_build(ci_netif* ni) * the array (if we have had trouble allocating packet buffers), so * we need to be aware of that when checking the sizes are sane */ - size = ns->dma_ofs - ns->buf_ofs - sizeof(oo_pktbuf_manager); + size = ns->dma_ofs - ns->buf_ofs - sizeof(oo_pktbuf_manager); expected_buf_ofs = sizeof(ci_netif_state); expected_buf_ofs = CI_ROUND_UP(expected_buf_ofs, __alignof__(ef_vi_state)); @@ -2280,7 +2280,7 @@ static int netif_tcp_helper_build(ci_netif* ni) goto fail3; } { - int i; + int i; struct ci_extra_ep ref = { CI_FD_BAD }; for( i = 0; i < ni->state->max_ep_bufs; ++i ) ni->eps[i] = ref; @@ -2316,7 +2316,7 @@ static int netif_tcp_helper_build(ci_netif* ni) static int netif_tcp_helper_restore(ci_netif* ni, unsigned netif_mmap_bytes) { void* p; - int rc; + int rc; rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, CI_NETIF_MMAP_ID_STATE, netif_mmap_bytes, OO_MMAP_FLAG_DEFAULT, &p); @@ -2324,10 +2324,10 @@ static int netif_tcp_helper_restore(ci_netif* ni, unsigned netif_mmap_bytes) LOG_NV(ci_log("netif_tcp_helper_restore: oo_resource_mmap %d", rc)); return rc; } - ni->state = (ci_netif_state*) p; + ni->state = (ci_netif_state*) p; ni->mmap_bytes = netif_mmap_bytes; - rc = netif_tcp_helper_build(ni); + rc = netif_tcp_helper_build(ni); if( rc < 0 ) { ci_log("%s: netif_tcp_helper_build %d", __FUNCTION__, rc); oo_resource_munmap( @@ -2338,7 +2338,7 @@ static int netif_tcp_helper_restore(ci_netif* ni, unsigned netif_mmap_bytes) return rc; } -static void ci_netif_deinit(ci_netif* ni); +static void ci_netif_deinit(ci_netif* ni); ci_inline void netif_tcp_helper_free(ci_netif* ni) @@ -2367,7 +2367,7 @@ static void init_resource_alloc(ci_resource_onload_alloc_t* ra, strncpy(ra->in_version, onload_short_version, sizeof(ra->in_version)); strncpy(ra->in_uk_intf_ver, OO_UK_INTF_VER, sizeof(ra->in_uk_intf_ver)); if( flags & CI_NETIF_FLAG_DO_ALLOCATE_SCALABLE_FILTERS_RSS ) { - ra->in_cluster_size = CITP_OPTS.cluster_size; + ra->in_cluster_size = CITP_OPTS.cluster_size; ra->in_cluster_restart = CITP_OPTS.cluster_restart_opt; strncpy(ra->in_name, CITP_OPTS.cluster_name, CI_CFG_STACK_NAME_LEN); } else if( name != NULL ) @@ -2392,9 +2392,9 @@ static int netif_tcp_helper_alloc_u(ef_driver_handle fd, ci_netif* ni, const ci_netif_config_opts* opts, unsigned flags, const char* stack_name) { ci_resource_onload_alloc_t ra; - int rc; - ci_netif_state* ns; - void* p; + int rc; + ci_netif_state* ns; + void* p; /**************************************************************************** * Allocate the TCP Helper resource. @@ -2563,13 +2563,13 @@ static void ci_netif_sanity_checks(void) static int ci_netif_pkt_reserve(ci_netif* ni, int n, oo_pkt_p* p_pkt_list) { ci_ip_pkt_fmt* pkt; - int i; + int i; for( i = 0; i < n; ++i ) { if( (pkt = ci_netif_pkt_alloc(ni, 0)) == NULL ) break; *p_pkt_list = OO_PKT_P(pkt); - p_pkt_list = &pkt->next; + p_pkt_list = &pkt->next; } *p_pkt_list = OO_PP_NULL; return i; @@ -2581,7 +2581,7 @@ static void ci_netif_pkt_reserve_free(ci_netif* ni, oo_pkt_p pkt_list, int n) ci_ip_pkt_fmt* pkt; while( OO_PP_NOT_NULL(pkt_list) ) { CI_DEBUG(--n); - pkt = PKT_CHK(ni, pkt_list); + pkt = PKT_CHK(ni, pkt_list); pkt_list = pkt->next; ci_netif_pkt_release(ni, pkt); } @@ -2595,18 +2595,18 @@ static void ci_netif_pkt_reserve_free(ci_netif* ni, oo_pkt_p pkt_list, int n) void ci_netif_send_plugin_app_ctrl(ci_netif* ni, int nic_index, ci_ip_pkt_fmt* pkt, const void* payload, size_t paylen) { - pkt->intf_i = nic_index; - pkt->q_id = CI_Q_ID_TCP_APP; - pkt->pay_len = ETH_HLEN + paylen; + pkt->intf_i = nic_index; + pkt->q_id = CI_Q_ID_TCP_APP; + pkt->pay_len = ETH_HLEN + paylen; /* Fake values to ensure this doesn't look like IPv4 or IPv6, both to * various bits of Onload and to the NIC */ - pkt->pkt_start_off = 0; + pkt->pkt_start_off = 0; pkt->pkt_eth_payload_off = 0; - pkt->pkt_outer_l3_off = 0; + pkt->pkt_outer_l3_off = 0; memset(pkt->dma_start, 0, ETH_HLEN); pkt->n_buffers = 1; - pkt->buf_len = ETH_HLEN + paylen; + pkt->buf_len = ETH_HLEN + paylen; memcpy(pkt->dma_start + ETH_HLEN, payload, paylen); ci_netif_send(ni, pkt); } @@ -2650,8 +2650,8 @@ static int ci_netif_pkt_prefault(ci_netif* ni) * optimisations. */ ci_ip_pkt_fmt* pkt; - int i, n; - int rc = 0; + int i, n; + int rc = 0; if( NI_OPTS(ni).prefault_packets ) { n = ni->packets->n_pkts_allocated; @@ -2667,15 +2667,15 @@ static int ci_netif_pkt_prefault(ci_netif* ni) static void ci_netif_pkt_prefault_reserve(ci_netif* ni) { oo_pkt_p pkt_list; - int n; - int actual_max_packets = ni->packets->sets_max * PKTS_PER_SET; + int n; + int actual_max_packets = ni->packets->sets_max * PKTS_PER_SET; /* The maximum number of packet buffers we can have is subject to rounding * due to packet set size. Conservative approach is to use max of this and * configured EF_MAX_PACKETS - ensures we will always max out the buffers * when EF_PREFAULT_PACKETS is bigger than both. */ - int target_allocated = CI_MIN(NI_OPTS(ni).prefault_packets, - CI_MAX(NI_OPTS(ni).max_packets, actual_max_packets)); + int target_allocated = CI_MIN(NI_OPTS(ni).prefault_packets, + CI_MAX(NI_OPTS(ni).max_packets, actual_max_packets)); int already_reserved = (ni->packets->n_pkts_allocated - ni->packets->n_free); if( ! NI_OPTS(ni).prefault_packets ) @@ -2706,16 +2706,16 @@ void ci_netif_cluster_prefault(ci_netif* ni) static int ci_netif_init(ci_netif* ni, ef_driver_handle fd) { - int rc; + int rc; ef_driver_handle init_net_fd; ni->driver_handle = fd; CI_MAGIC_SET(ni, NETIF_MAGIC); - ni->flags = 0; - ni->error_flags = 0; + ni->flags = 0; + ni->error_flags = 0; ni->cplane_init_net = NULL; - ni->cplane = malloc(sizeof(struct oo_cplane_handle)); + ni->cplane = malloc(sizeof(struct oo_cplane_handle)); if( ni->cplane == NULL ) return -ENOMEM; @@ -2786,8 +2786,8 @@ static void ci_netif_start_helper2(ci_netif* ni) __attribute__((noreturn)); static void ci_netif_start_helper2(ci_netif* ni) { char* argv[5]; - char stack_id_str[strlen(OO_STRINGIFY(INT_MAX)) + 1]; - int rc; + char stack_id_str[strlen(OO_STRINGIFY(INT_MAX)) + 1]; + int rc; argv[0] = ONLOAD_HELPER_NAME; argv[1] = "-s"; @@ -2812,10 +2812,10 @@ static void ci_netif_start_helper2(ci_netif* ni) static void ci_netif_start_helper1(ci_netif* ni) __attribute__((noreturn)); static void ci_netif_start_helper1(ci_netif* ni) { - int i; + int i; sigset_t sigset; - int rc; - int wstatus; + int rc; + int wstatus; /* The first part of "man 7 daemon": */ @@ -2909,12 +2909,12 @@ int ci_netif_ctor( { ci_netif_config_opts* opts; struct oo_per_thread* per_thread; - int rc; + int rc; per_thread = oo_per_thread_get(); - opts = per_thread->thread_local_netif_opts != NULL - ? per_thread->thread_local_netif_opts - : &ci_cfg_opts.netif_opts; + opts = per_thread->thread_local_netif_opts != NULL + ? per_thread->thread_local_netif_opts + : &ci_cfg_opts.netif_opts; ci_assert(ni); ci_netif_sanity_checks(); @@ -2965,7 +2965,7 @@ int ci_netif_set_rxq_limit(ci_netif* ni) OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { ef_vi* vi = ci_netif_vi(ni, intf_i); - rxq_cap = ef_vi_receive_capacity(vi); + rxq_cap = ef_vi_receive_capacity(vi); ++n_intf; } /* We allow up to 80% of the total RX packet buf allocation to go in the @@ -2974,7 +2974,7 @@ int ci_netif_set_rxq_limit(ci_netif* ni) * effects. */ max_ring_pkts = NI_OPTS(ni).max_rx_packets * 4 / 5; - fill_limit = rxq_cap; + fill_limit = rxq_cap; if( fill_limit * n_intf > max_ring_pkts ) fill_limit = max_ring_pkts / n_intf; if( fill_limit < NI_OPTS(ni).rxq_limit ) { @@ -2984,7 +2984,7 @@ int ci_netif_set_rxq_limit(ci_netif* ni) "max_ring_pkts=%d rxq_cap=%d n_intf=%d", N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, fill_limit, max_ring_pkts, rxq_cap, n_intf)); - ni->opts.rxq_limit = fill_limit; + ni->opts.rxq_limit = fill_limit; ni->state->opts.rxq_limit = fill_limit; } if( ni->nic_n == 0 ) { @@ -2998,7 +2998,7 @@ int ci_netif_set_rxq_limit(ci_netif* ni) N_PRI_ARGS(ni), NI_OPTS(ni).rxq_limit, NI_OPTS(ni).rxq_min); ci_log("HINT: Use a larger value for EF_RXQ_LIMIT or " "EF_MAX_RX_PACKETS or EF_MAX_PACKETS")); - rc = -ENOMEM; + rc = -ENOMEM; /* NB. This isn't just called at init time -- it is also called after * failure to allocate more packet buffers. So we must leave * [rxq_limit] with a legal value. @@ -3030,7 +3030,7 @@ static int __ci_netif_init_fill_rx_rings(ci_netif* ni) int n_posted = 0; for( vi_i = 0; vi_i < ci_netif_num_vis(ni); ++vi_i ) { ef_vi* vi = &ni->nic_hw[intf_i].vis[vi_i]; - n_posted = ci_netif_rx_post(ni, intf_i, vi); + n_posted = ci_netif_rx_post(ni, intf_i, vi); if( ef_vi_receive_fill_level(vi) < rxq_limit ) return -ENOMEM; } @@ -3048,7 +3048,7 @@ static int __ci_netif_init_fill_rx_rings(ci_netif* ni) int ci_netif_init_fill_rx_rings(ci_netif* ni) { oo_pkt_p pkt_list; - int lim, rc, n_reserved, n_requested, n_accounted; + int lim, rc, n_reserved, n_requested, n_accounted; rc = ci_tcp_helper_more_bufs(ni); if( ni->packets->n_free == 0 ) { @@ -3156,7 +3156,7 @@ int ci_netif_dtor(ci_netif* ni) static int install_stack_by_id(ci_fd_t fp, unsigned id, bool is_service) { oo_stack_lookup_and_attach_t op; - op.stack_id = id; + op.stack_id = id; op.is_service = is_service; return oo_resource_op(fp, OO_IOC_INSTALL_STACK_BY_ID, &op); } @@ -3175,8 +3175,8 @@ static int install_stack_by_name(ci_fd_t fd, const char* name) int ci_netif_restore_id(ci_netif* ni, unsigned thr_id, bool is_service) { ef_driver_handle fd, fd2; - ci_uint32 map_size; - int rc; + ci_uint32 map_size; + int rc; ci_assert(ni); @@ -3205,8 +3205,8 @@ int ci_netif_restore_id(ci_netif* ni, unsigned thr_id, bool is_service) int ci_netif_restore_name(ci_netif* ni, const char* name) { ef_driver_handle fd, fd2; - ci_uint32 map_size; - int rc; + ci_uint32 map_size; + int rc; ci_assert(ni); diff --git a/src/lib/transport/ip/udp_recv.c b/src/lib/transport/ip/udp_recv.c index 6a7994823..2b811af95 100644 --- a/src/lib/transport/ip/udp_recv.c +++ b/src/lib/transport/ip/udp_recv.c @@ -71,9 +71,9 @@ typedef struct { ci_udp_iomsg_args* a; - ci_msghdr* msg; - int sock_locked; - int flags; + ci_msghdr* msg; + int sock_locked; + int flags; #if HAVE_MSG_FLAGS int msg_flags; #endif @@ -86,14 +86,14 @@ ci_inline void ci_udp_recvmsg_fill_msghdr( #ifndef __KERNEL__ if( msg != NULL ) { if( msg->msg_name != NULL ) { - int af; + int af; const ci_udp_hdr* udp; - ci_addr_t saddr; + ci_addr_t saddr; if( pkt->flags & CI_PKT_FLAG_INDIRECT ) pkt = PKT_CHK_NNL(ni, pkt->frag_next); - af = oo_pkt_af(pkt); - udp = oo_ipx_data(af, (ci_ip_pkt_fmt*) pkt); + af = oo_pkt_af(pkt); + udp = oo_ipx_data(af, (ci_ip_pkt_fmt*) pkt); saddr = RX_PKT_SADDR((ci_ip_pkt_fmt*) pkt); #if CI_CFG_IPV6 @@ -122,11 +122,11 @@ ci_inline int do_copy(void* to, const void* from, int n_bytes) struct oo_copy_state { - int pkt_left; - int pkt_off; - int bytes_copied; - int bytes_to_copy; - const char* from; + int pkt_left; + int pkt_off; + int bytes_copied; + int bytes_to_copy; + const char* from; const ci_ip_pkt_fmt* pkt; }; @@ -151,7 +151,7 @@ ci_inline int __oo_copy_frag_to_iovec_no_adv( /* Caller guarantees that packet contains at least [bytes_to_copy]. */ ci_assert(OO_PP_NOT_NULL(ocs->pkt->frag_next)); ci_iovec_ptr_advance(piov, n); - ocs->pkt = PKT_CHK_NNL(ni, ocs->pkt->frag_next); + ocs->pkt = PKT_CHK_NNL(ni, ocs->pkt->frag_next); ocs->pkt_off = 0; /* We're unlikely to hit end-of-pkt-buf and end-of-iovec at the same * time, and if we do, just go round the loop again. @@ -179,17 +179,17 @@ static int oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, * * Returns number of bytes copied on success, or -EFAULT otherwise. */ - int rc; + int rc; struct oo_copy_state ocs; - ocs.bytes_copied = 0; + ocs.bytes_copied = 0; ocs.bytes_to_copy = bytes_to_copy; - ocs.pkt_off = 0; - ocs.pkt = pkt; + ocs.pkt_off = 0; + ocs.pkt = pkt; while( 1 ) { ocs.pkt_left = oo_offbuf_left(&(ocs.pkt->buf)) - ocs.pkt_off; - ocs.from = oo_offbuf_ptr(&(ocs.pkt->buf)); - rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); + ocs.from = oo_offbuf_ptr(&(ocs.pkt->buf)); + rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); if( rc == 0 ) return ocs.bytes_copied; else if( rc == 1 ) @@ -208,22 +208,22 @@ static int oo_copy_pkt_to_iovec_no_adv(ci_netif* ni, const ci_ip_pkt_fmt* pkt, static int ci_udp_timestamp_q_pkt_to_iovec( ci_netif* ni, const ci_ip_pkt_fmt* pkt, ci_iovec_ptr* piov) { - int rc; + int rc; struct oo_copy_state ocs; - ocs.bytes_copied = 0; + ocs.bytes_copied = 0; /* We have to copy all chunks of jumbo frame, so pkt->buf_len is wrong * here. */ ocs.bytes_to_copy = CI_BSWAP_BE16(oo_ip_hdr_const(pkt)->ip_tot_len_be16) + oo_tx_pre_l3_len(pkt); ocs.pkt_off = 0; - ocs.pkt = pkt; + ocs.pkt = pkt; while( 1 ) { /* Don't use pkt->buf so we don't interfere with the data path. We * need different offsets to include the delivery of the headers */ ocs.pkt_left = ocs.pkt->buf_len - ocs.pkt_off; - ocs.from = (char*) oo_ether_hdr_const(ocs.pkt); - rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); + ocs.from = (char*) oo_ether_hdr_const(ocs.pkt); + rc = __oo_copy_frag_to_iovec_no_adv(ni, piov, &ocs); if( rc == 0 ) return ocs.bytes_copied; else if( rc == 1 ) @@ -249,12 +249,12 @@ static int ci_udp_timestamp_q_pkt_to_iovec( static void ci_udp_pkt_to_zc_msg( ci_netif* ni, ci_ip_pkt_fmt* pkt, struct onload_zc_msg* zc_msg) { - int i, bytes_left = pkt->pf.udp.pay_len; + int i, bytes_left = pkt->pf.udp.pay_len; ci_ip_pkt_fmt* frag; ci_ip_pkt_fmt* handle_frag; handle_frag = frag = pkt; - i = 0; + i = 0; ci_assert_nequal(zc_msg->iov, NULL); /* Ignore first frag if zero length and there is another frag, but @@ -266,17 +266,17 @@ static void ci_udp_pkt_to_zc_msg( handle_frag->user_refcount = CI_ZC_USER_REFCOUNT_ONE; do { - zc_msg->iov[i].iov_len = CI_MIN(oo_offbuf_left(&frag->buf), bytes_left); - zc_msg->iov[i].iov_base = oo_offbuf_ptr(&frag->buf); - zc_msg->iov[i].buf = zc_pktbuf_to_handle(handle_frag); - zc_msg->iov[i].iov_flags = 0; + zc_msg->iov[i].iov_len = CI_MIN(oo_offbuf_left(&frag->buf), bytes_left); + zc_msg->iov[i].iov_base = oo_offbuf_ptr(&frag->buf); + zc_msg->iov[i].buf = zc_pktbuf_to_handle(handle_frag); + zc_msg->iov[i].iov_flags = 0; zc_msg->iov[i].addr_space = EF_ADDRSPACE_LOCAL; bytes_left -= zc_msg->iov[i].iov_len; ++i; if( OO_PP_IS_NULL(frag->frag_next) || (i == CI_UDP_ZC_IOVEC_MAX) || (bytes_left == 0) ) break; - frag = PKT_CHK_NNL(ni, frag->frag_next); + frag = PKT_CHK_NNL(ni, frag->frag_next); handle_frag = frag; } while( 1 ); zc_msg->msghdr.msg_iovlen = i; @@ -287,10 +287,10 @@ static void ci_udp_filter_kernel_pkt( ci_netif* ni, ci_udp_state* us, struct msghdr* msg, int* bytes) { enum onload_zc_callback_rc rc; - struct onload_zc_msg zc_msg; - struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags = 0; - int i = 0, bytes_remaining = *bytes; + struct onload_zc_msg zc_msg; + struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; + unsigned cb_flags = 0; + int i = 0, bytes_remaining = *bytes; if( msg->msg_iovlen > CI_UDP_ZC_IOVEC_MAX ) { LOG_U(log("%s: too many fragments (%d), passing packet unfiltered", @@ -298,18 +298,18 @@ static void ci_udp_filter_kernel_pkt( return; } - zc_msg.iov = zc_iovec; - zc_msg.msghdr = *msg; + zc_msg.iov = zc_iovec; + zc_msg.msghdr = *msg; zc_msg.msghdr.msg_iov = NULL; ci_assert_gt(msg->msg_iovlen, 0); do { - zc_msg.iov[i].iov_base = msg->msg_iov[i].iov_base; - zc_msg.iov[i].iov_len = msg->msg_iov[i].iov_len > bytes_remaining - ? bytes_remaining - : msg->msg_iov[i].iov_len; - zc_msg.iov[i].buf = ONLOAD_ZC_HANDLE_NONZC; + zc_msg.iov[i].iov_base = msg->msg_iov[i].iov_base; + zc_msg.iov[i].iov_len = msg->msg_iov[i].iov_len > bytes_remaining + ? bytes_remaining + : msg->msg_iov[i].iov_len; + zc_msg.iov[i].buf = ONLOAD_ZC_HANDLE_NONZC; zc_msg.iov[i].iov_flags = 0; bytes_remaining -= zc_msg.iov[i].iov_len; } while( ++i < msg->msg_iovlen && bytes_remaining ); @@ -328,11 +328,11 @@ static void ci_udp_filter_kernel_pkt( static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) { - ci_netif* ni = rinf->a->ni; - ci_udp_state* us = rinf->a->us; - ci_msghdr* msg = rinf->msg; + ci_netif* ni = rinf->a->ni; + ci_udp_state* us = rinf->a->us; + ci_msghdr* msg = rinf->msg; ci_ip_pkt_fmt* pkt; - int rc; + int rc; /* NB. [msg] can be NULL for async recv. */ @@ -347,7 +347,7 @@ static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) msg->msg_controllen = 0; } #endif - us->stamp = pkt->tstamp_frc; + us->stamp = pkt->tstamp_frc; us->future_intf_i = pkt->intf_i; rc = oo_copy_pkt_to_iovec_no_adv(ni, pkt, piov, pkt->pf.udp.pay_len); @@ -362,14 +362,14 @@ static int ci_udp_recvmsg_get(ci_udp_recv_info* rinf, ci_iovec_ptr* piov) #ifndef __KERNEL__ #if CI_CFG_ZC_RECV_FILTER if( us->recv_q_filter ) { - struct onload_zc_msg zc_msg; + struct onload_zc_msg zc_msg; struct onload_zc_iovec zc_iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags; - int filterrc; + unsigned cb_flags; + int filterrc; - zc_msg.iov = zc_iovec; + zc_msg.iov = zc_iovec; zc_msg.msghdr.msg_controllen = 0; - zc_msg.msghdr.msg_flags = 0; + zc_msg.msghdr.msg_flags = 0; ci_udp_pkt_to_zc_msg(ni, pkt, &zc_msg); @@ -487,7 +487,7 @@ static int __ci_udp_recvmsg_try_os( static int ci_udp_recvmsg_try_os(ci_udp_recv_info* rinf, int* prc) { ci_udp_state* us = rinf->a->us; - int rc; + int rc; if( ! (us->s.os_sock_status & OO_OS_STATUS_RX) ) return 0; @@ -514,8 +514,8 @@ static int ci_udp_recvmsg_try_os(ci_udp_recv_info* rinf, int* prc) static int ci_udp_recvmsg_socklocked_slowpath( ci_udp_recv_info* rinf, ci_iovec_ptr* piov) { - int rc = 0; - ci_netif* ni = rinf->a->ni; + int rc = 0; + ci_netif* ni = rinf->a->ni; ci_udp_state* us = rinf->a->us; if( CI_UNLIKELY(ni->state->rxq_low) ) @@ -548,12 +548,12 @@ static int ci_udp_recvmsg_socklocked_slowpath( #endif }; } __attribute__((packed, aligned(sizeof(ci_uint32)))) errhdr; - int do_data = (rinf->msg->msg_iovlen > 0); + int do_data = (rinf->msg->msg_iovlen > 0); - cmsg_state.msg = rinf->msg; - cmsg_state.cm = rinf->msg->msg_control; + cmsg_state.msg = rinf->msg; + cmsg_state.cm = rinf->msg->msg_control; cmsg_state.cmsg_bytes_used = 0; - cmsg_state.p_msg_flags = &rinf->msg_flags; + cmsg_state.p_msg_flags = &rinf->msg_flags; if( do_data ) ci_iovec_ptr_init_nz(piov, rinf->msg->msg_iov, rinf->msg->msg_iovlen); @@ -567,13 +567,13 @@ static int ci_udp_recvmsg_socklocked_slowpath( memset(ts, 0, sizeof(ts)); if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_RAW_HARDWARE ) { - ts[2].tv_sec = pkt->hw_stamp.tv_sec; + ts[2].tv_sec = pkt->hw_stamp.tv_sec; ts[2].tv_nsec = pkt->hw_stamp.tv_nsec; } if( (us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_SYS_HARDWARE) && (pkt->hw_stamp.tv_nsec & CI_IP_PKT_HW_STAMP_FLAG_IN_SYNC) ) { - ts[1].tv_sec = pkt->hw_stamp.tv_sec; + ts[1].tv_sec = pkt->hw_stamp.tv_sec; ts[1].tv_nsec = pkt->hw_stamp.tv_nsec; } ci_put_cmsg( @@ -592,10 +592,10 @@ static int ci_udp_recvmsg_socklocked_slowpath( } memset(&errhdr, 0, sizeof(errhdr)); - errhdr.ee.ee_errno = ENOMSG; + errhdr.ee.ee_errno = ENOMSG; errhdr.ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; - errhdr.ee.ee_info = 0; - errhdr.ee.ee_data = pkt->ts_key; + errhdr.ee.ee_info = 0; + errhdr.ee.ee_data = pkt->ts_key; if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_OPT_CMSG ) { ci_addr_t saddr = ipx_hdr_saddr(oo_pkt_af(pkt), oo_ipx_hdr(pkt)); #if CI_CFG_IPV6 @@ -665,13 +665,13 @@ struct recvmsg_spinstate { ci_uint64 start_frc; ci_uint64 schedule_frc; ci_uint64 max_spin; - int do_spin; - int spin_limit_by_so; + int do_spin; + int spin_limit_by_so; ci_uint32 timeout; #ifndef __KERNEL__ - uint32_t poison; + uint32_t poison; const volatile uint32_t* future; - citp_signal_info* si; + citp_signal_info* si; #endif }; @@ -684,9 +684,9 @@ static int ci_udp_recvmsg_block( #ifndef __KERNEL__ { citp_signal_info* si; - struct pollfd pfd; - int inside_lib; - pfd.fd = a->fd; + struct pollfd pfd; + int inside_lib; + pfd.fd = a->fd; pfd.events = POLLIN; if( timeout == 0 ) @@ -698,7 +698,7 @@ static int ci_udp_recvmsg_block( si = citp_signal_get_specific_inited(); continue_to_block: inside_lib = oo_exit_lib_temporary_begin(si); - rc = ci_sys_poll(&pfd, 1, timeout); + rc = ci_sys_poll(&pfd, 1, timeout); oo_exit_lib_temporary_end(si, inside_lib); if( rc > 0 ) @@ -807,15 +807,15 @@ ci_inline int ci_udp_recvmsg_socklocked_spin( static int ci_udp_recvmsg_common(ci_udp_recv_info* rinf) { - ci_netif* ni = rinf->a->ni; - ci_udp_state* us = rinf->a->us; - ci_iovec_ptr piov = { NULL, 0, { NULL, 0 } }; - int rc = 0, slow; + ci_netif* ni = rinf->a->ni; + ci_udp_state* us = rinf->a->us; + ci_iovec_ptr piov = { NULL, 0, { NULL, 0 } }; + int rc = 0, slow; struct recvmsg_spinstate spin_state = { 0 }; #ifndef __KERNEL__ spin_state.do_spin = -1; - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); #endif spin_state.timeout = us->s.so.rcvtimeo_msec; @@ -907,15 +907,15 @@ static int ci_udp_recvmsg_common(ci_udp_recv_info* rinf) oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); if( spin_state.do_spin ) { - spin_state.poison = CI_PKT_RX_POISON; - spin_state.future = &spin_state.poison; + spin_state.poison = CI_PKT_RX_POISON; + spin_state.future = &spin_state.poison; spin_state.schedule_frc = spin_state.start_frc; - spin_state.max_spin = us->s.b.spin_cycles; + spin_state.max_spin = us->s.b.spin_cycles; if( us->s.so.rcvtimeo_msec ) { ci_uint64 max_so_spin = (ci_uint64) us->s.so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= spin_state.max_spin ) { - spin_state.max_spin = max_so_spin; + spin_state.max_spin = max_so_spin; spin_state.spin_limit_by_so = 1; } } @@ -972,17 +972,17 @@ static int ci_udp_recvmsg_common(ci_udp_recv_info* rinf) int ci_udp_recvmsg(ci_udp_iomsg_args* a, ci_msghdr* msg, int flags) { - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - int rc; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + int rc; ci_udp_recv_info rinf; - rinf.a = a; - rinf.msg = msg; + rinf.a = a; + rinf.msg = msg; rinf.sock_locked = 0; - rinf.flags = flags; + rinf.flags = flags; - rc = ci_udp_recvmsg_common(&rinf); + rc = ci_udp_recvmsg_common(&rinf); if( rinf.sock_locked ) ci_sock_unlock(ni, &us->s.b); #if HAVE_MSG_FLAGS @@ -998,16 +998,16 @@ int ci_udp_recvmsg(ci_udp_iomsg_args* a, ci_msghdr* msg, int flags) int ci_udp_recvmmsg(ci_udp_iomsg_args* a, struct mmsghdr* mmsg, unsigned int vlen, int flags, const struct timespec* timeout) { - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - int rc, i; - struct timeval tv_before; - int timeout_msec = -1; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + int rc, i; + struct timeval tv_before; + int timeout_msec = -1; ci_udp_recv_info rinf; - rinf.a = a; + rinf.a = a; rinf.sock_locked = 0; - rinf.flags = flags; + rinf.flags = flags; if( timeout ) { timeout_msec = timeout->tv_sec * 1000 + timeout->tv_nsec / 1000000; @@ -1017,7 +1017,7 @@ int ci_udp_recvmmsg(ci_udp_iomsg_args* a, struct mmsghdr* mmsg, i = 0; while( i < vlen ) { rinf.msg = &mmsg[i].msg_hdr; - rc = ci_udp_recvmsg_common(&rinf); + rc = ci_udp_recvmsg_common(&rinf); if( rc >= 0 ) { mmsg[i].msg_len = rc; #if HAVE_MSG_FLAGS @@ -1074,12 +1074,12 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, (CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start))) + \ 1) - int rc, i, cb_flags; - struct msghdr msg; - struct iovec iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; + int rc, i, cb_flags; + struct msghdr msg; + struct iovec iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; struct onload_zc_iovec zc_iov[ZC_BUFFERS_FOR_64K_DATAGRAM]; - oo_pkt_p pkt_p, first_pkt_p; - ci_ip_pkt_fmt* pkt; + oo_pkt_p pkt_p, first_pkt_p; + ci_ip_pkt_fmt* pkt; ci_assert_le(us->zc_kernel_datagram_count, ZC_BUFFERS_FOR_64K_DATAGRAM); @@ -1100,7 +1100,7 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, } pkt->flags |= CI_PKT_FLAG_RX; ++ni->state->n_rx_pkts; - pkt->frag_next = us->zc_kernel_datagram; + pkt->frag_next = us->zc_kernel_datagram; us->zc_kernel_datagram = OO_PKT_P(pkt); ++us->zc_kernel_datagram_count; } @@ -1108,12 +1108,12 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, } pkt_p = us->zc_kernel_datagram; - i = 0; + i = 0; while( OO_PP_NOT_NULL(pkt_p) ) { #ifndef NDEBUG ci_assert_lt(i, us->zc_kernel_datagram_count); #endif - pkt = PKT_CHK_NNL(ni, pkt_p); + pkt = PKT_CHK_NNL(ni, pkt_p); iov[i].iov_base = pkt->dma_start; iov[i].iov_len = (CI_CFG_PKT_BUF_SIZE - ((char*) pkt->dma_start - (char*) pkt)); @@ -1121,13 +1121,13 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, pkt_p = pkt->frag_next; } - msg.msg_iov = iov; - msg.msg_iovlen = i; - msg.msg_control = args->msg.msghdr.msg_control; + msg.msg_iov = iov; + msg.msg_iovlen = i; + msg.msg_control = args->msg.msghdr.msg_control; msg.msg_controllen = args->msg.msghdr.msg_controllen; - msg.msg_name = args->msg.msghdr.msg_name; - msg.msg_namelen = args->msg.msghdr.msg_namelen; - msg.msg_flags = 0; + msg.msg_name = args->msg.msghdr.msg_name; + msg.msg_namelen = args->msg.msghdr.msg_namelen; + msg.msg_flags = 0; ci_assert(us->s.os_sock_status & OO_OS_STATUS_RX); i = __ci_udp_recvmsg_try_os( @@ -1141,16 +1141,16 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, * the caller's onload_zc_iovec */ - i = 0; + i = 0; pkt_p = us->zc_kernel_datagram; do { #ifndef NDEBUG ci_assert_lt(i, us->zc_kernel_datagram_count); #endif - pkt = PKT_CHK_NNL(ni, pkt_p); - zc_iov[i].iov_len = rc > iov[i].iov_len ? iov[i].iov_len : rc; - zc_iov[i].iov_base = iov[i].iov_base; - zc_iov[i].buf = zc_pktbuf_to_handle(pkt); + pkt = PKT_CHK_NNL(ni, pkt_p); + zc_iov[i].iov_len = rc > iov[i].iov_len ? iov[i].iov_len : rc; + zc_iov[i].iov_base = iov[i].iov_base; + zc_iov[i].buf = zc_pktbuf_to_handle(pkt); zc_iov[i].addr_space = EF_ADDRSPACE_LOCAL; rc -= zc_iov[i].iov_len; @@ -1161,28 +1161,28 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, /* Clear last packet's frag_next in chain we're passing to callback. * We'll restore it later if they don't keep the buffers */ - pkt->frag_next = OO_PP_NULL; + pkt->frag_next = OO_PP_NULL; /* pkt_p handily points to the buffer after the last one used for * this datagram, and i is the number of buffers we used. Remove * them from the zc_kernel_datagram list */ - first_pkt_p = us->zc_kernel_datagram; + first_pkt_p = us->zc_kernel_datagram; PKT_CHK_NNL(ni, first_pkt_p)->user_refcount = CI_ZC_USER_REFCOUNT_ONE; - us->zc_kernel_datagram = pkt_p; + us->zc_kernel_datagram = pkt_p; #ifndef NDEBUG ci_assert_ge(us->zc_kernel_datagram_count, i); #endif us->zc_kernel_datagram_count -= i; - args->msg.iov = zc_iov; - args->msg.msghdr.msg_iovlen = i; - args->msg.msghdr.msg_control = msg.msg_control; + args->msg.iov = zc_iov; + args->msg.msghdr.msg_iovlen = i; + args->msg.msghdr.msg_control = msg.msg_control; args->msg.msghdr.msg_controllen = msg.msg_controllen; - args->msg.msghdr.msg_name = msg.msg_name; - args->msg.msghdr.msg_namelen = msg.msg_namelen; - args->msg.msghdr.msg_flags = msg.msg_flags; + args->msg.msghdr.msg_name = msg.msg_name; + args->msg.msghdr.msg_namelen = msg.msg_namelen; + args->msg.msghdr.msg_flags = msg.msg_flags; - cb_flags = 0; + cb_flags = 0; if( (ci_udp_recv_q_pkts(&us->recv_q) == 0) && (us->s.os_sock_status & OO_OS_STATUS_RX) == 0 ) cb_flags |= ONLOAD_ZC_END_OF_BURST; @@ -1198,7 +1198,7 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, /* Check the integrity of the list structure on the packets that we passed * to the application. */ int app_packet_count = 0; - pkt_p = first_pkt_p; + pkt_p = first_pkt_p; while( OO_PP_NOT_NULL(pkt_p) ) { ci_assert_lt(app_packet_count, i); ci_assert_nequal(pkt_p, us->zc_kernel_datagram); @@ -1211,8 +1211,8 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, /* Put the buffers back on the zc_kernel_datagram list */ PKT_CHK_NNL(ni, first_pkt_p)->pio_addr = -1; - pkt->frag_next = us->zc_kernel_datagram; - us->zc_kernel_datagram = first_pkt_p; + pkt->frag_next = us->zc_kernel_datagram; + us->zc_kernel_datagram = first_pkt_p; us->zc_kernel_datagram_count += i; } @@ -1234,23 +1234,23 @@ static int ci_udp_zc_recv_from_os(ci_netif* ni, ci_udp_state* us, int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) { - int rc, done_big_poll = 0, done_kernel_poll = 0, done_callback = 0; - ci_netif* ni = a->ni; - ci_udp_state* us = a->us; - enum onload_zc_callback_rc cb_rc = ONLOAD_ZC_CONTINUE; - struct recvmsg_spinstate spin_state = { 0 }; - size_t supplied_controllen = args->msg.msghdr.msg_controllen; - void* supplied_control = args->msg.msghdr.msg_control; - socklen_t supplied_namelen = args->msg.msghdr.msg_namelen; - void* supplied_name = args->msg.msghdr.msg_name; + int rc, done_big_poll = 0, done_kernel_poll = 0, done_callback = 0; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; + enum onload_zc_callback_rc cb_rc = ONLOAD_ZC_CONTINUE; + struct recvmsg_spinstate spin_state = { 0 }; + size_t supplied_controllen = args->msg.msghdr.msg_controllen; + void* supplied_control = args->msg.msghdr.msg_control; + socklen_t supplied_namelen = args->msg.msghdr.msg_namelen; + void* supplied_name = args->msg.msghdr.msg_name; struct onload_zc_iovec iovec[CI_UDP_ZC_IOVEC_MAX]; - unsigned cb_flags; + unsigned cb_flags; spin_state.do_spin = -1; - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); spin_state.timeout = us->s.so.rcvtimeo_msec; - rc = ci_sock_lock(ni, &us->s.b); + rc = ci_sock_lock(ni, &us->s.b); if( CI_UNLIKELY(rc != 0) ) return rc; @@ -1274,14 +1274,14 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) while( (pkt = ci_udp_recv_q_get(ni, &us->recv_q)) != NULL ) { /* Reinitialise our own state within [args] each time around the loop, as * the app's callback might have changed it. */ - args->msg.iov = iovec; - args->msg.msghdr.msg_name = supplied_name; + args->msg.iov = iovec; + args->msg.msghdr.msg_name = supplied_name; args->msg.msghdr.msg_namelen = supplied_namelen; - args->msg.msghdr.msg_flags = 0; + args->msg.msghdr.msg_flags = 0; if( CI_UNLIKELY(us->s.cmsg_flags != 0) ) { args->msg.msghdr.msg_controllen = supplied_controllen; - args->msg.msghdr.msg_control = supplied_control; + args->msg.msghdr.msg_control = supplied_control; ci_ip_cmsg_recv( ni, us, pkt, &args->msg.msghdr, 0, &args->msg.msghdr.msg_flags); } else @@ -1359,7 +1359,7 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) spin_loop: if( CI_UNLIKELY((rc = UDP_RX_ERRNO(us))) ) { - rc = -rc; + rc = -rc; us->s.rx_errno = us->s.rx_errno & 0xf0000000; goto out; } @@ -1377,10 +1377,10 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) do { /* Restore these just in case they are needed */ args->msg.msghdr.msg_controllen = supplied_controllen; - args->msg.msghdr.msg_control = supplied_control; - args->msg.msghdr.msg_name = supplied_name; - args->msg.msghdr.msg_namelen = supplied_namelen; - rc = ci_udp_zc_recv_from_os(ni, us, args, &cb_rc); + args->msg.msghdr.msg_control = supplied_control; + args->msg.msghdr.msg_name = supplied_name; + args->msg.msghdr.msg_namelen = supplied_namelen; + rc = ci_udp_zc_recv_from_os(ni, us, args, &cb_rc); done_callback = 1; if( rc != 0 || cb_rc & ONLOAD_ZC_TERMINATE ) { ci_assert(done_big_poll); @@ -1426,16 +1426,16 @@ int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args) oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_UDP_RECV); if( spin_state.do_spin ) { - spin_state.si = citp_signal_get_specific_inited(); + spin_state.si = citp_signal_get_specific_inited(); spin_state.max_spin = us->s.b.spin_cycles; - spin_state.poison = CI_PKT_RX_POISON; - spin_state.future = &spin_state.poison; + spin_state.poison = CI_PKT_RX_POISON; + spin_state.future = &spin_state.poison; if( us->s.so.rcvtimeo_msec ) { ci_uint64 max_so_spin = (ci_uint64) us->s.so.rcvtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= spin_state.max_spin ) { - spin_state.max_spin = max_so_spin; + spin_state.max_spin = max_so_spin; spin_state.spin_limit_by_so = 1; } } diff --git a/src/lib/transport/unix/dpdk.c b/src/lib/transport/unix/dpdk.c index 7aa30a0b6..d087c7d70 100644 --- a/src/lib/transport/unix/dpdk.c +++ b/src/lib/transport/unix/dpdk.c @@ -1,7 +1,7 @@ #include #include "internal.h" -static const char *__dpdk_eal_argv[] = { "-l", "1", "--proc-type=secondary", +static char *__dpdk_eal_argv[] = { "-l", "1", "--proc-type=secondary", "--log-level", "0" }; /* These values should be kept in sync with the argv list above. The last two diff --git a/test_programs/mock_xnic/Makefile b/test_programs/mock_xnic/Makefile index eb6a14f1c..37f302cc7 100644 --- a/test_programs/mock_xnic/Makefile +++ b/test_programs/mock_xnic/Makefile @@ -1,4 +1,4 @@ -FLAGS = -march=native -O3 -msse3 +CFLAGS = -march=native -O3 -msse3 -mavx INCLUDES = -I./ LFLAGS = -L/usr/local/lib/x86_64-linux-gnu LIBS = -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs diff --git a/test_programs/mock_xnic/main.c b/test_programs/mock_xnic/main.c index f72635daa..6a748694d 100644 --- a/test_programs/mock_xnic/main.c +++ b/test_programs/mock_xnic/main.c @@ -49,18 +49,20 @@ #include "mp_commands.h" #define RTE_LOGTYPE_APP RTE_LOGTYPE_USER1 -#define DEBUG_TX 1 -#define DEBUG_RX 1 +#define DEBUG_TX 0 +#define DEBUG_RX 0 -static const char *_TX_RING = "TX_RING"; -static const char *_TX_PREP_RING = "TX_PREP_RING"; -static const char *_RX_PREP_RING = "RX_PREP_RING"; -static const char *_TX_COMP_RING = "TX_COMP_RING"; -static const char *_RX_RING = "RX_RING"; -static const char *_RX_FILL_RING = "RX_FILL_RING"; -static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; +static const char *_TX_RING = "TX_RING"; +static const char *_TX_PREP_RING = "TX_PREP_RING"; +static const char *_RX_PREP_RING = "RX_PREP_RING"; +static const char *_RX_PENDING_RING = "RX_PENDING_RING"; +static const char *_TX_COMP_RING = "TX_COMP_RING"; +static const char *_RX_RING = "RX_RING"; +static const char *_RX_FILL_RING = "RX_FILL_RING"; +static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; -struct rte_ring *tx_ring, *tx_completion_ring, *rx_ring, *rx_fill_ring; +struct rte_ring *tx_ring, *tx_completion_ring, *rx_ring, *rx_fill_ring, + *rx_prep_ring, *tx_prep_ring, *rx_pending_ring; static const unsigned MAX_MESSAGE_SIZE = 2048; @@ -72,12 +74,12 @@ static const unsigned MAX_MESSAGE_SIZE = 2048; #define BURST_SIZE 32 struct rte_mempool *mbuf_pool; -volatile int quit = 0; +volatile int quit = 0; -struct rte_mbuf *tx_bufs[BURST_SIZE]; -struct rte_mbuf *rx_bufs[BURST_SIZE]; -struct rte_mbuf *rx_drop_bufs[BURST_SIZE]; -struct rte_mbuf *rx_final_bufs[BURST_SIZE]; +struct rte_mbuf *tx_bufs[BURST_SIZE]; +struct rte_mbuf *temp_rx_bufs[BURST_SIZE]; +struct rte_mbuf *rx_bufs[BURST_SIZE]; +struct rte_mbuf *rx_final_bufs[BURST_SIZE]; static const struct rte_eth_conf port_conf_default = { .rxmode = { @@ -93,14 +95,14 @@ static const struct rte_eth_conf port_conf_default = { */ static inline int port_init(uint16_t port) { - struct rte_eth_conf port_conf = port_conf_default; - const uint16_t rx_rings = 1, tx_rings = 1; - uint16_t nb_rxd = RX_RING_SIZE; - uint16_t nb_txd = TX_RING_SIZE; - int retval; - uint16_t q; + struct rte_eth_conf port_conf = port_conf_default; + const uint16_t rx_rings = 1, tx_rings = 1; + uint16_t nb_rxd = RX_RING_SIZE; + uint16_t nb_txd = TX_RING_SIZE; + int retval; + uint16_t q; struct rte_eth_dev_info dev_info; - struct rte_eth_txconf txconf; + struct rte_eth_txconf txconf; if( ! rte_eth_dev_is_valid_port(port) ) return -1; @@ -124,15 +126,18 @@ static inline int port_init(uint16_t port) if( retval != 0 ) return retval; + printf("Setting up RX Desc: %d TX Desc: %d\n", nb_rxd, nb_txd); + /* Allocate and set up 1 RX queue per Ethernet port. */ for( q = 0; q < rx_rings; q++ ) { + printf("setting up rx ring: %d\n", q); retval = rte_eth_rx_queue_setup( port, q, nb_rxd, rte_eth_dev_socket_id(port), NULL, mbuf_pool); if( retval < 0 ) return retval; } - txconf = dev_info.default_txconf; + txconf = dev_info.default_txconf; txconf.offloads = port_conf.txmode.offloads; /* Allocate and set up 1 TX queue per Ethernet port. */ for( q = 0; q < tx_rings; q++ ) { @@ -175,21 +180,29 @@ static inline int init_ports(void) { if( port_init(portid) != 0 ) { printf("Cannot init port %d \n", portid); - return -1; } } return 0; } +static void dump_ring_state() +{ + printf("MPOOL free: %d\n", rte_mempool_avail_count(mbuf_pool)); + printf("TX RING count: %d\n", rte_ring_count(tx_ring)); + printf("TX COMP RING count: %d\n", rte_ring_count(tx_completion_ring)); + printf("RX FILL RING count: %d\n", rte_ring_count(rx_fill_ring)); + printf("RX RING count: %d\n", rte_ring_count(rx_ring)); +} + static void print_mbufs(struct rte_mbuf **mbufs, int length, char *type) { if( length != 0 ) { printf("TYPE: %s\n", type); } for( int i = 0; i < length; i++ ) { - uint8_t *data = rte_pktmbuf_mtod(mbufs[i], uint8_t *); - int data_len = rte_pktmbuf_data_len(mbufs[i]); + uint8_t *data = rte_pktmbuf_mtod(mbufs[i], uint8_t *); + int data_len = rte_pktmbuf_data_len(mbufs[i]); printf("Data Len: %d\n", data_len); for( int j = 0; j < data_len; j++ ) { printf("%02X ", data[j]); @@ -198,55 +211,81 @@ static void print_mbufs(struct rte_mbuf **mbufs, int length, char *type) } } +static void drain_queue(struct rte_ring *ring) +{ + unsigned available = 0; + int count = 0; + int burst_size = 32; + struct rte_mbuf *bufs[burst_size]; + + do { + count = rte_ring_dequeue_burst( + ring, (void **) &bufs[0], burst_size, &available); + + for( int i = 0; i < count; ++i ) { + struct rte_mbuf *buf = bufs[i]; + printf("%p\n", buf); + rte_pktmbuf_free(buf); + } + + } while( available != 0 ); +} + + +static void bulk_free(struct rte_mbuf **mbufs, unsigned length) +{ + for( int i = 0; i < length; ++i ) { + rte_pktmbuf_free(mbufs[i]); + } +} static int receive(uint16_t port) { - int should_drop = 0; - int allowed = rte_ring_dequeue_burst( - rx_fill_ring, (void **) &rx_bufs[0], BURST_SIZE, NULL); + int allowed = rte_ring_dequeue_burst( + rx_fill_ring, (void **) &temp_rx_bufs[0], BURST_SIZE, NULL); + if( allowed == 0 ) { - allowed = BURST_SIZE; - should_drop = 1; - *rx_bufs = *rx_drop_bufs; + return 0; } + uint16_t recv = rte_eth_rx_burst(port, 0, &rx_bufs[0], allowed); - if( should_drop ) { - if( recv != 0 ) { - printf("DROPPING RECV. No fill packets\n"); - } - return 0; + // recycle any unused packets + if( unlikely(recv != allowed) ) { + rte_ring_enqueue_bulk( + rx_fill_ring, (void **) &temp_rx_bufs[recv], allowed - recv, NULL); } + int enqueueCount = 0; - for( int i = 0; i < recv; i++ ) { + for( int i = 0; i < recv; ++i ) { struct rte_ether_hdr *eth_h = rte_pktmbuf_mtod(rx_bufs[i], struct rte_ether_hdr *); + // drop this because it's breaking everything for now if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_IPV6 ) { - rte_ring_enqueue(rx_fill_ring, &rx_bufs[i]); + // recycle unused buffers + rte_ring_enqueue(rx_fill_ring, temp_rx_bufs[i]); } else if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_ARP ) { struct rte_arp_hdr *arp = (struct rte_arp_hdr *) (eth_h + 1); if( ntohs(arp->arp_opcode) == RTE_ARP_OP_REPLY ) { - char ethStr[50]; + char ethStr[50]; struct in_addr add; add.s_addr = arp->arp_data.arp_sip; rte_ether_format_addr(ethStr, 50, &arp->arp_data.arp_sha); char *ipAddr = inet_ntoa(add); - char str[100]; + char str[100]; sprintf(str, "ip neigh replace %s dev eth1 lladdr %s nud reachable", ipAddr, ethStr); - printf("running system command: %s\n", str); if( system(str) != 0 ) { printf("Failed to add neighbor\n"); } - } - // unsure whether to recycle this packet or send it along - rte_ring_enqueue(rx_fill_ring, &rx_bufs[i]); - // rx_final_bufs[enqueueCount++] = rx_bufs[i]; + rte_ring_enqueue(rx_fill_ring, temp_rx_bufs[i]); + } } else { + rte_pktmbuf_free(temp_rx_bufs[i]); rx_final_bufs[enqueueCount++] = rx_bufs[i]; } } @@ -255,27 +294,23 @@ static int receive(uint16_t port) print_mbufs(rx_final_bufs, enqueueCount, "RX"); #endif - if( recv != allowed ) { - rte_ring_enqueue_bulk( - rx_fill_ring, (void **) &rx_bufs[recv - 1], allowed - recv, NULL); - } - - if( enqueueCount != 0 ) { + if( likely(enqueueCount != 0) ) { if( rte_ring_enqueue_bulk( - rx_ring, (void **) &rx_final_bufs[0], enqueueCount, NULL) == 0 ) { - printf("FAILED TO HAND TO RX RING"); + rx_ring, (void **) rx_final_bufs, enqueueCount, NULL) == 0 ) { + printf("FAILED TO HAND TO RX RING\n"); + bulk_free(rx_final_bufs, enqueueCount); } } - - return recv; } +const int max_tries = 1000; + static int transmit(uint16_t port) { // might be better to manually move the consumer tail manually? int allowed = rte_ring_dequeue_burst(tx_ring, (void **) &tx_bufs, BURST_SIZE, NULL); - if( allowed == 0 ) { + if( unlikely(allowed == 0) ) { return 0; } @@ -283,23 +318,48 @@ static int transmit(uint16_t port) print_mbufs(tx_bufs, allowed, "TX"); #endif - uint16_t txed = rte_eth_tx_burst(port, 0, &tx_bufs[0], allowed); + int start = 0; + int end = allowed; + for( int i = 0; i < max_tries; ++i ) { + uint16_t txed = rte_eth_tx_burst(port, 0, &tx_bufs[start], end); + start += txed; + end -= txed; - rte_ring_enqueue_bulk(tx_completion_ring, (void **) &tx_bufs[0], txed, NULL); + if( likely(end == 0) ) { + break; + } + usleep(10); + } - if( txed != allowed ) { - // PUT back unused bufs? This is almost certainly problematic - // rte_ring_enqueue_bulk(tx_ring, (void **)&tx_bufs[txed - 1], allowed - - // txed, NULL); - printf("DROPPING A PACKET\n"); + if( unlikely(start != allowed) ) { + printf("Unable to send all tx packets\n"); + bulk_free(&tx_bufs[start], end); } - return txed; + if( unlikely(start == 0) ) { + return start; + } + + + struct rte_mbuf *comp_count[start]; + + if( unlikely(rte_mempool_get_bulk(mbuf_pool, (void **) comp_count, start) != + 0) ) { + printf("Unable to get pkts to marks as completed\n"); + + return start; + } + + if( unlikely(rte_ring_enqueue_bulk(tx_completion_ring, (void **) comp_count, + start, NULL) == 0) ) { + printf("FAILED to mark tx completed\n"); + bulk_free(tx_bufs, start); + } + return start; } static int lcore_run(__attribute__((unused)) void *arg) { - /* Check that there is an even number of ports to send/receive on. */ int nb_ports = rte_eth_dev_count_avail(); if( nb_ports < 1 ) { printf("ERROR: failed to init. Bad number of ports: %d\n", nb_ports); @@ -336,7 +396,7 @@ static int lcore_run(__attribute__((unused)) void *arg) while( ! quit ) { int recved = receive(port); - int sent = transmit(port); + int sent = transmit(port); if( recved == 0 && sent == 0 ) { usleep(10); } @@ -358,15 +418,15 @@ static void signal_handler(int signum) int main(int argc, char **argv) { - const unsigned flags = 0; - const unsigned ring_size = 512; + const unsigned flags = 0; + const unsigned ring_size = 512; const unsigned fill_ring_size = 1024; - const unsigned pool_size = 1024; - const unsigned pool_cache = 0; - const unsigned priv_data_sz = 0; + const unsigned pool_size = 1024; + const unsigned pool_cache = 0; + const unsigned priv_data_sz = 0; - int ret; - unsigned lcore_id; + int ret; + unsigned lcore_id; signal(SIGRTMIN, signal_handler); signal(SIGINT, signal_handler); @@ -376,20 +436,24 @@ int main(int argc, char **argv) rte_exit(EXIT_FAILURE, "Cannot init EAL\n"); if( rte_eal_process_type() != RTE_PROC_PRIMARY ) { - rte_exit(EXIT_FAILURE, "This program must be run as primary"); + rte_exit(EXIT_FAILURE, "This program must be run as primary\n"); } - tx_ring = rte_ring_create(_TX_RING, ring_size, SOCKET_ID_ANY, flags); - rx_ring = rte_ring_create(_RX_RING, ring_size, SOCKET_ID_ANY, flags); - rx_fill_ring = - rte_ring_create(_RX_FILL_RING, fill_ring_size, SOCKET_ID_ANY, flags); - tx_completion_ring = - rte_ring_create(_TX_COMP_RING, ring_size, SOCKET_ID_ANY, flags); + tx_ring = rte_ring_create(_TX_RING, ring_size, SOCKET_ID_ANY, RING_F_SC_DEQ); + rx_ring = rte_ring_create(_RX_RING, ring_size, SOCKET_ID_ANY, RING_F_SC_DEQ); + rx_fill_ring = rte_ring_create( + _RX_FILL_RING, fill_ring_size, SOCKET_ID_ANY, RING_F_SC_DEQ); + tx_completion_ring = rte_ring_create( + _TX_COMP_RING, fill_ring_size, SOCKET_ID_ANY, RING_F_SC_DEQ); - mbuf_pool = rte_pktmbuf_pool_create(_RX_MBUF_POOL, NUM_MBUFS * 1, + mbuf_pool = rte_pktmbuf_pool_create(_RX_MBUF_POOL, NUM_MBUFS - 1, MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY); - rte_ring_create(_TX_PREP_RING, ring_size, SOCKET_ID_ANY, 0); - rte_ring_create(_RX_PREP_RING, ring_size, SOCKET_ID_ANY, 0); + tx_prep_ring = rte_ring_create(_TX_PREP_RING, ring_size / 2, SOCKET_ID_ANY, + RING_F_SC_DEQ | RING_F_SP_ENQ); + rx_prep_ring = rte_ring_create(_RX_PREP_RING, ring_size / 2, SOCKET_ID_ANY, + RING_F_SC_DEQ | RING_F_SP_ENQ); + rx_pending_ring = rte_ring_create(_RX_PENDING_RING, ring_size / 4, + SOCKET_ID_ANY, RING_F_SC_DEQ | RING_F_SP_ENQ); if( tx_ring == NULL ) rte_exit(EXIT_FAILURE, "Problem getting sending ring\n"); @@ -402,15 +466,6 @@ int main(int argc, char **argv) if( mbuf_pool == NULL ) rte_exit(EXIT_FAILURE, "Problem getting message pool\n"); - // reserve some rx bufs to keep things empty - if( rte_mempool_get_bulk( - mbuf_pool, (void **) &rx_drop_bufs[0], BURST_SIZE) != 0 ) { - RTE_LOG(ERR, APP, "Unable to get objects from mempool\n"); - } else { - RTE_LOG(INFO, APP, "GOT DATA SUCCESSFULLY %d \n", - rte_mempool_avail_count(mbuf_pool)); - } - RTE_LOG(INFO, APP, "Finished Process Init.\n"); /* call lcore_recv() on every slave lcore */ @@ -420,6 +475,7 @@ int main(int argc, char **argv) } printf("MAIN CORE: %d\n", rte_lcore_id()); + dump_ring_state(1); /* call cmd prompt on master lcore */ struct cmdline *cl = cmdline_stdin_new(simple_mp_ctx, "\nsimple_mp > "); if( cl == NULL ) @@ -428,5 +484,14 @@ int main(int argc, char **argv) cmdline_stdin_exit(cl); rte_eal_mp_wait_lcore(); + + rte_ring_free(tx_ring); + rte_ring_free(rx_ring); + rte_ring_free(tx_completion_ring); + rte_ring_free(rx_fill_ring); + rte_ring_free(tx_prep_ring); + rte_ring_free(rx_prep_ring); + rte_ring_free(rx_pending_ring); + rte_mempool_free(mbuf_pool); return 0; } diff --git a/test_programs/mock_xnic/mp_commands.c b/test_programs/mock_xnic/mp_commands.c index 4f9bad285..9735c112a 100644 --- a/test_programs/mock_xnic/mp_commands.c +++ b/test_programs/mock_xnic/mp_commands.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -93,9 +94,46 @@ cmdline_parse_inst_t cmd_help = { }, }; +static void dump_rings(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, __attribute__((unused)) void *data) +{ + rte_mempool_dump(stdout, mbuf_pool); + cmdline_printf(cl, + "TX Ring Count: %d:%d\n" + "TX Comp Ring Count: %d:%d\n" + "RX Fill Ring Count: %d:%d\n" + "RX Ring Count: %d:%d\n" + "RX Prep Ring Count: %d:%d\n" + "TX Prep Ring Count: %d:%d\n" + "RX Pending Ring Count: %d:%d\n", + rte_ring_count(tx_ring), rte_ring_get_capacity(tx_ring), + rte_ring_count(tx_completion_ring), + rte_ring_get_capacity(tx_completion_ring), rte_ring_count(rx_fill_ring), + rte_ring_get_capacity(rx_fill_ring), rte_ring_count(rx_ring), + rte_ring_get_capacity(rx_ring), rte_ring_count(rx_prep_ring), + rte_ring_get_capacity(rx_prep_ring), rte_ring_count(tx_prep_ring), + rte_ring_get_capacity(tx_prep_ring), rte_ring_count(rx_pending_ring), + rte_ring_get_capacity(rx_pending_ring)); +} + +cmdline_parse_token_string_t cmd_dump_rings_help = + TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "dump"); + +cmdline_parse_inst_t cmd_dump_rings= { + .f = dump_rings, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "show ring state", + .tokens = { + /* token list, NULL terminated */ + (void *)&cmd_dump_rings_help, + NULL, + }, +}; + /****** CONTEXT (list of instruction) */ cmdline_parse_ctx_t simple_mp_ctx[] = { (cmdline_parse_inst_t *) &cmd_quit, (cmdline_parse_inst_t *) &cmd_help, + (cmdline_parse_inst_t *) &cmd_dump_rings, NULL, }; diff --git a/test_programs/mock_xnic/mp_commands.h b/test_programs/mock_xnic/mp_commands.h index 5d67413e7..4e9fe14a9 100644 --- a/test_programs/mock_xnic/mp_commands.h +++ b/test_programs/mock_xnic/mp_commands.h @@ -5,8 +5,9 @@ #ifndef _SIMPLE_MP_COMMANDS_H_ #define _SIMPLE_MP_COMMANDS_H_ -extern struct rte_ring *send_ring; -extern struct rte_mempool *message_pool; +extern struct rte_ring *tx_ring, *tx_completion_ring, *rx_ring, *rx_fill_ring, + *rx_prep_ring, *tx_prep_ring, *rx_pending_ring; +extern struct rte_mempool *mbuf_pool; extern volatile int quit; extern cmdline_parse_ctx_t simple_mp_ctx[]; From 1219fc733139f5933e62432def276c996a111fa8 Mon Sep 17 00:00:00 2001 From: Kyle Kyrazis Date: Wed, 2 Nov 2022 14:16:35 +0000 Subject: [PATCH 4/5] got rid of some doing anything useful with the fill ring --- src/lib/ciul/efswxtch_vi.c | 77 ++++++++++++++++----------- test_programs/mock_xnic/main.c | 32 +++++------ test_programs/mock_xnic/mp_commands.c | 3 +- test_programs/mock_xnic/mp_commands.h | 1 + 4 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/lib/ciul/efswxtch_vi.c b/src/lib/ciul/efswxtch_vi.c index e389c1a2a..e197ba14a 100644 --- a/src/lib/ciul/efswxtch_vi.c +++ b/src/lib/ciul/efswxtch_vi.c @@ -15,6 +15,7 @@ static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; static const char *_TX_PREP_RING = "TX_PREP_RING"; static const char *_RX_PREP_RING = "RX_PREP_RING"; static const char *_RX_PENDING_RING = "RX_PENDING_RING"; +static const unsigned RECEIVE_PUSH_SIZE = 16; typedef struct swxtch_rings { struct rte_mempool *mempool; // basic mempool to pull mbufs from @@ -33,31 +34,35 @@ typedef struct swxtch_rings { static swxtch_rings m_rings; +// testing using this as our "fill pkt" +static int fake_fill_pkt = 1; + // drain a ring on startup to free any stuck mbufs -void efswxtch_drain_ring(struct rte_ring *ring) +void efswxtch_drain_ring(struct rte_ring *ring, int should_free) { unsigned available = 0; int count = 0; int burst_size = 32; - struct rte_mbuf *bufs[burst_size]; + void *bufs[burst_size]; do { - count = rte_ring_dequeue_burst( - ring, (void **) &bufs[0], burst_size, &available); + count = rte_ring_dequeue_burst(ring, &bufs[0], burst_size, &available); - rte_pktmbuf_free_bulk(bufs, count); + if( should_free ) { + rte_pktmbuf_free_bulk((struct rte_mbuf **) bufs, count); + } } while( available != 0 ); } void efswxtch_drain_rings(void) { - efswxtch_drain_ring(m_rings.rx_fill_ring); - efswxtch_drain_ring(m_rings.tx_ring); - efswxtch_drain_ring(m_rings.rx_ring); - efswxtch_drain_ring(m_rings.rx_prep_ring); - efswxtch_drain_ring(m_rings.tx_prep_ring); - efswxtch_drain_ring(m_rings.tx_comp_ring); - efswxtch_drain_ring(m_rings.rx_pending_ring); + efswxtch_drain_ring(m_rings.rx_fill_ring, 0); + efswxtch_drain_ring(m_rings.tx_ring, 1); + efswxtch_drain_ring(m_rings.rx_ring, 1); + efswxtch_drain_ring(m_rings.rx_prep_ring, 0); + efswxtch_drain_ring(m_rings.tx_prep_ring, 1); + efswxtch_drain_ring(m_rings.tx_comp_ring, 1); + efswxtch_drain_ring(m_rings.rx_pending_ring, 1); } int efswxtch_init_rings(void) @@ -296,7 +301,6 @@ static int efswxtch_ef_vi_receive_init( { ef_vi_rxq *q = &vi->vi_rxq; ef_vi_rxq_state *qs = &vi->ep_state->rxq; - struct rte_mbuf *mbufs[1]; int i; if( qs->added - qs->removed >= q->mask ) return -EAGAIN; @@ -304,32 +308,43 @@ static int efswxtch_ef_vi_receive_init( i = qs->added++ & q->mask; q->ids[i] = dma_id; - if( rte_mempool_get(m_rings.mempool, (void **) &mbufs[0]) == 0 ) { - if( ! efswxtch_ef_vi_safe_enqueue(m_rings.rx_prep_ring, mbufs, 1) ) { - return -2; - } - } else { - ef_log("Unable to get mbuf to enqueue on the rx prep ring: %d left", - rte_mempool_avail_count(m_rings.mempool)); - return -1; + if( rte_ring_enqueue(m_rings.rx_prep_ring, &fake_fill_pkt) != 0 ) { + ef_log("Unable to initalize the receive queue"); + return -EAGAIN; } + /* + if( rte_mempool_get(m_rings.mempool, (void **) &mbufs[0]) == 0 ) { + if( ! efswxtch_ef_vi_safe_enqueue(m_rings.rx_prep_ring, mbufs, 1) ) { + return -2; + } + } else { + ef_log("Unable to get mbuf to enqueue on the rx prep ring: %d left", + rte_mempool_avail_count(m_rings.mempool)); + return -1; + } + */ + return 0; } static void efswxtch_ef_vi_receive_push(ef_vi *vi) { - int size = rte_ring_count(m_rings.rx_prep_ring); - struct rte_mbuf *mbufs[size]; - int dequeued = rte_ring_dequeue_burst( - m_rings.rx_prep_ring, (void **) &mbufs[0], size, NULL); - if( dequeued == 0 ) { - ef_log("failed to get rx prep ring buffs"); - return; - } + unsigned available = 0; + void *fake_pkts[RECEIVE_PUSH_SIZE]; + do { + int dequeued = rte_ring_dequeue_burst( + m_rings.rx_prep_ring, fake_pkts, RECEIVE_PUSH_SIZE, &available); - efswxtch_ef_vi_safe_enqueue( - m_rings.rx_fill_ring, (struct rte_mbuf **) &mbufs[0], dequeued); + if( dequeued == 0 ) { + ef_log("failed to get rx prep ring buffs"); + return; + } + if( rte_ring_enqueue_bulk( + m_rings.rx_fill_ring, fake_pkts, dequeued, NULL) == 0 ) { + ef_log("Unable to enqueue the fake pkts onto the fill ring"); + } + } while( available != 0 ); } diff --git a/test_programs/mock_xnic/main.c b/test_programs/mock_xnic/main.c index 6a748694d..55ab7cef2 100644 --- a/test_programs/mock_xnic/main.c +++ b/test_programs/mock_xnic/main.c @@ -74,10 +74,11 @@ static const unsigned MAX_MESSAGE_SIZE = 2048; #define BURST_SIZE 32 struct rte_mempool *mbuf_pool; +unsigned long idle_count = 0; volatile int quit = 0; struct rte_mbuf *tx_bufs[BURST_SIZE]; -struct rte_mbuf *temp_rx_bufs[BURST_SIZE]; +void *rx_fill_pkts[BURST_SIZE]; struct rte_mbuf *rx_bufs[BURST_SIZE]; struct rte_mbuf *rx_final_bufs[BURST_SIZE]; @@ -241,10 +242,10 @@ static void bulk_free(struct rte_mbuf **mbufs, unsigned length) static int receive(uint16_t port) { - int allowed = rte_ring_dequeue_burst( - rx_fill_ring, (void **) &temp_rx_bufs[0], BURST_SIZE, NULL); + int allowed = + rte_ring_dequeue_burst(rx_fill_ring, rx_fill_pkts, BURST_SIZE, NULL); - if( allowed == 0 ) { + if( unlikely(allowed == 0) ) { return 0; } @@ -254,7 +255,7 @@ static int receive(uint16_t port) // recycle any unused packets if( unlikely(recv != allowed) ) { rte_ring_enqueue_bulk( - rx_fill_ring, (void **) &temp_rx_bufs[recv], allowed - recv, NULL); + rx_fill_ring, &rx_fill_pkts[recv], allowed - recv, NULL); } @@ -266,8 +267,10 @@ static int receive(uint16_t port) // drop this because it's breaking everything for now if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_IPV6 ) { // recycle unused buffers - rte_ring_enqueue(rx_fill_ring, temp_rx_bufs[i]); + rte_ring_enqueue(rx_fill_ring, rx_fill_pkts[i]); } else if( ntohs(eth_h->ether_type) == RTE_ETHER_TYPE_ARP ) { + rte_ring_enqueue(rx_fill_ring, rx_fill_pkts[i]); + /* struct rte_arp_hdr *arp = (struct rte_arp_hdr *) (eth_h + 1); if( ntohs(arp->arp_opcode) == RTE_ARP_OP_REPLY ) { char ethStr[50]; @@ -282,10 +285,9 @@ static int receive(uint16_t port) printf("Failed to add neighbor\n"); } - rte_ring_enqueue(rx_fill_ring, temp_rx_bufs[i]); } + */ } else { - rte_pktmbuf_free(temp_rx_bufs[i]); rx_final_bufs[enqueueCount++] = rx_bufs[i]; } } @@ -328,7 +330,6 @@ static int transmit(uint16_t port) if( likely(end == 0) ) { break; } - usleep(10); } if( unlikely(start != allowed) ) { @@ -340,20 +341,19 @@ static int transmit(uint16_t port) return start; } + struct rte_mbuf *comp_count[allowed]; - struct rte_mbuf *comp_count[start]; - - if( unlikely(rte_mempool_get_bulk(mbuf_pool, (void **) comp_count, start) != - 0) ) { + if( unlikely(rte_mempool_get_bulk( + mbuf_pool, (void **) comp_count, allowed) != 0) ) { printf("Unable to get pkts to marks as completed\n"); return start; } if( unlikely(rte_ring_enqueue_bulk(tx_completion_ring, (void **) comp_count, - start, NULL) == 0) ) { + allowed, NULL) == 0) ) { printf("FAILED to mark tx completed\n"); - bulk_free(tx_bufs, start); + bulk_free(comp_count, allowed); } return start; } @@ -398,7 +398,7 @@ static int lcore_run(__attribute__((unused)) void *arg) int recved = receive(port); int sent = transmit(port); if( recved == 0 && sent == 0 ) { - usleep(10); + idle_count++; } } } diff --git a/test_programs/mock_xnic/mp_commands.c b/test_programs/mock_xnic/mp_commands.c index 9735c112a..1d2e725a0 100644 --- a/test_programs/mock_xnic/mp_commands.c +++ b/test_programs/mock_xnic/mp_commands.c @@ -99,6 +99,7 @@ static void dump_rings(__attribute__((unused)) void *parsed_result, { rte_mempool_dump(stdout, mbuf_pool); cmdline_printf(cl, + "Idle Count: %ld\n" "TX Ring Count: %d:%d\n" "TX Comp Ring Count: %d:%d\n" "RX Fill Ring Count: %d:%d\n" @@ -106,7 +107,7 @@ static void dump_rings(__attribute__((unused)) void *parsed_result, "RX Prep Ring Count: %d:%d\n" "TX Prep Ring Count: %d:%d\n" "RX Pending Ring Count: %d:%d\n", - rte_ring_count(tx_ring), rte_ring_get_capacity(tx_ring), + idle_count, rte_ring_count(tx_ring), rte_ring_get_capacity(tx_ring), rte_ring_count(tx_completion_ring), rte_ring_get_capacity(tx_completion_ring), rte_ring_count(rx_fill_ring), rte_ring_get_capacity(rx_fill_ring), rte_ring_count(rx_ring), diff --git a/test_programs/mock_xnic/mp_commands.h b/test_programs/mock_xnic/mp_commands.h index 4e9fe14a9..6ad9862de 100644 --- a/test_programs/mock_xnic/mp_commands.h +++ b/test_programs/mock_xnic/mp_commands.h @@ -8,6 +8,7 @@ extern struct rte_ring *tx_ring, *tx_completion_ring, *rx_ring, *rx_fill_ring, *rx_prep_ring, *tx_prep_ring, *rx_pending_ring; extern struct rte_mempool *mbuf_pool; +extern unsigned long idle_count; extern volatile int quit; extern cmdline_parse_ctx_t simple_mp_ctx[]; From 48615bc3fb488df36eed162ef4fa98cfd082b4f7 Mon Sep 17 00:00:00 2001 From: Kyle Kyrazis Date: Thu, 3 Nov 2022 16:50:07 +0000 Subject: [PATCH 5/5] Statically build Onload, Remove REUSE_PORT support --- .vscode/settings.json | 4 +- mk/before.mk | 13 +- mk/linux_gcc.mk | 2 +- scripts/onload_mkdist | 12 +- scripts/onload_profiles/swxtch.opf | 15 +- src/include/ci/internal/ip.h | 3230 ++++++++--------- .../ci/internal/transport_config_opt.h | 301 +- src/lib/ciul/efswxtch_vi.c | 270 +- src/lib/ciul/efxdp_vi.c | 95 +- src/lib/ciul/mmake.mk | 9 +- src/lib/efthrm/tcp_helper_endpoint.c | 317 +- src/lib/transport/ip/ip_internal.h | 34 +- src/lib/transport/ip/netif_event.c | 2 + src/lib/transport/ip/netif_pkt.c | 141 +- src/lib/transport/ip/netif_table.c | 353 +- src/lib/transport/ip/netif_tx.c | 6 +- src/lib/transport/ip/tcp_connect.c | 7 +- src/lib/transport/ip/tcp_helper.c | 181 +- src/lib/transport/ip/tcp_send.c | 1237 +++---- src/lib/transport/ip/udp_connect.c | 368 +- src/lib/transport/ip/udp_send.c | 624 ++-- src/lib/transport/unix/dpdk.c | 4 +- src/lib/transport/unix/fdtable.c | 923 ++--- src/lib/transport/unix/mmake.mk | 10 +- src/lib/transport/unix/startup.c | 394 +- src/lib/transport/unix/udp_fd.c | 373 +- src/tests/ef_vi/mmake.mk | 6 +- src/tests/rtt/mmake.mk | 6 +- src/tests/trade_sim/mmake.mk | 8 +- src/tests/unit/mmake.mk | 2 - src/tools/ip/mmake.mk | 5 +- src/tools/onload_remote_monitor/mmake.mk | 5 +- test_programs/bin/sockperf | Bin 0 -> 48920096 bytes test_programs/mock_xnic/Makefile | 11 +- test_programs/mock_xnic/main.c | 237 +- test_programs/mock_xnic/mp_commands.c | 6 +- test_programs/mock_xnic/mp_commands.h | 2 +- test_programs/share/doc/sockperf/README.md | 81 + test_programs/share/doc/sockperf/authors | 2 + test_programs/share/doc/sockperf/copying | 28 + test_programs/share/doc/sockperf/news | 0 test_programs/share/doc/sockperf/version | 1 + test_programs/udp_receiver.py | 14 +- test_programs/udp_sender.py | 2 + test_programs/udp_sender_eth0.py | 37 + 45 files changed, 4739 insertions(+), 4639 deletions(-) create mode 100755 test_programs/bin/sockperf create mode 100644 test_programs/share/doc/sockperf/README.md create mode 100644 test_programs/share/doc/sockperf/authors create mode 100644 test_programs/share/doc/sockperf/copying create mode 100644 test_programs/share/doc/sockperf/news create mode 100644 test_programs/share/doc/sockperf/version create mode 100644 test_programs/udp_sender_eth0.py diff --git a/.vscode/settings.json b/.vscode/settings.json index fd76620f3..9472eba41 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,7 @@ { "files.associations": { - "ip_internal.h": "c" + "ip_internal.h": "c", + "*.tmpl": "c", + "functional": "c" } } diff --git a/mk/before.mk b/mk/before.mk index a5b3d20f8..6b0b4f8ca 100644 --- a/mk/before.mk +++ b/mk/before.mk @@ -44,8 +44,7 @@ export cxxflags # Include directories. # MMAKE_INCLUDE_DIR := $(TOPPATH)/src/include -MMAKE_INCLUDE := -I. -I$(BUILD)/include -I$(MMAKE_INCLUDE_DIR) -I/usr/local/include - +MMAKE_INCLUDE := -I. -I$(BUILD)/include -I$(MMAKE_INCLUDE_DIR) ###################################################################### @@ -106,3 +105,13 @@ default_all: all nullstring:= space=$(nullstring) #<-do not edit this line + +# Definition of all of the DPDK libs. If subdirectories need to link to DPDK they can just reference +# this variable to include it. This matches the same setup that we have for REPL +DPDK_STATIC_LOCATIONS = -L$(RTE_SDK)/build/lib -L$(RTE_SDK)/build/drivers +DPDK_STATIC_LIBS = -lrte_hash -lrte_cmdline -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_mempool_ring -lrte_kni -lrte_ethdev -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring -lrte_kvargs -lrte_pmd_bond -lrte_pmd_virtio -lrte_pmd_enic -lrte_pmd_i40e -lrte_pmd_ixgbe -lrte_net -lrte_pmd_e1000 -lrte_pmd_ring -lrte_pmd_af_packet -lrte_pmd_mlx4 -lrte_pmd_mlx5 -lrte_pmd_ena -lrte_pmd_failsafe -lrte_pmd_netvsc -lrte_pmd_vdev_netvsc -lrte_bus_vmbus -lrte_pmd_tap -lrte_gso -lrte_timer -lrte_meter +DPDK_DYN_LIBS = -lm -ldl -lnuma -libverbs -lmlx4 -lmlx5 +DPDK_STATIC = -Wl,-Bstatic -Wl,--whole-archive +DPDK_DYNAMIC = -Wl,--no-whole-archive -Wl,-Bdynamic +DEFAULT_DPDK := $(DPDK_STATIC_LOCATIONS) $(DPDK_STATIC) $(DPDK_STATIC_LIBS) $(DPDK_DYNAMIC) $(DPDK_DYN_LIBS) + diff --git a/mk/linux_gcc.mk b/mk/linux_gcc.mk index 7672d4e35..524eb8c13 100644 --- a/mk/linux_gcc.mk +++ b/mk/linux_gcc.mk @@ -194,7 +194,7 @@ endef define MMakeLinkCApp set -x; \ -$(CLINK) $(MMAKE_CARCH) $(CFLAGS) $(MMAKE_DPDK) -Wl,-E $(MMAKE_DIR_LINKFLAGS) $(filter %.o,$^) \ +$(CLINK) $(MMAKE_CARCH) $(CFLAGS) -Wl,-E $(MMAKE_DIR_LINKFLAGS) $(filter %.o,$^) \ $$libs -lm -lpthread -lrt -lresolv -lanl $(MMAKE_DPDK_LIBS) -o $@ endef diff --git a/scripts/onload_mkdist b/scripts/onload_mkdist index a0f588eb7..dd75f346e 100755 --- a/scripts/onload_mkdist +++ b/scripts/onload_mkdist @@ -226,12 +226,12 @@ done < <(find . -type d) preprocess_source verstub=$(echo "$version" | sed -e 's/-test.*//' -e 's/-rc.*//') -if [ -f ChangeLog ] && ! grep -q "$verstub" ChangeLog; then - bad "Nothing in the ChangeLog for this version" -fi -if [ -f ReleaseNotes ] && ! grep -q "$verstub" ReleaseNotes; then - bad "Nothing in the ReleaseNotes for this version" -fi +#if [ -f ChangeLog ] && ! grep -q "$verstub" ChangeLog; then +# bad "Nothing in the ChangeLog for this version" +#fi +#if [ -f ReleaseNotes ] && ! grep -q "$verstub" ReleaseNotes; then +# bad "Nothing in the ReleaseNotes for this version" +#fi # Get rid of junk! find . -type f -name '.#*' -exec rm "{}" \; diff --git a/scripts/onload_profiles/swxtch.opf b/scripts/onload_profiles/swxtch.opf index d06dfba1d..7331f5e4c 100644 --- a/scripts/onload_profiles/swxtch.opf +++ b/scripts/onload_profiles/swxtch.opf @@ -5,4 +5,17 @@ onload_set EF_TCP_RECV_SPIN 1 onload_set EF_TCP_SEND_SPIN 1 onload_set EF_UDP_RECV_SPIN 1 onload_set EF_UDP_SEND_SPIN 1 -#onload_set EF_UNIX_LOG 0xFFFFFFFFFFF # this is a crappy bitmask that can be found in opts_citp_def.h and it only seems to kind of work +onload_set EF_MAX_ENDPOINTS 16384 +onload_set EF_TXQ_SIZE 2048 +onload_set EF_CLUSTER_SIZE 0 +#onload_set EF_MAX_PACKETS 2097152 +#onload_set EF_MAX_TX_PACKETS 1048576 +#onload_set EF_PREALLOC_PACKETS 1 +onload_set EF_USE_HUGE_PAGES 2 +#onload_set EF_UDP_FORCE_REUSEPORT 0 +#onload_set EF_UNIX_LOG 0xFFFFFFFFFFFFFFFFFFFF # this is a crappy bitmask that can be found in opts_citp_def.h and it only seems to kind of work +#onload_set EF_CTPIO 0 +#onload_set EF_PIO 0 +#onload_set EF_EPOLL_MT_SAFE 1 +#onload_set EF_INT_DRIVEN 0 +#onload_set EF_HIGH_THROUGHPUT_MODE 1 diff --git a/src/include/ci/internal/ip.h b/src/include/ci/internal/ip.h index eaa24c625..e6f409b28 100644 --- a/src/include/ci/internal/ip.h +++ b/src/include/ci/internal/ip.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief Decls & defs for IP library internal to our libraries. @@ -48,9 +48,9 @@ #endif #ifdef __KERNEL__ -# include -# include -# include +#include +#include +#include #endif #include @@ -93,44 +93,40 @@ extern const char* oo_uk_intf_ver; **********************************************************************/ #if ! CI_CFG_DETAILED_CHECKS || defined(NDEBUG) -# define CHECK_NI(ni) -# define CHECK_TS(ni,ts) -# define CHECK_TLS(ni,ts) -# define CHECK_TEP(ep) -# define CHECK_US(ni,ts) -# define CHECK_UEP(ep) -# define CHECK_TIMERS(ni) -# define CHECK_FREEPKTS(ni) -# define CHECK_TEP_NNL(ep) +#define CHECK_NI(ni) +#define CHECK_TS(ni, ts) +#define CHECK_TLS(ni, ts) +#define CHECK_TEP(ep) +#define CHECK_US(ni, ts) +#define CHECK_UEP(ep) +#define CHECK_TIMERS(ni) +#define CHECK_FREEPKTS(ni) +#define CHECK_TEP_NNL(ep) #else -# define CHECK_NI(ni) \ - ci_netif_assert_valid(ni,__FILE__,__LINE__) +#define CHECK_NI(ni) ci_netif_assert_valid(ni, __FILE__, __LINE__) -# define CHECK_TS(ni,ts) \ - ci_tcp_state_assert_valid((ni), (ts), __FILE__,__LINE__) +#define CHECK_TS(ni, ts) \ + ci_tcp_state_assert_valid((ni), (ts), __FILE__, __LINE__) -# define CHECK_TLS(ni, tls) \ - ci_tcp_state_listen_assert_valid((ni), (tls), __FILE__,__LINE__) +#define CHECK_TLS(ni, tls) \ + ci_tcp_state_listen_assert_valid((ni), (tls), __FILE__, __LINE__) -# define CHECK_TEP(ep) \ - ci_tcp_ep_assert_valid(ep, __FILE__, __LINE__) +#define CHECK_TEP(ep) ci_tcp_ep_assert_valid(ep, __FILE__, __LINE__) -# define CHECK_US(ni,ts) \ - ci_udp_state_assert_valid((ni), (ts), __FILE__, __LINE__) +#define CHECK_US(ni, ts) \ + ci_udp_state_assert_valid((ni), (ts), __FILE__, __LINE__) -# define CHECK_UEP(ep) \ - ci_udp_ep_assert_valid(ep, __FILE__, __LINE__) +#define CHECK_UEP(ep) ci_udp_ep_assert_valid(ep, __FILE__, __LINE__) -# define CHECK_TIMERS(ni) \ - ci_ip_timer_state_assert_valid((ni), __FILE__, __LINE__) +#define CHECK_TIMERS(ni) \ + ci_ip_timer_state_assert_valid((ni), __FILE__, __LINE__) -# define CHECK_FREEPKTS(ni) \ - ci_netif_verify_freepkts(ni, __FILE__, __LINE__); +#define CHECK_FREEPKTS(ni) ci_netif_verify_freepkts(ni, __FILE__, __LINE__); /* This is intended to allow some checking to be done without the netif * lock held. At the moment it does nothing. */ -# define CHECK_TEP_NNL(ep) +#define CHECK_TEP_NNL(ep) #endif @@ -140,62 +136,60 @@ extern const char* oo_uk_intf_ver; *********************************************************************/ /* It should be equal to EFX_MAX_MTU from driver/linux_net/net_driver.h */ -#define CI_PMTU_MAX_MTU (9 * 1024) +#define CI_PMTU_MAX_MTU (9 * 1024) -#define LOG_PMTU(x) LOG_IPP(x) +#define LOG_PMTU(x) LOG_IPP(x) /* Path MTU plateau table entries (stored in ci_tcp_state) */ -#define CI_PMTU_PLATEAU_ENTRIES \ - { 68, 296, 508, 1006, 1492, 2002, 4352, 8166, 32000, 65535 } -#define CI_PMTU_PLATEAU_ENTRY_MAX 9 +#define CI_PMTU_PLATEAU_ENTRIES \ + { \ + 68, 296, 508, 1006, 1492, 2002, 4352, 8166, 32000, 65535 \ + } +#define CI_PMTU_PLATEAU_ENTRY_MAX 9 -extern void -ci_pmtu_state_init(ci_netif* ni, ci_sock_cmn *s, oo_p pmtu_sp, - ci_pmtu_state_t* pmtus, int func_code); -extern void ci_pmtu_set(ci_netif *ni, ci_pmtu_state_t *pmtus, unsigned pmtu); +extern void ci_pmtu_state_init(ci_netif* ni, ci_sock_cmn* s, oo_p pmtu_sp, + ci_pmtu_state_t* pmtus, int func_code); +extern void ci_pmtu_set(ci_netif* ni, ci_pmtu_state_t* pmtus, unsigned pmtu); /*! IP timer callback for Path MTU discovery process */ extern void ci_pmtu_timeout_pmtu(ci_netif* ni, ci_pmtu_state_t* pmtu) CI_HF; -extern void ci_pmtu_update_fast(ci_netif *ni, ci_pmtu_state_t *pmtus, - ci_ip_cached_hdrs *ipcache, - unsigned mtu) CI_HF; -extern void ci_pmtu_update_slow(ci_netif *ni, ci_pmtu_state_t *pmtus, - ci_ip_cached_hdrs *ipcache, - unsigned mtu) CI_HF; +extern void ci_pmtu_update_fast(ci_netif* ni, ci_pmtu_state_t* pmtus, + ci_ip_cached_hdrs* ipcache, unsigned mtu) CI_HF; +extern void ci_pmtu_update_slow(ci_netif* ni, ci_pmtu_state_t* pmtus, + ci_ip_cached_hdrs* ipcache, unsigned mtu) CI_HF; -#define CI_PMTU_STOP_TIMER ((ci_iptime_t)0) -#define CI_PMTU_IMMEDIATE_TIMEOUT ((ci_iptime_t)1) +#define CI_PMTU_STOP_TIMER ((ci_iptime_t) 0) +#define CI_PMTU_IMMEDIATE_TIMEOUT ((ci_iptime_t) 1) -#define CI_PMTU_TIMER_SET_FAST(ni, p) \ +#define CI_PMTU_TIMER_SET_FAST(ni, p) \ ci_pmtu_discover_timer((ni), (p), NI_CONF(ni).tconst_pmtu_discover_fast) -#define CI_PMTU_TIMER_SET_SLOW(ni, p) \ +#define CI_PMTU_TIMER_SET_SLOW(ni, p) \ ci_pmtu_discover_timer((ni), (p), NI_CONF(ni).tconst_pmtu_discover_slow) -#define CI_PMTU_TIMER_SET_RECOVER(ni, p) \ +#define CI_PMTU_TIMER_SET_RECOVER(ni, p) \ ci_pmtu_discover_timer((ni), (p), NI_CONF(ni).tconst_pmtu_discover_recover) -#define CI_PMTU_TIMER_KILL(ni, p) \ - ci_pmtu_discover_timer( (ni), (p), CI_PMTU_STOP_TIMER ) -#define CI_PMTU_TIMER_NOW(ni, p) \ - ci_pmtu_discover_timer( (ni), (p), CI_PMTU_IMMEDIATE_TIMEOUT ) - +#define CI_PMTU_TIMER_KILL(ni, p) \ + ci_pmtu_discover_timer((ni), (p), CI_PMTU_STOP_TIMER) +#define CI_PMTU_TIMER_NOW(ni, p) \ + ci_pmtu_discover_timer((ni), (p), CI_PMTU_IMMEDIATE_TIMEOUT) /*! Initializes an IP cache * (to use this macro include ) */ -#define ci_ip_cache_init_common(ipcache, af) \ -do { \ - ci_ip_cache_invalidate(ipcache); \ - (ipcache)->status = retrrc_noroute; \ - (ipcache)->intf_i = -1; \ - (ipcache)->hwport = CI_HWPORT_ID_BAD; \ - (ipcache)->ether_type = ci_af2ethertype(af); \ - (ipcache)->flags = 0; \ - (ipcache)->nexthop = addr_any; \ - ipcache_ttl(ipcache) = CI_IPX_DFLT_TTL_HOPLIMIT(af); \ -} while (0) +#define ci_ip_cache_init_common(ipcache, af) \ + do { \ + ci_ip_cache_invalidate(ipcache); \ + (ipcache)->status = retrrc_noroute; \ + (ipcache)->intf_i = -1; \ + (ipcache)->hwport = CI_HWPORT_ID_BAD; \ + (ipcache)->ether_type = ci_af2ethertype(af); \ + (ipcache)->flags = 0; \ + (ipcache)->nexthop = addr_any; \ + ipcache_ttl(ipcache) = CI_IPX_DFLT_TTL_HOPLIMIT(af); \ + } while( 0 ) #define ci_ip_cache_init(ipcache, af) ci_ip_cache_init_common(ipcache, af) @@ -221,8 +215,7 @@ static inline cp_fwd_table_id ci_ni_fwd_table_id(ci_netif* ni) /*! Invalidates a ci_ip_cached_hdrs struct i.e. all state becomes out-of-date. */ -ci_inline void -ci_ip_cache_invalidate(ci_ip_cached_hdrs* ipcache) +ci_inline void ci_ip_cache_invalidate(ci_ip_cached_hdrs* ipcache) { oo_cp_verinfo_init(&ipcache->fwd_ver); oo_cp_verinfo_init(&ipcache->fwd_ver_init_net); @@ -230,16 +223,15 @@ ci_ip_cache_invalidate(ci_ip_cached_hdrs* ipcache) } -static inline int -oo_cp_ipcache_is_valid(ci_netif* ni, ci_ip_cached_hdrs* ipcache) +static inline int oo_cp_ipcache_is_valid( + ci_netif* ni, ci_ip_cached_hdrs* ipcache) { - int rc = oo_cp_verinfo_is_valid(ni->cplane, &ipcache->fwd_ver, - ci_ni_fwd_table_id(ni)); + int rc = oo_cp_verinfo_is_valid( + ni->cplane, &ipcache->fwd_ver, ci_ni_fwd_table_id(ni)); if( rc && ipcache->fwd_ver_init_net.id != CICP_MAC_ROWID_UNUSED ) { rc = ni->cplane_init_net != NULL && oo_cp_verinfo_is_valid(ni->cplane_init_net, - &ipcache->fwd_ver_init_net, - ci_ni_fwd_table_id(ni)); + &ipcache->fwd_ver_init_net, ci_ni_fwd_table_id(ni)); } return rc; } @@ -253,78 +245,77 @@ oo_cp_ipcache_is_valid(ci_netif* ni, ci_ip_cached_hdrs* ipcache) #define TX_PKT_LEN(pkt) (pkt)->pay_len /* Offset of current buffer position from start of TCP payload. */ -#define PKT_RX_BUF_OFF(pkt) \ - ((ci_uint32)(oo_offbuf_ptr(&(pkt)->buf) - CI_TCP_PAYLOAD(PKT_TCP_HDR(pkt)))) +#define PKT_RX_BUF_OFF(pkt) \ + ((ci_uint32) (oo_offbuf_ptr(&(pkt)->buf) - CI_TCP_PAYLOAD(PKT_TCP_HDR(pkt)))) -#define PKT_IPX_RX_BUF_OFF(af, pkt) \ - ((ci_uint32)(oo_offbuf_ptr(&(pkt)->buf) - \ - CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)))) +#define PKT_IPX_RX_BUF_OFF(af, pkt) \ + ((ci_uint32) (oo_offbuf_ptr(&(pkt)->buf) - \ + CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)))) /* Sequence number at the current buffer position. */ -#define PKT_RX_BUF_SEQ(pkt) \ +#define PKT_RX_BUF_SEQ(pkt) \ (CI_BSWAP_BE32(PKT_TCP_HDR(pkt)->tcp_seq_be32) + PKT_RX_BUF_OFF(pkt)) -#define PKT_IPX_RX_BUF_SEQ(af, pkt) \ +#define PKT_IPX_RX_BUF_SEQ(af, pkt) \ (CI_BSWAP_BE32(PKT_IPX_TCP_HDR(af, pkt)->tcp_seq_be32) + \ - PKT_IPX_RX_BUF_OFF(af, pkt)) + PKT_IPX_RX_BUF_OFF(af, pkt)) -#define PKT_TCP_RX_BUF_ASSERT_VALID(ni, pkt) \ - OO_OFFBUF_ASSERT_VALID(&(pkt)->buf, PKT_START(pkt), \ - (pkt) + CI_CFG_PKT_BUF_SIZE) +#define PKT_TCP_RX_BUF_ASSERT_VALID(ni, pkt) \ + OO_OFFBUF_ASSERT_VALID( \ + &(pkt)->buf, PKT_START(pkt), (pkt) + CI_CFG_PKT_BUF_SIZE) -#define PKT_START(pkt) ((char*) oo_ether_hdr(pkt)) +#define PKT_START(pkt) ((char*) oo_ether_hdr(pkt)) -#define PKT_TCP_HDR(pkt) ((ci_tcp_hdr*) oo_ip_data(pkt)) +#define PKT_TCP_HDR(pkt) ((ci_tcp_hdr*) oo_ip_data(pkt)) static inline ci_tcp_hdr* ci_pkt_ipx_tcp_hdr(int af, ci_ip_pkt_fmt* pkt) - { return oo_ipx_data(af, pkt); } +{ + return oo_ipx_data(af, pkt); +} #define PKT_IPX_TCP_HDR(af, pkt) ci_pkt_ipx_tcp_hdr(af, pkt) /*! Find the amount of data in an outgoing packet */ -#define PKT_TCP_TX_SEQ_SPACE(pkt) \ - (SEQ_SUB((pkt)->pf.tcp_tx.end_seq, (pkt)->pf.tcp_tx.start_seq)) +#define PKT_TCP_TX_SEQ_SPACE(pkt) \ + (SEQ_SUB((pkt)->pf.tcp_tx.end_seq, (pkt)->pf.tcp_tx.start_seq)) -#define TX_PKT_TCP(pkt) ((ci_tcp_hdr*) oo_tx_ipx_data(oo_pkt_af(pkt), pkt)) -#define TX_PKT_UDP(pkt) ((ci_udp_hdr*) oo_tx_ipx_data(oo_pkt_af(pkt), pkt)) -#define TX_PKT_SPORT_BE16(pkt) (((ci_uint16*) oo_tx_ip_data(pkt))[0]) -#define TX_PKT_DPORT_BE16(pkt) (((ci_uint16*) oo_tx_ip_data(pkt))[1]) +#define TX_PKT_TCP(pkt) ((ci_tcp_hdr*) oo_tx_ipx_data(oo_pkt_af(pkt), pkt)) +#define TX_PKT_UDP(pkt) ((ci_udp_hdr*) oo_tx_ipx_data(oo_pkt_af(pkt), pkt)) +#define TX_PKT_SPORT_BE16(pkt) (((ci_uint16*) oo_tx_ip_data(pkt))[0]) +#define TX_PKT_DPORT_BE16(pkt) (((ci_uint16*) oo_tx_ip_data(pkt))[1]) #define TX_PKT_IPX_SPORT(af, pkt) (((ci_uint16*) oo_tx_ipx_data(af, pkt))[0]) #define TX_PKT_IPX_DPORT(af, pkt) (((ci_uint16*) oo_tx_ipx_data(af, pkt))[1]) -#define TX_PKT_IPX_HDR(af, pkt) ((ci_ipx_hdr_t*) (oo_tx_ipx_hdr(af, pkt))) +#define TX_PKT_IPX_HDR(af, pkt) ((ci_ipx_hdr_t*) (oo_tx_ipx_hdr(af, pkt))) -#define TX_PKT_PROTOCOL(af, pkt) ipx_hdr_protocol(af, TX_PKT_IPX_HDR(af, pkt)) -#define TX_PKT_TTL(af, pkt) ipx_hdr_ttl(af, TX_PKT_IPX_HDR(af, pkt)) -#define TX_PKT_SADDR(af, pkt) ipx_hdr_saddr(af, TX_PKT_IPX_HDR(af, pkt)) -#define TX_PKT_DADDR(af, pkt) ipx_hdr_daddr(af, TX_PKT_IPX_HDR(af, pkt)) +#define TX_PKT_PROTOCOL(af, pkt) ipx_hdr_protocol(af, TX_PKT_IPX_HDR(af, pkt)) +#define TX_PKT_TTL(af, pkt) ipx_hdr_ttl(af, TX_PKT_IPX_HDR(af, pkt)) +#define TX_PKT_SADDR(af, pkt) ipx_hdr_saddr(af, TX_PKT_IPX_HDR(af, pkt)) +#define TX_PKT_DADDR(af, pkt) ipx_hdr_daddr(af, TX_PKT_IPX_HDR(af, pkt)) #define TX_PKT_SET_SADDR(af, pkt, addr) \ - ipx_hdr_set_saddr(af, TX_PKT_IPX_HDR(af, pkt), (addr)) + ipx_hdr_set_saddr(af, TX_PKT_IPX_HDR(af, pkt), (addr)) #define TX_PKT_SET_DADDR(af, pkt, addr) \ - ipx_hdr_set_daddr(af, TX_PKT_IPX_HDR(af, pkt), (addr)) + ipx_hdr_set_daddr(af, TX_PKT_IPX_HDR(af, pkt), (addr)) #define TX_PKT_SET_FLOWLABEL(af, pkt, flowlabel) \ - ipx_hdr_set_flowlabel(af, TX_PKT_IPX_HDR(af, pkt), (flowlabel)) + ipx_hdr_set_flowlabel(af, TX_PKT_IPX_HDR(af, pkt), (flowlabel)) #define RX_PKT_IPX_HDR(pkt) oo_ipx_hdr(pkt) #define RX_PKT_PROTOCOL(pkt) \ ipx_hdr_protocol(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) -#define RX_PKT_TTL(pkt) \ - ipx_hdr_ttl(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) -#define RX_PKT_SADDR(pkt) \ - ipx_hdr_saddr(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) -#define RX_PKT_DADDR(pkt) \ - ipx_hdr_daddr(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) +#define RX_PKT_TTL(pkt) ipx_hdr_ttl(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) +#define RX_PKT_SADDR(pkt) ipx_hdr_saddr(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) +#define RX_PKT_DADDR(pkt) ipx_hdr_daddr(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) #define RX_PKT_PAYLOAD_LEN(pkt) \ ipx_hdr_tot_len(oo_pkt_af(pkt), RX_PKT_IPX_HDR(pkt)) -static inline ci_udp_hdr* ci_tx_pkt_ipx_udp(int af, ci_ip_pkt_fmt* pkt, - bool is_frag) +static inline ci_udp_hdr* ci_tx_pkt_ipx_udp( + int af, ci_ip_pkt_fmt* pkt, bool is_frag) { if( IS_AF_INET6(af) && is_frag ) - return (ci_udp_hdr*)((uint8_t*)oo_tx_ipx_data(af, pkt) + - sizeof(ci_ip6_frag_hdr)); + return (ci_udp_hdr*) ((uint8_t*) oo_tx_ipx_data(af, pkt) + + sizeof(ci_ip6_frag_hdr)); else return oo_tx_ipx_data(af, pkt); } @@ -335,29 +326,28 @@ static inline ci_tcp_hdr* ci_tx_pkt_ipx_tcp(int af, ci_ip_pkt_fmt* pkt) } #define TX_PKT_IPX_UDP(af, pkt, is_frag) ci_tx_pkt_ipx_udp(af, pkt, is_frag) -#define TX_PKT_IPX_TCP(af, pkt) ci_tx_pkt_ipx_tcp(af, pkt) +#define TX_PKT_IPX_TCP(af, pkt) ci_tx_pkt_ipx_tcp(af, pkt) static inline void* ci_ipx_data_ptr(int af, ci_ipx_hdr_t* hdr) { #if CI_CFG_IPV6 if( af == AF_INET6 ) { return &hdr->ip6 + 1; - } - else + } else #endif { - return (uint8_t*)&hdr->ip4 + CI_IP4_IHL(&hdr->ip4); + return (uint8_t*) &hdr->ip4 + CI_IP4_IHL(&hdr->ip4); } } -static inline ci_uint16 ci_tx_pkt_ipx_tcp_payload_len(int af, ci_ip_pkt_fmt* pkt) +static inline ci_uint16 ci_tx_pkt_ipx_tcp_payload_len( + int af, ci_ip_pkt_fmt* pkt) { ci_uint16 len; #if CI_CFG_IPV6 if( af == AF_INET6 ) { len = oo_tx_l3_len(pkt) - sizeof(ci_ip6_hdr); - } - else + } else #endif { ci_ip4_hdr* ip = oo_tx_ip_hdr(pkt); @@ -371,7 +361,7 @@ static inline ci_uint16 ci_tx_pkt_ipx_tcp_payload_len(int af, ci_ip_pkt_fmt* pkt /*! Get tsval from timestamp option. This had better be a TCP packet with ** a timestamp option! (Horribly inefficient; only use for logging). */ -#define PKT_TCP_TSO_TSVAL(pkt) \ +#define PKT_TCP_TSO_TSVAL(pkt) \ CI_BSWAP_BE32(*(ci_uint32*) (CI_TCP_HDR_OPTS(PKT_TCP_HDR(pkt)) + 4)) #define PKT_IPX_TCP_TSO_TSVAL(af, pkt) \ @@ -380,10 +370,12 @@ static inline ci_uint16 ci_tx_pkt_ipx_tcp_payload_len(int af, ci_ip_pkt_fmt* pkt /* TODO: replace PKT_UDP_HDR and PKT_IOVEC_UDP_PFX by TX-specific and * generic function; see oo_tx_ip_hdr() performance notes. */ -#define PKT_UDP_HDR(pkt) ((ci_udp_hdr*)oo_ip_data(pkt)) +#define PKT_UDP_HDR(pkt) ((ci_udp_hdr*) oo_ip_data(pkt)) static inline ci_udp_hdr* ci_pkt_ipx_udp_hdr(int af, ci_ip_pkt_fmt* pkt) - { return oo_ipx_data(af, pkt); } +{ + return oo_ipx_data(af, pkt); +} #define PKT_IPX_UDP_HDR(af, pkt) ci_pkt_ipx_udp_hdr(af, pkt) @@ -394,58 +386,57 @@ static inline ci_udp_hdr* ci_pkt_ipx_udp_hdr(int af, ci_ip_pkt_fmt* pkt) typedef struct { struct ci_netif_poll_state* poll_state; - ci_netif* ni; + ci_netif* ni; ci_ip_pkt_fmt* pkt; - ci_tcp_hdr* tcp; + ci_tcp_hdr* tcp; /* [flags] can take any of the following values, or any of the tcp ** options flags (e.g. CI_TCPT_FLAG_*). */ -#define CI_TCP_PAWS_FAILED 0x80000000 -#define CI_TCP_SACKED 0x20000000 /* Something is newly SACKed */ -#define CI_TCP_DSACK 0x10000000 /* First SACK block is duplicate */ - - ci_uint32 flags; - ci_uint32 timestamp; /* pointer to timeval, host endian */ - ci_uint32 timestamp_echo; /* pointer to timeval, host endian */ - ci_uint32 sack[8]; /* pointer to first block, host endian */ - ci_int32 sack_blocks; - ci_uint32 ack,seq; /* ACK and SEQ values in host endian */ - ci_uint32 hash; /* hash for l/r addr/port */ +#define CI_TCP_PAWS_FAILED 0x80000000 +#define CI_TCP_SACKED 0x20000000 /* Something is newly SACKed */ +#define CI_TCP_DSACK 0x10000000 /* First SACK block is duplicate */ + + ci_uint32 flags; + ci_uint32 timestamp; /* pointer to timeval, host endian */ + ci_uint32 timestamp_echo; /* pointer to timeval, host endian */ + ci_uint32 sack[8]; /* pointer to first block, host endian */ + ci_int32 sack_blocks; + ci_uint32 ack, seq; /* ACK and SEQ values in host endian */ + ci_uint32 hash; /* hash for l/r addr/port */ } ciip_tcp_rx_pkt; - /********************************************************************** ************************** Network interface ************************** **********************************************************************/ /* The following are used in netic_init.c to decode EF_UDP_OPTIONS */ -#define CI_EF_UDP_UL_RECV_M 0x00000007 -#define CI_EF_UDP_UL_RECV_S 0 +#define CI_EF_UDP_UL_RECV_M 0x00000007 +#define CI_EF_UDP_UL_RECV_S 0 -#define CI_EF_UDP_RECV_FAST_M 0x00000008 -#define CI_EF_UDP_RECV_FAST_S 3 +#define CI_EF_UDP_RECV_FAST_M 0x00000008 +#define CI_EF_UDP_RECV_FAST_S 3 -#define CI_EF_UDP_UL_POLL_M 0x00000070 -#define CI_EF_UDP_UL_POLL_S 4 +#define CI_EF_UDP_UL_POLL_M 0x00000070 +#define CI_EF_UDP_UL_POLL_S 4 -#define NI_ID(ni) ((ni)->state->stack_id) -#define NI_CONF(ni) ((ni)->state->conf) +#define NI_ID(ni) ((ni)->state->stack_id) +#define NI_CONF(ni) ((ni)->state->conf) #ifdef __KERNEL__ -# define NI_OPTS(ni) ((ni)->opts) +#define NI_OPTS(ni) ((ni)->opts) #else -# define NI_OPTS(ni) ((ni)->state->opts) +#define NI_OPTS(ni) ((ni)->state->opts) #endif -#define NI_IPID(ni) (&(ni)->state->ipid) +#define NI_IPID(ni) (&(ni)->state->ipid) #ifdef __KERNEL__ -# define NI_PKT_SET(ni) \ - ( (ni)->packets->id < 0 ? 0 : \ - (ni)->packets->id >= (ni)->pkt_sets_n ? \ - (ni)->pkt_sets_n - 1 : (ni)->packets->id ) +#define NI_PKT_SET(ni) \ + ((ni)->packets->id < 0 ? 0 \ + : (ni)->packets->id >= (ni)->pkt_sets_n ? (ni)->pkt_sets_n - 1 \ + : (ni)->packets->id) #else -# define NI_PKT_SET(ni) ((ni)->packets->id) +#define NI_PKT_SET(ni) ((ni)->packets->id) #endif @@ -453,51 +444,52 @@ extern void ci_netif_config_opts_rangecheck(ci_netif_config_opts* opts) CI_HF; extern void ci_netif_config_opts_getenv(ci_netif_config_opts* opts) CI_HF; extern void ci_netif_config_opts_defaults(ci_netif_config_opts* opts) CI_HF; #ifdef __KERNEL__ -extern void ci_netif_state_init(ci_netif* ni, int cpu_khz, - const char* name) CI_HF; -extern int ci_netif_ctor(ci_netif**, const ci_netif_config_opts*, - unsigned flags) CI_HF; +extern void ci_netif_state_init( + ci_netif* ni, int cpu_khz, const char* name) CI_HF; +extern int ci_netif_ctor( + ci_netif**, const ci_netif_config_opts*, unsigned flags) CI_HF; #else -extern int ci_netif_ctor(ci_netif*, ef_driver_handle, const char* name, - unsigned flags) CI_HF; +extern int ci_netif_ctor( + ci_netif*, ef_driver_handle, const char* name, unsigned flags) CI_HF; extern void ci_netif_cluster_prefault(ci_netif* ni) CI_HF; #endif -extern int ci_netif_restore_id(ci_netif*, unsigned stack_id, bool is_service) CI_HF; -extern int citp_netif_by_id(ci_uint32 stack_id, ci_netif** out_ni, int locked) CI_HF; -extern int ci_netif_restore_name(ci_netif*, const char*) CI_HF; -extern int ci_netif_restore(ci_netif* ni, ci_fd_t fd, - unsigned netif_mmap_bytes) CI_HF; -extern int ci_netif_dtor(ci_netif*) CI_HF; +extern int ci_netif_restore_id( + ci_netif*, unsigned stack_id, bool is_service) CI_HF; +extern int citp_netif_by_id( + ci_uint32 stack_id, ci_netif** out_ni, int locked) CI_HF; +extern int ci_netif_restore_name(ci_netif*, const char*) CI_HF; +extern int ci_netif_restore( + ci_netif* ni, ci_fd_t fd, unsigned netif_mmap_bytes) CI_HF; +extern int ci_netif_dtor(ci_netif*) CI_HF; extern unsigned ci_netif_build_future_intf_mask(ci_netif* ni) CI_HF; -extern void ci_netif_error_detected(ci_netif*, unsigned error_flag, - const char* caller) CI_HF; +extern void ci_netif_error_detected( + ci_netif*, unsigned error_flag, const char* caller) CI_HF; #if OO_DO_STACK_POLL #ifndef __KERNEL__ -extern int ci_netif_poll_intf_future(ci_netif*, int intf_i, ci_uint64 now_frc) - CI_HF; +extern int ci_netif_poll_intf_future( + ci_netif*, int intf_i, ci_uint64 now_frc) CI_HF; #endif -extern int ci_netif_poll_n(ci_netif*, int max_evs) CI_HF; -#define ci_netif_poll(ni) ci_netif_poll_n((ni), NI_OPTS(ni).evs_per_poll) +extern int ci_netif_poll_n(ci_netif*, int max_evs) CI_HF; +#define ci_netif_poll(ni) ci_netif_poll_n((ni), NI_OPTS(ni).evs_per_poll) extern void ci_netif_loopback_pkts_send(ci_netif* ni) CI_HF; #if CI_CFG_WANT_BPF_NATIVE #ifdef __KERNEL__ /* in-kernel backend for ci_netif_evq_poll_k */ -extern int ci_netif_evq_poll(ci_netif*, int intf); +extern int ci_netif_evq_poll(ci_netif*, int intf); #else /* makes syscall to invoke ci_netif_evq_poll */ -extern int ci_netif_evq_poll_k(ci_netif* ni, int intf_i); +extern int ci_netif_evq_poll_k(ci_netif* ni, int intf_i); #endif #endif -extern void ci_netif_tx_pkt_complete(ci_netif*, struct ci_netif_poll_state*, - ci_ip_pkt_fmt*); +extern void ci_netif_tx_pkt_complete( + ci_netif*, struct ci_netif_poll_state*, ci_ip_pkt_fmt*); /* Fake TX complete function called when a packet was deferred because of * no destination MAC, and dropped as a response to various error. */ -ci_inline void -cicp_pkt_complete_fake(ci_netif* ni, ci_ip_pkt_fmt* pkt) +ci_inline void cicp_pkt_complete_fake(ci_netif* ni, ci_ip_pkt_fmt* pkt) { ni->state->nic[pkt->intf_i].tx_bytes_removed -= TX_PKT_LEN(pkt); ci_netif_tx_pkt_complete(ni, NULL, pkt); @@ -513,68 +505,63 @@ ci_inline void ci_netif_send(ci_netif* ni, ci_ip_pkt_fmt* pkt) __ci_netif_send(ni, pkt); } extern bool ci_netif_send_immediate(ci_netif* netif, ci_ip_pkt_fmt* pkt, - const struct ef_vi_tx_extra* extra) CI_HF; + const struct ef_vi_tx_extra* extra) CI_HF; extern int ci_netif_rx_post(ci_netif* netif, int nic_index, ef_vi* vi) CI_HF; #ifdef __KERNEL__ -extern int ci_netif_set_rxq_limit(ci_netif*) CI_HF; -extern int ci_netif_init_fill_rx_rings(ci_netif*) CI_HF; +extern int ci_netif_set_rxq_limit(ci_netif*) CI_HF; +extern int ci_netif_init_fill_rx_rings(ci_netif*) CI_HF; #endif extern ci_uint64 ci_netif_purge_deferred_socket_list(ci_netif* ni) CI_HF; extern void ci_netif_merge_atomic_counters(ci_netif* ni) CI_HF; extern void ci_netif_mem_pressure_pkt_pool_fill(ci_netif*) CI_HF; -extern int ci_netif_mem_pressure_try_exit(ci_netif*) CI_HF; +extern int ci_netif_mem_pressure_try_exit(ci_netif*) CI_HF; extern void ci_netif_timeout_remove(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_netif_timeout_leave(ci_netif* ni, ci_tcp_state* ts) CI_HF; -extern void ci_netif_timeout_reap(ci_netif* ni) CI_HF; +extern void ci_netif_timeout_reap(ci_netif* ni) CI_HF; extern void ci_netif_timeout_state(ci_netif* ni) CI_HF; -extern void ci_netif_timeout_restart(ci_netif *ni, ci_tcp_state *ts) CI_HF; +extern void ci_netif_timeout_restart(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_netif_timewait_enter(ci_netif* ni, ci_tcp_state* ts) CI_HF; -extern int ci_netif_timewait_try_to_free_filter(ci_netif* ni) CI_HF; +extern int ci_netif_timewait_try_to_free_filter(ci_netif* ni) CI_HF; extern void ci_netif_fin_timeout_enter(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_netif_dump(ci_netif* ni) CI_HF; extern void ci_vi_info_dump(ci_netif* ni) CI_HF; -extern void ci_netif_dump_to_logger(ci_netif* ni, oo_dump_log_fn_t logger, - void* log_arg) CI_HF; +extern void ci_netif_dump_to_logger( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_netif_dump_vi_stats(ci_netif* ni) CI_HF; -extern void ci_netif_dump_vi_stats_to_logger(ci_netif* ni, - oo_dump_log_fn_t logger, - void* log_arg) CI_HF; +extern void ci_netif_dump_vi_stats_to_logger( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_netif_dump_extra(ci_netif* ni) CI_HF; -extern void ci_netif_dump_extra_to_logger(ci_netif* ni, - oo_dump_log_fn_t logger, - void *log_arg) CI_HF; +extern void ci_netif_dump_extra_to_logger( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_netif_dump_sockets(ci_netif* ni) CI_HF; -extern void ci_netif_dump_sockets_to_logger(ci_netif* ni, - oo_dump_log_fn_t logger, - void *log_arg) CI_HF; -extern void ci_netif_netstat_sockets_to_logger(ci_netif* ni, - oo_dump_log_fn_t logger, - void *log_arg) CI_HF; +extern void ci_netif_dump_sockets_to_logger( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void ci_netif_netstat_sockets_to_logger( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_netif_print_sockets(ci_netif* ni) CI_HF; extern void ci_netif_dump_dmaq(ci_netif* ni, int dump) CI_HF; extern void ci_netif_dump_timeoutq(ci_netif* ni) CI_HF; extern void ci_netif_dump_reap_list(ci_netif* ni, int verbose) CI_HF; -extern void ci_netif_config_opts_dump(ci_netif_config_opts* opts, - oo_dump_log_fn_t logger, - void* log_arg) CI_HF; -extern void ci_stack_time_dump(ci_netif* ni, oo_dump_log_fn_t logger, - void* log_arg) CI_HF; +extern void ci_netif_config_opts_dump( + ci_netif_config_opts* opts, oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void ci_stack_time_dump( + ci_netif* ni, oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_netif_pkt_dump_all(ci_netif* ni) CI_HF; -extern void ci_netif_pkt_queue_dump(ci_netif* ni, ci_ip_pkt_queue* q, - int is_recv, int dump) CI_HF; -extern void ci_netif_pkt_list_dump(ci_netif* ni, oo_pkt_p head, - int is_recv, int dump) CI_HF; -extern void ci_netif_pkt_dump(ci_netif* ni, ci_ip_pkt_fmt*, int is_recv, - int dump) CI_HF; -extern int ci_netif_bad_hwport(ci_netif*, ci_hwport_id_t) CI_HF; +extern void ci_netif_pkt_queue_dump( + ci_netif* ni, ci_ip_pkt_queue* q, int is_recv, int dump) CI_HF; +extern void ci_netif_pkt_list_dump( + ci_netif* ni, oo_pkt_p head, int is_recv, int dump) CI_HF; +extern void ci_netif_pkt_dump( + ci_netif* ni, ci_ip_pkt_fmt*, int is_recv, int dump) CI_HF; +extern int ci_netif_bad_hwport(ci_netif*, ci_hwport_id_t) CI_HF; extern void ci_tcp_rx_checks(ci_netif*, ci_tcp_state*, ci_ip_pkt_fmt*) CI_HF; -extern void ci_tcp_listen_rx_checks(ci_netif*, ci_tcp_socket_listen*, - ci_ip_pkt_fmt*) CI_HF; +extern void ci_tcp_listen_rx_checks( + ci_netif*, ci_tcp_socket_listen*, ci_ip_pkt_fmt*) CI_HF; -extern int ci_netif_force_wake(ci_netif* ni, int everyone) CI_HF; +extern int ci_netif_force_wake(ci_netif* ni, int everyone) CI_HF; #if CI_CFG_EPOLL3 #ifndef __KERNEL__ @@ -585,22 +572,27 @@ extern void ci_netif_free_ready_lists(ci_netif* ni); #endif CI_DEBUG(extern void ci_netif_assert_valid(ci_netif*, const char*, int);) -CI_DEBUG(extern void ci_netif_verify_freepkts(ci_netif *, const char *, int);) +CI_DEBUG(extern void ci_netif_verify_freepkts(ci_netif*, const char*, int);) -#define ASSERT_VALID_NETIF_ADDR(ni, addr, size) do{ \ - ci_assert(ci_to_int(addr) >= 0); \ - ci_assert((addr) < (ni)->state->netif_mmap_bytes); \ - ci_assert((addr) + (size) <= (ni)->state->netif_mmap_bytes); \ - }while(0) +#define ASSERT_VALID_NETIF_ADDR(ni, addr, size) \ + do { \ + ci_assert(ci_to_int(addr) >= 0); \ + ci_assert((addr) < (ni)->state->netif_mmap_bytes); \ + ci_assert((addr) + (size) <= (ni)->state->netif_mmap_bytes); \ + } while( 0 ) ci_inline int ci_netif_num_vis(ci_netif* ni) { #if CI_CFG_TCP_OFFLOAD_RECYCLER || CI_CFG_TX_CRC_OFFLOAD switch( NI_OPTS(ni).tcp_offload_plugin ) { - case CITP_TCP_OFFLOAD_OFF: return 1; - case CITP_TCP_OFFLOAD_NVME: return 1; - case CITP_TCP_OFFLOAD_RAW_TCP: return 2; - default: return 2 + CI_CFG_TCP_PLUGIN_EXTRA_VIS; + case CITP_TCP_OFFLOAD_OFF: + return 1; + case CITP_TCP_OFFLOAD_NVME: + return 1; + case CITP_TCP_OFFLOAD_RAW_TCP: + return 2; + default: + return 2 + CI_CFG_TCP_PLUGIN_EXTRA_VIS; } #endif return 1; @@ -611,7 +603,7 @@ ci_inline int ci_netif_num_vis(ci_netif* ni) *********************************************************************/ /* Assert packet is empty - but may contain payload */ -#ifndef NDEBUG +#ifndef NDEBUG #define ASSERT_PKT_PAYLOAD_EMPTY(p) ci_assert_equal(p->pay_len, 0); #else #define ASSERT_PKT_PAYLOAD_EMPTY(p) @@ -619,26 +611,26 @@ ci_inline int ci_netif_num_vis(ci_netif* ni) /* True if [id] is in legal range. */ -#define IS_VALID_PKT_ID(ni, pp) OO_PP_EQ((pp), VALID_PKT_ID((ni), (pp))) +#define IS_VALID_PKT_ID(ni, pp) OO_PP_EQ((pp), VALID_PKT_ID((ni), (pp))) /* Validate packet id. */ -#define ASSERT_VALID_PKT_ID(ni, id) \ +#define ASSERT_VALID_PKT_ID(ni, id) \ ci_ss_assert((ni), IS_VALID_PKT_ID((ni), (id))) -#define __ASSERT_VALID_PKT_ID(ni, id, file, line) \ +#define __ASSERT_VALID_PKT_ID(ni, id, file, line) \ ci_ss_assertfl((ni), IS_VALID_PKT_ID((ni), (id)), file, line) #ifdef NDEBUG -# define ASSERT_VALID_PKT(ni, pkt) -# define ASSERT_VALID_PKT_NNL(ni, pkt) -# define ASSERT_VALID_PKT_MAYBE_NNL(ni, pkt, ni_locked) +#define ASSERT_VALID_PKT(ni, pkt) +#define ASSERT_VALID_PKT_NNL(ni, pkt) +#define ASSERT_VALID_PKT_MAYBE_NNL(ni, pkt, ni_locked) #else -# define ASSERT_VALID_PKT(ni, pkt) \ - ci_assert_valid_pkt((ni), (pkt), CI_TRUE, __FILE__, __LINE__) -# define ASSERT_VALID_PKT_NNL(ni, pkt) \ - ci_assert_valid_pkt((ni), (pkt), CI_FALSE, __FILE__, __LINE__) -# define ASSERT_VALID_PKT_MAYBE_NNL(ni, pkt, ni_locked) \ - ci_assert_valid_pkt((ni), (pkt), (ni_locked), __FILE__, __LINE__) +#define ASSERT_VALID_PKT(ni, pkt) \ + ci_assert_valid_pkt((ni), (pkt), CI_TRUE, __FILE__, __LINE__) +#define ASSERT_VALID_PKT_NNL(ni, pkt) \ + ci_assert_valid_pkt((ni), (pkt), CI_FALSE, __FILE__, __LINE__) +#define ASSERT_VALID_PKT_MAYBE_NNL(ni, pkt, ni_locked) \ + ci_assert_valid_pkt((ni), (pkt), (ni_locked), __FILE__, __LINE__) #endif @@ -647,31 +639,31 @@ ci_inline int ci_netif_num_vis(ci_netif* ni) *********************************************************************/ #ifdef __KERNEL__ -# define IS_VALID_SOCK_ID(ni, id) ((unsigned) (id) < (ni)->ep_tbl_n) +#define IS_VALID_SOCK_ID(ni, id) ((unsigned) (id) < (ni)->ep_tbl_n) #else -# define IS_VALID_SOCK_ID(ni, id) ((unsigned) (id) < (ni)->state->n_ep_bufs) +#define IS_VALID_SOCK_ID(ni, id) ((unsigned) (id) < (ni)->state->n_ep_bufs) #endif -#define IS_VALID_SOCK_P(ni, sockp) IS_VALID_SOCK_ID((ni), OO_SP_TO_INT(sockp)) +#define IS_VALID_SOCK_P(ni, sockp) IS_VALID_SOCK_ID((ni), OO_SP_TO_INT(sockp)) -# define PKT_DBG_FMT "[id=%d flgs=%x]" -# define PKT_DBG_ARGS(p) OO_PKT_FMT(p), (p)->flags +#define PKT_DBG_FMT "[id=%d flgs=%x]" +#define PKT_DBG_ARGS(p) OO_PKT_FMT(p), (p)->flags extern int ci_netif_pktset_best(ci_netif* ni) CI_HF; -extern void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt - CI_KERNEL_ARG(int* p_netif_is_locked)) CI_HF; +extern void ci_netif_pkt_free(ci_netif* ni, + ci_ip_pkt_fmt* pkt CI_KERNEL_ARG(int* p_netif_is_locked)) CI_HF; #define CI_PKT_ALLOC_FOR_TCP_TX 1 #define CI_PKT_ALLOC_USE_NONB 2 #define CI_PKT_ALLOC_NO_REAP 4 extern ci_ip_pkt_fmt* ci_netif_pkt_alloc_slow(ci_netif*, int flags) CI_HF; -extern int ci_netif_pkt_try_to_free(ci_netif* ni, int desperation, - int stop_once_freed_n) CI_HF; +extern int ci_netif_pkt_try_to_free( + ci_netif* ni, int desperation, int stop_once_freed_n) CI_HF; extern void ci_netif_try_to_reap(ci_netif* ni, int stop_once_freed_n) CI_HF; -extern void ci_netif_rxq_low_on_recv(ci_netif*, ci_sock_cmn*, - int bytes_freed) CI_HF; +extern void ci_netif_rxq_low_on_recv( + ci_netif*, ci_sock_cmn*, int bytes_freed) CI_HF; /*! Allocate a packet buffer, blocking if necessary. If can_block=FALSE * this function returns 0 or -ENOBUFS. At userlevel this @@ -682,10 +674,8 @@ extern void ci_netif_rxq_low_on_recv(ci_netif*, ci_sock_cmn*, * does *not* "exit" the library, so if any signals occur when called from * userspace, they are deferred. */ -extern int ci_netif_pkt_alloc_block(ci_netif*, ci_sock_cmn*, - int* ni_locked, - int can_block, - ci_ip_pkt_fmt** p_pkt) CI_HF; +extern int ci_netif_pkt_alloc_block(ci_netif*, ci_sock_cmn*, int* ni_locked, + int can_block, ci_ip_pkt_fmt** p_pkt) CI_HF; /*! Sleeps until a packet buffer becomes available, returning 0 on success. * At userlevel this function will never fail. In the kernel it may return @@ -701,10 +691,10 @@ extern int ci_netif_pkt_alloc_block(ci_netif*, ci_sock_cmn*, */ extern int ci_netif_pkt_wait(ci_netif*, ci_sock_cmn* s, int lock_flags) CI_HF; -extern ci_ip_pkt_fmt* __ci_netif_pkt_rx_to_tx(ci_netif*, ci_ip_pkt_fmt*, - const char*) CI_HF; -#define ci_netif_pkt_rx_to_tx(ni, pkt) \ - __ci_netif_pkt_rx_to_tx((ni), (pkt), __FUNCTION__) +extern ci_ip_pkt_fmt* __ci_netif_pkt_rx_to_tx( + ci_netif*, ci_ip_pkt_fmt*, const char*) CI_HF; +#define ci_netif_pkt_rx_to_tx(ni, pkt) \ + __ci_netif_pkt_rx_to_tx((ni), (pkt), __FUNCTION__) extern int ci_netif_pkt_pass_to_kernel(ci_netif* ni, ci_ip_pkt_fmt* pkt); @@ -717,24 +707,24 @@ extern void oo_sock_cplane_init(struct oo_sock_cplane*) CI_HF; extern void ci_sock_cmn_init(ci_netif*, ci_sock_cmn*, int can_poison) CI_HF; extern void ci_sock_cmn_reinit(ci_netif*, ci_sock_cmn*) CI_HF; extern void ci_sock_cmn_dump(ci_netif*, ci_sock_cmn*, const char* pf, - oo_dump_log_fn_t logger, void* log_arg) CI_HF; + oo_dump_log_fn_t logger, void* log_arg) CI_HF; -# define S_SP(ss) ((ss)->s.b.bufid) -# define SC_SP(s) ((s)->b.bufid) -# define W_SP(w) ((w)->bufid) +#define S_SP(ss) ((ss)->s.b.bufid) +#define SC_SP(s) ((s)->b.bufid) +#define W_SP(w) ((w)->bufid) -#define S_ID(ss) OO_SP_TO_INT(S_SP(ss)) -#define SC_ID(s) OO_SP_TO_INT(SC_SP(s)) -#define W_ID(w) OO_SP_TO_INT(W_SP(w)) +#define S_ID(ss) OO_SP_TO_INT(S_SP(ss)) +#define SC_ID(s) OO_SP_TO_INT(SC_SP(s)) +#define W_ID(w) OO_SP_TO_INT(W_SP(w)) -#define S_FMT(ss) OO_SP_FMT(S_SP(ss)) -#define SC_FMT(s) OO_SP_FMT(SC_SP(s)) -#define W_FMT(w) OO_SP_FMT(W_SP(w)) +#define S_FMT(ss) OO_SP_FMT(S_SP(ss)) +#define SC_FMT(s) OO_SP_FMT(SC_SP(s)) +#define W_FMT(w) OO_SP_FMT(W_SP(w)) /* Wrappers to determine whether a socket has been bound, explicitly or * implicitly */ -#define CI_SOCK_NOT_BOUND(s) (!sock_lport_be16((s))) +#define CI_SOCK_NOT_BOUND(s) (! sock_lport_be16((s))) void ci_ipcache_set_saddr(ci_ip_cached_hdrs* ipcache, ci_addr_t addr); void ci_ipcache_set_daddr(ci_ip_cached_hdrs* ipcache, ci_addr_t addr); @@ -758,15 +748,19 @@ ci_addr_t sock_raddr(ci_sock_cmn* s); /* Note: we do not require a lock to set the so_error field */ /* [s] = ci_sock_cmn*, [e] is >= 0 error value */ -#define CI_SET_SO_ERROR(s,e) do { \ - ci_assert_ge(e,0); if((e)) (s)->so_error=(e); } while(0) +#define CI_SET_SO_ERROR(s, e) \ + do { \ + ci_assert_ge(e, 0); \ + if( (e) ) \ + (s)->so_error = (e); \ + } while( 0 ) /* [t] = ci_tcp_state*, [e] = +ve error value */ -#define CI_SET_TCP_SO_ERROR(t,e) CI_SET_SO_ERROR(&(t)->s,(e)) +#define CI_SET_TCP_SO_ERROR(t, e) CI_SET_SO_ERROR(&(t)->s, (e)) /* [u] = ci_udp_state*, [e] = +ve error value */ -#define CI_SET_UDP_SO_ERROR(u,e) CI_SET_SO_ERROR(&(u)->s,(e)) +#define CI_SET_UDP_SO_ERROR(u, e) CI_SET_SO_ERROR(&(u)->s, (e)) -ci_inline ci_int32 ci_get_so_error(ci_sock_cmn *s) +ci_inline ci_int32 ci_get_so_error(ci_sock_cmn* s) { ci_int32 rc; do { @@ -779,22 +773,20 @@ ci_inline ci_int32 ci_get_so_error(ci_sock_cmn *s) ************************ rx_errno & tx_errno ************************* **********************************************************************/ -#define SOCK_TX_ERRNO(s) ((s)->tx_errno) -#define SOCK_RX_ERRNO(s) ((s)->rx_errno & 0x3fff) +#define SOCK_TX_ERRNO(s) ((s)->tx_errno) +#define SOCK_RX_ERRNO(s) ((s)->rx_errno & 0x3fff) /********************************************************************** **************************** ICMP/Errors ***************************** **********************************************************************/ -extern int -ci_icmp_send(ci_netif *ni, ci_ip_pkt_fmt *tx_pkt, - const ci_addr_t saddr, const ci_addr_t daddr, - const ci_mac_addr_t *mac_dest, - ci_uint8 type, ci_uint8 code, ci_uint16 data_len) CI_HF; +extern int ci_icmp_send(ci_netif* ni, ci_ip_pkt_fmt* tx_pkt, + const ci_addr_t saddr, const ci_addr_t daddr, + const ci_mac_addr_t* mac_dest, ci_uint8 type, ci_uint8 code, + ci_uint16 data_len) CI_HF; extern int __ci_icmp_send_error(ci_netif* ni, int af, ci_ipx_hdr_t* ipx, - struct oo_eth_hdr* rx_eth, ci_uint8 type, - ci_uint8 code) CI_HF; + struct oo_eth_hdr* rx_eth, ci_uint8 type, ci_uint8 code) CI_HF; /********************************************************************** ********************************* UDP ********************************* @@ -809,48 +801,47 @@ extern int __ci_icmp_send_error(ci_netif* ni, int af, ci_ipx_hdr_t* ipx, #define CI_UDP_MAX_PAYLOAD_BYTES(af) \ (0xffff - sizeof(ci_udp_hdr) - (IS_AF_INET6(af) ? 0 : sizeof(ci_ip4_hdr))) -#define UDP_FLAGS(us) ((us)->udpflags) +#define UDP_FLAGS(us) ((us)->udpflags) -#define UDP_SET_FLAG(us,f) ((us)->udpflags|=(f)) -#define UDP_CLR_FLAG(us,f) ((us)->udpflags&=~(f)) -#define UDP_GET_FLAG(us,f) ((us)->udpflags&(f)) +#define UDP_SET_FLAG(us, f) ((us)->udpflags |= (f)) +#define UDP_CLR_FLAG(us, f) ((us)->udpflags &= ~(f)) +#define UDP_GET_FLAG(us, f) ((us)->udpflags & (f)) -#define UDP_IP_HDR(us) (&(us)->s.pkt.ipx.ip4) +#define UDP_IP_HDR(us) (&(us)->s.pkt.ipx.ip4) -#define udp_lport_be16(us) (sock_lport_be16(&us->s)) -#define udp_laddr_be32(us) (sock_laddr_be32(&us->s)) -#define udp_frag_off_be16(us) (UDP_IP_HDR((us))->ip_frag_off_be16) -#define udp_rport_be16(us) (sock_rport_be16(&us->s)) -#define udp_raddr_be32(us) (sock_raddr_be32(&us->s)) +#define udp_lport_be16(us) (sock_lport_be16(&us->s)) +#define udp_laddr_be32(us) (sock_laddr_be32(&us->s)) +#define udp_frag_off_be16(us) (UDP_IP_HDR((us))->ip_frag_off_be16) +#define udp_rport_be16(us) (sock_rport_be16(&us->s)) +#define udp_raddr_be32(us) (sock_raddr_be32(&us->s)) #if CI_CFG_IPV6 -#define udp_ip6_laddr(us) (sock_ip6_laddr(&us->s)) -#define udp_ip6_raddr(us) (sock_ip6_raddr(&us->s)) +#define udp_ip6_laddr(us) (sock_ip6_laddr(&us->s)) +#define udp_ip6_raddr(us) (sock_ip6_raddr(&us->s)) #endif -#define sock_ipx_laddr(s) ((s)->laddr) -#define sock_ipx_raddr(s) ipcache_raddr(&(s)->pkt) +#define sock_ipx_laddr(s) ((s)->laddr) +#define sock_ipx_raddr(s) ipcache_raddr(&(s)->pkt) -#define udp_ipx_laddr(us) sock_ipx_laddr(&(us)->s) -#define udp_ipx_raddr(us) sock_ipx_raddr(&(us)->s) +#define udp_ipx_laddr(us) sock_ipx_laddr(&(us)->s) +#define udp_ipx_raddr(us) sock_ipx_raddr(&(us)->s) -#define UDP_TX_ERRNO(us) (SOCK_TX_ERRNO(&(us)->s)) -#define UDP_RX_ERRNO(us) (SOCK_RX_ERRNO(&(us)->s)) -#define UDP_IS_SHUT_RD(us) ((us)->s.rx_errno & CI_SHUT_RD) -#define UDP_IS_SHUT_WR(us) ((us)->s.rx_errno & CI_SHUT_WR) -#define UDP_IS_SHUT_RDWR(us) \ - (((us)->s.rx_errno & (CI_SHUT_RD | CI_SHUT_WR)) == \ - (CI_SHUT_RD | CI_SHUT_WR)) +#define UDP_TX_ERRNO(us) (SOCK_TX_ERRNO(&(us)->s)) +#define UDP_RX_ERRNO(us) (SOCK_RX_ERRNO(&(us)->s)) +#define UDP_IS_SHUT_RD(us) ((us)->s.rx_errno & CI_SHUT_RD) +#define UDP_IS_SHUT_WR(us) ((us)->s.rx_errno & CI_SHUT_WR) +#define UDP_IS_SHUT_RDWR(us) \ + (((us)->s.rx_errno & (CI_SHUT_RD | CI_SHUT_WR)) == (CI_SHUT_RD | CI_SHUT_WR)) /*** udp.c ***/ extern void ci_udp_state_dump(ci_netif*, ci_udp_state*, const char* pf, - oo_dump_log_fn_t logger, void* log_arg) CI_HF; + oo_dump_log_fn_t logger, void* log_arg) CI_HF; /* Set the source IP address & port */ -ci_inline void -ci_sock_cmn_set_laddr(ci_sock_cmn* s, ci_addr_t addr, int lport_be16) +ci_inline void ci_sock_cmn_set_laddr( + ci_sock_cmn* s, ci_addr_t addr, int lport_be16) { ci_sock_set_laddr_port(s, addr, lport_be16); s->cp.lport_be16 = lport_be16; @@ -859,46 +850,42 @@ ci_sock_cmn_set_laddr(ci_sock_cmn* s, ci_addr_t addr, int lport_be16) s->cp.laddr = ip4_addr_any; else s->cp.laddr = addr; - } -extern void ci_udp_state_assert_valid(ci_netif*, ci_udp_state* ts, - const char* file, int line) CI_HF; +extern void ci_udp_state_assert_valid( + ci_netif*, ci_udp_state* ts, const char* file, int line) CI_HF; -extern void ci_udp_ep_assert_valid(citp_socket* ep, - const char* file, int line) CI_HF; +extern void ci_udp_ep_assert_valid( + citp_socket* ep, const char* file, int line) CI_HF; /*** udp_rx.c ***/ -extern void ci_udp_handle_rx(ci_netif*, ci_ip_pkt_fmt* pkt, ci_udp_hdr*, - int ip_paylen) CI_HF; +extern void ci_udp_handle_rx( + ci_netif*, ci_ip_pkt_fmt* pkt, ci_udp_hdr*, int ip_paylen) CI_HF; -ci_inline -void ci_pkt_init_from_ipcache_len(ci_ip_pkt_fmt *pkt, - const ci_ip_cached_hdrs *ipcache, - size_t header_len) +ci_inline void ci_pkt_init_from_ipcache_len( + ci_ip_pkt_fmt* pkt, const ci_ip_cached_hdrs* ipcache, size_t header_len) { - if( !ipcache_is_ipv6(ipcache) ) { + if( ! ipcache_is_ipv6(ipcache) ) { ci_assert_equal(CI_IP4_IHL(&ipcache->ipx.ip4), sizeof(ci_ip4_hdr)); ci_assert_equal(ipcache->ether_type, CI_ETHERTYPE_IP); } oo_tx_pkt_layout_update(pkt, ipcache->ether_offset); memcpy(oo_tx_ether_hdr(pkt), ci_ip_cache_ether_hdr(ipcache), - header_len + oo_tx_ether_hdr_size(pkt)); - if( !ipcache_is_ipv6(ipcache) ) { + header_len + oo_tx_ether_hdr_size(pkt)); + if( ! ipcache_is_ipv6(ipcache) ) { ci_assert_equal(CI_IP4_IHL(oo_tx_ip_hdr(pkt)), sizeof(ci_ip4_hdr)); ci_assert_equal(oo_tx_ether_type_get(pkt), CI_ETHERTYPE_IP); } } -ci_inline -void ci_pkt_init_from_ipcache(ci_ip_pkt_fmt *pkt, - const ci_ip_cached_hdrs *ipcache) +ci_inline void ci_pkt_init_from_ipcache( + ci_ip_pkt_fmt* pkt, const ci_ip_cached_hdrs* ipcache) { - ci_pkt_init_from_ipcache_len(pkt, ipcache, - CI_IPX_HDR_SIZE(ipcache_af(ipcache)) + sizeof(ci_tcp_hdr)); + ci_pkt_init_from_ipcache_len( + pkt, ipcache, CI_IPX_HDR_SIZE(ipcache_af(ipcache)) + sizeof(ci_tcp_hdr)); } @@ -919,51 +906,47 @@ struct cmsg_state { int* p_msg_flags; }; -extern void ci_put_cmsg(struct cmsg_state *cmsg_state, int level, int type, - socklen_t len, const void *data) CI_HF; +extern void ci_put_cmsg(struct cmsg_state* cmsg_state, int level, int type, + socklen_t len, const void* data) CI_HF; /* info_out contains a pointer to struct in_pktinfo or struct in6_pktinfo */ extern int ci_ip_cmsg_send(const struct msghdr*, void** info_out) CI_HF; extern void ci_ip_cmsg_finish(struct cmsg_state* cmsg_state) CI_HF; #ifndef __KERNEL__ -extern ci_fd_t ci_udp_ep_ctor(citp_socket* ep, ci_netif* sh, - int domain, int type) CI_HF; +extern ci_fd_t ci_udp_ep_ctor( + citp_socket* ep, ci_netif* sh, int domain, int type) CI_HF; extern int ci_udp_bind_start(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* addr, socklen_t addrlen, - ci_uint16* lport) CI_HF; + const struct sockaddr* addr, socklen_t addrlen, ci_uint16* lport) CI_HF; extern int ci_udp_bind_conclude(citp_socket* ep, const struct sockaddr* addr, - socklen_t addrlen, ci_uint16 lport); + socklen_t addrlen, ci_uint16 lport); #if CI_CFG_ENDPOINT_MOVE extern void ci_udp_handle_force_reuseport(ci_fd_t fd, citp_socket* ep, - const struct sockaddr* sa, - socklen_t sa_len) CI_HF; + const struct sockaddr* sa, socklen_t sa_len) CI_HF; extern int ci_udp_reuseport_bind(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* sa, - socklen_t sa_len, ci_uint16 lport) CI_HF; + const struct sockaddr* sa, socklen_t sa_len, ci_uint16 lport) CI_HF; #endif -extern int ci_udp_connect(citp_socket*, ci_fd_t fd, - const struct sockaddr*, socklen_t addrlen) CI_HF; +extern int ci_udp_connect( + citp_socket*, ci_fd_t fd, const struct sockaddr*, socklen_t addrlen) CI_HF; extern int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* serv_addr, - socklen_t addrlen, ci_fd_t os_sock) CI_HF; + const struct sockaddr* serv_addr, socklen_t addrlen, + ci_fd_t os_sock) CI_HF; extern int ci_udp_shutdown(citp_socket*, ci_fd_t fd, int how) CI_HF; extern int __ci_udp_shutdown(ci_netif* netif, ci_udp_state* us, int how) CI_HF; -extern int ci_udp_getpeername(citp_socket*, struct sockaddr*,socklen_t*) CI_HF; +extern int ci_udp_getpeername( + citp_socket*, struct sockaddr*, socklen_t*) CI_HF; extern int ci_udp_getsockopt(citp_socket* ep, ci_fd_t fd, int level, - int optname, void *optval, socklen_t *optlen ) CI_HF; + int optname, void* optval, socklen_t* optlen) CI_HF; extern int ci_udp_setsockopt(citp_socket* ep, ci_fd_t fd, int level, - int optname, const void*optval, socklen_t optlen) CI_HF; + int optname, const void* optval, socklen_t optlen) CI_HF; extern int ci_udp_ioctl(citp_socket*, ci_fd_t, int request, void* arg) CI_HF; #endif /* Send/recv called from within kernel & user-library, so outside above #if */ -extern int ci_udp_sendmsg(ci_udp_iomsg_args *a, - const ci_msghdr*, int) CI_HF; -extern int ci_udp_recvmsg(ci_udp_iomsg_args *a, ci_msghdr*, - int flags) CI_HF; +extern int ci_udp_sendmsg(ci_udp_iomsg_args* a, const ci_msghdr*, int) CI_HF; +extern int ci_udp_recvmsg(ci_udp_iomsg_args* a, ci_msghdr*, int flags) CI_HF; extern void ci_udp_set_no_unicast(citp_socket* ep) CI_HF; @@ -987,39 +970,35 @@ typedef enum { #ifndef __KERNEL__ struct mmsghdr; -extern int ci_udp_recvmmsg(ci_udp_iomsg_args *a, struct mmsghdr* mmsg, - unsigned int vlen, int flags, - const struct timespec* timeout - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) CI_HF; +extern int ci_udp_recvmmsg(ci_udp_iomsg_args* a, struct mmsghdr* mmsg, + unsigned int vlen, int flags, + const struct timespec* timeout CI_KERNEL_ARG( + ci_addr_spc_t addr_spc)) CI_HF; struct onload_zc_mmsg; -extern int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, - struct onload_zc_mmsg* msgs, int flags); +extern int ci_tcp_zc_send( + ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msgs, int flags); struct onload_zc_recv_args; int ci_udp_zc_recv(ci_udp_iomsg_args* a, struct onload_zc_recv_args* args); /* A special version of recvmsg to grab data from kernel stack when - * doing zero-copy + * doing zero-copy */ -extern int ci_udp_recvmsg_kernel(int fd, ci_netif* ni, ci_udp_state* us, - struct msghdr* msg, int flags); +extern int ci_udp_recvmsg_kernel( + int fd, ci_netif* ni, ci_udp_state* us, struct msghdr* msg, int flags); -extern enum onload_delegated_send_rc -ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, - void* headers, int* headers_len_inout, - int* ip_tcp_hdr_len_out, - int* tcp_seq_offset_out, int* ip_len_offset_out); -extern int ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, - const ci_iovec *iov, int iovlen, int flags); +extern enum onload_delegated_send_rc ci_tcp_ds_fill_headers(ci_netif* ni, + ci_tcp_state* ts, unsigned flags, void* headers, int* headers_len_inout, + int* ip_tcp_hdr_len_out, int* tcp_seq_offset_out, int* ip_len_offset_out); +extern int ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, const ci_iovec* iov, + int iovlen, int flags); -extern int -ci_netif_raw_send(ci_netif* ni, int intf_i, - const ci_iovec *iov, int iovlen); +extern int ci_netif_raw_send( + ci_netif* ni, int intf_i, const ci_iovec* iov, int iovlen); #endif extern void ci_ip_cmsg_recv(ci_netif*, ci_udp_state*, const ci_ip_pkt_fmt*, - struct msghdr*, int netif_locked, - int *p_msg_flags) CI_HF; + struct msghdr*, int netif_locked, int* p_msg_flags) CI_HF; #if OO_DO_STACK_POLL extern void ci_udp_all_fds_gone(ci_netif* netif, oo_sp, int do_free); #endif @@ -1028,11 +1007,12 @@ extern void ci_udp_state_try_free(ci_netif*, ci_udp_state*) CI_HF; extern int ci_udp_csum_correct(ci_ip_pkt_fmt* pkt, ci_udp_hdr* udp) CI_HF; extern void ci_udp_sendmsg_send_async_q(ci_netif*, ci_udp_state*) CI_HF; -extern void ci_udp_perform_deferred_socket_work(ci_netif*, ci_udp_state*)CI_HF; -extern int ci_udp_try_to_free_pkts(ci_netif*, ci_udp_state*, - int desperation) CI_HF; +extern void ci_udp_perform_deferred_socket_work( + ci_netif*, ci_udp_state*) CI_HF; +extern int ci_udp_try_to_free_pkts( + ci_netif*, ci_udp_state*, int desperation) CI_HF; -#define CI_PIPE_ZC_WRITE_FLAG_FORCE (1<<16) +#define CI_PIPE_ZC_WRITE_FLAG_FORCE (1 << 16) struct ci_pipe_pkt_list { ci_ip_pkt_fmt* head; @@ -1040,284 +1020,260 @@ struct ci_pipe_pkt_list { ci_uint32 count; }; -typedef int (*ci_pipe_zc_read_cb)(void* context, struct iovec* iovec, - int iov_num, int flags); - -extern int ci_pipe_read(ci_netif*, struct oo_pipe*, const struct iovec*, - size_t iovlen) CI_HF; -extern int oo_pipe_write_block(ci_netif* ni, struct oo_pipe* p, int flags) CI_HF; -extern int ci_pipe_write(ci_netif*, struct oo_pipe*, const struct iovec*, - size_t iovlen) CI_HF; -extern int ci_pipe_zc_read(ci_netif* ni, struct oo_pipe* p, int len, - int flags, ci_pipe_zc_read_cb cb, void* ctx) CI_HF; +typedef int (*ci_pipe_zc_read_cb)( + void* context, struct iovec* iovec, int iov_num, int flags); + +extern int ci_pipe_read( + ci_netif*, struct oo_pipe*, const struct iovec*, size_t iovlen) CI_HF; +extern int oo_pipe_write_block( + ci_netif* ni, struct oo_pipe* p, int flags) CI_HF; +extern int ci_pipe_write( + ci_netif*, struct oo_pipe*, const struct iovec*, size_t iovlen) CI_HF; +extern int ci_pipe_zc_read(ci_netif* ni, struct oo_pipe* p, int len, int flags, + ci_pipe_zc_read_cb cb, void* ctx) CI_HF; extern int ci_pipe_zc_move(ci_netif* ni, struct oo_pipe* pipe_src, - struct oo_pipe* pipe_dest, int len, int flags) CI_HF; + struct oo_pipe* pipe_dest, int len, int flags) CI_HF; extern int ci_pipe_zc_write(ci_netif* ni, struct oo_pipe* p, - struct ci_pipe_pkt_list* pkts, - int len, int flags) CI_HF; -extern int ci_pipe_zc_alloc_buffers(ci_netif* ni, - struct oo_pipe* p, - int flags, - int count, - struct ci_pipe_pkt_list* pkts_out) CI_HF; -extern int ci_pipe_zc_release_buffers(ci_netif* ni, - struct oo_pipe* p, - struct ci_pipe_pkt_list* pkts) CI_HF; -extern int ci_pipe_set_size(ci_netif* ni, struct oo_pipe* p, - size_t size) CI_HF; + struct ci_pipe_pkt_list* pkts, int len, int flags) CI_HF; +extern int ci_pipe_zc_alloc_buffers(ci_netif* ni, struct oo_pipe* p, int flags, + int count, struct ci_pipe_pkt_list* pkts_out) CI_HF; +extern int ci_pipe_zc_release_buffers( + ci_netif* ni, struct oo_pipe* p, struct ci_pipe_pkt_list* pkts) CI_HF; +extern int ci_pipe_set_size( + ci_netif* ni, struct oo_pipe* p, size_t size) CI_HF; extern void oo_pipe_dump(ci_netif*, struct oo_pipe*, const char* pf, - oo_dump_log_fn_t logger, void* log_arg) CI_HF; + oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern int ci_pipe_list_to_iovec(ci_netif* ni, struct oo_pipe* p, - struct iovec* iov, - int* iov_num, - struct ci_pipe_pkt_list* pkts, - int len); + struct iovec* iov, int* iov_num, struct ci_pipe_pkt_list* pkts, int len); /********************************************************************** ********************************* TCP ******************************** **********************************************************************/ -#define SEQ_EQ(s1, s2) ((ci_uint32)((s1) - (s2)) == 0u) -#define SEQ_LT(s1, s2) ((ci_int32)((s1) - (s2)) < 0) -#define SEQ_LE(s1, s2) ((ci_int32)((s1) - (s2)) <= 0) -#define SEQ_GT(s1, s2) ((ci_int32)((s1) - (s2)) > 0) -#define SEQ_GE(s1, s2) ((ci_int32)((s1) - (s2)) >= 0) -#define SEQ_SUB(s1, s2) ((ci_int32)((s1) - (s2))) -#define SEQ(s) ((unsigned) (s)) +#define SEQ_EQ(s1, s2) ((ci_uint32) ((s1) - (s2)) == 0u) +#define SEQ_LT(s1, s2) ((ci_int32) ((s1) - (s2)) < 0) +#define SEQ_LE(s1, s2) ((ci_int32) ((s1) - (s2)) <= 0) +#define SEQ_GT(s1, s2) ((ci_int32) ((s1) - (s2)) > 0) +#define SEQ_GE(s1, s2) ((ci_int32) ((s1) - (s2)) >= 0) +#define SEQ_SUB(s1, s2) ((ci_int32) ((s1) - (s2))) +#define SEQ(s) ((unsigned) (s)) /* Is [s] between [sl] and [sh] (inclusive) */ -#define SEQ_BTW(s, sl, sh) ((sh) - (sl) >= (s) - (sl)) +#define SEQ_BTW(s, sl, sh) ((sh) - (sl) >= (s) - (sl)) -#define SEQ_MIN(x, y) (SEQ_LE(x, y) ? (x) : (y)) -#define SEQ_MAX(x, y) (SEQ_LE(x, y) ? (y) : (x)) +#define SEQ_MIN(x, y) (SEQ_LE(x, y) ? (x) : (y)) +#define SEQ_MAX(x, y) (SEQ_LE(x, y) ? (y) : (x)) /* Flags for connection states. These are used to determine whether ** certain things can/should be done in the current state. */ -#define CI_TCP_STATE_SYNCHRONISED 0x001 -#define CI_TCP_STATE_SLOW_PATH 0x002 -#define CI_TCP_STATE_NOT_CONNECTED 0x004 -#define CI_TCP_STATE_RECVD_FIN 0x008 -#define CI_TCP_STATE_ACCEPT_DATA 0x010 -#define CI_TCP_STATE_TXQ_ACTIVE 0x020 -#define CI_TCP_STATE_NO_TIMERS 0x040 -#define CI_TCP_STATE_TIMEOUT_ORPHAN 0x080 -#define CI_TCP_STATE_TCP_CONN 0x100 -#define CI_TCP_STATE_TCP 0x200 -#define CI_TCP_STATE_INVALID 0x400 +#define CI_TCP_STATE_SYNCHRONISED 0x001 +#define CI_TCP_STATE_SLOW_PATH 0x002 +#define CI_TCP_STATE_NOT_CONNECTED 0x004 +#define CI_TCP_STATE_RECVD_FIN 0x008 +#define CI_TCP_STATE_ACCEPT_DATA 0x010 +#define CI_TCP_STATE_TXQ_ACTIVE 0x020 +#define CI_TCP_STATE_NO_TIMERS 0x040 +#define CI_TCP_STATE_TIMEOUT_ORPHAN 0x080 +#define CI_TCP_STATE_TCP_CONN 0x100 +#define CI_TCP_STATE_TCP 0x200 +#define CI_TCP_STATE_INVALID 0x400 /* 0x800 is unused */ /* Connection states. See also [tcp_misc.c] if you change these. */ -#define CI_TCP_CLOSED (0x0000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_NO_TIMERS) -#define CI_TCP_LISTEN (0x1000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_NO_TIMERS) -#define CI_TCP_INVALID (CI_TCP_LISTEN | CI_TCP_STATE_INVALID) -#define CI_TCP_SYN_SENT (0x2000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_TXQ_ACTIVE) -#define CI_TCP_ESTABLISHED (0x3000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_ACCEPT_DATA \ - | CI_TCP_STATE_TXQ_ACTIVE ) -#define CI_TCP_CLOSE_WAIT (0x4000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_RECVD_FIN \ - | CI_TCP_STATE_TXQ_ACTIVE ) -#define CI_TCP_LAST_ACK (0x5000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_RECVD_FIN \ - | CI_TCP_STATE_TXQ_ACTIVE \ - | CI_TCP_STATE_TIMEOUT_ORPHAN ) -#define CI_TCP_FIN_WAIT1 (0x6000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_ACCEPT_DATA \ - | CI_TCP_STATE_TXQ_ACTIVE \ - | CI_TCP_STATE_TIMEOUT_ORPHAN ) -#define CI_TCP_FIN_WAIT2 (0x7000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_ACCEPT_DATA \ - | CI_TCP_STATE_TIMEOUT_ORPHAN ) -#define CI_TCP_CLOSING (0x8000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_RECVD_FIN \ - | CI_TCP_STATE_TXQ_ACTIVE \ - | CI_TCP_STATE_TIMEOUT_ORPHAN ) -#define CI_TCP_TIME_WAIT (0x9000 | CI_TCP_STATE_TCP \ - | CI_TCP_STATE_TCP_CONN \ - | CI_TCP_STATE_SYNCHRONISED \ - | CI_TCP_STATE_SLOW_PATH \ - | CI_TCP_STATE_NOT_CONNECTED \ - | CI_TCP_STATE_RECVD_FIN \ - /* 2MSL timer doesn't count */ \ - | CI_TCP_STATE_NO_TIMERS) +#define CI_TCP_CLOSED \ + (0x0000 | CI_TCP_STATE_TCP | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_NOT_CONNECTED | CI_TCP_STATE_NO_TIMERS) +#define CI_TCP_LISTEN \ + (0x1000 | CI_TCP_STATE_TCP | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_NOT_CONNECTED | CI_TCP_STATE_NO_TIMERS) +#define CI_TCP_INVALID (CI_TCP_LISTEN | CI_TCP_STATE_INVALID) +#define CI_TCP_SYN_SENT \ + (0x2000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SLOW_PATH | CI_TCP_STATE_NOT_CONNECTED | \ + CI_TCP_STATE_TXQ_ACTIVE) +#define CI_TCP_ESTABLISHED \ + (0x3000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SYNCHRONISED | CI_TCP_STATE_ACCEPT_DATA | \ + CI_TCP_STATE_TXQ_ACTIVE) +#define CI_TCP_CLOSE_WAIT \ + (0x4000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SYNCHRONISED | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_RECVD_FIN | CI_TCP_STATE_TXQ_ACTIVE) +#define CI_TCP_LAST_ACK \ + (0x5000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SYNCHRONISED | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_NOT_CONNECTED | CI_TCP_STATE_RECVD_FIN | \ + CI_TCP_STATE_TXQ_ACTIVE | CI_TCP_STATE_TIMEOUT_ORPHAN) +#define CI_TCP_FIN_WAIT1 \ + (0x6000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SLOW_PATH | CI_TCP_STATE_SYNCHRONISED | \ + CI_TCP_STATE_ACCEPT_DATA | CI_TCP_STATE_TXQ_ACTIVE | \ + CI_TCP_STATE_TIMEOUT_ORPHAN) +#define CI_TCP_FIN_WAIT2 \ + (0x7000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SLOW_PATH | CI_TCP_STATE_SYNCHRONISED | \ + CI_TCP_STATE_ACCEPT_DATA | CI_TCP_STATE_TIMEOUT_ORPHAN) +#define CI_TCP_CLOSING \ + (0x8000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SYNCHRONISED | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_NOT_CONNECTED | CI_TCP_STATE_RECVD_FIN | \ + CI_TCP_STATE_TXQ_ACTIVE | CI_TCP_STATE_TIMEOUT_ORPHAN) +#define CI_TCP_TIME_WAIT \ + (0x9000 | CI_TCP_STATE_TCP | CI_TCP_STATE_TCP_CONN | \ + CI_TCP_STATE_SYNCHRONISED | CI_TCP_STATE_SLOW_PATH | \ + CI_TCP_STATE_NOT_CONNECTED | \ + CI_TCP_STATE_RECVD_FIN /* 2MSL timer doesn't count */ \ + | CI_TCP_STATE_NO_TIMERS) /* Set in a socket that is freed. */ -#define CI_TCP_STATE_FREE (0xa000 | CI_TCP_STATE_NO_TIMERS) +#define CI_TCP_STATE_FREE (0xa000 | CI_TCP_STATE_NO_TIMERS) /* Set in a socket that is UDP */ -#define CI_TCP_STATE_UDP (0xb000) +#define CI_TCP_STATE_UDP (0xb000) /* Set in a waitable which is in fact a pipe meta (not a pipe end) */ -#define CI_TCP_STATE_PIPE (0xc000) +#define CI_TCP_STATE_PIPE (0xc000) /* This endpoint is used to store aux buffers (synrecv states & some * others) */ -#define CI_TCP_STATE_AUXBUF (0xd000) +#define CI_TCP_STATE_AUXBUF (0xd000) /* Set in a socket that is used as the owner for an active wild filter */ #define CI_TCP_STATE_ACTIVE_WILD (0xe000) /* Convert state to number in range 0->0xe */ -#define CI_TCP_STATE_NUM(s) (((s) & 0xf000) >> 12u) +#define CI_TCP_STATE_NUM(s) (((s) &0xf000) >> 12u) /* Flags we don't expect to see in normal data packets. */ -#define CI_TCP_OOB_FLAGS (CI_TCP_FLAG_SYN|CI_TCP_FLAG_FIN| \ - CI_TCP_FLAG_RST|CI_TCP_FLAG_ECE| \ - CI_TCP_FLAG_CWR) +#define CI_TCP_OOB_FLAGS \ + (CI_TCP_FLAG_SYN | CI_TCP_FLAG_FIN | CI_TCP_FLAG_RST | CI_TCP_FLAG_ECE | \ + CI_TCP_FLAG_CWR) /* Flags to check for a socket */ -#define CI_TCP_STATE_IS_SOCKET(s) ((s) == CI_TCP_STATE_UDP || \ - (s) & CI_TCP_STATE_TCP) +#define CI_TCP_STATE_IS_SOCKET(s) \ + ((s) == CI_TCP_STATE_UDP || (s) &CI_TCP_STATE_TCP) /* For the fast path check we inspect header length and all flags other ** than PSH. */ -#define CI_TCP_FAST_PATH_MASK CI_BSWAPC_BE32(0xf0f70000) -#define CI_TCP_FAST_PATH_WORD(hdr) (((ci_uint32*)(hdr))[3]) +#define CI_TCP_FAST_PATH_MASK CI_BSWAPC_BE32(0xf0f70000) +#define CI_TCP_FAST_PATH_WORD(hdr) (((ci_uint32*) (hdr))[3]) -#ifndef MSG_NOSIGNAL /* Introduced in glibc3. */ -# define MSG_NOSIGNAL 0 +#ifndef MSG_NOSIGNAL /* Introduced in glibc3. */ +#define MSG_NOSIGNAL 0 #endif -#define tcp_outgoing_opts_len(ts) \ +#define tcp_outgoing_opts_len(ts) \ ((ts)->outgoing_hdrs_len - sizeof(ci_ip4_hdr) - sizeof(ci_tcp_hdr)) #define tcp_ipx_outgoing_opts_len(af, ts) \ ((ts)->outgoing_hdrs_len - CI_IPX_HDR_SIZE(af) - sizeof(ci_tcp_hdr)) /* These names match the terminology used in the RFCs etc. */ -#define tcp_snd_una(ts) ((ts)->snd_una) -#define tcp_snd_nxt(ts) ((ts)->snd_nxt) -#define tcp_snd_wnd(ts) SEQ_SUB((ts)->snd_max, (ts)->snd_una) -#define tcp_snd_up(ts) ((ts)->snd_up) - -#define tcp_rcv_nxt(ts) (TS_IPX_TCP(ts)->tcp_ack_be32) -#define tcp_rcv_usr(ts) ((ts)->rcv_added - (ts)->rcv_delivered) -#define tcp_rcv_up(ts) ((ts)->rcv_up) -#define tcp_rcv_wnd_advertised(ts) ((ts)->rcv_wnd_advertised) -#define tcp_rcv_wnd_right_edge_sent(ts) ((ts)->rcv_wnd_right_edge_sent) +#define tcp_snd_una(ts) ((ts)->snd_una) +#define tcp_snd_nxt(ts) ((ts)->snd_nxt) +#define tcp_snd_wnd(ts) SEQ_SUB((ts)->snd_max, (ts)->snd_una) +#define tcp_snd_up(ts) ((ts)->snd_up) + +#define tcp_rcv_nxt(ts) (TS_IPX_TCP(ts)->tcp_ack_be32) +#define tcp_rcv_usr(ts) ((ts)->rcv_added - (ts)->rcv_delivered) +#define tcp_rcv_up(ts) ((ts)->rcv_up) +#define tcp_rcv_wnd_advertised(ts) ((ts)->rcv_wnd_advertised) +#define tcp_rcv_wnd_right_edge_sent(ts) ((ts)->rcv_wnd_right_edge_sent) #define tcp_rcv_wnd_current(ts) \ - CI_MIN((ts)->rcv_window_max, (ts)->s.so.rcvbuf - tcp_rcv_usr(ts)) + CI_MIN((ts)->rcv_window_max, (ts)->s.so.rcvbuf - tcp_rcv_usr(ts)) /* TCP packet urgent offset - named urgent offset to differantiate it from snd_up of the tcp state */ -#define tcp_snd_urg_off(ts,tcp) \ - ( (ci_uint16) (tcp_snd_up(ts) - CI_BSWAP_BE32((tcp)->tcp_seq_be32)) ) +#define tcp_snd_urg_off(ts, tcp) \ + ((ci_uint16) (tcp_snd_up(ts) - CI_BSWAP_BE32((tcp)->tcp_seq_be32))) /* Sequence number of next data to be inserted into TX queue. */ #define tcp_enq_nxt(ts) (TS_IPX_TCP(ts)->tcp_seq_be32) /* TCP urgent data definitions */ #define tcp_urg_data(ts) ((ts)->urg_data) -#define tcp_urg_data_invalidate(ts) ((ts)->urg_data &=~ \ - (CI_TCP_URG_IS_HERE|CI_TCP_URG_PTR_VALID|CI_TCP_URG_DATA_MASK)); +#define tcp_urg_data_invalidate(ts) \ + ((ts)->urg_data &= \ + ~(CI_TCP_URG_IS_HERE | CI_TCP_URG_PTR_VALID | CI_TCP_URG_DATA_MASK)); /*! Returns true if we are not expecting an urgent byte. */ #define tcp_rx_urg_fast_path(ts) (~tcp_urg_data(ts) & CI_TCP_URG_COMING) /* conversion from scaled sa and sv to real srtt and rttvar */ -#define tcp_srtt(ts) ((ts)->sa >> 3u) -#define tcp_rttvar(ts) ((ts)->sv >> 2u) +#define tcp_srtt(ts) ((ts)->sa >> 3u) +#define tcp_rttvar(ts) ((ts)->sv >> 2u) -#define CI_SHUT_RD 0x8000 -#define CI_SHUT_WR 0x4000 -#define TCP_RX_DONE(ts) ((ts)->s.rx_errno) +#define CI_SHUT_RD 0x8000 +#define CI_SHUT_WR 0x4000 +#define TCP_RX_DONE(ts) ((ts)->s.rx_errno) -#define TCP_RX_ERRNO(ts) (SOCK_RX_ERRNO(&(ts)->s)) -#define TCP_TX_ERRNO(ts) (SOCK_TX_ERRNO(&(ts)->s)) +#define TCP_RX_ERRNO(ts) (SOCK_RX_ERRNO(&(ts)->s)) +#define TCP_TX_ERRNO(ts) (SOCK_TX_ERRNO(&(ts)->s)) /* We never transmit IP options (at the moment). */ -#define S_TCP_HDR(s) ((ci_tcp_hdr*) (&(s)->pkt.ipx.ip4 + 1)) -#define TS_TCP(ts) S_TCP_HDR(&(ts)->s) +#define S_TCP_HDR(s) ((ci_tcp_hdr*) (&(s)->pkt.ipx.ip4 + 1)) +#define TS_TCP(ts) S_TCP_HDR(&(ts)->s) #if CI_CFG_IPV6 #define S_IP6_TCP_HDR(s) ((ci_tcp_hdr*) (&(s)->pkt.ipx.ip6 + 1)) -#define TS_IP6_TCP(ts) S_IP6_TCP_HDR(&(ts)->s) +#define TS_IP6_TCP(ts) S_IP6_TCP_HDR(&(ts)->s) #endif #if CI_CFG_IPV6 -#define S_IPX_TCP_HDR(s) ((ipcache_is_ipv6(&(s)->pkt)) ? \ - S_IP6_TCP_HDR(s) : S_TCP_HDR(s)) -#define TS_IPX_TCP(ts) ((ipcache_is_ipv6(&(ts)->s.pkt)) ? \ - TS_IP6_TCP(ts) : TS_TCP(ts)) +#define S_IPX_TCP_HDR(s) \ + ((ipcache_is_ipv6(&(s)->pkt)) ? S_IP6_TCP_HDR(s) : S_TCP_HDR(s)) +#define TS_IPX_TCP(ts) \ + ((ipcache_is_ipv6(&(ts)->s.pkt)) ? TS_IP6_TCP(ts) : TS_TCP(ts)) #else #define S_IPX_TCP_HDR(s) S_TCP_HDR(s) -#define TS_IPX_TCP(ts) TS_TCP(ts) +#define TS_IPX_TCP(ts) TS_TCP(ts) #endif /** Macro that initialises RX queue offset */ -#define TS_QUEUE_RX_SET(ts, name) \ +#define TS_QUEUE_RX_SET(ts, name) \ ((ts)->recv_off = CI_MEMBER_OFFSET(ci_tcp_state, name)) /** Get active RX queue (fast/slow as appropriate) from TCP state */ -#define TS_QUEUE_RX(ts) \ - ((ci_ip_pkt_queue*) \ - ((ci_uintptr_t) (ts) + (ts)->recv_off)) +#define TS_QUEUE_RX(ts) \ + ((ci_ip_pkt_queue*) ((ci_uintptr_t) (ts) + (ts)->recv_off)) /** Offset of TS within netif state. */ -#define TS_OFF(ni, ts) oo_sockp_to_statep((ni),S_SP(ts)) -#define TS_MEMBER_OFF(ni, ts, member) ((ci_uint32)((char *)&(member) \ - - (char*)(ts) \ - + TS_OFF((ni),(ts)))) -#define TS_FMT "%d(%u)" -#define TS_ARG(ni,ts) (S_SP(ts)), (unsigned) TS_OFF((ni),(ts)) - -#define TCP_STATE_FROM_LINK(lnk) \ +#define TS_OFF(ni, ts) oo_sockp_to_statep((ni), S_SP(ts)) +#define TS_MEMBER_OFF(ni, ts, member) \ + ((ci_uint32) ((char*) &(member) - (char*) (ts) + TS_OFF((ni), (ts)))) +#define TS_FMT "%d(%u)" +#define TS_ARG(ni, ts) (S_SP(ts)), (unsigned) TS_OFF((ni), (ts)) + +#define TCP_STATE_FROM_LINK(lnk) \ CI_CONTAINER(ci_tcp_state, timeout_q_link, (lnk)) /* Macros for controlling delayed ACK state */ -#define TCP_FORCE_ACK(ts) ((ts)->acks_pending |= CI_TCP_ACK_FORCED_FLAG) -#define TCP_NEED_ACK(ts) (++(ts)->acks_pending) -#define TCP_ACK_FORCED(ts) ((ts)->acks_pending & CI_TCP_ACK_FORCED_FLAG) +#define TCP_FORCE_ACK(ts) ((ts)->acks_pending |= CI_TCP_ACK_FORCED_FLAG) +#define TCP_NEED_ACK(ts) (++(ts)->acks_pending) +#define TCP_ACK_FORCED(ts) ((ts)->acks_pending & CI_TCP_ACK_FORCED_FLAG) /* macros for getting source and dest addresses and ports */ #if CI_CFG_IPV6 -#define ipcache_ttl(ipcache) (*(ipcache_is_ipv6(ipcache) ? \ - &(ipcache)->ipx.ip6.hop_limit : &(ipcache)->ipx.ip4.ip_ttl)) +#define ipcache_ttl(ipcache) \ + (*(ipcache_is_ipv6(ipcache) ? &(ipcache)->ipx.ip6.hop_limit \ + : &(ipcache)->ipx.ip4.ip_ttl)) #else #define ipcache_ttl(ipcache) ((ipcache)->ipx.ip4.ip_ttl) #endif #if CI_CFG_IPV6 -#define ipcache_protocol(ipcache) (*(ipcache_is_ipv6(ipcache) ? \ - &(ipcache)->ipx.ip6.next_hdr : &(ipcache)->ipx.ip4.ip_protocol)) +#define ipcache_protocol(ipcache) \ + (*(ipcache_is_ipv6(ipcache) ? &(ipcache)->ipx.ip6.next_hdr \ + : &(ipcache)->ipx.ip4.ip_protocol)) #else #define ipcache_protocol(ipcache) ((ipcache)->ipx.ip4.ip_protocol) #endif @@ -1331,38 +1287,38 @@ extern int ci_pipe_list_to_iovec(ci_netif* ni, struct oo_pipe* p, #endif #if CI_CFG_IPV6 +#define ipcache_lport_be16(ipcache) \ + ((ipcache_is_ipv6(ipcache) ? ((ci_uint16*) (&(ipcache)->ipx.ip6 + 1)) \ + : ((ci_uint16*) (&(ipcache)->ipx.ip4 + 1)))[0]) +#define ipcache_rport_be16(ipcache) \ + ((ipcache_is_ipv6(ipcache) ? ((ci_uint16*) (&(ipcache)->ipx.ip6 + 1)) \ + : ((ci_uint16*) (&(ipcache)->ipx.ip4 + 1)))[1]) +#else #define ipcache_lport_be16(ipcache) \ - ((ipcache_is_ipv6(ipcache) ? \ - ((ci_uint16*) (&(ipcache)->ipx.ip6 + 1)) : \ - ((ci_uint16*) (&(ipcache)->ipx.ip4 + 1)) )[0]) + (((ci_uint16*) (&(ipcache)->ipx.ip4 + 1))[0]) #define ipcache_rport_be16(ipcache) \ - ((ipcache_is_ipv6(ipcache) ? \ - ((ci_uint16*) (&(ipcache)->ipx.ip6 + 1)) : \ - ((ci_uint16*) (&(ipcache)->ipx.ip4 + 1)) )[1]) -#else -#define ipcache_lport_be16(ipcache) (((ci_uint16*) (&(ipcache)->ipx.ip4 + 1))[0]) -#define ipcache_rport_be16(ipcache) (((ci_uint16*) (&(ipcache)->ipx.ip4 + 1))[1]) + (((ci_uint16*) (&(ipcache)->ipx.ip4 + 1))[1]) /* NB. Above two assume no IP options (which is true for now). */ #endif #define sock_lport_be16(s) ipcache_lport_be16(&(s)->pkt) #define sock_rport_be16(s) ipcache_rport_be16(&(s)->pkt) -#define sock_protocol(s) ipcache_protocol(&(s)->pkt) +#define sock_protocol(s) ipcache_protocol(&(s)->pkt) #define sock_tos_tclass(af, cp) \ - ( WITH_CI_CFG_IPV6( IS_AF_INET6(af) ? (cp)->tclass : ) (cp)->ip_tos ) + (WITH_CI_CFG_IPV6(IS_AF_INET6(af) ? (cp)->tclass :)(cp)->ip_tos) #define sock_cp_ttl_hoplimit(af, cp) \ - ( WITH_CI_CFG_IPV6( IS_AF_INET6(af) ? (cp)->hop_limit : ) (cp)->ip_ttl ) + (WITH_CI_CFG_IPV6(IS_AF_INET6(af) ? (cp)->hop_limit :)(cp)->ip_ttl) #if CI_CFG_IPV6 ci_inline int sock_af_space(ci_sock_cmn* s) { /* Fixme: do we want to cache sock_af_space() somewhere in the socket * state? */ - if( !CI_IS_ADDR_IP6(s->laddr) ) + if( ! CI_IS_ADDR_IP6(s->laddr) ) return AF_SPACE_FLAG_IP4; /* IPv6: are we bound to a specific IPv6 address? */ - if( !CI_IPX_ADDR_IS_ANY(s->laddr) ) + if( ! CI_IPX_ADDR_IS_ANY(s->laddr) ) return AF_SPACE_FLAG_IP6; /* Bound to :::. Is V6ONLY set? */ @@ -1372,47 +1328,45 @@ ci_inline int sock_af_space(ci_sock_cmn* s) return AF_SPACE_FLAG_IP6 | AF_SPACE_FLAG_IP4; } #else -#define sock_af_space(s) AF_SPACE_FLAG_IP4 +#define sock_af_space(s) AF_SPACE_FLAG_IP4 #endif -#define tcp_laddr_be32(ts) sock_laddr_be32(&(ts)->s) -#define tcp_raddr_be32(ts) sock_raddr_be32(&(ts)->s) +#define tcp_laddr_be32(ts) sock_laddr_be32(&(ts)->s) +#define tcp_raddr_be32(ts) sock_raddr_be32(&(ts)->s) #if CI_CFG_IPV6 -#define tcp_ip6_laddr(ts) sock_ip6_laddr(&(ts)->s) -#define tcp_ip6_raddr(ts) sock_ip6_raddr(&(ts)->s) +#define tcp_ip6_laddr(ts) sock_ip6_laddr(&(ts)->s) +#define tcp_ip6_raddr(ts) sock_ip6_raddr(&(ts)->s) #endif -#define tcp_ipx_laddr(ts) sock_ipx_laddr(&(ts)->s) -#define tcp_ipx_raddr(ts) sock_ipx_raddr(&(ts)->s) +#define tcp_ipx_laddr(ts) sock_ipx_laddr(&(ts)->s) +#define tcp_ipx_raddr(ts) sock_ipx_raddr(&(ts)->s) -#define tcp_protocol(ts) sock_protocol(&(ts)->s) -#define tcp_lport_be16(ts) sock_lport_be16(&(ts)->s) -#define tcp_rport_be16(ts) sock_rport_be16(&(ts)->s) +#define tcp_protocol(ts) sock_protocol(&(ts)->s) +#define tcp_lport_be16(ts) sock_lport_be16(&(ts)->s) +#define tcp_rport_be16(ts) sock_rport_be16(&(ts)->s) /* Enable / disable the TCP fast path. */ -# define ci_tcp_can_use_fast_path(ts) \ - ((~ts->s.b.state & CI_TCP_STATE_SLOW_PATH) && \ - ci_ip_queue_is_empty(&(ts)->rob) && \ - tcp_rx_urg_fast_path(ts) && \ - tcp_rcv_wnd_advertised(ts) ) +#define ci_tcp_can_use_fast_path(ts) \ + ((~ts->s.b.state & CI_TCP_STATE_SLOW_PATH) && \ + ci_ip_queue_is_empty(&(ts)->rob) && tcp_rx_urg_fast_path(ts) && \ + tcp_rcv_wnd_advertised(ts)) /* is state in CI_TCP_STATE_TIMEOUT_ORPHAN and orphaned - * if so we timeout */ #if CI_CFG_FD_CACHING -#define ci_tcp_is_timeout_orphan(ts) \ - (((ts)->s.b.state & CI_TCP_STATE_TIMEOUT_ORPHAN) && \ - (((ts)->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) | \ - ((ts)->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE))) +#define ci_tcp_is_timeout_orphan(ts) \ + (((ts)->s.b.state & CI_TCP_STATE_TIMEOUT_ORPHAN) && \ + (((ts)->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN) | \ + ((ts)->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE))) #else -#define ci_tcp_is_timeout_orphan(ts) \ - (((ts)->s.b.state & CI_TCP_STATE_TIMEOUT_ORPHAN) && \ - ((ts)->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)) +#define ci_tcp_is_timeout_orphan(ts) \ + (((ts)->s.b.state & CI_TCP_STATE_TIMEOUT_ORPHAN) && \ + ((ts)->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)) #endif -static inline bool -ci_tcp_is_pluginized(ci_tcp_state* ts) +static inline bool ci_tcp_is_pluginized(ci_tcp_state* ts) { #if CI_CFG_TCP_OFFLOAD_RECYCLER return (ts->s.s_flags & CI_SOCK_FLAG_TCP_OFFLOAD) != 0; @@ -1440,30 +1394,31 @@ extern ci_tcp_state* ci_tcp_get_state_buf(ci_netif*) CI_HF; extern ci_tcp_state* ci_tcp_get_state_buf_from_cache(ci_netif*, int pid) CI_HF; #endif extern ci_udp_state* ci_udp_get_state_buf(ci_netif*) CI_HF; -extern void ci_tcp_state_init(ci_netif* netif, ci_tcp_state* ts, - int from_cache) CI_HF; -extern void ci_tcp_state_tcb_reinit_minimal(ci_netif* netif, - ci_tcp_state* ts) CI_HF; +extern void ci_tcp_state_init( + ci_netif* netif, ci_tcp_state* ts, int from_cache) CI_HF; +extern void ci_tcp_state_tcb_reinit_minimal( + ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_state_reinit(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_init_rcv_wnd(ci_tcp_state*, const char* caller) CI_HF; extern void ci_tcp_drop(ci_netif*, ci_tcp_state*, int so_error) CI_HF; extern void ci_tcp_drop_rob(ci_netif*, ci_tcp_state*) CI_HF; -extern int ci_tcp_try_to_free_pkts(ci_netif* ni, ci_tcp_state* ts, - int desperation) CI_HF; +extern int ci_tcp_try_to_free_pkts( + ci_netif* ni, ci_tcp_state* ts, int desperation) CI_HF; extern void ci_tcp_state_free(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_tcp_state_free_to_cache(ci_netif* ni, ci_tcp_state* ts) CI_HF; #if OO_DO_STACK_POLL -extern void ci_tcp_listen_all_fds_gone(ci_netif*, ci_tcp_socket_listen*, - int do_free) CI_HF; -extern void ci_tcp_all_fds_gone(ci_netif* netif, ci_tcp_state*, - int do_free) CI_HF; +extern void ci_tcp_listen_all_fds_gone( + ci_netif*, ci_tcp_socket_listen*, int do_free) CI_HF; +extern void ci_tcp_all_fds_gone( + ci_netif* netif, ci_tcp_state*, int do_free) CI_HF; #endif extern void ci_tcp_all_fds_gone_common(ci_netif* netif, ci_tcp_state*) CI_HF; extern void ci_tcp_rx_reap_rxq_bufs(ci_netif* netif, ci_tcp_state* ts) CI_HF; -extern void ci_tcp_rx_reap_rxq_last_buf(ci_netif* netif, ci_tcp_state* ts) CI_HF; +extern void ci_tcp_rx_reap_rxq_last_buf( + ci_netif* netif, ci_tcp_state* ts) CI_HF; -static inline void -ci_tcp_rx_reap_rxq_bufs_socklocked(ci_netif* netif, ci_tcp_state* ts) +static inline void ci_tcp_rx_reap_rxq_bufs_socklocked( + ci_netif* netif, ci_tcp_state* ts) { ci_tcp_rx_reap_rxq_bufs(netif, ts); ci_assert(OO_PP_EQ(ts->recv1.head, ts->recv1_extract)); @@ -1471,19 +1426,17 @@ ci_tcp_rx_reap_rxq_bufs_socklocked(ci_netif* netif, ci_tcp_state* ts) ci_tcp_rx_reap_rxq_last_buf(netif, ts); } -extern void ci_tcp_state_dump(ci_netif*, ci_tcp_state*, const char *pf, - oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void ci_tcp_state_dump(ci_netif*, ci_tcp_state*, const char* pf, + oo_dump_log_fn_t logger, void* log_arg) CI_HF; extern void ci_tcp_state_dump_id(ci_netif* ni, int ep_id) CI_HF; extern void ci_tcp_state_dump_qs(ci_netif*, int ep_id, int hex_dump) CI_HF; extern void ci_tcp_state_dump_rob(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_tcp_state_dump_retrans_blocks(ci_netif*, ci_tcp_state*) CI_HF; extern void ci_tcp_state_dump_retrans(ci_netif* ni, ci_tcp_state* ts) CI_HF; -extern void ci_tcp_pkt_dump(ci_netif* ni, ci_ip_pkt_fmt* pkt, int is_recv, - int dump) CI_HF; +extern void ci_tcp_pkt_dump( + ci_netif* ni, ci_ip_pkt_fmt* pkt, int is_recv, int dump) CI_HF; extern void ci_tcp_socket_listen_dump(ci_netif*, ci_tcp_socket_listen*, - const char* pf, - oo_dump_log_fn_t logger, - void* log_arg) CI_HF; + const char* pf, oo_dump_log_fn_t logger, void* log_arg) CI_HF; /* If all the packets have size of amss, the maximum number of packets is * (ts)->s.so.rcvbuf / (ts)->amss. We allow the sum of receive queue to @@ -1498,43 +1451,37 @@ extern void ci_tcp_socket_listen_dump(ci_netif*, ci_tcp_socket_listen*, static inline int ci_tcp_rcvbuf_abused(ci_netif* ni, ci_tcp_state* ts) { return NI_OPTS(ni).tcp_rcvbuf_strict && - ts->recv1.num + ts->recv2.num + ts->rob.num > - (ts->s.so.rcvbuf + ts->rcv_window_max) / ts->amss; + ts->recv1.num + ts->recv2.num + ts->rob.num > + (ts->s.so.rcvbuf + ts->rcv_window_max) / ts->amss; } -extern void ci_tcp_rcvbuf_unabuse(ci_netif* ni, ci_tcp_state* ts, - int sock_already_locked) CI_HF; +extern void ci_tcp_rcvbuf_unabuse( + ci_netif* ni, ci_tcp_state* ts, int sock_already_locked) CI_HF; -extern void -ci_tcp_syncookie_syn(ci_netif* netif, ci_tcp_socket_listen* tls, - ci_tcp_state_synrecv* tsr); -extern void -ci_tcp_syncookie_ack(ci_netif* netif, ci_tcp_socket_listen* tls, - ciip_tcp_rx_pkt* rxp, - ci_tcp_state_synrecv **tsr_p); +extern void ci_tcp_syncookie_syn( + ci_netif* netif, ci_tcp_socket_listen* tls, ci_tcp_state_synrecv* tsr); +extern void ci_tcp_syncookie_ack(ci_netif* netif, ci_tcp_socket_listen* tls, + ciip_tcp_rx_pkt* rxp, ci_tcp_state_synrecv** tsr_p); extern void ci_tcp_set_sndbuf(ci_netif* ni, ci_tcp_state* ts); extern void ci_tcp_set_sndbuf_from_sndbuf_pkts(ci_netif* ni, ci_tcp_state* ts); -extern int -ci_tcp_use_mac_filter_listen(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex); +extern int ci_tcp_use_mac_filter_listen( + ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex); #ifndef __KERNEL__ -extern int -ci_tcp_can_set_filter_in_ul(ci_netif *ni, ci_sock_cmn* s); +extern int ci_tcp_can_set_filter_in_ul(ci_netif* ni, ci_sock_cmn* s); #endif -extern int -ci_tcp_sock_set_stack_filter(ci_netif *ni, ci_sock_cmn* s); +extern int ci_tcp_sock_set_stack_filter(ci_netif* ni, ci_sock_cmn* s); -extern void -ci_tcp_sock_clear_stack_filter(ci_netif *ni, ci_tcp_state* ts); +extern void ci_tcp_sock_clear_stack_filter(ci_netif* ni, ci_tcp_state* ts); #if CI_CFG_FD_CACHING extern int /*bool*/ ci_tcp_is_cacheable_active_wild_sharer(ci_sock_cmn*); #endif -extern int -ci_tcp_offload_get_stream_id(ci_netif* ni, ci_tcp_state* ts, int intf_i); +extern int ci_tcp_offload_get_stream_id( + ci_netif* ni, ci_tcp_state* ts, int intf_i); extern void ci_tcp_prev_seq_remember(ci_netif*, ci_tcp_state*); extern ci_uint32 ci_tcp_prev_seq_lookup(ci_netif*, const ci_tcp_state*); @@ -1544,17 +1491,16 @@ extern ci_uint32 ci_tcp_prev_seq_lookup(ci_netif*, const ci_tcp_state*); **********************************************************************/ #if OO_DO_STACK_POLL -extern void ci_pipe_all_fds_gone(ci_netif* netif, struct oo_pipe* p, - int do_free); +extern void ci_pipe_all_fds_gone( + ci_netif* netif, struct oo_pipe* p, int do_free); #endif /********************************************************************** *************************** ACTIVE WILD ******************************* **********************************************************************/ -ci_inline void -ci_addr_simple_hash(ci_addr_t addr, ci_uint32 entries, - ci_uint32* hash1_out, ci_uint32* hash2_out) +ci_inline void ci_addr_simple_hash(ci_addr_t addr, ci_uint32 entries, + ci_uint32* hash1_out, ci_uint32* hash2_out) { /* Convert address to uint32. Without IPv6 there is no conversion. */ ci_uint32 hash0 = 0; @@ -1562,26 +1508,25 @@ ci_addr_simple_hash(ci_addr_t addr, ci_uint32 entries, if( CI_IS_ADDR_IP6(addr) ) { int i; - for( i = 0; i < sizeof(ci_addr_t) / 4; i++) { + for( i = 0; i < sizeof(ci_addr_t) / 4; i++ ) { hash0 ^= addr.u32[i]; } - } - else + } else #endif hash0 = addr.ip4; - *hash2_out = (hash0 | 1) & (entries - 1); + *hash2_out = (hash0 | 1) & (entries - 1); /* Spread the entropy (such as it is) from the higher-order bits of the * address down a bit. */ hash0 = CI_BSWAP_BE32(hash0); hash0 = hash0 ^ (hash0 >> 8); - *hash1_out = hash0 & (entries - 1); + *hash1_out = hash0 & (entries - 1); } extern ci_active_wild* ci_active_wild_get_state_buf(ci_netif* netif); -extern void ci_active_wild_all_fds_gone(ci_netif* ni, ci_active_wild* aw, - int do_free); +extern void ci_active_wild_all_fds_gone( + ci_netif* ni, ci_active_wild* aw, int do_free); /********************************************************************* ************************** citp_waitable_obj ************************* @@ -1598,229 +1543,198 @@ extern void citp_waitable_obj_free_to_cache(ci_netif*, citp_waitable*) CI_HF; #endif #if OO_DO_STACK_POLL extern void citp_waitable_all_fds_gone(ci_netif*, oo_sp) CI_HF; -extern void citp_waitable_cleanup(ci_netif* ni, citp_waitable_obj* wo, - int do_free); +extern void citp_waitable_cleanup( + ci_netif* ni, citp_waitable_obj* wo, int do_free); #endif extern const char* citp_waitable_type_str(citp_waitable* w) CI_HF; extern void citp_waitable_dump(ci_netif*, citp_waitable*, const char*) CI_HF; extern void citp_waitable_dump_to_logger(ci_netif* ni, citp_waitable* w, - const char* pf, oo_dump_log_fn_t logger, - void* log_arg) CI_HF; -extern void citp_waitable_print_to_logger(ci_netif*, citp_waitable*, - oo_dump_log_fn_t logger, - void* log_arg) CI_HF; -extern void -ci_tcp_listenq_print_to_logger(ci_netif* ni, ci_tcp_socket_listen* tls, - oo_dump_log_fn_t logger, void *log_arg); + const char* pf, oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void citp_waitable_print_to_logger( + ci_netif*, citp_waitable*, oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void ci_tcp_listenq_print_to_logger(ci_netif* ni, + ci_tcp_socket_listen* tls, oo_dump_log_fn_t logger, void* log_arg); /********************************************************************* *********************************************************************/ -extern void ci_tcp_listenq_insert(ci_netif*, ci_tcp_socket_listen*, - ci_tcp_state_synrecv*) CI_HF; -extern void ci_tcp_listenq_remove(ci_netif*, ci_tcp_socket_listen*, - ci_tcp_state_synrecv*) CI_HF; -extern void ci_tcp_listenq_drop(ci_netif*, ci_tcp_socket_listen*, - ci_tcp_state_synrecv*) CI_HF; -extern ci_tcp_state_synrecv* ci_tcp_listenq_lookup(ci_netif* netif, - ci_tcp_socket_listen* tls, - ciip_tcp_rx_pkt*) CI_HF; +extern void ci_tcp_listenq_insert( + ci_netif*, ci_tcp_socket_listen*, ci_tcp_state_synrecv*) CI_HF; +extern void ci_tcp_listenq_remove( + ci_netif*, ci_tcp_socket_listen*, ci_tcp_state_synrecv*) CI_HF; +extern void ci_tcp_listenq_drop( + ci_netif*, ci_tcp_socket_listen*, ci_tcp_state_synrecv*) CI_HF; +extern ci_tcp_state_synrecv* ci_tcp_listenq_lookup( + ci_netif* netif, ci_tcp_socket_listen* tls, ciip_tcp_rx_pkt*) CI_HF; extern void ci_tcp_listenq_drop_oldest(ci_netif*, ci_tcp_socket_listen*) CI_HF; extern int ci_tcp_listenq_drop_all(ci_netif*, ci_tcp_socket_listen*) CI_HF; extern int ci_tcp_listenq_try_promote(ci_netif*, ci_tcp_socket_listen*, - ci_tcp_state_synrecv*, - ci_ip_cached_hdrs*, - ci_ip_pkt_fmt*, - ci_tcp_state**) CI_HF; + ci_tcp_state_synrecv*, ci_ip_cached_hdrs*, ci_ip_pkt_fmt*, + ci_tcp_state**) CI_HF; extern const char* ci_tcp_state_num_str(int state) CI_HF; -#define ci_tcp_state_str(state) ci_tcp_state_num_str(CI_TCP_STATE_NUM(state)) -#define state_str(ts) ci_tcp_state_str((ts)->s.b.state) +#define ci_tcp_state_str(state) ci_tcp_state_num_str(CI_TCP_STATE_NUM(state)) +#define state_str(ts) ci_tcp_state_str((ts)->s.b.state) #ifndef NDEBUG -extern void ci_tcp_state_verify_no_timers(ci_netif *ni, ci_tcp_state *ts); +extern void ci_tcp_state_verify_no_timers(ci_netif* ni, ci_tcp_state* ts); #else -#define ci_tcp_state_verify_no_timers(ni,ts) +#define ci_tcp_state_verify_no_timers(ni, ts) #endif extern const char* ci_tcp_congstate_str(unsigned state) CI_HF; -#define congstate_str(ts) ci_tcp_congstate_str((ts)->congstate) +#define congstate_str(ts) ci_tcp_congstate_str((ts)->congstate) extern void ci_tcp_handle_rx(ci_netif*, struct ci_netif_poll_state*, - ci_ip_pkt_fmt*, ci_tcp_hdr*, int ip_paylen) CI_HF; -extern void ci_tcp_rx_deliver2(ci_tcp_state*,ci_netif*,ciip_tcp_rx_pkt*) CI_HF; -extern void ci_tcp_rx_plugin_meta(ci_netif*, struct ci_netif_poll_state*, - ci_ip_pkt_fmt* pkt) CI_HF; + ci_ip_pkt_fmt*, ci_tcp_hdr*, int ip_paylen) CI_HF; +extern void ci_tcp_rx_deliver2( + ci_tcp_state*, ci_netif*, ciip_tcp_rx_pkt*) CI_HF; +extern void ci_tcp_rx_plugin_meta( + ci_netif*, struct ci_netif_poll_state*, ci_ip_pkt_fmt* pkt) CI_HF; extern void ci_tcp_tx_change_mss(ci_netif*, ci_tcp_state*) CI_HF; -extern void ci_tcp_enqueue_no_data(ci_tcp_state* ts, ci_netif* netif, - ci_ip_pkt_fmt* pkt) CI_HF; +extern void ci_tcp_enqueue_no_data( + ci_tcp_state* ts, ci_netif* netif, ci_ip_pkt_fmt* pkt) CI_HF; extern int ci_tcp_send_sim_synack(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern int ci_tcp_synrecv_send(ci_netif* netif, ci_tcp_socket_listen* tls, - ci_tcp_state_synrecv* tsr, - ci_ip_pkt_fmt* pkt, ci_uint8 tcp_flags, - ci_ip_cached_hdrs* ipcache_opt) CI_HF; + ci_tcp_state_synrecv* tsr, ci_ip_pkt_fmt* pkt, ci_uint8 tcp_flags, + ci_ip_cached_hdrs* ipcache_opt) CI_HF; extern int ci_tcp_unsacked_segments_in_flight(ci_netif*, ci_tcp_state*) CI_HF; -extern int ci_tcp_retrans_one(ci_tcp_state* ts, ci_netif* netif, - ci_ip_pkt_fmt* pkt) CI_HF; +extern int ci_tcp_retrans_one( + ci_tcp_state* ts, ci_netif* netif, ci_ip_pkt_fmt* pkt) CI_HF; extern int ci_tcp_retrans(ci_netif* ni, ci_tcp_state* ts, int seq_limit, - int before_sacked_only, int* seq_used) CI_HF; -extern void ci_tcp_retrans_recover(ci_netif* ni, ci_tcp_state* ts, - int force_retrans_first) CI_HF; + int before_sacked_only, int* seq_used) CI_HF; +extern void ci_tcp_retrans_recover( + ci_netif* ni, ci_tcp_state* ts, int force_retrans_first) CI_HF; extern int /*bool*/ ci_tcp_maybe_enter_fast_recovery(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_tcp_recovered(ci_netif* ni, ci_tcp_state* ts) CI_HF; extern void ci_tcp_clear_sacks(ci_netif* ni, ci_tcp_state* ts) CI_HF; -extern void ci_tcp_retrans_init_ptrs(ci_netif* ni, ci_tcp_state* ts, - unsigned* recover_seq_out) CI_HF; -extern void ci_tcp_get_fack(ci_netif* ni, ci_tcp_state* ts, - unsigned* fack_out, int* retrans_data_out) CI_HF; +extern void ci_tcp_retrans_init_ptrs( + ci_netif* ni, ci_tcp_state* ts, unsigned* recover_seq_out) CI_HF; +extern void ci_tcp_get_fack(ci_netif* ni, ci_tcp_state* ts, unsigned* fack_out, + int* retrans_data_out) CI_HF; -extern void ci_tcp_retrans_coalesce_block(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt) CI_HF; +extern void ci_tcp_retrans_coalesce_block( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) CI_HF; extern int ci_tcp_tx_coalesce(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_queue* q, ci_ip_pkt_fmt* pkt, - ci_boolean_t is_sendq) CI_HF; + ci_ip_pkt_queue* q, ci_ip_pkt_fmt* pkt, ci_boolean_t is_sendq) CI_HF; extern void ci_tcp_tx_insert_option_space(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt, int hdrlen, - int extra_opts) CI_HF; + ci_ip_pkt_fmt* pkt, int hdrlen, int extra_opts) CI_HF; extern int ci_tcp_tx_split(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_queue* qu, - ci_ip_pkt_fmt* pkt, int new_paylen, - ci_boolean_t is_sendq) CI_HF; + ci_ip_pkt_fmt* pkt, int new_paylen, ci_boolean_t is_sendq) CI_HF; extern void ci_tcp_tx_advance(ci_tcp_state* ts, ci_netif* netif) CI_HF; extern void ci_tcp_tx_advance_to(ci_netif* ni, ci_tcp_state* ts, - unsigned right_edge, ci_uint32* p_stop_cntr) CI_HF; -extern void ci_tcp_send_rst_with_flags(ci_netif*, ci_tcp_state*, - ci_uint8 extra_flags) CI_HF; + unsigned right_edge, ci_uint32* p_stop_cntr) CI_HF; +extern void ci_tcp_send_rst_with_flags( + ci_netif*, ci_tcp_state*, ci_uint8 extra_flags) CI_HF; extern void ci_tcp_send_rst(ci_netif* netif, ci_tcp_state* ts) CI_HF; -extern void -ci_tcp_reply_with_rst(ci_netif* netif, const struct oo_sock_cplane* sock_cp, - ciip_tcp_rx_pkt* rxp) CI_HF; -extern int ci_tcp_reset_untrusted(ci_netif *netif, ci_tcp_state *ts) CI_HF; +extern void ci_tcp_reply_with_rst(ci_netif* netif, + const struct oo_sock_cplane* sock_cp, ciip_tcp_rx_pkt* rxp) CI_HF; +extern int ci_tcp_reset_untrusted(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_send_zwin_probe(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_set_established_state(ci_netif*, ci_tcp_state*) CI_HF; extern void ci_tcp_expand_sndbuf(ci_netif*, ci_tcp_state*) CI_HF; extern bool ci_tcp_should_expand_sndbuf(ci_netif*, ci_tcp_state*) CI_HF; -extern void ci_tcp_moderate_sndbuf(ci_netif* , ci_tcp_state*) CI_HF; +extern void ci_tcp_moderate_sndbuf(ci_netif*, ci_tcp_state*) CI_HF; extern void ci_tcp_set_slow_state(ci_netif*, ci_tcp_state*, int state) CI_HF; -extern int ci_tcp_parse_options(ci_netif*, ciip_tcp_rx_pkt*, - ci_tcp_options*) CI_HF; +extern int ci_tcp_parse_options( + ci_netif*, ciip_tcp_rx_pkt*, ci_tcp_options*) CI_HF; -extern void ci_ipx_hdr_init_fixed(ci_ipx_hdr_t* ip, int af, int protocol, - int ttl, unsigned tos) CI_HF; +extern void ci_ipx_hdr_init_fixed( + ci_ipx_hdr_t* ip, int af, int protocol, int ttl, unsigned tos) CI_HF; extern void ci_tcp_send_ack_rx(ci_netif*, ci_tcp_state*, ci_ip_pkt_fmt*, - int sock_locked, int update_wnd) CI_HF; -ci_inline void ci_tcp_send_ack(ci_netif* netif, ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt, int sock_locked) + int sock_locked, int update_wnd) CI_HF; +ci_inline void ci_tcp_send_ack( + ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_fmt* pkt, int sock_locked) { ci_tcp_send_ack_rx(netif, ts, pkt, sock_locked, 1); } -extern int ci_tcp_send_challenge_ack(ci_netif*, ci_tcp_state*, - ci_ip_pkt_fmt*) CI_HF; -extern int/*bool*/ +extern int ci_tcp_send_challenge_ack( + ci_netif*, ci_tcp_state*, ci_ip_pkt_fmt*) CI_HF; +extern int /*bool*/ ci_tcp_may_send_ack_ratelimited(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_send_ack_loopback(ci_netif* netif, ci_tcp_state* ts) CI_HF; -extern int ci_tcp_send_wnd_update(ci_netif*, ci_tcp_state*, - int sock_locked) CI_HF; +extern int ci_tcp_send_wnd_update( + ci_netif*, ci_tcp_state*, int sock_locked) CI_HF; /* TCP/UDP filter insertion */ extern void ci_netif_filter_init(ci_netif* ni, int size_lg2) CI_HF; #if CI_CFG_IPV6 -void ci_ip6_netif_filter_init(ci_ip6_netif_filter_table* tbl, - int size_lg2) CI_HF; +void ci_ip6_netif_filter_init( + ci_ip6_netif_filter_table* tbl, int size_lg2) CI_HF; #endif -extern ci_sock_cmn* -__ci_netif_filter_lookup(ci_netif* netif, int af_space, - ci_addr_t daddr, unsigned dport, - ci_addr_t saddr, unsigned sport, - unsigned prot) CI_HF; +extern ci_sock_cmn* __ci_netif_filter_lookup(ci_netif* netif, int af_space, + ci_addr_t daddr, unsigned dport, ci_addr_t saddr, unsigned sport, + unsigned prot) CI_HF; #if CI_CFG_IPV6 -extern int -ci_ip6_netif_filter_lookup(ci_netif* netif, ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, unsigned prot) CI_HF; -extern int -__ci_ip6_netif_filter_lookup(ci_netif* netif, ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, unsigned prot) CI_HF; -#endif -extern oo_sp -ci_netif_filter_lookup(ci_netif* netif, int af_space, - ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, - unsigned protocol); +extern int ci_ip6_netif_filter_lookup(ci_netif* netif, ci_addr_t laddr, + unsigned lport, ci_addr_t raddr, unsigned rport, unsigned prot) CI_HF; +extern int __ci_ip6_netif_filter_lookup(ci_netif* netif, ci_addr_t laddr, + unsigned lport, ci_addr_t raddr, unsigned rport, unsigned prot) CI_HF; +#endif +extern oo_sp ci_netif_filter_lookup(ci_netif* netif, int af_space, + ci_addr_t laddr, unsigned lport, ci_addr_t raddr, unsigned rport, + unsigned protocol); /* Returns socket index, or OO_SP_NULL if lookup failed. */ -extern oo_sp -ci_netif_listener_lookup(ci_netif* netif, int af_space, - ci_addr_t laddr, unsigned lport) CI_HF; +extern oo_sp ci_netif_listener_lookup( + ci_netif* netif, int af_space, ci_addr_t laddr, unsigned lport) CI_HF; /* Invokes the callback on each socket that matches the supplied addressing * fields. If the callback returns non-zero, then the search is * terminated. * Returns 1 if the search was terminated, 0 otherwise. */ -extern int -ci_netif_filter_for_each_match(ci_netif*, unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, - unsigned protocol, int intf_i, int vlan, - int (*callback)(ci_sock_cmn*, void*), - void* callback_arg, ci_uint32* hash_out) CI_HF; +extern int ci_netif_filter_for_each_match(ci_netif*, unsigned laddr, + unsigned lport, unsigned raddr, unsigned rport, unsigned protocol, + int intf_i, int vlan, int (*callback)(ci_sock_cmn*, void*), + void* callback_arg, ci_uint32* hash_out) CI_HF; #if CI_CFG_IPV6 -extern int -ci_netif_filter_for_each_match_ip6(ci_netif* ni, - const ci_addr_t* laddr, unsigned lport, - const ci_addr_t* raddr, unsigned rport, - unsigned protocol, int intf_i, int vlan, - int (*callback)(ci_sock_cmn*, void*), - void* callback_arg, ci_uint32* hash_out) CI_HF; -#endif - -extern ci_uint32 -ci_netif_filter_hash(ci_netif* ni, ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, - unsigned protocol) CI_HF; - -extern int -ci_netif_filter_insert(ci_netif* netif, oo_sp sock_id, int af_space, - const ci_addr_t laddr, unsigned lport, - const ci_addr_t raddr, unsigned rport, - unsigned protocol) CI_HF; - -extern void -ci_netif_filter_remove(ci_netif* netif, oo_sp tcp_id, int af_space, - const ci_addr_t laddr, unsigned lport, - const ci_addr_t raddr, unsigned rport, - unsigned protocol) CI_HF; +extern int ci_netif_filter_for_each_match_ip6(ci_netif* ni, + const ci_addr_t* laddr, unsigned lport, const ci_addr_t* raddr, + unsigned rport, unsigned protocol, int intf_i, int vlan, + int (*callback)(ci_sock_cmn*, void*), void* callback_arg, + ci_uint32* hash_out) CI_HF; +#endif + +extern ci_uint32 ci_netif_filter_hash(ci_netif* ni, ci_addr_t laddr, + unsigned lport, ci_addr_t raddr, unsigned rport, unsigned protocol) CI_HF; + +extern int ci_netif_filter_insert(ci_netif* netif, oo_sp sock_id, int af_space, + const ci_addr_t laddr, unsigned lport, const ci_addr_t raddr, + unsigned rport, unsigned protocol) CI_HF; + +extern void ci_netif_filter_remove(ci_netif* netif, oo_sp tcp_id, int af_space, + const ci_addr_t laddr, unsigned lport, const ci_addr_t raddr, + unsigned rport, unsigned protocol) CI_HF; #if CI_CFG_UL_INTERRUPT_HELPER || defined(__KERNEL__) -ci_inline void -oo_sw_filter_apply(ci_netif* ni, struct oo_sw_filter_op* op) +ci_inline void oo_sw_filter_apply(ci_netif* ni, struct oo_sw_filter_op* op) { if( op->op == OO_SW_FILTER_OP_ADD ) { - ci_netif_filter_insert(ni, op->sock_id, op->af_space, - op->laddr, op->lport, - op->raddr, op->rport, op->protocol); - } - else { - ci_netif_filter_remove(ni, op->sock_id, op->af_space, - op->laddr, op->lport, - op->raddr, op->rport, op->protocol); + ci_netif_filter_insert(ni, op->sock_id, op->af_space, op->laddr, op->lport, + op->raddr, op->rport, op->protocol); + } else { + ci_netif_filter_remove(ni, op->sock_id, op->af_space, op->laddr, op->lport, + op->raddr, op->rport, op->protocol); } } #endif @@ -1846,19 +1760,17 @@ ci_inline ci_uint32 ci_netif_filter_table_size(ci_netif* ni) #if CI_CFG_TCP_SHARED_LOCAL_PORTS #ifndef __KERNEL__ extern oo_sp ci_netif_active_wild_get(ci_netif* ni, ci_addr_t laddr, - ci_addr_t raddr, unsigned lport, - ci_uint16* port_out, - ci_uint32* prev_seq_out); + ci_addr_t raddr, unsigned lport, ci_uint16* port_out, + ci_uint32* prev_seq_out); #endif extern void ci_netif_active_wild_sharer_closed(ci_netif* ni, ci_sock_cmn* s); #define RSS_HASH_SIZE 0x80 #define RSS_HASH_MASK (RSS_HASH_SIZE - 1) -extern int ci_netif_active_wild_nic_hash(ci_netif *ni, - ci_addr_t laddr, ci_uint16 lport, - ci_addr_t raddr, ci_uint16 rport); +extern int ci_netif_active_wild_nic_hash(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport, ci_addr_t raddr, ci_uint16 rport); -extern struct oo_p_dllink_state -ci_netif_get_active_wild_list(ci_netif* ni, int aw_pool, ci_addr_t laddr); +extern struct oo_p_dllink_state ci_netif_get_active_wild_list( + ci_netif* ni, int aw_pool, ci_addr_t laddr); #endif /* Bind RX of socket to given interface. Used by implementation of @@ -1867,17 +1779,16 @@ ci_netif_get_active_wild_list(ci_netif* ni, int aw_pool, ci_addr_t laddr); */ extern int ci_sock_rx_bind2dev(ci_netif*, ci_sock_cmn*, ci_ifid_t) CI_HF; -extern int -__ci_tcp_shutdown(ci_netif*, ci_tcp_state*, int how) CI_HF; +extern int __ci_tcp_shutdown(ci_netif*, ci_tcp_state*, int how) CI_HF; extern void __ci_tcp_listen_shutdown(ci_netif*, ci_tcp_socket_listen*) CI_HF; -extern void ci_tcp_listen_shutdown_queues(ci_netif* netif, - ci_tcp_socket_listen* tls) CI_HF; +extern void ci_tcp_listen_shutdown_queues( + ci_netif* netif, ci_tcp_socket_listen* tls) CI_HF; #if CI_CFG_FD_CACHING -extern void -ci_tcp_listen_uncache_fds(ci_netif* netif, ci_tcp_socket_listen* tls) CI_HF; +extern void ci_tcp_listen_uncache_fds( + ci_netif* netif, ci_tcp_socket_listen* tls) CI_HF; extern void ci_tcp_epcache_drop_cache(ci_netif* ni) CI_HF; -extern void ci_tcp_listen_update_cached(ci_netif* netif, - ci_tcp_socket_listen* tls) CI_HF; +extern void ci_tcp_listen_update_cached( + ci_netif* netif, ci_tcp_socket_listen* tls) CI_HF; extern void ci_tcp_active_cache_drop_cache(ci_netif* ni) CI_HF; extern void ci_tcp_passive_scalable_cache_drop_cache(ci_netif* ni) CI_HF; #endif @@ -1885,8 +1796,8 @@ extern void __ci_tcp_listen_to_normal(ci_netif*, ci_tcp_socket_listen*) CI_HF; extern void ci_netif_filter_dump(ci_netif*) CI_HF; -extern unsigned int ci_tcp_wscl_by_buff(ci_netif *netif, - ci_int32 rcv_buff) CI_HF; +extern unsigned int ci_tcp_wscl_by_buff( + ci_netif* netif, ci_int32 rcv_buff) CI_HF; extern ci_int32 ci_tcp_rcvbuf_established(ci_netif* ni, ci_sock_cmn* s) CI_HF; @@ -1898,11 +1809,11 @@ extern void ci_udp_ipcache_convert(int af, ci_udp_state* ts) CI_HF; #endif /* timer handlers */ -#define ci_tcp_time_now(ni) ci_ip_time_now(ni) +#define ci_tcp_time_now(ni) ci_ip_time_now(ni) #define ci_tcp_time_ms2ticks(ni, x) ci_ip_time_ms2ticks(ni, (x)) extern void ci_tcp_timer_init(ci_netif* netif) CI_HF; -extern void ci_tcp_timeout_listen(ci_netif* netif, - ci_tcp_socket_listen* tls) CI_HF; +extern void ci_tcp_timeout_listen( + ci_netif* netif, ci_tcp_socket_listen* tls) CI_HF; extern void ci_tcp_timeout_kalive(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_timeout_zwin(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_timeout_delack(ci_netif* netif, ci_tcp_state* ts) CI_HF; @@ -1910,15 +1821,15 @@ extern void ci_tcp_timeout_rto(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_timeout_cork(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_timeout_recycle(ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_stop_timers(ci_netif* netif, ci_tcp_state* ts) CI_HF; -extern void ci_tcp_send_corked_packets(ci_netif* netif, ci_tcp_state* ts) CI_HF; +extern void ci_tcp_send_corked_packets( + ci_netif* netif, ci_tcp_state* ts) CI_HF; extern void ci_tcp_tx_pkt_assert_valid(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt*, - const char* f, int l) CI_HF; -extern void ci_tcp_state_assert_valid(ci_netif*, ci_tcp_state* ts, - const char* file, int line) CI_HF; -extern void ci_tcp_state_listen_assert_valid(ci_netif*, ci_tcp_socket_listen*, - const char* file, int line) CI_HF; + ci_ip_pkt_fmt*, const char* f, int l) CI_HF; +extern void ci_tcp_state_assert_valid( + ci_netif*, ci_tcp_state* ts, const char* file, int line) CI_HF; +extern void ci_tcp_state_listen_assert_valid( + ci_netif*, ci_tcp_socket_listen*, const char* file, int line) CI_HF; extern void ci_tcp_ep_assert_valid(citp_socket*, const char*, int ln) CI_HF; @@ -1928,50 +1839,47 @@ extern void ci_tcp_ep_assert_valid(citp_socket*, const char*, int ln) CI_HF; #ifndef __KERNEL__ -extern int -ci_opt_is_setting_reuseport(int level, int optname, const void* optval, - socklen_t optlen) CI_HF; -extern int -ci_setsockopt_os_fail_ignore(ci_netif* ni, ci_sock_cmn* s, int err, - int level, int optname, - const void* optval, socklen_t optlen) CI_HF; +extern int ci_opt_is_setting_reuseport( + int level, int optname, const void* optval, socklen_t optlen) CI_HF; +extern int ci_setsockopt_os_fail_ignore(ci_netif* ni, ci_sock_cmn* s, int err, + int level, int optname, const void* optval, socklen_t optlen) CI_HF; struct oo_per_thread; typedef void (*citp_init_thread_callback)(struct oo_per_thread*); typedef void (*oo_signal_terminate_fn)(int signum); extern int ci_tp_init(citp_init_thread_callback cb, - oo_signal_terminate_fn signal_terminate_fn) CI_HF; + oo_signal_terminate_fn signal_terminate_fn) CI_HF; extern int ci_tcp_bind(citp_socket* ep, const struct sockaddr* my_addr, - socklen_t addrlen, ci_fd_t fd) CI_HF; + socklen_t addrlen, ci_fd_t fd) CI_HF; #if CI_CFG_ENDPOINT_MOVE extern int ci_tcp_reuseport_bind(ci_sock_cmn* sock, ci_fd_t fd) CI_HF; #endif -extern void ci_tcp_get_peer_addr(ci_tcp_state* ts, struct sockaddr* name, - socklen_t* namelen) CI_HF; -extern int ci_tcp_getpeername(citp_socket*, struct sockaddr*, socklen_t*) CI_HF; -extern int ci_tcp_getsockname(citp_socket*, ci_fd_t, struct sockaddr*, - socklen_t*) CI_HF; +extern void ci_tcp_get_peer_addr( + ci_tcp_state* ts, struct sockaddr* name, socklen_t* namelen) CI_HF; +extern int ci_tcp_getpeername( + citp_socket*, struct sockaddr*, socklen_t*) CI_HF; +extern int ci_tcp_getsockname( + citp_socket*, ci_fd_t, struct sockaddr*, socklen_t*) CI_HF; -extern int ci_tcp_getsockopt(citp_socket* ep, ci_fd_t fd, int level, int optname, - void *optval, socklen_t *optlen) CI_HF; -extern int ci_tcp_setsockopt(citp_socket* ep, ci_fd_t fd, int level, int optname, - const void*optval, socklen_t optlen) CI_HF; -extern int ci_tcp_ioctl(citp_socket* ep, ci_fd_t fd, int request, void* arg) CI_HF; +extern int ci_tcp_getsockopt(citp_socket* ep, ci_fd_t fd, int level, + int optname, void* optval, socklen_t* optlen) CI_HF; +extern int ci_tcp_setsockopt(citp_socket* ep, ci_fd_t fd, int level, + int optname, const void* optval, socklen_t optlen) CI_HF; +extern int ci_tcp_ioctl( + citp_socket* ep, ci_fd_t fd, int request, void* arg) CI_HF; struct oo_msg_template; struct onload_template_msg_update_iovec; extern int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template** omt_pp, - const struct iovec* initial_msg, int mlen, - unsigned flags) CI_HF; -extern int -ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template* omt, - const struct onload_template_msg_update_iovec* updates, - int ulen, unsigned flags) CI_HF; -extern int ci_tcp_tmpl_abort(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template* omt) CI_HF; + struct oo_msg_template** omt_pp, const struct iovec* initial_msg, int mlen, + unsigned flags) CI_HF; +extern int ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, + struct oo_msg_template* omt, + const struct onload_template_msg_update_iovec* updates, int ulen, + unsigned flags) CI_HF; +extern int ci_tcp_tmpl_abort( + ci_netif* ni, ci_tcp_state* ts, struct oo_msg_template* omt) CI_HF; extern int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) CI_HF; @@ -1979,27 +1887,26 @@ extern int ci_tcp_listen(citp_socket* ep, ci_fd_t fd, int backlog) CI_HF; #ifdef __KERNEL__ extern void ci_tcp_linger(ci_netif*, ci_tcp_state*) CI_HF; -extern int ci_tcp_sync_sockopts_to_os_sock(ci_netif* ni, oo_sp sock_id, - struct socket* sock) CI_HF; +extern int ci_tcp_sync_sockopts_to_os_sock( + ci_netif* ni, oo_sp sock_id, struct socket* sock) CI_HF; #endif -extern int ci_tcp_listen_init(ci_netif *ni, ci_tcp_socket_listen *tls) CI_HF; +extern int ci_tcp_listen_init(ci_netif* ni, ci_tcp_socket_listen* tls) CI_HF; /* Send/recv called from within kernel & user-library, so outside above #if */ extern int ci_tcp_recvmsg(const ci_tcp_recvmsg_args*) CI_HF; struct onload_zc_recv_args; -extern int ci_tcp_zc_recvmsg(const ci_tcp_recvmsg_args*, - struct onload_zc_recv_args* args) CI_HF; -extern int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, - const ci_iovec* iov, unsigned long iovlen, - int flags - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) CI_HF; -extern void ci_tcp_sendmsg_enqueue_prequeue_deferred(ci_netif*, - ci_tcp_state*) CI_HF; -extern void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, - ci_tcp_state* ts, - int/*bool*/ shutdown) CI_HF; -extern void ci_tcp_perform_deferred_socket_work(ci_netif*, ci_tcp_state*)CI_HF; +extern int ci_tcp_zc_recvmsg( + const ci_tcp_recvmsg_args*, struct onload_zc_recv_args* args) CI_HF; +extern int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, const ci_iovec* iov, + unsigned long iovlen, + int flags CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) CI_HF; +extern void ci_tcp_sendmsg_enqueue_prequeue_deferred( + ci_netif*, ci_tcp_state*) CI_HF; +extern void ci_tcp_sendmsg_enqueue_prequeue( + ci_netif* ni, ci_tcp_state* ts, int /*bool*/ shutdown) CI_HF; +extern void ci_tcp_perform_deferred_socket_work( + ci_netif*, ci_tcp_state*) CI_HF; /* Guarantees that deferred work will be performed at some point in the * near future, either by the calling thread (in this call), or deferred to @@ -2007,51 +1914,49 @@ extern void ci_tcp_perform_deferred_socket_work(ci_netif*, ci_tcp_state*)CI_HF; * * Returns 1 if the stack lock was grabbed, else 0. */ -extern int ci_netif_lock_or_defer_work(ci_netif*, citp_waitable*) CI_HF; +extern int ci_netif_lock_or_defer_work(ci_netif*, citp_waitable*) CI_HF; #ifndef __KERNEL__ extern int ci_tcp_connect(citp_socket*, const struct sockaddr*, socklen_t, - ci_fd_t fd, int *p_moved) CI_HF; + ci_fd_t fd, int* p_moved) CI_HF; extern int ci_tcp_shutdown(citp_socket*, int how, ci_fd_t fd) CI_HF; #endif -extern oo_sp ci_tcp_connect_find_local_peer(ci_netif *ni, int locked, - ci_addr_t dst_addr, - int dport_be16) CI_HF; +extern oo_sp ci_tcp_connect_find_local_peer( + ci_netif* ni, int locked, ci_addr_t dst_addr, int dport_be16) CI_HF; #ifdef __KERNEL__ -extern int ci_tcp_connect_lo_samestack(ci_netif *ni, ci_tcp_state *ts, - oo_sp tls_id, int *stack_locked) CI_HF; -extern int ci_tcp_connect_lo_toconn(ci_netif *c_ni, oo_sp c_id, ci_addr_t dst, - ci_netif *l_ni, oo_sp l_id) CI_HF; +extern int ci_tcp_connect_lo_samestack( + ci_netif* ni, ci_tcp_state* ts, oo_sp tls_id, int* stack_locked) CI_HF; +extern int ci_tcp_connect_lo_toconn(ci_netif* c_ni, oo_sp c_id, ci_addr_t dst, + ci_netif* l_ni, oo_sp l_id) CI_HF; #endif #if CI_CFG_LIMIT_AMSS || CI_CFG_LIMIT_SMSS -extern ci_uint16 ci_tcp_limit_mss(ci_uint16 mss, ci_netif* ni, - const char* caller) CI_HF; +extern ci_uint16 ci_tcp_limit_mss( + ci_uint16 mss, ci_netif* ni, const char* caller) CI_HF; #endif extern unsigned ci_tcp_amss(ci_netif* ni, const ci_tcp_socket_cmn* c, - ci_ip_cached_hdrs* ipcache, - const char* caller) CI_HF; + ci_ip_cached_hdrs* ipcache, const char* caller) CI_HF; /********************************************************************** ************************** Misc and tracing ************************** **********************************************************************/ -extern const char* /*??ci_*/ip_addr_str(unsigned addr_be32) CI_HF; - /* Note that this function is not reentrant. However, it won't cause - ** seg-faults. Two buffers are used alternately, so it can be used twice - ** in an list of arguments. - */ +extern const char* /*??ci_*/ ip_addr_str(unsigned addr_be32) CI_HF; +/* Note that this function is not reentrant. However, it won't cause +** seg-faults. Two buffers are used alternately, so it can be used twice +** in an list of arguments. +*/ -extern const char* /*??ci_*/domain_str(int domain) CI_HF; -extern const char* /*??ci_*/type_str(int type) CI_HF; +extern const char* /*??ci_*/ domain_str(int domain) CI_HF; +extern const char* /*??ci_*/ type_str(int type) CI_HF; #define CI_SOCK_TYPE_FMT "%s%s%s" -#define CI_SOCK_TYPE_ARGS(type) \ - type_str(type), type & SOCK_CLOEXEC ? " | SOCK_CLOEXEC" : "", \ - type & SOCK_NONBLOCK ? " | SOCK_NONBLOCK" : "" +#define CI_SOCK_TYPE_ARGS(type) \ + type_str(type), type &SOCK_CLOEXEC ? " | SOCK_CLOEXEC" : "", \ + type &SOCK_NONBLOCK ? " | SOCK_NONBLOCK" : "" #ifndef __KERNEL__ /* Linux defines it in its in-kernel header only; we use it both in module @@ -2063,19 +1968,19 @@ extern const char* /*??ci_*/type_str(int type) CI_HF; * be handled by the L5 stack. * On failure, the return value is the error condition. */ -extern int ci_can_handle_addr(ci_netif *netif, ci_uint32 ip_be32, - unsigned int proto, ci_uint32 *src_ip_be32_out, - unsigned *nic_i_out, unsigned *mtu_out) CI_HF; +extern int ci_can_handle_addr(ci_netif* netif, ci_uint32 ip_be32, + unsigned int proto, ci_uint32* src_ip_be32_out, unsigned* nic_i_out, + unsigned* mtu_out) CI_HF; -#define NETIF_MAGIC 0xd +#define NETIF_MAGIC 0xd /********************************************************************** ************************** Per-socket locks *************************** **********************************************************************/ -extern int ci_sock_lock_slow(ci_netif* ni, citp_waitable* w) CI_HF; +extern int ci_sock_lock_slow(ci_netif* ni, citp_waitable* w) CI_HF; extern void ci_sock_unlock_slow(ci_netif*, citp_waitable*) CI_HF; @@ -2083,10 +1988,10 @@ extern void ci_sock_unlock_slow(ci_netif*, citp_waitable*) CI_HF; ******************************* Sleeping ****************************** **********************************************************************/ -#define CI_SLEEP_NETIF_LOCKED 0x1 -#define CI_SLEEP_SOCK_LOCKED 0x2 -#define CI_SLEEP_NETIF_RQ 0x4 -#define CI_SLEEP_SOCK_RQ 0x8 +#define CI_SLEEP_NETIF_LOCKED 0x1 +#define CI_SLEEP_SOCK_LOCKED 0x2 +#define CI_SLEEP_NETIF_RQ 0x4 +#define CI_SLEEP_SOCK_RQ 0x8 #if OO_DO_STACK_POLL /*! Sleep until something happens. @@ -2107,8 +2012,7 @@ extern void ci_sock_unlock_slow(ci_netif*, citp_waitable*) CI_HF; ** of this function). */ extern int ci_sock_sleep(ci_netif* ni, citp_waitable* w, ci_bits why, - unsigned lock_flags, ci_uint64 sleep_seq, - ci_uint32 *timeout_ms_p) CI_HF; + unsigned lock_flags, ci_uint64 sleep_seq, ci_uint32* timeout_ms_p) CI_HF; #endif @@ -2116,9 +2020,9 @@ extern int ci_sock_sleep(ci_netif* ni, citp_waitable* w, ci_bits why, ******************************* Polling ******************************* **********************************************************************/ -#define ci_netif_is_contention(ni) \ - (ef_eplock_flags(&(ni)->state->lock) & \ - (CI_EPLOCK_FL_NEED_WAKE | CI_EPLOCK_NETIF_SOCKET_LIST)) +#define ci_netif_is_contention(ni) \ + (ef_eplock_flags(&(ni)->state->lock) & \ + (CI_EPLOCK_FL_NEED_WAKE | CI_EPLOCK_NETIF_SOCKET_LIST)) /********************************************************************** @@ -2130,42 +2034,44 @@ extern int ci_sock_sleep(ci_netif* ni, citp_waitable* w, ci_bits why, /* ***************** - * Errno wrappers - note that errno should not be accessed directly + * Errno wrappers - note that errno should not be accessed directly */ #ifdef __KERNEL__ -# define CI_SET_ERROR(rc, e) \ - do{ \ - CI_BUILD_ASSERT_CONSTANT_NON_NEGATIVE((int)(e)-1); \ - ci_assert_gt((int)(e), 0); \ - (rc) = -(e); \ - } while(0) -# define CI_GET_ERROR(rc) (-(rc)) +#define CI_SET_ERROR(rc, e) \ + do { \ + CI_BUILD_ASSERT_CONSTANT_NON_NEGATIVE((int) (e) -1); \ + ci_assert_gt((int) (e), 0); \ + (rc) = -(e); \ + } while( 0 ) +#define CI_GET_ERROR(rc) (-(rc)) #else -# define CI_SET_ERROR(rc, e) \ - do{ \ - CI_BUILD_ASSERT_CONSTANT_NON_NEGATIVE((int)(e)-1); \ - ci_assert_gt((int)(e), 0); \ - errno = (e); \ - (rc) = CI_SOCKET_ERROR; \ - } while(0) -# define CI_GET_ERROR(rc) (errno) +#define CI_SET_ERROR(rc, e) \ + do { \ + CI_BUILD_ASSERT_CONSTANT_NON_NEGATIVE((int) (e) -1); \ + ci_assert_gt((int) (e), 0); \ + errno = (e); \ + (rc) = CI_SOCKET_ERROR; \ + } while( 0 ) +#define CI_GET_ERROR(rc) (errno) #endif /* Sets errno to specified value and returns CI_SOCKET_ERROR */ -#define RET_WITH_ERRNO(_errno) do { \ - int rc_; \ - CI_SET_ERROR(rc_, _errno); \ - return rc_; } while (0) +#define RET_WITH_ERRNO(_errno) \ + do { \ + int rc_; \ + CI_SET_ERROR(rc_, _errno); \ + return rc_; \ + } while( 0 ) /********************************************************************** **************************** OS-specific ***************************** -**********************************************************************/ + **********************************************************************/ /* ************************** */ /* Unix Implementation */ /* ************************** */ /*! \i_ossock Return value from failed socket calls. */ -#define CI_SOCKET_ERROR -1 +#define CI_SOCKET_ERROR -1 /*! \i_ossock Verify that a file descriptor/handle is valid */ #define CI_IS_VALID_SOCKET(fd) ((fd) >= 0) @@ -2182,8 +2088,11 @@ extern int ci_sock_sleep(ci_netif* ni, citp_waitable* w, ci_bits why, * \param fd [in] OS fd to release * \return nothing */ -#define ci_rel_os_sock_fd(fd) do { if(CI_IS_VALID_SOCKET(fd)) \ - ci_tcp_helper_rel_sock_fd((fd)); } while(0) +#define ci_rel_os_sock_fd(fd) \ + do { \ + if( CI_IS_VALID_SOCKET(fd) ) \ + ci_tcp_helper_rel_sock_fd((fd)); \ + } while( 0 ) /********************************************************************** @@ -2194,31 +2103,31 @@ extern int ci_sock_sleep(ci_netif* ni, citp_waitable* w, ci_bits why, /* Copy data from [piov] into [pkt]. [buf] identifies the buffer space ** into which data can be copied. */ -extern int __ci_copy_iovec_to_pkt(ci_netif*, ci_ip_pkt_fmt*, ci_iovec_ptr* - CI_KERNEL_ARG(ci_addr_spc_t)) CI_HF; +extern int __ci_copy_iovec_to_pkt(ci_netif*, ci_ip_pkt_fmt*, + ci_iovec_ptr* CI_KERNEL_ARG(ci_addr_spc_t)) CI_HF; #if defined(__KERNEL__) -# define ci_copy_iovec_to_pkt(ni, pkt, piov, addr_spc) \ - __ci_copy_iovec_to_pkt((ni), (pkt), (piov), (addr_spc)) +#define ci_copy_iovec_to_pkt(ni, pkt, piov, addr_spc) \ + __ci_copy_iovec_to_pkt((ni), (pkt), (piov), (addr_spc)) #else -# define ci_copy_iovec_to_pkt(ni, pkt, piov) \ - __ci_copy_iovec_to_pkt((ni), (pkt), (piov)) +#define ci_copy_iovec_to_pkt(ni, pkt, piov) \ + __ci_copy_iovec_to_pkt((ni), (pkt), (piov)) #endif -# define ci_ip_copy_pkt_to_user __ci_ip_copy_pkt_to_user -extern ssize_t __ci_ip_copy_pkt_to_user(ci_netif*, ci_iovec*, - ci_ip_pkt_fmt*, int peek_off) CI_HF; +#define ci_ip_copy_pkt_to_user __ci_ip_copy_pkt_to_user +extern ssize_t __ci_ip_copy_pkt_to_user( + ci_netif*, ci_iovec*, ci_ip_pkt_fmt*, int peek_off) CI_HF; #if defined(__KERNEL__) -# define ci_ip_copy_pkt_from_piov __ci_ip_copy_pkt_from_piov -extern size_t __ci_ip_copy_pkt_from_piov(ci_netif*, ci_ip_pkt_fmt*, - ci_iovec_ptr*, ci_addr_spc_t) CI_HF; +#define ci_ip_copy_pkt_from_piov __ci_ip_copy_pkt_from_piov +extern size_t __ci_ip_copy_pkt_from_piov( + ci_netif*, ci_ip_pkt_fmt*, ci_iovec_ptr*, ci_addr_spc_t) CI_HF; #else /* __KERNEL__ */ -# define ci_ip_copy_pkt_from_piov(ni, pkt, iov, aspc) \ +#define ci_ip_copy_pkt_from_piov(ni, pkt, iov, aspc) \ __ci_ip_copy_pkt_from_piov((ni), (pkt), (iov)) -extern size_t __ci_ip_copy_pkt_from_piov(ci_netif*, ci_ip_pkt_fmt*, - ci_iovec_ptr*) CI_HF; +extern size_t __ci_ip_copy_pkt_from_piov( + ci_netif*, ci_ip_pkt_fmt*, ci_iovec_ptr*) CI_HF; #endif @@ -2236,25 +2145,31 @@ extern int ci_setup_ipstack_params(void); **********************************************************************/ #if CI_CFG_STATS_NETIF -# define CITP_STATS_NETIF(x) x -# define CITP_STATS_NETIF_INC(ni,x) do{ ++(ni)->state->stats.x; }while(0) -# define CITP_STATS_NETIF_ADD(ni,x,v) do{ (ni)->state->stats.x += v; }while(0) +#define CITP_STATS_NETIF(x) x +#define CITP_STATS_NETIF_INC(ni, x) \ + do { \ + ++(ni)->state->stats.x; \ + } while( 0 ) +#define CITP_STATS_NETIF_ADD(ni, x, v) \ + do { \ + (ni)->state->stats.x += v; \ + } while( 0 ) #else -# define CITP_STATS_NETIF(x) -# define CITP_STATS_NETIF_INC(ni,x) -# define CITP_STATS_NETIF_ADD(ni,x,v) +#define CITP_STATS_NETIF(x) +#define CITP_STATS_NETIF_INC(ni, x) +#define CITP_STATS_NETIF_ADD(ni, x, v) #endif #if CI_CFG_STATS_TCP_LISTEN -# define CITP_STATS_TCP_LISTEN(x) x +#define CITP_STATS_TCP_LISTEN(x) x #else -# define CITP_STATS_TCP_LISTEN(x) +#define CITP_STATS_TCP_LISTEN(x) #endif #if CI_CFG_DETAILED_CHECKS -# define CITP_DETAILED_CHECKS(x) x +#define CITP_DETAILED_CHECKS(x) x #else -# define CITP_DETAILED_CHECKS(x) +#define CITP_DETAILED_CHECKS(x) #endif @@ -2262,12 +2177,12 @@ extern int ci_setup_ipstack_params(void); ******************** Accessing trusted kernel state ******************* **********************************************************************/ -#define ci_netif_ep_get(ni, s) ((ni)->ep_tbl[OO_SP_TO_INT(s)]) -#define ci_trs_ep_get(trs, s) ci_netif_ep_get(&(trs)->netif, (s)) +#define ci_netif_ep_get(ni, s) ((ni)->ep_tbl[OO_SP_TO_INT(s)]) +#define ci_trs_ep_get(trs, s) ci_netif_ep_get(&(trs)->netif, (s)) -#define ci_netif_get_valid_ep(ni, sockp) \ +#define ci_netif_get_valid_ep(ni, sockp) \ ((ni)->ep_tbl[TRUSTED_SOCK_ID_FROM_P((ni), (sockp))]) -#define ci_trs_get_valid_ep(trs, sock_id) \ +#define ci_trs_get_valid_ep(trs, sock_id) \ ci_netif_get_valid_ep(&(trs)->netif, (sock_id)) @@ -2276,19 +2191,20 @@ extern int ci_setup_ipstack_params(void); **********************************************************************/ /* note bitno is undefined after loop */ -#define OO_FOR_EACH_BIT(init_mask, mask, bitno) \ - for( (mask) = (init_mask), (bitno) = __builtin_ctz(mask); \ - (mask) ; \ - (mask) = (mask) & ((mask) - 1), (bitno) = __builtin_ctz(mask) ) +#define OO_FOR_EACH_BIT(init_mask, mask, bitno) \ + for( (mask) = (init_mask), (bitno) = __builtin_ctz(mask); (mask); \ + (mask) = (mask) & ((mask) -1), (bitno) = __builtin_ctz(mask) ) CI_BUILD_ASSERT(sizeof(unsigned) * 8 >= CI_CFG_MAX_INTERFACES); -#define OO_STACK_FOR_EACH_INTF_I(_ni, _intf_i) \ +#define OO_STACK_FOR_EACH_INTF_I(_ni, _intf_i) \ for( (_intf_i) = 0; (_intf_i) < oo_stack_intf_max(_ni); ++(_intf_i) ) -#define OO_STACK_FOR_EACH_FUTURE_INTF_I(_ni, _mask, _intf_i) \ - ci_assert_lt((_ni)->future_intf_mask, 1u << oo_stack_intf_max(_ni)); \ - { CI_BUILD_ASSERT(sizeof(_mask) >= sizeof((_ni)->future_intf_mask)); } \ +#define OO_STACK_FOR_EACH_FUTURE_INTF_I(_ni, _mask, _intf_i) \ + ci_assert_lt((_ni)->future_intf_mask, 1u << oo_stack_intf_max(_ni)); \ + { \ + CI_BUILD_ASSERT(sizeof(_mask) >= sizeof((_ni)->future_intf_mask)); \ + } \ OO_FOR_EACH_BIT((_ni)->future_intf_mask, (_mask), (_intf_i)) /* @@ -2317,7 +2233,8 @@ CI_BUILD_ASSERT(sizeof(unsigned) * 8 >= CI_CFG_MAX_INTERFACES); ************************ Runtime config options ********************** *********************************************************************/ -ci_inline ef_driver_handle ci_netif_get_driver_handle(const ci_netif* ni) { +ci_inline ef_driver_handle ci_netif_get_driver_handle(const ci_netif* ni) +{ #ifdef __KERNEL__ return 0; #else @@ -2325,7 +2242,8 @@ ci_inline ef_driver_handle ci_netif_get_driver_handle(const ci_netif* ni) { #endif } -ci_inline int oo_stack_intf_max(ci_netif* ni) { +ci_inline int oo_stack_intf_max(ci_netif* ni) +{ #if defined(__KERNEL__) return ni->nic_n; #else @@ -2333,7 +2251,8 @@ ci_inline int oo_stack_intf_max(ci_netif* ni) { #endif } -ci_inline ef_vi* ci_netif_vi(ci_netif* ni, int nic_i) { +ci_inline ef_vi* ci_netif_vi(ci_netif* ni, int nic_i) +{ ci_assert_ge(nic_i, 0); ci_assert_lt(nic_i, oo_stack_intf_max(ni)); @@ -2344,8 +2263,8 @@ ci_inline ef_vi* ci_netif_vi(ci_netif* ni, int nic_i) { #if CI_CFG_IPV6 extern ci_uint32 ci_make_flowlabel(ci_netif* ni, ci_addr_t saddr, ci_uint16 sport, ci_addr_t daddr, ci_uint16 dport, ci_uint8 proto) CI_HF; -extern ci_uint32 ci_ipcache_make_flowlabel(ci_netif* ni, - ci_ip_cached_hdrs* ipcache) CI_HF; +extern ci_uint32 ci_ipcache_make_flowlabel( + ci_netif* ni, ci_ip_cached_hdrs* ipcache) CI_HF; extern void ci_ipcache_update_flowlabel(ci_netif* ni, ci_sock_cmn* s) CI_HF; #else #define ci_ipcache_update_flowlabel(ni, s) @@ -2355,19 +2274,19 @@ extern void ci_ipcache_update_flowlabel(ci_netif* ni, ci_sock_cmn* s) CI_HF; * negative, because rxq_limit changes dynamically. */ ci_inline int ci_netif_rx_vi_space(ci_netif* ni, ef_vi* vi) -{ return ni->state->rxq_limit - ef_vi_receive_fill_level(vi); } - +{ + return ni->state->rxq_limit - ef_vi_receive_fill_level(vi); +} extern void ci_netif_send_plugin_app_ctrl(ci_netif* ni, int nic_index, - ci_ip_pkt_fmt* pkt, - const void* payload, size_t paylen); + ci_ip_pkt_fmt* pkt, const void* payload, size_t paylen); -extern void __ci_netif_ring_plugin_app_doorbell(ci_netif* netif, - int nic_index); +extern void __ci_netif_ring_plugin_app_doorbell( + ci_netif* netif, int nic_index); -ci_inline void ci_netif_ring_ceph_doorbell(ci_netif* netif, - int nic_index, int n) +ci_inline void ci_netif_ring_ceph_doorbell( + ci_netif* netif, int nic_index, int n) { #if CI_CFG_TCP_OFFLOAD_RECYCLER if( NI_OPTS(netif).tcp_offload_plugin == CITP_TCP_OFFLOAD_CEPH ) { @@ -2393,7 +2312,7 @@ ci_inline void ci_netif_rx_post_all_batch(ci_netif* netif, int nic_index) if( ci_netif_rx_vi_space(netif, vi) >= CI_CFG_RX_DESC_BATCH ) n_posted = ci_netif_rx_post(netif, nic_index, vi); } - (void)n_posted; + (void) n_posted; #if CI_CFG_TCP_OFFLOAD_RECYCLER /* The VI owning the doorbell is always the last VI, so the loop above has * the effect of ignoring n_posted for all the others and only passing the @@ -2407,7 +2326,8 @@ ci_inline void ci_netif_rx_post_all_batch(ci_netif* netif, int nic_index) * Handling return from ci_netif_pkt_wait() and ci_netif_lock(). */ -ci_inline int ci_netif_pkt_wait_was_interrupted(int rc) { +ci_inline int ci_netif_pkt_wait_was_interrupted(int rc) +{ #ifdef __KERNEL__ ci_assert(rc == 0 || rc == -ERESTARTSYS); return rc < 0; @@ -2418,7 +2338,8 @@ ci_inline int ci_netif_pkt_wait_was_interrupted(int rc) { } -ci_inline int ci_netif_lock_was_interrupted(int rc) { +ci_inline int ci_netif_lock_was_interrupted(int rc) +{ #ifdef __KERNEL__ ci_assert(rc == 0 || rc == -ERESTARTSYS); return rc < 0; @@ -2453,45 +2374,55 @@ ci_inline int oo_bit_array_get(ci_uint32* array, int id) ************************** citp_waitable_obj ************************* *********************************************************************/ -ci_inline ci_udp_state* SOCK_TO_UDP(ci_sock_cmn* s) { +ci_inline ci_udp_state* SOCK_TO_UDP(ci_sock_cmn* s) +{ ci_assert_equal(s->b.state, CI_TCP_STATE_UDP); return CI_CONTAINER(ci_udp_state, s, s); } ci_inline ci_tcp_state* __SOCK_TO_TCP(ci_sock_cmn* s) -{ return CI_CONTAINER(ci_tcp_state, s, s); } -ci_inline ci_tcp_socket_listen* __SOCK_TO_TCP_LISTEN(ci_sock_cmn* s) { +{ + return CI_CONTAINER(ci_tcp_state, s, s); +} +ci_inline ci_tcp_socket_listen* __SOCK_TO_TCP_LISTEN(ci_sock_cmn* s) +{ return CI_CONTAINER(ci_tcp_socket_listen, s, s); } #ifdef NDEBUG #define SOCK_TO_TCP __SOCK_TO_TCP #else -ci_inline ci_tcp_state* SOCK_TO_TCP_DEBUG(ci_sock_cmn*s, const char*file, - int line) { +ci_inline ci_tcp_state* SOCK_TO_TCP_DEBUG( + ci_sock_cmn* s, const char* file, int line) +{ _ci_assert(s->b.state & CI_TCP_STATE_TCP, file, line); - _ci_assert(s->b.state == CI_TCP_CLOSED || - (s->b.state & CI_TCP_STATE_TCP_CONN), file, line); + _ci_assert( + s->b.state == CI_TCP_CLOSED || (s->b.state & CI_TCP_STATE_TCP_CONN), + file, line); return __SOCK_TO_TCP(s); } -# define SOCK_TO_TCP(s) SOCK_TO_TCP_DEBUG(s, __FILE__, __LINE__) +#define SOCK_TO_TCP(s) SOCK_TO_TCP_DEBUG(s, __FILE__, __LINE__) #endif -ci_inline ci_tcp_socket_listen* SOCK_TO_TCP_LISTEN(ci_sock_cmn* s) { +ci_inline ci_tcp_socket_listen* SOCK_TO_TCP_LISTEN(ci_sock_cmn* s) +{ ci_assert_equal(s->b.state, CI_TCP_LISTEN); return __SOCK_TO_TCP_LISTEN(s); } ci_inline citp_waitable_obj* SOCK_TO_WAITABLE_OBJ(ci_sock_cmn* s) -{ return CI_CONTAINER(citp_waitable_obj, sock, s); } +{ + return CI_CONTAINER(citp_waitable_obj, sock, s); +} /********************************************************************* ************************** UDP Receive queue ************************* *********************************************************************/ -ci_inline void ci_udp_recv_q_init(ci_udp_recv_q* q) { +ci_inline void ci_udp_recv_q_init(ci_udp_recv_q* q) +{ q->head = q->extract = OO_PP_NULL; q->pkts_reaped = q->pkts_delivered = q->pkts_added = 0; } @@ -2502,17 +2433,17 @@ ci_inline int ci_udp_recv_q_is_empty(ci_udp_recv_q* q) } ci_inline int ci_udp_recv_q_not_empty(ci_udp_recv_q* q) -{ +{ return q->pkts_added != q->pkts_delivered; } ci_inline int ci_udp_recv_q_pkts(ci_udp_recv_q* q) { - return q->pkts_added - q->pkts_delivered; + return q->pkts_added - q->pkts_delivered; } ci_inline int ci_udp_recv_q_reapable(ci_udp_recv_q* q) -{ +{ return q->pkts_delivered - q->pkts_reaped; } @@ -2523,10 +2454,12 @@ ci_inline int ci_udp_recv_q_reapable(ci_udp_recv_q* q) /*! This function gets the current cached time in ticks ** \param its A pointer to the ci_ip_timer_state management block -** \return The current cached time in ticks +** \return The current cached time in ticks */ -ci_inline ci_iptime_t ci_ip_time_now(ci_netif *ni) -{ return IPTIMER_STATE(ni)->ci_ip_time_real_ticks; } +ci_inline ci_iptime_t ci_ip_time_now(ci_netif* ni) +{ + return IPTIMER_STATE(ni)->ci_ip_time_real_ticks; +} /* Returns true if [a] is before [b]. */ @@ -2537,21 +2470,23 @@ ci_ip_time_before(ci_iptime_t a, ci_iptime_t b) } -/*! This function sets the initial current free cycle counter time in ticks +/*! This function sets the initial current free cycle counter time in ticks ** \param its A pointer to the ci_ip_timer_state management block */ -ci_inline void ci_ip_time_initial_sync(ci_ip_timer_state* its) { -#if defined(CI_HAVE_FRC64) - ci_frc64(&its->frc); +ci_inline void ci_ip_time_initial_sync(ci_ip_timer_state* its) +{ +#if defined(CI_HAVE_FRC64) + ci_frc64(&its->frc); its->ci_ip_time_real_ticks = - (ci_iptime_t)(its->frc >> its->ci_ip_time_frc2tick); + (ci_iptime_t) (its->frc >> its->ci_ip_time_frc2tick); #else -# error need a frc64 routine to compile iptimer support -#endif +#error need a frc64 routine to compile iptimer support +#endif } -ci_inline void ci_ip_time_update(ci_ip_timer_state* its, ci_uint64 new_frc) { - if(CI_LIKELY( new_frc >= its->frc )) { +ci_inline void ci_ip_time_update(ci_ip_timer_state* its, ci_uint64 new_frc) +{ + if( CI_LIKELY(new_frc >= its->frc) ) { ci_iptime_t new_ticks; new_ticks = (ci_iptime_t) (new_frc >> its->ci_ip_time_frc2tick); its->ci_ip_time_real_ticks = new_ticks; @@ -2559,52 +2494,55 @@ ci_inline void ci_ip_time_update(ci_ip_timer_state* its, ci_uint64 new_frc) { } } -/*! This function updates the current free cycle counter time in ticks +/*! This function updates the current free cycle counter time in ticks ** \param its A pointer to the ci_ip_timer_state management block */ -ci_inline void ci_ip_time_resync(ci_ip_timer_state* its) { +ci_inline void ci_ip_time_resync(ci_ip_timer_state* its) +{ ci_uint64 new_frc; - ci_frc64(&new_frc); + ci_frc64(&new_frc); ci_ip_time_update(its, new_frc); } -/*! This function gets the current free cycle counter time in ticks +/*! This function gets the current free cycle counter time in ticks ** \param its A pointer to the ci_ip_timer_state management block ** \param t An out parameter to write the return into */ -ci_inline void ci_ip_time_get(ci_ip_timer_state* its, ci_iptime_t* ticks) { -#if defined(CI_HAVE_FRC64) +ci_inline void ci_ip_time_get(ci_ip_timer_state* its, ci_iptime_t* ticks) +{ +#if defined(CI_HAVE_FRC64) ci_uint64 frc; - ci_frc64(&frc); - *ticks = (ci_iptime_t)(frc >> its->ci_ip_time_frc2tick); + ci_frc64(&frc); + *ticks = (ci_iptime_t) (frc >> its->ci_ip_time_frc2tick); #else -# error need a frc64 routine to compile iptimer support -#endif +#error need a frc64 routine to compile iptimer support +#endif } /*! This function gets the current free cycle counter time in us ** \param its A pointer to the ci_ip_timer_state management block ** \param t An out parameter to write the return into */ -ci_inline void ci_ip_time_get_us(ci_ip_timer_state* its, ci_iptime_t* t) { -#if defined(CI_HAVE_FRC64) +ci_inline void ci_ip_time_get_us(ci_ip_timer_state* its, ci_iptime_t* t) +{ +#if defined(CI_HAVE_FRC64) ci_uint64 frc; - ci_frc64(&frc); - *t = (ci_iptime_t)(frc >> its->ci_ip_time_frc2us); + ci_frc64(&frc); + *t = (ci_iptime_t) (frc >> its->ci_ip_time_frc2us); #else -# error need a frc64 routine to compile iptimer support -#endif +#error need a frc64 routine to compile iptimer support +#endif } /*! Convert a time measure in ms to the number of ticks -** \param ni A pointer to the netif +** \param ni A pointer to the netif ** \param t The time in ms ** \return The time t in ticks */ -ci_inline ci_iptime_t ci_ip_time_ms2ticks(ci_netif *ni, ci_uint32 t) +ci_inline ci_iptime_t ci_ip_time_ms2ticks(ci_netif* ni, ci_uint32 t) { - ci_ip_timer_state *its = IPTIMER_STATE(ni); - t = (ci_iptime_t) ( (((ci_uint64)t) * its->ci_ip_time_ms2tick_fxp) >> 32 ); + ci_ip_timer_state* its = IPTIMER_STATE(ni); + t = (ci_iptime_t) ((((ci_uint64) t) * its->ci_ip_time_ms2tick_fxp) >> 32); /* rounds up 0 timers... */ return t ? t : 1; } @@ -2614,11 +2552,12 @@ ci_inline ci_iptime_t ci_ip_time_ms2ticks(ci_netif *ni, ci_uint32 t) ** \param t The time in ticks ** \return The time t in ms */ -ci_inline ci_uint32 ci_ip_time_ticks2ms(ci_netif* ni, ci_iptime_t t) { - ci_ip_timer_state *its = IPTIMER_STATE(ni); +ci_inline ci_uint32 ci_ip_time_ticks2ms(ci_netif* ni, ci_iptime_t t) +{ + ci_ip_timer_state* its = IPTIMER_STATE(ni); /* As for now the function is not used on fast path should this change * then use of multiplication and inversed factor to be considered */ - t = (ci_iptime_t) ( (((ci_uint64)t << 32) / its->ci_ip_time_ms2tick_fxp) ); + t = (ci_iptime_t) ((((ci_uint64) t << 32) / its->ci_ip_time_ms2tick_fxp)); return t; } @@ -2626,10 +2565,10 @@ ci_inline ci_uint32 ci_ip_time_ticks2ms(ci_netif* ni, ci_iptime_t t) { /* Convert Herz (per-second value) to per tick. */ ci_inline ci_uint32 ci_ip_time_freq_hz2tick(ci_netif* ni, ci_uint32 hz) { - ci_ip_timer_state *its = IPTIMER_STATE(ni); + ci_ip_timer_state* its = IPTIMER_STATE(ni); /* We assume that 1024==1000, and khz = hz >> 10. * Then we use the expression from ci_ip_time_ms2ticks(). */ - return ((ci_uint64)hz << 22) / its->ci_ip_time_ms2tick_fxp; + return ((ci_uint64) hz << 22) / its->ci_ip_time_ms2tick_fxp; } @@ -2643,7 +2582,8 @@ ci_inline const cicp_hwport_mask_t ci_netif_get_hwport_mask(ci_netif* ni) } -ci_inline const ci_int8* ci_netif_get_hwport_to_intf_i(ci_netif* ni) { +ci_inline const ci_int8* ci_netif_get_hwport_to_intf_i(ci_netif* ni) +{ #ifdef __KERNEL__ return ni->hwport_to_intf_i; #else @@ -2652,21 +2592,21 @@ ci_inline const ci_int8* ci_netif_get_hwport_to_intf_i(ci_netif* ni) { } -ci_inline int __ci_hwport_to_intf_i(ci_netif* ni, ci_hwport_id_t hwport) { +ci_inline int __ci_hwport_to_intf_i(ci_netif* ni, ci_hwport_id_t hwport) +{ ci_assert((unsigned) hwport < CI_CFG_MAX_HWPORTS); return ci_netif_get_hwport_to_intf_i(ni)[hwport]; } -ci_inline int ci_hwport_to_intf_i(ci_netif* ni, ci_hwport_id_t hwport) { - if(CI_LIKELY( (unsigned) hwport < CI_CFG_MAX_HWPORTS )) +ci_inline int ci_hwport_to_intf_i(ci_netif* ni, ci_hwport_id_t hwport) +{ + if( CI_LIKELY((unsigned) hwport < CI_CFG_MAX_HWPORTS) ) return ci_netif_get_hwport_to_intf_i(ni)[hwport]; return ci_netif_bad_hwport(ni, hwport); } - - ci_inline int ci_netif_may_poll(ci_netif* ni) { return NI_OPTS(ni).poll_on_demand; @@ -2696,33 +2636,40 @@ ci_inline int ci_netif_is_spinner(ci_netif* ni) ** generate an interrupt when an event next arrives. */ ci_inline int ci_netif_is_primed(ci_netif* ni) -{ return ni->nic_set.nics == ni->state->evq_primed; } +{ + return ni->nic_set.nics == ni->state->evq_primed; +} /* Cheap test that returns true if the stack is not "primed". i.e. Not all ** event queues have been primed to generate an interrupt when the next ** event arrives. */ ci_inline int ci_netif_not_primed(ci_netif* ni) -{ return ni->nic_set.nics != ni->state->evq_primed; } +{ + return ni->nic_set.nics != ni->state->evq_primed; +} /* Returns true if there are any hardware events outstanding on the given * interface. */ ci_inline int ci_netif_intf_has_event(ci_netif* ni, int intf_i) -{ return ef_eventq_has_event(ci_netif_vi(ni, intf_i)); } +{ + return ef_eventq_has_event(ci_netif_vi(ni, intf_i)); +} /* Returns true if there are any hardware events outstanding on any * interface. */ -ci_inline int ci_netif_has_event(ci_netif* ni) { +ci_inline int ci_netif_has_event(ci_netif* ni) +{ int intf_i, rc = 0; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( ci_netif_intf_has_event(ni, intf_i) ) { - rc = 1; - break; - } + if( ci_netif_intf_has_event(ni, intf_i) ) { + rc = 1; + break; + } if( OO_PP_NOT_NULL(ni->state->looppkts) ) rc = 1; return rc; @@ -2730,13 +2677,14 @@ ci_inline int ci_netif_has_event(ci_netif* ni) { /* Returns true if there are many hardware events outstanding. */ -ci_inline int ci_netif_has_many_events(ci_netif* ni, int lookahead) { +ci_inline int ci_netif_has_many_events(ci_netif* ni, int lookahead) +{ int intf_i, rc = 0; OO_STACK_FOR_EACH_INTF_I(ni, intf_i) - if( ef_eventq_has_many_events(ci_netif_vi(ni, intf_i), lookahead) ) { - rc = 1; - break; - } + if( ef_eventq_has_many_events(ci_netif_vi(ni, intf_i), lookahead) ) { + rc = 1; + break; + } return rc; } @@ -2746,10 +2694,11 @@ ci_inline int ci_netif_has_many_events(ci_netif* ni, int lookahead) { * This must not match the first four bytes of the packet. Anything that does * not match our OUI or multicast addresses will do. If we add support for * third-party NICs, we may want a per-NIC poison value to ensure a mismatch. - * If we add support for detecting subsequent cache lines, or if packet prefixes - * are enabled, there will be the possibility of deciding falsely that a packet - * is still poisonous when in fact it is not, but there is very little that we - * can do about that. It would not cause a functional problem in any case. + * If we add support for detecting subsequent cache lines, or if packet + * prefixes are enabled, there will be the possibility of deciding falsely that + * a packet is still poisonous when in fact it is not, but there is very little + * that we can do about that. It would not cause a functional problem in any + * case. * * For EFCT, this must match the value provided to the driver in * efct_nic_rxq_bind. TODO EFCT centralise the definition of this value. @@ -2757,7 +2706,7 @@ ci_inline int ci_netif_has_many_events(ci_netif* ni, int lookahead) { #define CI_PKT_RX_POISON 0xFFA0C09Bu ci_inline volatile uint32_t* ci_netif_poison_location(ci_ip_pkt_fmt* pkt) { - return (volatile uint32_t*)pkt->dma_start; + return (volatile uint32_t*) pkt->dma_start; } ci_inline void ci_netif_poison_rx_pkt(ci_ip_pkt_fmt* pkt) { @@ -2797,8 +2746,8 @@ ci_inline ci_ip_pkt_fmt* ci_netif_intf_next_rx_pkt(ci_netif* ni, ef_vi* vi) * * The function does not require a stack lock. */ -ci_inline const volatile uint32_t* -ci_netif_intf_rx_future(ci_netif* ni, int intf_i, const uint32_t* poison) +ci_inline const volatile uint32_t* ci_netif_intf_rx_future( + ci_netif* ni, int intf_i, const uint32_t* poison) { ci_ip_pkt_fmt* pkt; ci_uint8* p; @@ -2819,8 +2768,9 @@ ci_netif_intf_rx_future(ci_netif* ni, int intf_i, const uint32_t* poison) if( pkt == NULL ) return poison; - /* FIXME: colocate all the fields used by the rx path to reduce cache usage */ - for( p = (ci_uint8*)pkt; p < pkt->dma_start; p += CI_CACHE_LINE_SIZE ) + /* FIXME: colocate all the fields used by the rx path to reduce cache usage + */ + for( p = (ci_uint8*) pkt; p < pkt->dma_start; p += CI_CACHE_LINE_SIZE ) ci_prefetch(p); return ci_netif_poison_location(pkt); @@ -2828,24 +2778,24 @@ ci_netif_intf_rx_future(ci_netif* ni, int intf_i, const uint32_t* poison) #endif -ci_inline int ci_netif_need_timer_prime(ci_netif* ni, ci_uint64 frc_now) { +ci_inline int ci_netif_need_timer_prime(ci_netif* ni, ci_uint64 frc_now) +{ return frc_now - ni->state->evq_last_prime > ni->state->timer_prime_cycles; } ci_inline int ci_netif_need_poll_spinning(ci_netif* ni, ci_uint64 frc_now) { - return ci_netif_has_event(ni) || - ci_netif_need_timer_prime(ni, frc_now); + return ci_netif_has_event(ni) || ci_netif_need_timer_prime(ni, frc_now); } /* See ci_netif_need_poll() for description. Use this when you already ** know a recent frc. */ -ci_inline int ci_netif_need_poll_frc(ci_netif* ni, ci_uint64 frc_now) { - return ci_netif_not_primed(ni) && - ci_netif_need_poll_spinning(ni, frc_now); +ci_inline int ci_netif_need_poll_frc(ci_netif* ni, ci_uint64 frc_now) +{ + return ci_netif_not_primed(ni) && ci_netif_need_poll_spinning(ni, frc_now); } @@ -2857,11 +2807,14 @@ ci_inline int ci_netif_need_poll_frc(ci_netif* ni, ci_uint64 frc_now) { ** outstanding or it has been a while since the stack was last polled. */ ci_inline int ci_netif_need_poll(ci_netif* ni) -{ return ci_netif_need_poll_frc(ni, ci_frc64_get()); } +{ + return ci_netif_need_poll_frc(ni, ci_frc64_get()); +} -ci_inline int ci_netif_need_poll_maybe_spinning(ci_netif* ni, ci_uint64 frc_now, - int spinning) { +ci_inline int ci_netif_need_poll_maybe_spinning( + ci_netif* ni, ci_uint64 frc_now, int spinning) +{ if( spinning ) return ci_netif_need_poll_spinning(ni, frc_now); else @@ -2871,48 +2824,49 @@ ci_inline int ci_netif_need_poll_maybe_spinning(ci_netif* ni, ci_uint64 frc_now, #if CI_CFG_TCP_SHARED_LOCAL_PORTS ci_inline int ci_netif_should_allocate_tcp_shared_local_ports(ci_netif* ni) { - return - NI_OPTS(ni).tcp_shared_local_ports > 0 && - NI_OPTS(ni).scalable_filter_enable != CITP_SCALABLE_FILTERS_ENABLE_WORKER; + return NI_OPTS(ni).tcp_shared_local_ports > 0 && + NI_OPTS(ni).scalable_filter_enable != + CITP_SCALABLE_FILTERS_ENABLE_WORKER; } #endif -ci_inline int oo_tx_zc_payload_size(ci_netif* ni) { +ci_inline int oo_tx_zc_payload_size(ci_netif* ni) +{ return sizeof(struct ci_pkt_zc_payload) + sizeof(ef_addr) * oo_stack_intf_max(ni); } -ci_inline struct ci_pkt_zc_payload* -oo_tx_zc_payload_next(ci_netif* ni, struct ci_pkt_zc_payload* zcp) +ci_inline struct ci_pkt_zc_payload* oo_tx_zc_payload_next( + ci_netif* ni, struct ci_pkt_zc_payload* zcp) { if( zcp->is_remote ) - return (void*)((char*)zcp + oo_tx_zc_payload_size(ni)); - return (void*)(zcp->local + CI_ALIGN_FWD(zcp->len, CI_PKT_ZC_PAYLOAD_ALIGN)); + return (void*) ((char*) zcp + oo_tx_zc_payload_size(ni)); + return ( + void*) (zcp->local + CI_ALIGN_FWD(zcp->len, CI_PKT_ZC_PAYLOAD_ALIGN)); } -#define OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) \ - for( (zcp) = (zch)->data; \ - (char*)(zcp) - (char*)(zch) < (zch)->end; \ +#define OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) \ + for( (zcp) = (zch)->data; (char*) (zcp) - (char*) (zch) < (zch)->end; \ (zcp) = oo_tx_zc_payload_next(ni, zcp) ) #if CI_CFG_TX_CRC_OFFLOAD /* Initializes an id pool for the NVMe CRC plugin ids. * According to the ci_fifo2 specification, the queue capacity is cap-1 */ -ci_inline void -ci_nvme_plugin_crc_id_init(struct nvme_crc_plugin_idp_t* idp, unsigned base, unsigned limit) +ci_inline void ci_nvme_plugin_crc_id_init( + struct nvme_crc_plugin_idp_t* idp, unsigned base, unsigned limit) { int i = 0; if( limit == 0 || limit >= (1 << ZC_NVME_CRC_IDP_CAP) ) limit = (1 << ZC_NVME_CRC_IDP_CAP) - 1; ci_fifo2_init(idp, 1 << ZC_NVME_CRC_IDP_CAP); for( i = 0; i < limit; i++ ) - ci_fifo2_put(idp, i + base); + ci_fifo2_put(idp, i + base); } -ci_inline int -ci_nvme_plugin_crc_id_alloc(struct nvme_crc_plugin_idp_t* idp, unsigned *id) +ci_inline int ci_nvme_plugin_crc_id_alloc( + struct nvme_crc_plugin_idp_t* idp, unsigned* id) { if( ci_fifo2_is_empty(idp) ) return -EAGAIN; @@ -2920,34 +2874,35 @@ ci_nvme_plugin_crc_id_alloc(struct nvme_crc_plugin_idp_t* idp, unsigned *id) return 0; } -ci_inline void -ci_nvme_plugin_crc_id_release(struct nvme_crc_plugin_idp_t* idp, unsigned id) +ci_inline void ci_nvme_plugin_crc_id_release( + struct nvme_crc_plugin_idp_t* idp, unsigned id) { - ci_assert(!ci_fifo2_is_full(idp)); + ci_assert(! ci_fifo2_is_full(idp)); ci_assert_nequal(id, ZC_NVME_CRC_ID_INVALID); ci_fifo2_put(idp, id); } -ci_inline bool -ci_nvme_plugin_crc_last_byte_sent(const struct ci_pkt_zc_payload* zcp) +ci_inline bool ci_nvme_plugin_crc_last_byte_sent( + const struct ci_pkt_zc_payload* zcp) { return zcp->crc_insert_first_byte + zcp->crc_insert_n_bytes == 4; } /* The acked ids are released when the flag is INSERT and the last * CRC byte has been sent */ -ci_inline void -ci_nvme_plugin_crc_free_acked_ids(ci_netif* ni, ci_ip_pkt_fmt* pkt) +ci_inline void ci_nvme_plugin_crc_free_acked_ids( + ci_netif* ni, ci_ip_pkt_fmt* pkt) { struct ci_pkt_zc_payload* zcp; struct ci_pkt_zc_header* zch = oo_tx_zc_header(pkt); int intf_i = pkt->intf_i; - OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) { + OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) + { if( zcp->zcp_flags & ZC_PAYLOAD_FLAG_INSERT_CRC && ci_nvme_plugin_crc_last_byte_sent(zcp) ) { - ci_nvme_plugin_crc_id_release(&ni->state->nvme_crc_plugin_idp[intf_i], - zcp->crc_id); + ci_nvme_plugin_crc_id_release( + &ni->state->nvme_crc_plugin_idp[intf_i], zcp->crc_id); zcp->crc_id = ZC_NVME_CRC_ID_INVALID; } } @@ -2958,9 +2913,8 @@ ci_nvme_plugin_crc_free_acked_ids(ci_netif* ni, ci_ip_pkt_fmt* pkt) * needed for cleanup when the ID pool is exhausted mid-packet or when TX of * the packet fails. The value of ts->current_crc_id should have been restored * by the caller to its pre-failure value before calling this function. */ -ci_inline void -ci_nvme_plugin_crc_packet_cleanup(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt) +ci_inline void ci_nvme_plugin_crc_packet_cleanup( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) { #if CI_CFG_TX_CRC_OFFLOAD struct ci_pkt_zc_header* zch = oo_tx_zc_header(pkt); @@ -2968,17 +2922,17 @@ ci_nvme_plugin_crc_packet_cleanup(ci_netif* ni, ci_tcp_state* ts, ci_uint32 prev_id = ZC_NVME_CRC_ID_INVALID; int intf_i = pkt->intf_i; - OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) { - if( zcp->zcp_flags & (ZC_PAYLOAD_FLAG_ACCUM_CRC | - ZC_PAYLOAD_FLAG_INSERT_CRC) ) { + OO_TX_FOR_EACH_ZC_PAYLOAD(ni, zch, zcp) + { + if( zcp->zcp_flags & + (ZC_PAYLOAD_FLAG_ACCUM_CRC | ZC_PAYLOAD_FLAG_INSERT_CRC) ) { if( zcp->crc_id == ZC_NVME_CRC_ID_INVALID ) break; /* Free this ID if it was different from the preceding one, and therefore * newly allocated. */ - if( zcp->crc_id != ts->current_crc_id && - zcp->crc_id != prev_id ) { - ci_nvme_plugin_crc_id_release(&ni->state->nvme_crc_plugin_idp[intf_i], - zcp->crc_id); + if( zcp->crc_id != ts->current_crc_id && zcp->crc_id != prev_id ) { + ci_nvme_plugin_crc_id_release( + &ni->state->nvme_crc_plugin_idp[intf_i], zcp->crc_id); prev_id = zcp->crc_id; } zcp->crc_id = ZC_NVME_CRC_ID_INVALID; @@ -2991,9 +2945,8 @@ ci_nvme_plugin_crc_packet_cleanup(ci_netif* ni, ci_tcp_state* ts, * which need to be freed. Those ids are the current id and the * previously-allocated ones. */ -ci_inline void ci_nvme_plugin_idp_dropped_queue_cleanup(ci_netif* ni, - ci_tcp_state* ts, - ci_ip_pkt_queue *qu) +ci_inline void ci_nvme_plugin_idp_dropped_queue_cleanup( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_queue* qu) { #if CI_CFG_TX_CRC_OFFLOAD oo_pkt_p pp = qu->head; @@ -3006,8 +2959,8 @@ ci_inline void ci_nvme_plugin_idp_dropped_queue_cleanup(ci_netif* ni, pp = p->next; } if( ts->current_crc_id != ZC_NVME_CRC_ID_INVALID ) { - ci_nvme_plugin_crc_id_release(&ni->state->nvme_crc_plugin_idp[intf_i], - ts->current_crc_id); + ci_nvme_plugin_crc_id_release( + &ni->state->nvme_crc_plugin_idp[intf_i], ts->current_crc_id); ts->current_crc_id = ZC_NVME_CRC_ID_INVALID; } #endif @@ -3017,7 +2970,7 @@ ci_inline void ci_nvme_plugin_idp_dropped_queue_cleanup(ci_netif* ni, ********************** Packet buffer allocation ********************** *********************************************************************/ -ci_inline void __ci_netif_pkt_clean(ci_ip_pkt_fmt* pkt) +ci_inline void __ci_netif_pkt_clean(ci_ip_pkt_fmt* pkt) { pkt->flags &= CI_PKT_FLAG_NONB_POOL; pkt->rx_flags = 0; @@ -3064,7 +3017,7 @@ ci_inline void ci_netif_pkt_put(ci_netif* ni, ci_ip_pkt_fmt* pkt) /* If we have too few free packets in the now-current set, * we should allocate another set. * Fixme: is set_size/2 a good margin or should it be tunable? */ -ci_inline int/*bool*/ +ci_inline int /*bool*/ ci_netif_pkt_set_is_underfilled(ci_netif* ni, int bufset_id) { return ni->packets->set[bufset_id].n_free < CI_CFG_PKT_SET_LOW_WATER; @@ -3077,15 +3030,14 @@ ci_netif_pkt_set_is_underfilled(ci_netif* ni, int bufset_id) * If the caller need to allocate a lot of packets, there is no need call * ci_netif_pkt_set_change() until all the allocations are done. */ -ci_inline void ci_netif_pkt_set_change(ci_netif* ni, int bufset_id, - int/*bool*/ is_underfilled) +ci_inline void ci_netif_pkt_set_change( + ci_netif* ni, int bufset_id, int /*bool*/ is_underfilled) { ni->packets->id = bufset_id; ci_assert_equal(bufset_id, NI_PKT_SET(ni)); if( ni->packets->sets_n < ni->packets->sets_max && is_underfilled ) - ef_eplock_holder_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_NEED_PKT_SET); + ef_eplock_holder_set_flag(&ni->state->lock, CI_EPLOCK_NETIF_NEED_PKT_SET); /* When we are called from ci_netif_rx_post(), we could already consume * all available packets. Let's set NEED_PKT_SET flag above and exit. */ @@ -3094,12 +3046,13 @@ ci_inline void ci_netif_pkt_set_change(ci_netif* ni, int bufset_id, ci_assert(OO_PP_NOT_NULL(ni->packets->set[bufset_id].free)); } -ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc(ci_netif* ni, int flags) { +ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc(ci_netif* ni, int flags) +{ ci_ip_pkt_fmt* pkt; int bufset_id; - ci_assert( ci_netif_is_locked(ni) ); + ci_assert(ci_netif_is_locked(ni)); bufset_id = NI_PKT_SET(ni); - if(CI_LIKELY( ni->packets->set[bufset_id].n_free > 0 )) + if( CI_LIKELY(ni->packets->set[bufset_id].n_free > 0) ) pkt = ci_netif_pkt_get(ni, bufset_id); else pkt = ci_netif_pkt_alloc_slow(ni, flags); @@ -3108,33 +3061,39 @@ ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc(ci_netif* ni, int flags) { ci_inline int ci_netif_pkt_nonb_pool_is_empty(ci_netif* ni) -{ return (ni->state->nonb_pkt_pool & 0xffffffff) == 0xffffffff; } +{ + return (ni->state->nonb_pkt_pool & 0xffffffff) == 0xffffffff; +} ci_inline int ci_netif_pkt_nonb_pool_not_empty(ci_netif* ni) -{ return (ni->state->nonb_pkt_pool & 0xffffffff) != 0xffffffff; } - +{ + return (ni->state->nonb_pkt_pool & 0xffffffff) != 0xffffffff; +} -#define CI_NETIF_PKT_POOL_MIN_LEVEL 512 +#define CI_NETIF_PKT_POOL_MIN_LEVEL 512 /* Number of packet either allocated to rx or reserved to rx */ -ci_inline int ci_netif_pkt_rx_n(ci_netif* ni) { +ci_inline int ci_netif_pkt_rx_n(ci_netif* ni) +{ return ni->state->n_rx_pkts + ni->state->reserved_pktbufs; } /* Number of packet bufs that can get allocated */ -ci_inline int ci_netif_pkt_free_n(ci_netif* ni) { - return - ((ni->packets->sets_max - ni->packets->sets_n) << CI_CFG_PKTS_PER_SET_S) + - ni->packets->n_free; +ci_inline int ci_netif_pkt_free_n(ci_netif* ni) +{ + return ((ni->packets->sets_max - ni->packets->sets_n) + << CI_CFG_PKTS_PER_SET_S) + + ni->packets->n_free; } /* Number of packet bufs currently allocated to TX paths. Packets in the * non-blocking free pool count as being allocated to TX. */ -ci_inline int ci_netif_pkt_tx_n(ci_netif* ni) { - return ni->packets->n_pkts_allocated - ni->state->n_rx_pkts - - ni->packets->n_free; +ci_inline int ci_netif_pkt_tx_n(ci_netif* ni) +{ + return ni->packets->n_pkts_allocated - ni->state->n_rx_pkts - + ni->packets->n_free; } @@ -3146,24 +3105,27 @@ ci_inline int ci_netif_pkt_tx_n(ci_netif* ni) { * it is possible at the moment -- there may be none free. See * ci_netif_pkt_tx_can_alloc_now(). */ -ci_inline int ci_netif_pkt_tx_may_alloc(ci_netif* ni) { +ci_inline int ci_netif_pkt_tx_may_alloc(ci_netif* ni) +{ int n_tx_pkts = ci_netif_pkt_tx_n(ni); + // ci_log("n tx pkts: %d", n_tx_pkts); return - /* TX is not yet using all of the packet buffers that are exclusively - * reserved for its use. - */ - (n_tx_pkts < NI_OPTS(ni).max_packets - NI_OPTS(ni).max_rx_packets) || - /* The RX rings are nice and full, and TX hasn't hit its limit. */ - (ni->state->mem_pressure == 0 && n_tx_pkts < NI_OPTS(ni).max_tx_packets); + /* TX is not yet using all of the packet buffers that are exclusively + * reserved for its use. + */ + (n_tx_pkts < NI_OPTS(ni).max_packets - NI_OPTS(ni).max_rx_packets) || + /* The RX rings are nice and full, and TX hasn't hit its limit. */ + (ni->state->mem_pressure == 0 && n_tx_pkts < NI_OPTS(ni).max_tx_packets); } /* Returns true if it is permitted and possible to allocate a packet buffer * for the TX path -- either from the free pool of the non-blocking pool. */ -ci_inline int ci_netif_pkt_tx_can_alloc_now(ci_netif* ni) { - return ( (ci_netif_pkt_tx_may_alloc(ni) && ni->packets->n_free > 0) || - ci_netif_pkt_nonb_pool_not_empty(ni) ); +ci_inline int ci_netif_pkt_tx_can_alloc_now(ci_netif* ni) +{ + return ((ci_netif_pkt_tx_may_alloc(ni) && ni->packets->n_free > 0) || + ci_netif_pkt_nonb_pool_not_empty(ni)); } @@ -3171,47 +3133,53 @@ ci_inline int ci_netif_pkt_tx_can_alloc_now(ci_netif* ni) { * the send queue or retransmit queue for a long time, so we must be * careful not to deplete the pool of free buffers too much. */ -ci_inline ci_ip_pkt_fmt* -ci_netif_pkt_tx_tcp_alloc(ci_netif* ni, ci_tcp_state* ts) { +ci_inline ci_ip_pkt_fmt* ci_netif_pkt_tx_tcp_alloc( + ci_netif* ni, ci_tcp_state* ts) +{ int bufset_id; ci_assert(ci_netif_is_locked(ni)); bufset_id = NI_PKT_SET(ni); - if(CI_LIKELY( ci_netif_pkt_tx_may_alloc(ni) && - ni->packets->set[bufset_id].n_free > 0 )) { + if( CI_LIKELY(ci_netif_pkt_tx_may_alloc(ni) && + ni->packets->set[bufset_id].n_free > 0) ) { + LOG_S(ci_log( + "Packets Allocated: %d, Packets free: %d, Set free: %d, Num sets: %d, " + "Pkts per set: %d, Bufset Id: %d", + ni->packets->n_pkts_allocated, ni->packets->n_free, + ni->packets->set[bufset_id].n_free, ni->packets->sets_n, PKTS_PER_SET, + bufset_id)); return ci_netif_pkt_get(ni, bufset_id); - } - else { + } else { if( (! ci_netif_pkt_tx_may_alloc(ni)) && - (NI_OPTS(ni).tcp_sndbuf_mode == 2) && - (ts != NULL) ) + (NI_OPTS(ni).tcp_sndbuf_mode == 2) && (ts != NULL) ) ci_tcp_moderate_sndbuf(ni, ts); /* TCP TX path is always allowed to allocate from the non-blocking pool * because those packet buffers are already allocated to TX. */ - return ci_netif_pkt_alloc_slow(ni, CI_PKT_ALLOC_FOR_TCP_TX | - CI_PKT_ALLOC_USE_NONB); + return ci_netif_pkt_alloc_slow( + ni, CI_PKT_ALLOC_FOR_TCP_TX | CI_PKT_ALLOC_USE_NONB); } } -ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc_nonb(ci_netif* ni) +ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc_nonb(ci_netif* ni) { - volatile ci_uint64 *nonb_pkt_pool_ptr; + volatile ci_uint64* nonb_pkt_pool_ptr; ci_uint64 link, new_link; unsigned id; ci_ip_pkt_fmt* pkt; oo_pkt_p pp; nonb_pkt_pool_ptr = &(ni->state->nonb_pkt_pool); - again: +again: pkt = NULL; link = *nonb_pkt_pool_ptr; id = link & 0xffffffff; if( id != 0xffffffff ) { OO_PP_INIT(ni, pp, id); pkt = PKT(ni, pp); - new_link = ((unsigned)OO_PP_ID(pkt->next)) | (link & 0xffffffff00000000llu); + new_link = + ((unsigned) OO_PP_ID(pkt->next)) | (link & 0xffffffff00000000llu); if( ci_cas64u_fail(nonb_pkt_pool_ptr, link, new_link) ) goto again; ci_assert_equal(pkt->refcount, 0); @@ -3222,10 +3190,10 @@ ci_inline ci_ip_pkt_fmt* ci_netif_pkt_alloc_nonb(ci_netif* ni) } -ci_inline void ci_netif_pkt_free_nonb_list(ci_netif *ni, oo_pkt_p pkt_list, - ci_ip_pkt_fmt *pkt_list_tail) +ci_inline void ci_netif_pkt_free_nonb_list( + ci_netif* ni, oo_pkt_p pkt_list, ci_ip_pkt_fmt* pkt_list_tail) { - volatile ci_uint64 *nonb_pkt_pool_ptr; + volatile ci_uint64* nonb_pkt_pool_ptr; ci_uint64 new_link, link; nonb_pkt_pool_ptr = &(ni->state->nonb_pkt_pool); @@ -3233,34 +3201,38 @@ ci_inline void ci_netif_pkt_free_nonb_list(ci_netif *ni, oo_pkt_p pkt_list, ci_assert_equal(pkt_list_tail->refcount, 0); link = *nonb_pkt_pool_ptr; OO_PP_INIT(ni, pkt_list_tail->next, link & 0xffffffff); - new_link = ((unsigned)OO_PP_ID(pkt_list)) | - ((link + 0x0000000100000000llu) & 0xffffffff00000000llu); + new_link = ((unsigned) OO_PP_ID(pkt_list)) | + ((link + 0x0000000100000000llu) & 0xffffffff00000000llu); } while( ci_cas64u_fail(nonb_pkt_pool_ptr, link, new_link) ); } -ci_inline void ci_netif_pkt_hold(ci_netif* ni, ci_ip_pkt_fmt* pkt) { +ci_inline void ci_netif_pkt_hold(ci_netif* ni, ci_ip_pkt_fmt* pkt) +{ ci_assert_gt(pkt->refcount, 0); ++pkt->refcount; } #ifdef __KERNEL__ -ci_inline void ci_netif_pkt_release_mnl(ci_netif* ni, ci_ip_pkt_fmt* pkt, - int* p_netif_is_locked) { +ci_inline void ci_netif_pkt_release_mnl( + ci_netif* ni, ci_ip_pkt_fmt* pkt, int* p_netif_is_locked) +{ ci_assert_gt(pkt->refcount, 0); if( --pkt->refcount == 0 ) ci_netif_pkt_free(ni, pkt, p_netif_is_locked); } -ci_inline void ci_netif_pkt_release(ci_netif* ni, ci_ip_pkt_fmt* pkt) { +ci_inline void ci_netif_pkt_release(ci_netif* ni, ci_ip_pkt_fmt* pkt) +{ int is_locked = 1; - ci_assert( ci_netif_is_locked(ni) ); + ci_assert(ci_netif_is_locked(ni)); ci_netif_pkt_release_mnl(ni, pkt, &is_locked); } #else -ci_inline void ci_netif_pkt_release(ci_netif* ni, ci_ip_pkt_fmt* pkt) { +ci_inline void ci_netif_pkt_release(ci_netif* ni, ci_ip_pkt_fmt* pkt) +{ ci_assert_gt(pkt->refcount, 0); - ci_assert( ci_netif_is_locked(ni) ); + ci_assert(ci_netif_is_locked(ni)); if( --pkt->refcount == 0 ) ci_netif_pkt_free(ni, pkt); } @@ -3270,15 +3242,13 @@ ci_inline void ci_netif_pkt_release(ci_netif* ni, ci_ip_pkt_fmt* pkt) { /* This is an optimised route for freeing packets when we know there is ** only one reference. */ -#define ci_netif_pkt_release_1ref(ni, pkt) \ - ci_netif_pkt_release(ni, pkt) +#define ci_netif_pkt_release_1ref(ni, pkt) ci_netif_pkt_release(ni, pkt) -#define ci_netif_pkt_release_rx_1ref(ni, pkt) \ +#define ci_netif_pkt_release_rx_1ref(ni, pkt) \ ci_netif_pkt_release_1ref(ni, pkt) -#define ci_netif_pkt_release_rx(ni, pkt) \ - ci_netif_pkt_release(ni, pkt) +#define ci_netif_pkt_release_rx(ni, pkt) ci_netif_pkt_release(ni, pkt) ci_inline int ci_netif_pkt_release_check_keep(ci_netif* ni, ci_ip_pkt_fmt* pkt) { @@ -3288,10 +3258,9 @@ ci_inline int ci_netif_pkt_release_check_keep(ci_netif* ni, ci_ip_pkt_fmt* pkt) */ if( (pkt->rx_flags & CI_PKT_RX_FLAG_KEEP) ) { /* Remove flag so other context (app or reap) will free it */ - pkt->rx_flags &=~ CI_PKT_RX_FLAG_KEEP; + pkt->rx_flags &= ~CI_PKT_RX_FLAG_KEEP; return 0; - } - else { + } else { ci_netif_pkt_release(ni, pkt); return 1; } @@ -3301,33 +3270,33 @@ ci_inline int ci_netif_pkt_release_check_keep(ci_netif* ni, ci_ip_pkt_fmt* pkt) *************************** pktbuf reserve accounting **************** *********************************************************************/ -ci_inline unsigned -__ci_tcp_rx_buf_count(ci_netif* netif, ci_tcp_state* ts) +ci_inline unsigned __ci_tcp_rx_buf_count(ci_netif* netif, ci_tcp_state* ts) { return ts->recv1.num + ts->recv2.num + ts->rob.num; } -ci_inline unsigned -__ci_tcp_rx_reserved_bufs(ci_netif* netif, ci_tcp_state* ts, int allocated_pkts) +ci_inline unsigned __ci_tcp_rx_reserved_bufs( + ci_netif* netif, ci_tcp_state* ts, int allocated_pkts) { - int reserved_bufs = ts->s.b.state != CI_TCP_ESTABLISHED ? 0 : - NI_OPTS(netif).endpoint_packet_reserve; + int reserved_bufs = ts->s.b.state != CI_TCP_ESTABLISHED + ? 0 + : NI_OPTS(netif).endpoint_packet_reserve; reserved_bufs -= allocated_pkts; /* this many buffers of this socket should have been added to * ns->reserved_pktbufs already */ return CI_MAX(0, reserved_bufs); } -ci_inline unsigned -ci_tcp_rx_reserved_bufs(ci_netif* netif, ci_tcp_state* ts) +ci_inline unsigned ci_tcp_rx_reserved_bufs(ci_netif* netif, ci_tcp_state* ts) { - return __ci_tcp_rx_reserved_bufs(netif, ts, __ci_tcp_rx_buf_count(netif, ts)); + return __ci_tcp_rx_reserved_bufs( + netif, ts, __ci_tcp_rx_buf_count(netif, ts)); } /* adjusts per-nic count of reserved buffers * needs to be called BEFORE any of tcp recv queues gets to be modified */ -ci_inline void -ci_tcp_rx_buf_adjust(ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_queue* q, int delta) +ci_inline void ci_tcp_rx_buf_adjust( + ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_queue* q, int delta) { int m, n; @@ -3338,7 +3307,8 @@ ci_tcp_rx_buf_adjust(ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_queue* q, int return; m = ci_tcp_rx_reserved_bufs(netif, ts); - n = __ci_tcp_rx_reserved_bufs(netif, ts, __ci_tcp_rx_buf_count(netif, ts) + delta); + n = __ci_tcp_rx_reserved_bufs( + netif, ts, __ci_tcp_rx_buf_count(netif, ts) + delta); netif->state->reserved_pktbufs += n - m; ci_assert(ci_netif_is_locked(netif)); @@ -3347,17 +3317,16 @@ ci_tcp_rx_buf_adjust(ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_queue* q, int extern void ci_ip_queue_drop(ci_netif*, ci_ip_pkt_queue*) CI_HF; -ci_inline void -ci_tcp_rx_queue_drop(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_queue* q) +ci_inline void ci_tcp_rx_queue_drop( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_queue* q) { ci_tcp_rx_buf_adjust(ni, ts, q, -q->num); ci_ip_queue_drop(ni, q); } -ci_inline void -ci_tcp_rx_buf_account_begin(ci_netif* netif, ci_tcp_state* ts) +ci_inline void ci_tcp_rx_buf_account_begin(ci_netif* netif, ci_tcp_state* ts) { - ci_assert( ci_netif_is_locked(netif) ); + ci_assert(ci_netif_is_locked(netif)); ci_assert_nflags(netif->state->flags, CI_NETIF_FLAG_PKT_ACCOUNT_PENDING); CI_DEBUG(netif->state->flags |= CI_NETIF_FLAG_PKT_ACCOUNT_PENDING); @@ -3368,10 +3337,9 @@ ci_tcp_rx_buf_account_begin(ci_netif* netif, ci_tcp_state* ts) ci_assert_ge(netif->state->reserved_pktbufs, 0); } -ci_inline void -ci_tcp_rx_buf_account_end(ci_netif* netif, ci_tcp_state* ts) +ci_inline void ci_tcp_rx_buf_account_end(ci_netif* netif, ci_tcp_state* ts) { - ci_assert( ci_netif_is_locked(netif) ); + ci_assert(ci_netif_is_locked(netif)); ci_assert_flags(netif->state->flags, CI_NETIF_FLAG_PKT_ACCOUNT_PENDING); CI_DEBUG(netif->state->flags &= ~CI_NETIF_FLAG_PKT_ACCOUNT_PENDING); @@ -3383,20 +3351,25 @@ ci_tcp_rx_buf_account_end(ci_netif* netif, ci_tcp_state* ts) *************************** ci_ip_pkt_queue ************************** *********************************************************************/ -#define CI_IP_QUEUE_UNLIMITED INT_MAX +#define CI_IP_QUEUE_UNLIMITED INT_MAX -ci_inline void ci_ip_queue_init(ci_ip_pkt_queue *qu) { +ci_inline void ci_ip_queue_init(ci_ip_pkt_queue* qu) +{ qu->num = 0; qu->head = OO_PP_NULL; /* tail undefined when queue is empty */ } -ci_inline int ci_ip_queue_is_empty(ci_ip_pkt_queue *qu) -{ return qu->num == 0; } +ci_inline int ci_ip_queue_is_empty(ci_ip_pkt_queue* qu) +{ + return qu->num == 0; +} -ci_inline int ci_ip_queue_not_empty(ci_ip_pkt_queue *qu) -{ return qu->num; } +ci_inline int ci_ip_queue_not_empty(ci_ip_pkt_queue* qu) +{ + return qu->num; +} ci_inline int ci_ip_queue_is_valid(ci_netif* netif, ci_ip_pkt_queue* qu) @@ -3404,39 +3377,38 @@ ci_inline int ci_ip_queue_is_valid(ci_netif* netif, ci_ip_pkt_queue* qu) if( qu->num == 0 ) return OO_PP_IS_NULL(qu->head); else - return IS_VALID_PKT_ID(netif, qu->head) && - IS_VALID_PKT_ID(netif, qu->tail) && - OO_PP_IS_NULL(PKT(netif, qu->tail)->next); + return IS_VALID_PKT_ID(netif, qu->head) && + IS_VALID_PKT_ID(netif, qu->tail) && + OO_PP_IS_NULL(PKT(netif, qu->tail)->next); } #ifndef NDEBUG /* This function should be NEVER used in production! * For temporary debugging only! */ -ci_inline int ci_ip_queue_is_valid_long(ci_netif* netif, ci_ip_pkt_queue* qu, - const char *name) +ci_inline int ci_ip_queue_is_valid_long( + ci_netif* netif, ci_ip_pkt_queue* qu, const char* name) { int i = 0, found_tail = 0; oo_pkt_p id; - if( !ci_ip_queue_is_valid(netif, qu) ) + if( ! ci_ip_queue_is_valid(netif, qu) ) return 0; - for( id = qu->head; OO_PP_NOT_NULL(id); - id = PKT(netif, id)->next ) { - ci_ip_pkt_fmt *pkt = PKT(netif, id); + for( id = qu->head; OO_PP_NOT_NULL(id); id = PKT(netif, id)->next ) { + ci_ip_pkt_fmt* pkt = PKT(netif, id); i++; ci_log("%s queue %d: %d %08x-%08x", name, i, OO_PP_FMT(id), - pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq); + pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq); if( OO_PP_EQ(qu->tail, id) ) found_tail = 1; } if( i != qu->num ) { - ci_log("validation of %s queue failed: %d real members, %d declared", - name, i, qu->num); + ci_log("validation of %s queue failed: %d real members, %d declared", name, + i, qu->num); return 0; } if( i && ! found_tail ) { - ci_log("validation of %s queue failed: tail %d not in queue", - name, OO_PP_FMT(qu->tail)); + ci_log("validation of %s queue failed: tail %d not in queue", name, + OO_PP_FMT(qu->tail)); return 0; } return 1; @@ -3444,14 +3416,13 @@ ci_inline int ci_ip_queue_is_valid_long(ci_netif* netif, ci_ip_pkt_queue* qu, #endif -ci_inline void __ci_ip_queue_enqueue(ci_netif* netif, ci_ip_pkt_queue* qu, - ci_ip_pkt_fmt* pkt) +ci_inline void __ci_ip_queue_enqueue( + ci_netif* netif, ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* pkt) { if( ci_ip_queue_is_empty(qu) ) { ci_assert(OO_PP_IS_NULL(qu->head)); qu->head = OO_PKT_P(pkt); - } - else { + } else { ci_assert(OO_PP_NOT_NULL(qu->head)); /* This assumes the netif lock is held, so use ci_ip_queue_enqueue_nnl() if it's not */ @@ -3462,24 +3433,24 @@ ci_inline void __ci_ip_queue_enqueue(ci_netif* netif, ci_ip_pkt_queue* qu, } -ci_inline void __ci_tcp_rx_queue_enqueue(ci_netif* netif, ci_tcp_state* ts, - ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* pkt) +ci_inline void __ci_tcp_rx_queue_enqueue( + ci_netif* netif, ci_tcp_state* ts, ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* pkt) { ci_tcp_rx_buf_adjust(netif, ts, qu, 1); __ci_ip_queue_enqueue(netif, qu, pkt); } -ci_inline void ci_ip_queue_enqueue(ci_netif* netif, ci_ip_pkt_queue* qu, - ci_ip_pkt_fmt* pkt) +ci_inline void ci_ip_queue_enqueue( + ci_netif* netif, ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* pkt) { pkt->next = OO_PP_NULL; __ci_ip_queue_enqueue(netif, qu, pkt); } -ci_inline void ci_ip_queue_dequeue(ci_netif* netif, ci_ip_pkt_queue* qu, - ci_ip_pkt_fmt* head) +ci_inline void ci_ip_queue_dequeue( + ci_netif* netif, ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* head) { ci_assert(IS_VALID_PKT_ID(netif, qu->head)); ci_assert_gt(qu->num, 0); @@ -3493,7 +3464,7 @@ ci_inline void ci_ip_queue_dequeue(ci_netif* netif, ci_ip_pkt_queue* qu, ci_inline void ci_tcp_rx_queue_dequeue(ci_netif* netif, ci_tcp_state* ts, - ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* head) + ci_ip_pkt_queue* qu, ci_ip_pkt_fmt* head) { ci_tcp_rx_buf_adjust(netif, ts, qu, -1); ci_ip_queue_dequeue(netif, qu, head); @@ -3503,8 +3474,7 @@ ci_inline void ci_tcp_rx_queue_dequeue(ci_netif* netif, ci_tcp_state* ts, ** must point at the last packet in the chain to be moved. */ ci_inline void ci_ip_queue_move(ci_netif* netif, ci_ip_pkt_queue* from, - ci_ip_pkt_queue *to, - ci_ip_pkt_fmt *last, int num) + ci_ip_pkt_queue* to, ci_ip_pkt_fmt* last, int num) { oo_pkt_p originalfromhead; @@ -3519,8 +3489,8 @@ ci_inline void ci_ip_queue_move(ci_netif* netif, ci_ip_pkt_queue* from, from->num -= num; last->next = OO_PP_NULL; ci_wmb(); - /* - * cat the to list and the new list + /* + * cat the to list and the new list */ if( ci_ip_queue_is_empty(to) ) to->head = originalfromhead; @@ -3532,8 +3502,8 @@ ci_inline void ci_ip_queue_move(ci_netif* netif, ci_ip_pkt_queue* from, /* Move entire queue [from] to [to] and re-init [from]. [to] need not * be initialised. */ -ci_inline void ci_ip_queue_move_all(ci_netif* netif, ci_ip_pkt_queue* from, - ci_ip_pkt_queue *to) +ci_inline void ci_ip_queue_move_all( + ci_netif* netif, ci_ip_pkt_queue* from, ci_ip_pkt_queue* to) { ci_assert(netif); ci_assert(from); @@ -3548,13 +3518,13 @@ ci_inline void ci_ip_queue_move_all(ci_netif* netif, ci_ip_pkt_queue* from, **********************************************************************/ /* Limited IPID handling - just run around the block we get at start-up */ -# include -# define NEXT_IP_ID(ni) (NI_IPID(ni)->base | \ - (NI_IPID(ni)->next++ & CI_IPID_BLOCK_MASK)) +#include +#define NEXT_IP_ID(ni) \ + (NI_IPID(ni)->base | (NI_IPID(ni)->next++ & CI_IPID_BLOCK_MASK)) #if CI_CFG_IPV6 -# define NEXT_IP6_ID(ni) (NI_IPID(ni)->ip6_base | \ - (NI_IPID(ni)->ip6_next++ & CI_IP6ID_BLOCK_MASK)) +#define NEXT_IP6_ID(ni) \ + (NI_IPID(ni)->ip6_base | (NI_IPID(ni)->ip6_next++ & CI_IP6ID_BLOCK_MASK)) #endif typedef union { @@ -3564,8 +3534,7 @@ typedef union { ci_uint16 ip4; } ci_ipx_id_t; -ci_inline ci_ipx_id_t -ci_next_ipx_id_be(int af, ci_netif* ni) +ci_inline ci_ipx_id_t ci_next_ipx_id_be(int af, ci_netif* ni) { ci_ipx_id_t ipx_id; #if CI_CFG_IPV6 @@ -3580,50 +3549,46 @@ ci_next_ipx_id_be(int af, ci_netif* ni) /* Return true if ip options contain badness. * Badness: Unknown option, source routing, invalid option lengths. */ -extern int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, - const int hdr_size); +extern int ci_ip_options_parse( + ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size); /********************************************************************** **************************** citp_waitable **************************** **********************************************************************/ -ci_inline int -citp_waitable_lock_or_set_flag(citp_waitable* w, ci_uint32 flag) +ci_inline int citp_waitable_lock_or_set_flag(citp_waitable* w, ci_uint32 flag) { ci_uint32 l, new_l; int rc; do { l = w->lock.wl_val; - if( ! (l & OO_WAITABLE_LK_LOCKED) ){ + if( ! (l & OO_WAITABLE_LK_LOCKED) ) { new_l = l | OO_WAITABLE_LK_LOCKED; rc = 1; - } - else{ + } else { new_l = l | flag; rc = 0; } - } while(CI_UNLIKELY( ci_cas32u_fail(&w->lock.wl_val, l, new_l) )); + } while( CI_UNLIKELY(ci_cas32u_fail(&w->lock.wl_val, l, new_l)) ); return rc; } -ci_inline void -citp_waitable_lock_set_flag(citp_waitable* w, ci_uint32 flag) +ci_inline void citp_waitable_lock_set_flag(citp_waitable* w, ci_uint32 flag) { ci_uint32 l; do { l = w->lock.wl_val; - } while(CI_UNLIKELY( ci_cas32u_fail(&w->lock.wl_val, l, l | flag) )); + } while( CI_UNLIKELY(ci_cas32u_fail(&w->lock.wl_val, l, l | flag)) ); } -ci_inline void -citp_waitable_lock_clear_flag(citp_waitable* w, ci_uint32 flag) +ci_inline void citp_waitable_lock_clear_flag(citp_waitable* w, ci_uint32 flag) { ci_uint32 l; do { l = w->lock.wl_val; - } while(CI_UNLIKELY( ci_cas32u_fail(&w->lock.wl_val, l, l & ~flag) )); + } while( CI_UNLIKELY(ci_cas32u_fail(&w->lock.wl_val, l, l & ~flag)) ); } @@ -3631,13 +3596,11 @@ citp_waitable_lock_clear_flag(citp_waitable* w, ci_uint32 flag) ***************************** ICMP/Errors ***************************** **********************************************************************/ -#define ci_icmp_send_error(ni, rx_pkt, type, code) \ - __ci_icmp_send_error((ni), oo_pkt_af(rx_pkt), \ - oo_ipx_hdr(rx_pkt), \ - oo_ether_hdr(rx_pkt), (type), (code)) +#define ci_icmp_send_error(ni, rx_pkt, type, code) \ + __ci_icmp_send_error((ni), oo_pkt_af(rx_pkt), oo_ipx_hdr(rx_pkt), \ + oo_ether_hdr(rx_pkt), (type), (code)) -ci_inline int -ci_icmp_send_port_unreach(ci_netif *ni, ci_ip_pkt_fmt* rx_pkt) +ci_inline int ci_icmp_send_port_unreach(ci_netif* ni, ci_ip_pkt_fmt* rx_pkt) { ci_uint8 type, code; @@ -3645,8 +3608,7 @@ ci_icmp_send_port_unreach(ci_netif *ni, ci_ip_pkt_fmt* rx_pkt) if( IS_AF_INET6(oo_pkt_af(rx_pkt)) ) { type = CI_ICMPV6_DEST_UNREACH; code = CI_ICMPV6_DU_PORT_UNREACH; - } - else + } else #endif { type = CI_ICMP_DEST_UNREACH; @@ -3660,7 +3622,8 @@ ci_icmp_send_port_unreach(ci_netif *ni, ci_ip_pkt_fmt* rx_pkt) ********************************* UDP ********************************* **********************************************************************/ -ci_inline void ci_udp_dec_tx_count(ci_udp_state* us, ci_ip_pkt_fmt* pkt) { +ci_inline void ci_udp_dec_tx_count(ci_udp_state* us, ci_ip_pkt_fmt* pkt) +{ ci_assert(pkt->flags & CI_PKT_FLAG_UDP); ci_assert_ge((int) us->tx_count, (int) pkt->pf.udp.tx_length); us->tx_count -= pkt->pf.udp.tx_length; @@ -3672,7 +3635,9 @@ ci_inline void ci_udp_dec_tx_count(ci_udp_state* us, ci_ip_pkt_fmt* pkt) { ** when to indicate writable in select() and poll(). */ ci_inline int ci_udp_tx_advertise_space(ci_udp_state* us) -{ return (int) (us->s.so.sndbuf - us->tx_count) > (int) (us->tx_count >> 1u); } +{ + return (int) (us->s.so.sndbuf - us->tx_count) > (int) (us->tx_count >> 1u); +} /********************************************************************* @@ -3681,19 +3646,18 @@ ci_inline int ci_udp_tx_advertise_space(ci_udp_state* us) extern void ci_udp_recv_q_drop(ci_netif*, ci_udp_recv_q*) CI_HF; extern int ci_udp_recv_q_reap(ci_netif*, ci_udp_recv_q*) CI_HF; -extern void ci_udp_recvq_dump(ci_netif* ni, ci_udp_recv_q* q, - const char* pf1, const char* pf2, - oo_dump_log_fn_t logger, void* log_arg) CI_HF; +extern void ci_udp_recvq_dump(ci_netif* ni, ci_udp_recv_q* q, const char* pf1, + const char* pf2, oo_dump_log_fn_t logger, void* log_arg) CI_HF; #if CI_CFG_TIMESTAMPING -extern int ci_udp_timestamp_q_enqueue(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt); +extern int ci_udp_timestamp_q_enqueue( + ci_netif* ni, ci_udp_state* us, ci_ip_pkt_fmt* pkt); #endif /* Put a packet into recv_q but don't mark it as visible to the consumer yet. * Stack should be locked. */ -ci_inline void ci_udp_recv_q_put_pending(ci_netif* ni, ci_udp_recv_q* q, - ci_ip_pkt_fmt* pkt) +ci_inline void ci_udp_recv_q_put_pending( + ci_netif* ni, ci_udp_recv_q* q, ci_ip_pkt_fmt* pkt) { ci_assert(ci_netif_is_locked(ni)); @@ -3701,7 +3665,7 @@ ci_inline void ci_udp_recv_q_put_pending(ci_netif* ni, ci_udp_recv_q* q, /* Changing [pkt->rx_flags] without the socket lock is safe as long as we * ensure that we do so before posting [pkt] to the recvq. * This is required for proper functioning ci_udp_recv_q_get() */ - pkt->rx_flags &=~ CI_PKT_RX_FLAG_RECV_Q_CONSUMED; + pkt->rx_flags &= ~CI_PKT_RX_FLAG_RECV_Q_CONSUMED; } pkt->udp_rx_next = OO_PP_NULL; @@ -3715,8 +3679,7 @@ ci_inline void ci_udp_recv_q_put_pending(ci_netif* ni, ci_udp_recv_q* q, if( OO_PP_NOT_NULL(q->head) ) { PKT_CHK(ni, q->tail)->udp_rx_next = OO_PKT_P(pkt); ci_udp_recv_q_reap(ni, q); - } - else { + } else { ci_assert(OO_PP_IS_NULL(q->extract)); /* q->extract is modified here without proper lock * (q->extract is proteced by socket lock). @@ -3742,8 +3705,8 @@ ci_inline void ci_udp_recv_q_put_complete(ci_udp_recv_q* q, unsigned n_buffers) /* Put a packet into recv_q. Stack should be locked. */ -ci_inline void ci_udp_recv_q_put(ci_netif* ni, ci_udp_recv_q* q, - ci_ip_pkt_fmt* pkt) +ci_inline void ci_udp_recv_q_put( + ci_netif* ni, ci_udp_recv_q* q, ci_ip_pkt_fmt* pkt) { ci_udp_recv_q_put_pending(ni, q, pkt); ci_udp_recv_q_put_complete(q, pkt->n_buffers); @@ -3751,13 +3714,12 @@ ci_inline void ci_udp_recv_q_put(ci_netif* ni, ci_udp_recv_q* q, /* Get a packet from recv_q. Socket should be locked. */ -ci_inline ci_ip_pkt_fmt* ci_udp_recv_q_get(ci_netif* ni, - ci_udp_recv_q* q) +ci_inline ci_ip_pkt_fmt* ci_udp_recv_q_get(ci_netif* ni, ci_udp_recv_q* q) { ci_ip_pkt_fmt* pkt; if( ci_udp_recv_q_is_empty(q) ) - return NULL; + return NULL; /* Full barrier needed here: we need to prevent reordering of access to * q->extract before the above check, and also, since bumping q->extract @@ -3773,20 +3735,19 @@ ci_inline ci_ip_pkt_fmt* ci_udp_recv_q_get(ci_netif* ni, */ q->extract = OO_ACCESS_ONCE(pkt->udp_rx_next); pkt = PKT_CHK_NNL(ni, q->extract); - ci_assert( !(pkt->rx_flags & CI_PKT_RX_FLAG_RECV_Q_CONSUMED) ); + ci_assert(! (pkt->rx_flags & CI_PKT_RX_FLAG_RECV_Q_CONSUMED)); } return pkt; } -ci_inline void ci_udp_recv_q_deliver(ci_netif* ni, ci_udp_recv_q* q, - ci_ip_pkt_fmt* pkt) +ci_inline void ci_udp_recv_q_deliver( + ci_netif* ni, ci_udp_recv_q* q, ci_ip_pkt_fmt* pkt) { - q->pkts_delivered += pkt->n_buffers; + q->pkts_delivered += pkt->n_buffers; pkt->rx_flags |= CI_PKT_RX_FLAG_RECV_Q_CONSUMED; } -ci_inline ci_ip_pkt_fmt* ci_udp_recv_q_next(ci_netif* ni, - ci_ip_pkt_fmt* pkt) +ci_inline ci_ip_pkt_fmt* ci_udp_recv_q_next(ci_netif* ni, ci_ip_pkt_fmt* pkt) { /* This function is called without the stack lock, and so we had better be * certain that the packet is not going to be reaped under our feet. */ @@ -3818,85 +3779,92 @@ static inline int ci_tcp_retransq_is_empty(ci_tcp_state* ts) ! (ts->tcpflags & CI_TCPT_FLAG_FIN_PENDING); } -ci_inline void ci_tcp_rto_check_and_set(ci_netif* netif, ci_tcp_state* ts) { +ci_inline void ci_tcp_rto_check_and_set(ci_netif* netif, ci_tcp_state* ts) +{ /* shouldn't set an RTO if no data to send */ - ci_assert(!ci_tcp_retransq_is_empty(ts)); + ci_assert(! ci_tcp_retransq_is_empty(ts)); /* shouldn't set an RTO timer in a state that doesn't allow them */ - ci_assert(!(ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); if( ! ci_ip_timer_pending(netif, &ts->rto_tid) ) { #if CI_CFG_TAIL_DROP_PROBE - ts->tcpflags &=~ CI_TCPT_FLAG_TAIL_DROP_TIMING; + ts->tcpflags &= ~CI_TCPT_FLAG_TAIL_DROP_TIMING; #endif ci_ip_timer_set(netif, &ts->rto_tid, ci_tcp_time_now(netif) + ts->rto); } } ci_inline void ci_tcp_rto_clear(ci_netif* netif, ci_tcp_state* ts) -{ ci_ip_timer_clear(netif, &ts->rto_tid); } +{ + ci_ip_timer_clear(netif, &ts->rto_tid); +} -ci_inline void ci_tcp_rto_restart(ci_netif* netif, ci_tcp_state* ts) { +ci_inline void ci_tcp_rto_restart(ci_netif* netif, ci_tcp_state* ts) +{ /* shouldn't set an RTO if retrans queue is empty */ - ci_assert(!ci_tcp_retransq_is_empty(ts)); + ci_assert(! ci_tcp_retransq_is_empty(ts)); /* shouldn't set an RTO timer in a state that doesn't allow them */ - ci_assert(!(ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); #if CI_CFG_TAIL_DROP_PROBE - ts->tcpflags &=~ CI_TCPT_FLAG_TAIL_DROP_TIMING; + ts->tcpflags &= ~CI_TCPT_FLAG_TAIL_DROP_TIMING; #endif ci_ip_timer_modify(netif, &ts->rto_tid, ci_tcp_time_now(netif) + ts->rto); } -ci_inline void ci_tcp_rto_set_with_timeout(ci_netif* netif, ci_tcp_state* ts, - ci_iptime_t timeout) { +ci_inline void ci_tcp_rto_set_with_timeout( + ci_netif* netif, ci_tcp_state* ts, ci_iptime_t timeout) +{ /* shouldn't set an RTO if retrans queue is empty */ - ci_assert(!ci_tcp_retransq_is_empty(ts)); + ci_assert(! ci_tcp_retransq_is_empty(ts)); /* shouldn't set an RTO timer in a state that doesn't allow them */ - ci_assert(!(ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); ci_ip_timer_set(netif, &ts->rto_tid, ci_tcp_time_now(netif) + timeout); } -#define ci_tcp_rto_set(ni, ts) ci_tcp_rto_set_with_timeout((ni), (ts), \ - (ts)->rto) +#define ci_tcp_rto_set(ni, ts) \ + ci_tcp_rto_set_with_timeout((ni), (ts), (ts)->rto) -ci_inline void ci_tcp_rto_bound(ci_netif* netif, ci_tcp_state* ts) { +ci_inline void ci_tcp_rto_bound(ci_netif* netif, ci_tcp_state* ts) +{ ts->rto = CI_MIN(NI_CONF(netif).tconst_rto_max, ts->rto); ts->rto = CI_MAX(NI_CONF(netif).tconst_rto_min, ts->rto); } /* delayed ack timers */ -ci_inline void ci_tcp_delack_check_and_set(ci_netif* netif, - ci_tcp_state* ts) { +ci_inline void ci_tcp_delack_check_and_set(ci_netif* netif, ci_tcp_state* ts) +{ /* shouldn't set a timer in a state that doesn't allow them */ - ci_assert(!(ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); - if( !ci_ip_timer_pending(netif, &ts->delack_tid) ) - ci_ip_timer_set(netif, &ts->delack_tid, ci_tcp_time_now(netif) + - NI_CONF(netif).tconst_delack); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + if( ! ci_ip_timer_pending(netif, &ts->delack_tid) ) + ci_ip_timer_set(netif, &ts->delack_tid, + ci_tcp_time_now(netif) + NI_CONF(netif).tconst_delack); } ci_inline void ci_tcp_delack_clear(ci_netif* netif, ci_tcp_state* ts) -{ ci_ip_timer_clear(netif, &ts->delack_tid); } +{ + ci_ip_timer_clear(netif, &ts->delack_tid); +} #if CI_CFG_DYNAMIC_ACK_RATE -ci_inline void ci_tcp_delack_soon(ci_netif* netif, ci_tcp_state* ts) +ci_inline void ci_tcp_delack_soon(ci_netif* netif, ci_tcp_state* ts) { /* shouldn't set a timer in a state that doesn't allow them */ - ci_assert(!(ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); ci_assert_gt(ts->acks_pending & CI_TCP_ACKS_PENDING_MASK, - NI_OPTS(netif).delack_thresh); + NI_OPTS(netif).delack_thresh); ts->acks_pending |= CI_TCP_DELACK_SOON_FLAG; if( ci_ip_timer_pending(netif, &ts->delack_tid) ) - ci_ip_timer_modify(netif, &ts->delack_tid, ci_tcp_time_now(netif)+1); + ci_ip_timer_modify(netif, &ts->delack_tid, ci_tcp_time_now(netif) + 1); else - ci_ip_timer_set(netif, &ts->delack_tid, ci_tcp_time_now(netif)+1); + ci_ip_timer_set(netif, &ts->delack_tid, ci_tcp_time_now(netif) + 1); } #endif #if CI_CFG_TAIL_DROP_PROBE -ci_inline int ci_tcp_taildrop_probe_enabled(const ci_netif* ni, - const ci_tcp_state* ts) +ci_inline int ci_tcp_taildrop_probe_enabled( + const ci_netif* ni, const ci_tcp_state* ts) { - return NI_OPTS(ni).tail_drop_probe && - (ts->tcpflags & CI_TCPT_FLAG_SACK) && + return NI_OPTS(ni).tail_drop_probe && (ts->tcpflags & CI_TCPT_FLAG_SACK) && ts->congstate == CI_TCP_CONG_OPEN && (ts->s.b.state & CI_TCP_STATE_SYNCHRONISED); } @@ -3918,8 +3886,8 @@ ci_inline int ci_tcp_taildrop_probe_enabled(const ci_netif* ni, */ #define TCP_TIMEOUT_MIN(netif) (NI_CONF(netif).tconst_rto_min / 10) -ci_inline unsigned ci_tcp_taildrop_timeout(const ci_netif* netif, - const ci_tcp_state* ts ) +ci_inline unsigned ci_tcp_taildrop_timeout( + const ci_netif* netif, const ci_tcp_state* ts) { unsigned offset; @@ -3934,11 +3902,10 @@ ci_inline unsigned ci_tcp_taildrop_timeout(const ci_netif* netif, offset += NI_CONF(netif).tconst_rto_min; else offset += TCP_TIMEOUT_MIN(netif); - } - else { + } else { /* ts->sa = 0 at start of day; it can be too small when 1 or 2 packets * were acked. */ - offset = NI_CONF(netif).tconst_rto_initial; + offset = NI_CONF(netif).tconst_rto_initial; } return CI_MIN(offset, ts->rto); } @@ -3946,14 +3913,14 @@ ci_inline unsigned ci_tcp_taildrop_timeout(const ci_netif* netif, #else -ci_inline int ci_tcp_taildrop_probe_enabled(const ci_netif* ni, - const ci_tcp_state* ts) +ci_inline int ci_tcp_taildrop_probe_enabled( + const ci_netif* ni, const ci_tcp_state* ts) { return 0; } -ci_inline unsigned ci_tcp_taildrop_timeout(const ci_netif* netif, - const ci_tcp_state* ts ) +ci_inline unsigned ci_tcp_taildrop_timeout( + const ci_netif* netif, const ci_tcp_state* ts) { ci_assert(0); return 0; @@ -3971,43 +3938,47 @@ ci_inline unsigned ci_tcp_taildrop_timeout(const ci_netif* netif, * @param ts TCP control block * @param t Relative time when keepalive timer should expire */ -ci_inline void ci_tcp_kalive_restart(ci_netif *netif, ci_tcp_state* ts, - ci_iptime_t t) { - /* - * Actually, if there are such situations remove this assert, +ci_inline void ci_tcp_kalive_restart( + ci_netif* netif, ci_tcp_state* ts, ci_iptime_t t) +{ + /* + * Actually, if there are such situations remove this assert, * but now I can't see any cases when this is false. */ /* ?? Why not use ts->s.b.state & CI_TCP_STATE_NO_TIMERS?? */ - ci_assert( ts->s.b.state != CI_TCP_CLOSED && - ts->s.b.state != CI_TCP_LISTEN ); + ci_assert(ts->s.b.state != CI_TCP_CLOSED && ts->s.b.state != CI_TCP_LISTEN); if( ts->s.s_flags & CI_SOCK_FLAG_KALIVE ) ci_ip_timer_modify(netif, &ts->kalive_tid, ci_tcp_time_now(netif) + t); else /* * ka_probes is not cleared somewhere, as soon as with disabled - * keepalive feature this field should be zero + * keepalive feature this field should be zero */ ci_assert(ts->ka_probes == 0); } /* - * Gets the value of keepalive IDLE time - time before start sending + * Gets the value of keepalive IDLE time - time before start sending * keepalive probes. * * @param ts TCP control block */ ci_inline ci_iptime_t ci_tcp_kalive_idle_get(ci_tcp_state* ts) -{ return ts->c.t_ka_time; } +{ + return ts->c.t_ka_time; +} /* - * Gets the value of keepalive IDLE time in seconds - time before + * Gets the value of keepalive IDLE time in seconds - time before * start sending keepalive probes. * * @param ts TCP control block */ ci_inline ci_iptime_t ci_tcp_kalive_idle_in_secs_get(ci_tcp_state* ts) -{ return ts->c.t_ka_time_in_secs; } +{ + return ts->c.t_ka_time_in_secs; +} /* * Gets the value of keepalive probe interval - interval between two @@ -4016,14 +3987,14 @@ ci_inline ci_iptime_t ci_tcp_kalive_idle_in_secs_get(ci_tcp_state* ts) * @param ts TCP control block * @param netif netif */ -ci_inline ci_iptime_t ci_tcp_kalive_intvl_get(ci_netif* netif, - ci_tcp_state* ts) +ci_inline ci_iptime_t ci_tcp_kalive_intvl_get( + ci_netif* netif, ci_tcp_state* ts) { return ts->c.t_ka_intvl; } /* - * Gets the value of keepalive probe interval in seconds- interval between + * Gets the value of keepalive probe interval in seconds- interval between * two consequent probes. * * @param ts TCP control block @@ -4039,16 +4010,20 @@ ci_inline ci_iptime_t ci_tcp_kalive_intvl_in_secs_get(ci_tcp_state* ts) * @param ts TCP control block */ ci_inline unsigned ci_tcp_kalive_probes_get(ci_tcp_state* ts) -{ return ts->c.ka_probe_th; } +{ + return ts->c.ka_probe_th; +} ci_inline void ci_tcp_kalive_check_and_clear(ci_netif* netif, ci_tcp_state* ts) -{ ci_ip_timer_clear(netif, &ts->kalive_tid); } +{ + ci_ip_timer_clear(netif, &ts->kalive_tid); +} /* Sort out the keepalive timer when an ACK is received */ -ci_inline void ci_tcp_kalive_reset(ci_netif *netif, ci_tcp_state *ts) +ci_inline void ci_tcp_kalive_reset(ci_netif* netif, ci_tcp_state* ts) { - if (ts->ka_probes) { + if( ts->ka_probes ) { /* This is a bit pointless, but necessary to get through WHQL for * chimney. We have to restart the timer here rather than just * let it expire and sort things out then because if the interval @@ -4056,7 +4031,7 @@ ci_inline void ci_tcp_kalive_reset(ci_netif *netif, ci_tcp_state *ts) * fail some WHQL tests. For now we ignore the time that has * expired on this timer so far */ ci_tcp_kalive_restart(netif, ts, ci_tcp_kalive_idle_get(ts)); - } + } ts->ka_probes = 0; } @@ -4065,8 +4040,8 @@ ci_inline void ci_tcp_kalive_reset(ci_netif *netif, ci_tcp_state *ts) ci_inline void ci_tcp_zwin_set(ci_netif* netif, ci_tcp_state* ts) { ci_iptime_t t; - ci_assert( ! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS) ); - ci_assert( OO_SP_IS_NULL(ts->local_peer) ); + ci_assert(! (ts->s.b.state & CI_TCP_STATE_NO_TIMERS)); + ci_assert(OO_SP_IS_NULL(ts->local_peer)); if( ts->zwin_probes == 0 ) t = ts->rto << ts->zwin_acks; else @@ -4078,23 +4053,23 @@ ci_inline void ci_tcp_zwin_set(ci_netif* netif, ci_tcp_state* ts) /* Put ts on the 'some recycling needs to be done for this socket' timer * queue, starting the timer if needed. */ -ci_inline void ci_tcp_recycle_reset(ci_netif* netif, ci_tcp_state* ts) { +ci_inline void ci_tcp_recycle_reset(ci_netif* netif, ci_tcp_state* ts) +{ #if CI_CFG_TCP_OFFLOAD_RECYCLER - struct oo_p_dllink_state link = oo_p_dllink_sb(netif, &ts->s.b, - &ts->recycle_link); + struct oo_p_dllink_state link = + oo_p_dllink_sb(netif, &ts->s.b, &ts->recycle_link); ci_assert(ci_ip_queue_not_empty(&ts->rob)); if( ! oo_p_dllink_is_empty(netif, link) ) return; - oo_p_dllink_add(netif, - oo_p_dllink_ptr(netif, &netif->state->recycle_retry_q), - link); + oo_p_dllink_add( + netif, oo_p_dllink_ptr(netif, &netif->state->recycle_retry_q), link); if( ! ci_ip_timer_pending(netif, &netif->state->recycle_tid) ) { /* This recycle timer exists to deal with the possibility of drops * and/or queue overflows in the link between plugin and host. Since * that's guaranteed to be a very fast link, we hard-code the minimum * possible timeout and share the timer across all sockets. */ - ci_ip_timer_set(netif, &netif->state->recycle_tid, - ci_tcp_time_now(netif) + 1); + ci_ip_timer_set( + netif, &netif->state->recycle_tid, ci_tcp_time_now(netif) + 1); } #endif } @@ -4105,13 +4080,17 @@ ci_inline void ci_tcp_recycle_reset(ci_netif* netif, ci_tcp_state* ts) { **********************************************************************/ ci_inline int ci_tcp_sendq_is_empty(ci_tcp_state* ts) -{ return ci_ip_queue_is_empty(&ts->send); } +{ + return ci_ip_queue_is_empty(&ts->send); +} ci_inline int ci_tcp_sendq_not_empty(ci_tcp_state* ts) -{ return ci_ip_queue_not_empty(&ts->send); } +{ + return ci_ip_queue_not_empty(&ts->send); +} ci_inline void ci_tcp_sendq_drop(ci_netif* ni, ci_tcp_state* ts) -{ +{ ts->send_out += ts->send.num; ci_ip_queue_drop(ni, &ts->send); } @@ -4131,7 +4110,7 @@ static inline int ci_tcp_resend_fin(ci_tcp_state* ts, ci_netif* netif) { tcp_enq_nxt(ts) -= 1; if( ci_tcp_add_fin(ts, netif) == 0 ) { - ts->tcpflags &=~ CI_TCPT_FLAG_FIN_PENDING; + ts->tcpflags &= ~CI_TCPT_FLAG_FIN_PENDING; CITP_STATS_NETIF_INC(netif, tcp_cant_fin_resolved); return 1; } @@ -4147,8 +4126,8 @@ static inline int ci_tcp_resend_fin(ci_tcp_state* ts, ci_netif* netif) ci_inline int ci_tcp_is_cached(ci_tcp_state* ts) { #if CI_CFG_FD_CACHING - ci_assert_equal(!!(ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE), - !!(ts->cached_on_fd != -1)); + ci_assert_equal(! ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE), + ! ! (ts->cached_on_fd != -1)); return ts->cached_on_fd != -1; #else return 0; @@ -4156,25 +4135,29 @@ ci_inline int ci_tcp_is_cached(ci_tcp_state* ts) } -ci_inline ci_uint16 tcp_eff_mss(const ci_tcp_state* ts) { +ci_inline ci_uint16 tcp_eff_mss(const ci_tcp_state* ts) +{ if( ts->s.b.state != CI_TCP_CLOSED ) { ci_assert(ts->s.b.state != CI_TCP_LISTEN); ci_assert_gt(CI_CFG_TCP_MINIMUM_MSS, tcp_outgoing_opts_len(ts)); - ci_assert_ge(ts->eff_mss,CI_CFG_TCP_MINIMUM_MSS-tcp_outgoing_opts_len(ts)); + ci_assert_ge( + ts->eff_mss, CI_CFG_TCP_MINIMUM_MSS - tcp_outgoing_opts_len(ts)); } return ts->eff_mss; } -ci_inline void ci_tcp_fast_path_enable(ci_tcp_state* ts) { - ts->fast_path_check = ts->incoming_tcp_hdr_len << 26u; +ci_inline void ci_tcp_fast_path_enable(ci_tcp_state* ts) +{ + ts->fast_path_check = ts->incoming_tcp_hdr_len << 26u; ts->fast_path_check |= CI_TCP_FLAG_ACK << 16u; - ts->fast_path_check = CI_BSWAP_BE32(ts->fast_path_check); + ts->fast_path_check = CI_BSWAP_BE32(ts->fast_path_check); ci_assert(ci_tcp_can_use_fast_path(ts)); } -ci_inline void ci_tcp_fast_path_disable(ci_tcp_state* ts) { - ci_assert(!ci_tcp_can_use_fast_path(ts)); +ci_inline void ci_tcp_fast_path_disable(ci_tcp_state* ts) +{ + ci_assert(! ci_tcp_can_use_fast_path(ts)); ts->fast_path_check = ~CI_TCP_FAST_PATH_MASK; } @@ -4187,16 +4170,15 @@ ci_inline int ci_tcp_recv_not_blocked(ci_tcp_state* ts) */ int bytes = tcp_rcv_usr(ts); return TCP_RX_DONE(ts) || - (bytes >= ts->s.so.rcvlowat + - ((tcp_urg_data(ts) & CI_TCP_URG_IS_HERE) ? 1 : 0)); + (bytes >= ts->s.so.rcvlowat + + ((tcp_urg_data(ts) & CI_TCP_URG_IS_HERE) ? 1 : 0)); } -ci_inline -ci_iptime_t ci_tcp_isn2tick(ci_netif* ni, ci_uint32 isn) +ci_inline ci_iptime_t ci_tcp_isn2tick(ci_netif* ni, ci_uint32 isn) { ci_uint64 ticks = isn; - ticks <<= IPTIMER_STATE(ni)->ci_ip_time_frc2isn; /* isn -> frc */ + ticks <<= IPTIMER_STATE(ni)->ci_ip_time_frc2isn; /* isn -> frc */ ticks >>= IPTIMER_STATE(ni)->ci_ip_time_frc2tick; /* frc -> tick */ return ticks; } @@ -4208,14 +4190,12 @@ ci_iptime_t ci_tcp_isn2tick(ci_netif* ni, ci_uint32 isn) * that use the sequence number to decide whether a SYN matching a TIME_WAIT is * acceptable. */ -ci_inline unsigned -ci_tcp_future_isn(ci_netif* ni, ci_addr_t laddr, ci_uint16 lport_be, - ci_addr_t raddr, ci_uint16 rport_be, - ci_uint64 future_delta_ticks) +ci_inline unsigned ci_tcp_future_isn(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport_be, ci_addr_t raddr, ci_uint16 rport_be, + ci_uint64 future_delta_ticks) { ci_uint64 frc; - ci_uint32 hash = onload_hash3(laddr, lport_be, - raddr, rport_be, IPPROTO_TCP); + ci_uint32 hash = onload_hash3(laddr, lport_be, raddr, rport_be, IPPROTO_TCP); ci_frc64(&frc); frc += future_delta_ticks << IPTIMER_STATE(ni)->ci_ip_time_frc2tick; @@ -4225,29 +4205,26 @@ ci_tcp_future_isn(ci_netif* ni, ci_addr_t laddr, ci_uint16 lport_be, return hash + (frc >> IPTIMER_STATE(ni)->ci_ip_time_frc2isn); } -ci_inline unsigned -ci_tcp_initial_seqno(ci_netif* ni, ci_addr_t laddr, ci_uint16 lport_be, - ci_addr_t raddr, ci_uint16 rport_be) +ci_inline unsigned ci_tcp_initial_seqno(ci_netif* ni, ci_addr_t laddr, + ci_uint16 lport_be, ci_addr_t raddr, ci_uint16 rport_be) { return ci_tcp_future_isn(ni, laddr, lport_be, raddr, rport_be, 0); } /* Returns non-scaled value of the receive window. */ -ci_inline ci_uint32 ci_tcp_rcvbuf2window(ci_uint32 so_rcvbuf, - ci_uint32 amss, - ci_uint8 rcv_wscl) +ci_inline ci_uint32 ci_tcp_rcvbuf2window( + ci_uint32 so_rcvbuf, ci_uint32 amss, ci_uint8 rcv_wscl) { ci_assert(amss); so_rcvbuf = CI_MAX(so_rcvbuf, amss); if( so_rcvbuf % amss ) so_rcvbuf += amss - (so_rcvbuf % amss); - so_rcvbuf = CI_MIN(so_rcvbuf, (unsigned)CI_CFG_TCP_MAX_WINDOW << rcv_wscl); + so_rcvbuf = CI_MIN(so_rcvbuf, (unsigned) CI_CFG_TCP_MAX_WINDOW << rcv_wscl); return so_rcvbuf; } -ci_inline ci_uint16 ci_tcp_calc_rcv_wnd_syn(ci_uint32 so_rcvbuf, - ci_uint16 amss, - ci_uint8 rcv_wscl) +ci_inline ci_uint16 ci_tcp_calc_rcv_wnd_syn( + ci_uint32 so_rcvbuf, ci_uint16 amss, ci_uint8 rcv_wscl) { /* We shouldn't scale the window in any SYN packet, so our max claimable * window is the full 16 bits. If our unscaled window is more than that @@ -4258,57 +4235,74 @@ ci_inline ci_uint16 ci_tcp_calc_rcv_wnd_syn(ci_uint32 so_rcvbuf, ci_inline void ci_tcp_set_rcvbuf(ci_netif* ni, ci_tcp_state* ts) { - ts->rcv_window_max = ci_tcp_rcvbuf2window(ts->s.so.rcvbuf, ts->amss, - ts->rcv_wscl); - if( CI_UNLIKELY( ts->rcv_window_max > ts->s.so.rcvbuf ) ) + ts->rcv_window_max = + ci_tcp_rcvbuf2window(ts->s.so.rcvbuf, ts->amss, ts->rcv_wscl); + if( CI_UNLIKELY(ts->rcv_window_max > ts->s.so.rcvbuf) ) ts->s.so.rcvbuf = ts->rcv_window_max; } -ci_inline void ci_tcp_set_flags(ci_tcp_state* ts, unsigned flags) { +ci_inline void ci_tcp_set_flags(ci_tcp_state* ts, unsigned flags) +{ ci_tcp_hdr* tcp = TS_IPX_TCP(ts); - tcp->tcp_flags = (ci_uint8)flags; + tcp->tcp_flags = (ci_uint8) flags; } -ci_inline void ci_tcp_set_hdr_len(ci_tcp_state* ts, unsigned len) { +ci_inline void ci_tcp_set_hdr_len(ci_tcp_state* ts, unsigned len) +{ ci_tcp_hdr* tcp = TS_IPX_TCP(ts); CI_TCP_HDR_SET_LEN(tcp, len); } -ci_inline void ci_tcp_set_peer(ci_tcp_state* ts, ci_addr_t addr, unsigned port){ - ci_ipcache_set_daddr(&ts->s.pkt ,addr); - TS_IPX_TCP(ts)->tcp_dest_be16 = (ci_uint16)port; +ci_inline void ci_tcp_set_peer(ci_tcp_state* ts, ci_addr_t addr, unsigned port) +{ + ci_ipcache_set_daddr(&ts->s.pkt, addr); + TS_IPX_TCP(ts)->tcp_dest_be16 = (ci_uint16) port; ts->s.pkt.dport_be16 = port; ts->s.s_flags |= CI_SOCK_FLAG_CONNECTED; } ci_inline int ci_tcp_max_rcv_window(ci_tcp_state* ts) -{ return ts->rcv_window_max; } +{ + return ts->rcv_window_max; +} /* We'll send window updates whenever the window increases by this much. */ ci_inline int ci_tcp_ack_trigger_delta(ci_tcp_state* ts) -{ return ci_tcp_max_rcv_window(ts) >> 3; } +{ + return ci_tcp_max_rcv_window(ts) >> 3; +} #if CI_CFG_TCP_FASTSTART -# define CITP_TCP_FASTSTART(x) do{ x; }while(0) +#define CITP_TCP_FASTSTART(x) \ + do { \ + x; \ + } while( 0 ) -ci_inline void ci_tcp_reduce_faststart(ci_tcp_state* ts, unsigned reduction) { - if(CI_LIKELY( ts->faststart_acks <= reduction )) +ci_inline void ci_tcp_reduce_faststart(ci_tcp_state* ts, unsigned reduction) +{ + if( CI_LIKELY(ts->faststart_acks <= reduction) ) ts->faststart_acks = 0; else ts->faststart_acks -= reduction; } ci_inline int ci_tcp_is_in_faststart(ci_tcp_state* ts) -{ return ts->faststart_acks != 0; } +{ + return ts->faststart_acks != 0; +} #else -# define CITP_TCP_FASTSTART(x) do{}while(0) -# define ci_tcp_reduce_faststart(ts, n) do{}while(0) -# define ci_tcp_is_in_faststart(ts) (0) +#define CITP_TCP_FASTSTART(x) \ + do { \ + } while( 0 ) +#define ci_tcp_reduce_faststart(ts, n) \ + do { \ + } while( 0 ) +#define ci_tcp_is_in_faststart(ts) (0) #endif @@ -4321,7 +4315,8 @@ ci_inline int ci_tcp_is_in_faststart(ci_tcp_state* ts) * * \return Window size. */ -ci_inline unsigned int ci_tcp_wnd_from_hdr(ci_tcp_hdr* tcphdr, unsigned wscl) { +ci_inline unsigned int ci_tcp_wnd_from_hdr(ci_tcp_hdr* tcphdr, unsigned wscl) +{ unsigned tmp = CI_BSWAP_BE16(tcphdr->tcp_window_be16); return (tcphdr->tcp_flags & CI_TCP_FLAG_SYN) ? tmp : (tmp << wscl); } @@ -4334,7 +4329,8 @@ ci_inline unsigned int ci_tcp_wnd_from_hdr(ci_tcp_hdr* tcphdr, unsigned wscl) { * * \param ts TCP state */ -ci_inline ci_uint32 ci_tcp_base_dupack_thresh(ci_tcp_state *ts) { +ci_inline ci_uint32 ci_tcp_base_dupack_thresh(ci_tcp_state* ts) +{ #if CI_CFG_PORT_STRIPING if( ts->tcpflags & CI_TCPT_FLAG_STRIPE ) return NI_OPTS(ni).stripe_dupack_threshold; @@ -4344,8 +4340,9 @@ ci_inline ci_uint32 ci_tcp_base_dupack_thresh(ci_tcp_state *ts) { /* congestion control functions */ -/* set the initial congestion window as in rfc3390/rfc2581/rfc2001 */ -ci_inline void ci_tcp_set_initialcwnd(ci_netif* ni, ci_tcp_state* ts) { +/* set the initial congestion window as in rfc3390/rfc2581/rfc2001 */ +ci_inline void ci_tcp_set_initialcwnd(ci_netif* ni, ci_tcp_state* ts) +{ if( NI_OPTS(ni).initial_cwnd == 0 ) { #if CI_CFG_TCP_INITIAL_CWND_RFC == 3390 /* rfc3390: IW = min (4*SMSS, max (2*SMSS, 4380 bytes)) */ @@ -4357,21 +4354,20 @@ ci_inline void ci_tcp_set_initialcwnd(ci_netif* ni, ci_tcp_state* ts) { /* rfc2581: "IW, the initial value of cwnd, MUST be less than or equal to * 2*SMSS bytes and MUST NOT be more than 2 segments." */ - ts->cwnd = tcp_eff_mss(ts) <<1; + ts->cwnd = tcp_eff_mss(ts) << 1; #elif CI_CFG_TCP_INITIAL_CWND_RFC == 2001 /* rfc2001: IW = ts->eff_mss */ ts->cwnd = tcp_eff_mss(ts); #else -# error Bad CI_CFG_TCP_INITIAL_CWND_RFC +#error Bad CI_CFG_TCP_INITIAL_CWND_RFC #endif - } - else { + } else { if( NI_OPTS(ni).initial_cwnd < tcp_eff_mss(ts) ) { /* issue a warning and set initial_cwnd to eff_mss */ ci_log("EF_TCP_INITIAL_CWND=%d is less than MSS value %d. Correcting.", - NI_OPTS(ni).initial_cwnd, tcp_eff_mss(ts)); + NI_OPTS(ni).initial_cwnd, tcp_eff_mss(ts)); } - ts->cwnd = CI_MAX((ci_uint32)tcp_eff_mss(ts),NI_OPTS(ni).initial_cwnd); + ts->cwnd = CI_MAX((ci_uint32) tcp_eff_mss(ts), NI_OPTS(ni).initial_cwnd); } ts->cwnd = CI_MAX(ts->cwnd, NI_OPTS(ni).min_cwnd); /* RFC5681 suggests using the maximum possible send window as the initial @@ -4383,12 +4379,15 @@ ci_inline void ci_tcp_set_initialcwnd(ci_netif* ni, ci_tcp_state* ts) { ts->ssthresh = 65535 << ts->snd_wscl; } -/*! ?? \TODO should we use fackets to make things more exact ? */ +/*! ?? \TODO should we use fackets to make things more exact ? */ ci_inline unsigned ci_tcp_inflight(ci_tcp_state* ts) -{ return SEQ_SUB(ts->snd_nxt, ts->snd_una); } +{ + return SEQ_SUB(ts->snd_nxt, ts->snd_una); +} /* New value for [ssthresh] after loss (RFC2581 p5). */ -ci_inline unsigned ci_tcp_losswnd(ci_tcp_state* ts) { +ci_inline unsigned ci_tcp_losswnd(ci_tcp_state* ts) +{ unsigned x = ci_tcp_inflight(ts) >> 1u; unsigned y = tcp_eff_mss(ts) << 1u; return CI_MAX(x, y); @@ -4396,7 +4395,8 @@ ci_inline unsigned ci_tcp_losswnd(ci_tcp_state* ts) { #if CI_CFG_BURST_CONTROL -ci_inline unsigned ci_tcp_burst_exhausted(ci_netif* ni, ci_tcp_state* ts) { +ci_inline unsigned ci_tcp_burst_exhausted(ci_netif* ni, ci_tcp_state* ts) +{ int extra, retrans_data; unsigned fack; ci_tcp_get_fack(ni, ts, &fack, &retrans_data); @@ -4407,8 +4407,9 @@ ci_inline unsigned ci_tcp_burst_exhausted(ci_netif* ni, ci_tcp_state* ts) { #endif -ci_inline int ci_tcp_can_stripe(ci_netif* ni, unsigned laddr_be32, - unsigned raddr_be32) { +ci_inline int ci_tcp_can_stripe( + ci_netif* ni, unsigned laddr_be32, unsigned raddr_be32) +{ #if CI_CFG_PORT_STRIPING unsigned mask = NI_OPTS(ni).stripe_netmask_be32; return (laddr_be32 & mask) == (raddr_be32 & mask); @@ -4422,7 +4423,8 @@ ci_inline int ci_tcp_can_stripe(ci_netif* ni, unsigned laddr_be32, * any of these counters may be updated concurrently wrt this function, so * we have to protect against the result going negative. */ -ci_inline int ci_tcp_sendq_n_pkts(ci_tcp_state* ts) { +ci_inline int ci_tcp_sendq_n_pkts(ci_tcp_state* ts) +{ int n = oo_atomic_read(&ts->send_prequeue_in) + ts->send_in - ts->send_out; return n >= 0 ? n : 0; } @@ -4432,20 +4434,20 @@ ci_inline int ci_tcp_sendq_n_pkts(ci_tcp_state* ts) { ** wake a blocking thread, and to decide whether to indicate the socket is ** writable in select() and poll(). */ -ci_inline int ci_tcp_tx_advertise_space(ci_netif* ni, ci_tcp_state* ts) { +ci_inline int ci_tcp_tx_advertise_space(ci_netif* ni, ci_tcp_state* ts) +{ if( NI_OPTS(ni).tcp_sndbuf_mode ) { int pkts_queued = ci_tcp_sendq_n_pkts(ts) #if CI_CFG_TIMESTAMPING - + ci_udp_recv_q_pkts(&ts->timestamp_q) + + ci_udp_recv_q_pkts(&ts->timestamp_q) #endif - + ts->retrans.num; + + ts->retrans.num; return ts->so_sndbuf_pkts - pkts_queued > (pkts_queued >> 1u); - } - else { + } else { int bytes_enqueued = SEQ_SUB(tcp_enq_nxt(ts), tcp_snd_nxt(ts)); - return ( ts->so_sndbuf_pkts > ci_tcp_sendq_n_pkts(ts) ) && - ( (int) (ts->s.so.sndbuf - bytes_enqueued) > - (int) (bytes_enqueued >> 1u) ); + return (ts->so_sndbuf_pkts > ci_tcp_sendq_n_pkts(ts)) && + ((int) (ts->s.so.sndbuf - bytes_enqueued) > + (int) (bytes_enqueued >> 1u)); } } @@ -4455,33 +4457,34 @@ ci_inline int ci_tcp_tx_advertise_space(ci_netif* ni, ci_tcp_state* ts) { ci_inline int ci_tcp_tx_send_space(ci_netif* ni, ci_tcp_state* ts) { if( NI_OPTS(ni).tcp_sndbuf_mode ) { - return ts->so_sndbuf_pkts - - (ci_tcp_sendq_n_pkts(ts) + return ts->so_sndbuf_pkts - (ci_tcp_sendq_n_pkts(ts) #if CI_CFG_TIMESTAMPING - + ci_udp_recv_q_pkts(&ts->timestamp_q) + + ci_udp_recv_q_pkts(&ts->timestamp_q) #endif - + ts->retrans.num); - } - else + + ts->retrans.num); + } else return ts->so_sndbuf_pkts - ci_tcp_sendq_n_pkts(ts); } /* helpers for RTT sampling without TS option */ -ci_inline void ci_tcp_clear_rtt_timing(ci_tcp_state* ts) { +ci_inline void ci_tcp_clear_rtt_timing(ci_tcp_state* ts) +{ ts->timed_seq = tcp_snd_una(ts) - 1; } -ci_inline void ci_tcp_set_rtt_timing(ci_netif* netif, - ci_tcp_state* ts, int seq) { +ci_inline void ci_tcp_set_rtt_timing( + ci_netif* netif, ci_tcp_state* ts, int seq) +{ ts->timed_seq = seq; ts->timed_ts = ci_tcp_time_now(netif); } -ci_inline void ci_tcp_tx_pkt_set_end(ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) { - uint8_t* end = (uint8_t*) oo_tx_l3_hdr(pkt) + ts->outgoing_hdrs_len + - tcp_eff_mss(ts); +ci_inline void ci_tcp_tx_pkt_set_end(ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) +{ + uint8_t* end = + (uint8_t*) oo_tx_l3_hdr(pkt) + ts->outgoing_hdrs_len + tcp_eff_mss(ts); ci_assert_nflags(pkt->flags, CI_PKT_FLAG_INDIRECT); oo_offbuf_set_end(&(pkt->buf), end); } @@ -4493,11 +4496,12 @@ ci_inline void ci_tcp_tx_pkt_set_end(ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) { * immediately after converting a packet to zc (or creating a new packet); * doing it again later may change where the zc_header appears to be located * and corrupt the packet. */ -ci_inline void ci_tcp_tx_pkt_set_zc_header_pos(ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt) { - char* end = CI_PTR_ALIGN_FWD((char*)oo_tx_l3_hdr(pkt) + - sizeof(ci_tcp_hdr) + CI_TCP_MAX_OPTS_LEN, - CI_PKT_ZC_PAYLOAD_ALIGN); +ci_inline void ci_tcp_tx_pkt_set_zc_header_pos( + ci_tcp_state* ts, ci_ip_pkt_fmt* pkt) +{ + char* end = CI_PTR_ALIGN_FWD( + (char*) oo_tx_l3_hdr(pkt) + sizeof(ci_tcp_hdr) + CI_TCP_MAX_OPTS_LEN, + CI_PKT_ZC_PAYLOAD_ALIGN); ci_assert_flags(pkt->flags, CI_PKT_FLAG_INDIRECT); oo_offbuf_set_end(&(pkt->buf), end); pkt->buf.end = CI_MAX(pkt->buf.off, pkt->buf.end); @@ -4505,38 +4509,36 @@ ci_inline void ci_tcp_tx_pkt_set_zc_header_pos(ci_tcp_state* ts, ci_inline ci_uint32 ci_tcp_listenq_max(ci_netif* ni) -{ return NI_OPTS(ni).tcp_backlog_max; } +{ + return NI_OPTS(ni).tcp_backlog_max; +} -ci_inline unsigned ci_ipx_tcp_checksum(int af, const ci_ipx_hdr_t* ipx, - const ci_tcp_hdr* tcp, void* payload) +ci_inline unsigned ci_ipx_tcp_checksum( + int af, const ci_ipx_hdr_t* ipx, const ci_tcp_hdr* tcp, void* payload) { #if CI_CFG_IPV6 - if( af == AF_INET6 ) - { + if( af == AF_INET6 ) { return ci_ip6_tcp_checksum(&ipx->ip6, tcp, payload); - } - else + } else #endif { return ci_tcp_checksum(&ipx->ip4, tcp, payload); } } -ci_inline unsigned ci_ipx_udp_checksum(int af, const ci_ipx_hdr_t* ipx, - const ci_udp_hdr* udp, void* payload) +ci_inline unsigned ci_ipx_udp_checksum( + int af, const ci_ipx_hdr_t* ipx, const ci_udp_hdr* udp, void* payload) { - ci_iovec iov = {.iov_base = payload}; + ci_iovec iov = { .iov_base = payload }; #if CI_CFG_IPV6 - if( af == AF_INET6 ) - { + if( af == AF_INET6 ) { iov.iov_len = CI_BSWAP_BE16(ipx->ip6.payload_len) - sizeof(ci_udp_hdr); return ci_ip6_udp_checksum(&ipx->ip6, udp, &iov, 1); - } - else + } else #endif { iov.iov_len = CI_BSWAP_BE16(ipx->ip4.ip_tot_len_be16) - - CI_IP4_IHL(&ipx->ip4) - sizeof(ci_udp_hdr); + CI_IP4_IHL(&ipx->ip4) - sizeof(ci_udp_hdr); return ci_udp_checksum(&ipx->ip4, udp, &iov, 1); } } @@ -4549,7 +4551,7 @@ ci_inline int ci_sock_trylock(ci_netif* ni, citp_waitable* w) { ci_uint32 l = w->lock.wl_val; return ! (l & OO_WAITABLE_LK_LOCKED) && - ci_cas32u_succeed(&w->lock.wl_val, l, l | OO_WAITABLE_LK_LOCKED); + ci_cas32u_succeed(&w->lock.wl_val, l, l | OO_WAITABLE_LK_LOCKED); } /* Always returns 0 (success) at userland. Returns -ERESTARTSYS if @@ -4557,11 +4559,11 @@ ci_inline int ci_sock_trylock(ci_netif* ni, citp_waitable* w) * possibly EINTR?). Return value *must* be checked when invoked in * kernel, else risk of proceeding without the lock held. */ -ci_inline int ci_sock_lock(ci_netif*, citp_waitable*) - OO_MUST_CHECK_RET_IN_KERNEL; +ci_inline int ci_sock_lock( + ci_netif*, citp_waitable*) OO_MUST_CHECK_RET_IN_KERNEL; ci_inline int ci_sock_lock(ci_netif* ni, citp_waitable* w) { - if(CI_LIKELY( ci_cas32u_succeed(&w->lock.wl_val, 0, OO_WAITABLE_LK_LOCKED) )) + if( CI_LIKELY(ci_cas32u_succeed(&w->lock.wl_val, 0, OO_WAITABLE_LK_LOCKED)) ) return 0; #ifdef __KERNEL__ return ci_sock_lock_slow(ni, w); @@ -4576,11 +4578,11 @@ ci_inline int ci_sock_lock(ci_netif* ni, citp_waitable* w) ci_inline void ci_sock_unlock(ci_netif* ni, citp_waitable* w) { - if(CI_UNLIKELY( ci_cas32u_fail(&w->lock.wl_val, OO_WAITABLE_LK_LOCKED, 0) )) + if( CI_UNLIKELY(ci_cas32u_fail(&w->lock.wl_val, OO_WAITABLE_LK_LOCKED, 0)) ) ci_sock_unlock_slow(ni, w); } -ci_inline int ci_sock_is_locked(ci_netif* ni, citp_waitable* w) +ci_inline int ci_sock_is_locked(ci_netif* ni, citp_waitable* w) { return w->lock.wl_val & OO_WAITABLE_LK_LOCKED; } @@ -4591,45 +4593,43 @@ ci_inline int ci_sock_is_locked(ci_netif* ni, citp_waitable* w) *********************************************************************/ /* Use this if you don't own the [get] lock. */ -#define ci_tcp_acceptq_n(tls) \ - ((tls)->acceptq_n_in - (tls)->acceptq_n_out) +#define ci_tcp_acceptq_n(tls) ((tls)->acceptq_n_in - (tls)->acceptq_n_out) /* Use this if you do own the [get] lock. */ -#define ci_tcp_acceptq_not_empty(tls) \ +#define ci_tcp_acceptq_not_empty(tls) \ (((tls)->acceptq_put >= 0) | OO_SP_NOT_NULL((tls)->acceptq_get)) -ci_inline void ci_tcp_acceptq_put(ci_netif* ni, - ci_tcp_socket_listen* tls, - citp_waitable* w) { +ci_inline void ci_tcp_acceptq_put( + ci_netif* ni, ci_tcp_socket_listen* tls, citp_waitable* w) +{ ci_assert(OO_SP_IS_NULL(w->wt_next)); ci_assert(ci_netif_is_locked(ni)); do w->wt_next = OO_SP_FROM_INT(ni, tls->acceptq_put); - while( ci_cas32_fail(&tls->acceptq_put, - OO_SP_TO_INT(w->wt_next), W_ID(w)) ); + while( ci_cas32_fail(&tls->acceptq_put, OO_SP_TO_INT(w->wt_next), W_ID(w)) ); ++tls->acceptq_n_in; } -ci_inline void ci_tcp_acceptq_put_back_tail(ci_netif* ni, - ci_tcp_socket_listen* tls, - citp_waitable* w) { +ci_inline void ci_tcp_acceptq_put_back_tail( + ci_netif* ni, ci_tcp_socket_listen* tls, citp_waitable* w) +{ ci_assert(OO_SP_IS_NULL(w->wt_next)); ci_assert(ci_sock_is_locked(ni, &tls->s.b)); ci_assert(w->sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ); do w->wt_next = OO_SP_FROM_INT(ni, tls->acceptq_put); - while( ci_cas32_fail(&tls->acceptq_put, - OO_SP_TO_INT(w->wt_next), W_ID(w)) ); + while( ci_cas32_fail(&tls->acceptq_put, OO_SP_TO_INT(w->wt_next), W_ID(w)) ); --tls->acceptq_n_out; } /* Should not be called directly, use ci_tcp_acceptq_get() and * ci_tcp_acceptq_peek(). */ -ci_inline void ci_tcp_acceptq_get_swizzle(ci_netif* ni, - ci_tcp_socket_listen* tls) { +ci_inline void ci_tcp_acceptq_get_swizzle( + ci_netif* ni, ci_tcp_socket_listen* tls) +{ ci_int32 from; oo_sp from_sp; ci_tcp_state* ts; @@ -4651,13 +4651,15 @@ ci_inline void ci_tcp_acceptq_get_swizzle(ci_netif* ni, /* Only call this if ci_tcp_acceptq_not_empty() is true. */ -ci_inline citp_waitable* ci_tcp_acceptq_get(ci_netif* ni, - ci_tcp_socket_listen* tls) { +ci_inline citp_waitable* ci_tcp_acceptq_get( + ci_netif* ni, ci_tcp_socket_listen* tls) +{ citp_waitable* w; ci_assert(ci_sock_is_locked(ni, &tls->s.b) || (tls->s.b.sb_aflags & CI_SB_AFLAG_ORPHAN)); ++tls->acceptq_n_out; - if( OO_SP_IS_NULL(tls->acceptq_get) ) ci_tcp_acceptq_get_swizzle(ni, tls); + if( OO_SP_IS_NULL(tls->acceptq_get) ) + ci_tcp_acceptq_get_swizzle(ni, tls); ci_assert(OO_SP_NOT_NULL(tls->acceptq_get)); w = SP_TO_WAITABLE(ni, tls->acceptq_get); tls->acceptq_get = w->wt_next; @@ -4668,10 +4670,12 @@ ci_inline citp_waitable* ci_tcp_acceptq_get(ci_netif* ni, #ifndef __ci_driver__ /* Only call this if ci_tcp_acceptq_not_empty() is true. */ -ci_inline ci_tcp_state* ci_tcp_acceptq_peek(ci_netif* ni, - ci_tcp_socket_listen* tls) { +ci_inline ci_tcp_state* ci_tcp_acceptq_peek( + ci_netif* ni, ci_tcp_socket_listen* tls) +{ ci_assert(ci_sock_is_locked(ni, &tls->s.b)); - if( OO_SP_IS_NULL(tls->acceptq_get) ) ci_tcp_acceptq_get_swizzle(ni, tls); + if( OO_SP_IS_NULL(tls->acceptq_get) ) + ci_tcp_acceptq_get_swizzle(ni, tls); ci_assert(OO_SP_NOT_NULL(tls->acceptq_get)); return SP_TO_TCP(ni, tls->acceptq_get); } @@ -4679,8 +4683,9 @@ ci_inline ci_tcp_state* ci_tcp_acceptq_peek(ci_netif* ni, /* Must hold the sock lock. */ -ci_inline void ci_tcp_acceptq_put_back(ci_netif* ni, ci_tcp_socket_listen* tls, - citp_waitable* w) { +ci_inline void ci_tcp_acceptq_put_back( + ci_netif* ni, ci_tcp_socket_listen* tls, citp_waitable* w) +{ ci_assert(ci_sock_is_locked(ni, &tls->s.b)); ci_assert(w->sb_aflags & CI_SB_AFLAG_TCP_IN_ACCEPTQ); --tls->acceptq_n_out; @@ -4695,19 +4700,23 @@ ci_inline void ci_tcp_acceptq_put_back(ci_netif* ni, ci_tcp_socket_listen* tls, static inline const char* ci_tcp_aux_type2str(int type) { - switch(type) { - case CI_TCP_AUX_TYPE_SYNRECV: return "syn-recv state"; - case CI_TCP_AUX_TYPE_BUCKET: return "syn-recv bucket"; - case CI_TCP_AUX_TYPE_EPOLL: return "epoll3 state"; - default: return "unknown"; + switch( type ) { + case CI_TCP_AUX_TYPE_SYNRECV: + return "syn-recv state"; + case CI_TCP_AUX_TYPE_BUCKET: + return "syn-recv bucket"; + case CI_TCP_AUX_TYPE_EPOLL: + return "epoll3 state"; + default: + return "unknown"; } } /* Does exactly what it says on the tin! */ ci_inline ci_ni_aux_mem* ci_ni_aux_p2aux(ci_netif* ni, oo_p p) { - ci_assert( OO_P_NOT_NULL(p) ); - return (void*)CI_NETIF_PTR(ni, p); + ci_assert(OO_P_NOT_NULL(p)); + return (void*) CI_NETIF_PTR(ni, p); } ci_inline ci_tcp_state_synrecv* ci_ni_aux_p2synrecv(ci_netif* ni, oo_p oop) { @@ -4734,10 +4743,9 @@ ci_inline ci_pmtu_state_t* ci_ni_aux_p2pmtus(ci_netif* ni, oo_p oop) return &aux->u.pmtus; } -ci_inline citp_waitable* -ci_ni_aux2container_w(ci_ni_aux_mem* aux) +ci_inline citp_waitable* ci_ni_aux2container_w(ci_ni_aux_mem* aux) { - return (void *)((ci_uintptr_t)aux &~ (CI_CFG_EP_BUF_SIZE - 1)); + return (void*) ((ci_uintptr_t) aux & ~(CI_CFG_EP_BUF_SIZE - 1)); } ci_inline oo_p ci_ni_aux2p(ci_netif* ni, ci_ni_aux_mem* aux) @@ -4745,42 +4753,45 @@ ci_inline oo_p ci_ni_aux2p(ci_netif* ni, ci_ni_aux_mem* aux) CI_BUILD_ASSERT(CI_IS_POW2(CI_CFG_EP_BUF_SIZE)); citp_waitable* w = ci_ni_aux2container_w(aux); oo_p sp = oo_sockp_to_statep(ni, W_SP(w)); - OO_P_ADD(sp, (ci_uintptr_t)aux & (CI_CFG_EP_BUF_SIZE - 1)); + OO_P_ADD(sp, (ci_uintptr_t) aux & (CI_CFG_EP_BUF_SIZE - 1)); return sp; } -ci_inline struct oo_p_dllink_state -ci_ni_aux2link(ci_netif* ni, ci_ni_aux_mem* aux) +ci_inline struct oo_p_dllink_state ci_ni_aux2link( + ci_netif* ni, ci_ni_aux_mem* aux) { return oo_p_dllink_statep(ni, ci_ni_aux2p(ni, aux)); } ci_inline void ci_ni_aux_free(ci_netif* ni, ci_ni_aux_mem* aux) { - ci_assert( ci_netif_is_locked(ni) ); + ci_assert(ci_netif_is_locked(ni)); ni->state->n_aux_bufs[aux->type]--; oo_p_dllink_add(ni, oo_p_dllink_ptr(ni, &ni->state->free_aux_mem), - ci_ni_aux2link(ni, aux)); + ci_ni_aux2link(ni, aux)); ni->state->n_free_aux_bufs++; } -ci_inline void ci_tcp_synrecv_free(ci_netif* ni, ci_tcp_state_synrecv* tsr) { +ci_inline void ci_tcp_synrecv_free(ci_netif* ni, ci_tcp_state_synrecv* tsr) +{ ci_ni_aux_free(ni, CI_CONTAINER(ci_ni_aux_mem, u.synrecv, tsr)); } -ci_inline void ci_sb_epoll_free(ci_netif* ni, ci_sb_epoll_state* epoll) { +ci_inline void ci_sb_epoll_free(ci_netif* ni, ci_sb_epoll_state* epoll) +{ ci_ni_aux_free(ni, CI_CONTAINER(ci_ni_aux_mem, u.epoll, epoll)); } -ci_inline void ci_pmtu_state_free(ci_netif* ni, ci_pmtu_state_t* pmtus) { +ci_inline void ci_pmtu_state_free(ci_netif* ni, ci_pmtu_state_t* pmtus) +{ ci_ni_aux_free(ni, CI_CONTAINER(ci_ni_aux_mem, u.pmtus, pmtus)); } extern void ci_ni_aux_more_bufs(ci_netif* ni); -ci_inline int/*bool*/ ci_ni_aux_can_alloc(ci_netif* ni, int type) +ci_inline int /*bool*/ ci_ni_aux_can_alloc(ci_netif* ni, int type) { struct oo_p_dllink_state free_aux_mem = - oo_p_dllink_ptr(ni, &ni->state->free_aux_mem); + oo_p_dllink_ptr(ni, &ni->state->free_aux_mem); if( ni->state->n_aux_bufs[type] >= ni->state->max_aux_bufs[type] ) return CI_FALSE; - if( ! oo_p_dllink_is_empty(ni, free_aux_mem) ) + if( ! oo_p_dllink_is_empty(ni, free_aux_mem) ) return CI_TRUE; ci_ni_aux_more_bufs(ni); return ! oo_p_dllink_is_empty(ni, free_aux_mem); @@ -4788,12 +4799,12 @@ ci_inline int/*bool*/ ci_ni_aux_can_alloc(ci_netif* ni, int type) ci_inline oo_p ci_ni_aux_alloc(ci_netif* ni, int type) { struct oo_p_dllink_state free_aux_mem = - oo_p_dllink_ptr(ni, &ni->state->free_aux_mem); + oo_p_dllink_ptr(ni, &ni->state->free_aux_mem); struct oo_p_dllink_state link; ci_ni_aux_mem* aux; - ci_assert( ci_netif_is_locked(ni) ); - if( !ci_ni_aux_can_alloc(ni, type) ) { + ci_assert(ci_netif_is_locked(ni)); + if( ! ci_ni_aux_can_alloc(ni, type) ) { CITP_STATS_NETIF(++ni->state->stats.aux_alloc_fails); return OO_P_NULL; } @@ -4828,12 +4839,14 @@ ci_inline oo_p ci_tcp_synrecv2p(ci_netif* ni, ci_tcp_state_synrecv* tsr) { return ci_ni_aux2p(ni, CI_CONTAINER(ci_ni_aux_mem, u.synrecv, tsr)); } -ci_inline struct oo_p_dllink_state -ci_tcp_synrecv2link(ci_netif* ni, ci_tcp_state_synrecv* tsr) { - ci_ni_aux_mem* aux = CI_CONTAINER(ci_ni_aux_mem, u.synrecv, tsr); +ci_inline struct oo_p_dllink_state ci_tcp_synrecv2link( + ci_netif* ni, ci_tcp_state_synrecv* tsr) +{ + ci_ni_aux_mem* aux = CI_CONTAINER(ci_ni_aux_mem, u.synrecv, tsr); return oo_p_dllink_sb(ni, ci_ni_aux2container_w(aux), &aux->link); } -ci_inline ci_tcp_state_synrecv* ci_tcp_link2synrecv(struct oo_p_dllink* link) { +ci_inline ci_tcp_state_synrecv* ci_tcp_link2synrecv(struct oo_p_dllink* link) +{ return &CI_CONTAINER(ci_ni_aux_mem, link, link)->u.synrecv; } @@ -4847,14 +4860,15 @@ ci_inline unsigned ci_tcp_get_pmtu(ci_netif* netif, ci_tcp_state* ts) x = ts->s.pkt.mtu; if( OO_PP_NOT_NULL(ts->pmtus) ) { ci_pmtu_state_t* pmtus = ci_ni_aux_p2pmtus(netif, ts->pmtus); - return CI_MIN(x, (unsigned)pmtus->pmtu); + return CI_MIN(x, (unsigned) pmtus->pmtu); } return x; } /* find effective MSS value based on smss, PMTU and MTU and optional user * value */ -ci_inline void ci_tcp_set_eff_mss(ci_netif* netif, ci_tcp_state* ts) { +ci_inline void ci_tcp_set_eff_mss(ci_netif* netif, ci_tcp_state* ts) +{ unsigned x; #if CI_CFG_IPV6 int af = ipcache_af(&ts->s.pkt); @@ -4864,8 +4878,8 @@ ci_inline void ci_tcp_set_eff_mss(ci_netif* netif, ci_tcp_state* ts) { x = ci_tcp_get_pmtu(netif, ts) - sizeof(ci_tcp_hdr) - CI_IPX_HDR_SIZE(af); - x = CI_MIN(x, (unsigned)ts->smss); - ts->eff_mss = CI_MAX(x, (unsigned)CI_CFG_TCP_MINIMUM_MSS) - + x = CI_MIN(x, (unsigned) ts->smss); + ts->eff_mss = CI_MAX(x, (unsigned) CI_CFG_TCP_MINIMUM_MSS) - tcp_ipx_outgoing_opts_len(af, ts); /* Increase ssthresh & cwndif eff_mss has increased */ @@ -4877,37 +4891,35 @@ ci_inline void ci_tcp_set_eff_mss(ci_netif* netif, ci_tcp_state* ts) { } -ci_inline struct oo_p_dllink_state -ci_sb_epoll_ready_link(ci_netif* ni, ci_sb_epoll_state* epoll, int i) +ci_inline struct oo_p_dllink_state ci_sb_epoll_ready_link( + ci_netif* ni, ci_sb_epoll_state* epoll, int i) { return oo_p_dllink_sb(ni, - ci_ni_aux2container_w(CI_CONTAINER(ci_ni_aux_mem, - u.epoll, epoll)), - &epoll->e[i].ready_link); + ci_ni_aux2container_w(CI_CONTAINER(ci_ni_aux_mem, u.epoll, epoll)), + &epoll->e[i].ready_link); } #define CI_READY_LIST_EACH(bitmask, tmp, i) \ ci_assert_lt((bitmask), 1u << CI_CFG_N_READY_LISTS); \ OO_FOR_EACH_BIT(bitmask, tmp, i) -ci_inline void -ci_netif_put_on_post_poll_epoll(ci_netif* ni, citp_waitable* sb) +ci_inline void ci_netif_put_on_post_poll_epoll(ci_netif* ni, citp_waitable* sb) { #if CI_CFG_EPOLL3 ci_sb_epoll_state* epoll = ci_ni_aux_p2epoll(ni, sb->epoll); ci_uint32 tmp, i; - CI_READY_LIST_EACH(sb->ready_lists_in_use, tmp, i) { + CI_READY_LIST_EACH(sb->ready_lists_in_use, tmp, i) + { struct oo_p_dllink_state link = ci_sb_epoll_ready_link(ni, epoll, i); oo_p_dllink_del(ni, link); - oo_p_dllink_add_tail(ni, - oo_p_dllink_ptr(ni, &ni->state->ready_lists[i]), - link); + oo_p_dllink_add_tail( + ni, oo_p_dllink_ptr(ni, &ni->state->ready_lists[i]), link); } #endif } -ci_inline void -citp_waitable_remove_from_epoll(ci_netif* ni, citp_waitable* w, int do_free) +ci_inline void citp_waitable_remove_from_epoll( + ci_netif* ni, citp_waitable* w, int do_free) { ci_sb_epoll_state* epoll; ci_uint32 tmp, i; @@ -4920,7 +4932,8 @@ citp_waitable_remove_from_epoll(ci_netif* ni, citp_waitable* w, int do_free) epoll = ci_ni_aux_p2epoll(ni, w->epoll); ci_assert_equal(epoll->sock_id, w->bufid); - CI_READY_LIST_EACH(w->ready_lists_in_use, tmp, i) { + CI_READY_LIST_EACH(w->ready_lists_in_use, tmp, i) + { struct oo_p_dllink_state link = ci_sb_epoll_ready_link(ni, epoll, i); oo_p_dllink_del(ni, link); oo_p_dllink_init(ni, link); @@ -4937,8 +4950,8 @@ ci_inline void ci_netif_put_on_post_poll(ci_netif* ni, citp_waitable* sb) struct oo_p_dllink_state link = oo_p_dllink_sb(ni, sb, &sb->post_poll_link); oo_p_dllink_del(ni, link); - oo_p_dllink_add_tail(ni, oo_p_dllink_ptr(ni, &ni->state->post_poll_list), - link); + oo_p_dllink_add_tail( + ni, oo_p_dllink_ptr(ni, &ni->state->post_poll_list), link); #if CI_CFG_EPOLL3 if( sb->ready_lists_in_use != 0 ) @@ -4947,11 +4960,11 @@ ci_inline void ci_netif_put_on_post_poll(ci_netif* ni, citp_waitable* sb) } -ci_inline void ci_netif_poll_free_pkts(ci_netif* ni, - struct ci_netif_poll_state* ps) +ci_inline void ci_netif_poll_free_pkts( + ci_netif* ni, struct ci_netif_poll_state* ps) { - ci_ip_pkt_fmt* tail = CI_CONTAINER(ci_ip_pkt_fmt, next, - ps->tx_pkt_free_list_insert); + ci_ip_pkt_fmt* tail = + CI_CONTAINER(ci_ip_pkt_fmt, next, ps->tx_pkt_free_list_insert); ci_netif_pkt_free_nonb_list(ni, ps->tx_pkt_free_list, tail); ni->state->n_async_pkts += ps->tx_pkt_free_list_n; CITP_STATS_NETIF_ADD(ni, pkt_nonb, ps->tx_pkt_free_list_n); @@ -4974,18 +4987,18 @@ ci_inline int citp_shutdown_how_is_valid(int how) ********************************* PMTU ******************************** **********************************************************************/ -/*! Manage the discovery timer. If the time is CI_PMTU_STOP_TIMER then +/*! Manage the discovery timer. If the time is CI_PMTU_STOP_TIMER then * the timer will be killed. If the timer is pending it will be modified * otherwise it will be set */ -ci_inline void ci_pmtu_discover_timer(ci_netif* ni, ci_pmtu_state_t* pmtus, - ci_iptime_t timeout) { - ci_ip_timer_clear(ni, &pmtus->tid ); +ci_inline void ci_pmtu_discover_timer( + ci_netif* ni, ci_pmtu_state_t* pmtus, ci_iptime_t timeout) +{ + ci_ip_timer_clear(ni, &pmtus->tid); if( timeout != CI_PMTU_STOP_TIMER ) ci_ip_timer_set(ni, &pmtus->tid, ci_tcp_time_now(ni) + timeout); } - /********************************************************************* ************************* IPv4/IPv6 address helpers ****************** *********************************************************************/ @@ -5006,8 +5019,8 @@ union ci_sockaddr_u { */ ci_inline int ci_tcp_ipv6_is_ipv4(const struct sockaddr* sa) { - if (CI_IP6_IS_V4MAPPED(&CI_SIN6(sa)->sin6_addr) || - CI_IP6_IS_ADDR_ANY(&CI_SIN6(sa)->sin6_addr)) { + if( CI_IP6_IS_V4MAPPED(&CI_SIN6(sa)->sin6_addr) || + CI_IP6_IS_ADDR_ANY(&CI_SIN6(sa)->sin6_addr) ) { return 1; } return 0; @@ -5025,11 +5038,11 @@ ci_inline ci_uint32 ci_get_ip4_addr(int family, const struct sockaddr* sa) #endif #if CI_CFG_FAKE_IPV6 - if (family == AF_INET) + if( family == AF_INET ) return CI_SIN(sa)->sin_addr.s_addr; else { /* IPv6 */ ci_assert(ci_tcp_ipv6_is_ipv4(sa)); - return ((ci_uint32 *)(&CI_SIN6(sa)->sin6_addr))[3]; + return ((ci_uint32*) (&CI_SIN6(sa)->sin6_addr))[3]; } #else return CI_SIN(sa)->sin_addr.s_addr; @@ -5044,8 +5057,8 @@ ci_inline int ci_tcp_ipv6_is_addr_any(const struct sockaddr* sa) ci_inline int ci_sock_maybe_ipv6(ci_sock_cmn* s, const struct sockaddr* addr) { - if(s->domain == PF_INET6 && (!ci_tcp_ipv6_is_ipv4(addr) || - ci_tcp_ipv6_is_addr_any(addr))) + if( s->domain == PF_INET6 && + (! ci_tcp_ipv6_is_ipv4(addr) || ci_tcp_ipv6_is_addr_any(addr)) ) return 1; return 0; } @@ -5062,10 +5075,9 @@ ci_inline ci_addr_t ci_get_addr(const struct sockaddr* sa) memcpy(addr.ip6, &CI_SIN6(sa)->sin6_addr, sizeof(addr.ip6)); #else ci_assert(ci_tcp_ipv6_is_ipv4(sa)); - addr.ip4 = ((unsigned*)(&CI_SIN6(sa)->sin6_addr))[3]; + addr.ip4 = ((unsigned*) (&CI_SIN6(sa)->sin6_addr))[3]; #endif - } - else { + } else { addr = CI_ADDR_FROM_IP4(CI_SIN(sa)->sin_addr.s_addr); } return addr; @@ -5081,9 +5093,8 @@ ci_inline ci_uint16 ci_get_port(const struct sockaddr* sa) /* Functions to make a sockaddr structure from a given port/ip: */ /* Get an IPv4 address addr_be32 and fill it into sockaddr_in. */ -ci_inline void -ci_make_sockaddr_from_ip4(struct sockaddr_in *sin, - ci_uint16 port_be16, ci_uint32 addr_be32) +ci_inline void ci_make_sockaddr_from_ip4( + struct sockaddr_in* sin, ci_uint16 port_be16, ci_uint32 addr_be32) { sin->sin_family = AF_INET; sin->sin_port = port_be16; @@ -5093,9 +5104,8 @@ ci_make_sockaddr_from_ip4(struct sockaddr_in *sin, #if CI_CFG_FAKE_IPV6 /* Get an IPv4 address addr_be32 and fill an mapped address * into sockaddr_in6. */ -ci_inline void -ci_make_sockaddr_in6_from_ip4(struct sockaddr_in6 *sin, - ci_uint16 port_be16, ci_uint32 addr_be32) +ci_inline void ci_make_sockaddr_in6_from_ip4( + struct sockaddr_in6* sin, ci_uint16 port_be16, ci_uint32 addr_be32) { sin->sin6_family = AF_INET6; sin->sin6_port = port_be16; @@ -5103,9 +5113,8 @@ ci_make_sockaddr_in6_from_ip4(struct sockaddr_in6 *sin, } /* Get an IPv6 address pointed by addr_be32_p and fill it * into sockaddr_in6. */ -ci_inline void -ci_make_sockaddr_in6_from_ip6(struct sockaddr_in6 *sin, ci_uint16 port_be16, - const ci_uint32* addr_be32_p) +ci_inline void ci_make_sockaddr_in6_from_ip6(struct sockaddr_in6* sin, + ci_uint16 port_be16, const ci_uint32* addr_be32_p) { sin->sin6_family = AF_INET6; sin->sin6_port = port_be16; @@ -5113,8 +5122,8 @@ ci_make_sockaddr_in6_from_ip6(struct sockaddr_in6 *sin, ci_uint16 port_be16, } #endif -ci_inline struct sockaddr_storage -ci_make_sockaddr_storage_from_addr(ci_uint16 port_be16, ci_addr_t addr) +ci_inline struct sockaddr_storage ci_make_sockaddr_storage_from_addr( + ci_uint16 port_be16, ci_addr_t addr) { union { struct sockaddr_in in; @@ -5130,8 +5139,7 @@ ci_make_sockaddr_storage_from_addr(ci_uint16 port_be16, ci_addr_t addr) u.in6.sin6_family = AF_INET6; u.in6.sin6_port = port_be16; memcpy(&u.in6.sin6_addr.s6_addr, addr.ip6, sizeof(addr.ip6)); - } - else + } else #endif { u.in.sin_family = AF_INET; @@ -5151,11 +5159,9 @@ ci_make_sockaddr_storage_from_addr(ci_uint16 port_be16, ci_addr_t addr) * - addr_be32_p is the pointer to IPv4 or IPv6 address, depending on * domain_in parameter; * - scope_id defines sin6_scope_id value for IPv6 link-local addresses. */ -ci_inline void -ci_addr_to_user(struct sockaddr *sa, socklen_t *sa_len, - sa_family_t domain_in, sa_family_t domain_out, - ci_uint16 port_be16, const ci_uint32* addr_be32_p, - ci_ifid_t scope_id) +ci_inline void ci_addr_to_user(struct sockaddr* sa, socklen_t* sa_len, + sa_family_t domain_in, sa_family_t domain_out, ci_uint16 port_be16, + const ci_uint32* addr_be32_p, ci_ifid_t scope_id) { socklen_t len = sizeof(struct sockaddr_in); @@ -5163,28 +5169,26 @@ ci_addr_to_user(struct sockaddr *sa, socklen_t *sa_len, ci_assert(domain_in == AF_INET || domain_in == AF_INET6); ci_assert(domain_out == AF_INET || domain_out == AF_INET6); - if (domain_out == AF_INET6) + if( domain_out == AF_INET6 ) /* One might expect to see SIN6_LEN_RFC2133 here, but Linux uses * sizeof() instead. */ len = sizeof(struct sockaddr_in6); else ci_assert_equal(domain_in, AF_INET); -#else +#else ci_assert_equal(domain_in, AF_INET); ci_assert_equal(domain_out, AF_INET); #endif - if (CI_LIKELY(*sa_len >= len)) { + if( CI_LIKELY(*sa_len >= len) ) { *sa_len = CI_MIN(*sa_len, len); memset(sa, 0, *sa_len); #if CI_CFG_FAKE_IPV6 - if (domain_out == AF_INET) { + if( domain_out == AF_INET ) { ci_make_sockaddr_from_ip4(CI_SIN(sa), port_be16, *addr_be32_p); - } - else if( domain_in == AF_INET ) { + } else if( domain_in == AF_INET ) { ci_make_sockaddr_in6_from_ip4(CI_SIN6(sa), port_be16, *addr_be32_p); - } - else { + } else { ci_make_sockaddr_in6_from_ip6(CI_SIN6(sa), port_be16, addr_be32_p); if( CI_IP6_IS_LINKLOCAL(&CI_SIN6(sa)->sin6_addr) ) CI_SIN6(sa)->sin6_scope_id = scope_id; @@ -5192,18 +5196,17 @@ ci_addr_to_user(struct sockaddr *sa, socklen_t *sa_len, #else ci_make_sockaddr_from_ip4(CI_SIN(sa), port_be16, *addr_be32_p); #endif - } - else { + } else { union ci_sockaddr_u ss_u; - if (*sa_len == 0) { + if( *sa_len == 0 ) { *sa_len = len; return; } memset(&ss_u, 0, len); #if CI_CFG_FAKE_IPV6 - if (domain_out == AF_INET) + if( domain_out == AF_INET ) ci_make_sockaddr_from_ip4(&ss_u.sin, port_be16, *addr_be32_p); else if( domain_in == AF_INET ) ci_make_sockaddr_in6_from_ip4(&ss_u.sin6, port_be16, *addr_be32_p); @@ -5226,12 +5229,10 @@ ci_addr_to_user(struct sockaddr *sa, socklen_t *sa_len, * - at_connect [in] set to 1 means function call on connect(), * 0 means - on bind(). * Returns 0 on success or -1 on failure. */ -ci_inline int -ci_sock_set_ip6_scope_id(ci_netif* ni, ci_sock_cmn* s, - const struct sockaddr* addr, socklen_t addrlen, - int/*bool*/ at_connect) +ci_inline int ci_sock_set_ip6_scope_id(ci_netif* ni, ci_sock_cmn* s, + const struct sockaddr* addr, socklen_t addrlen, int /*bool*/ at_connect) { - const struct sockaddr_in6* sin6 = (const struct sockaddr_in6*)addr; + const struct sockaddr_in6* sin6 = (const struct sockaddr_in6*) addr; if( addrlen >= sizeof(struct sockaddr_in6) && sin6->sin6_scope_id ) { ci_ifid_t ifindex = sin6->sin6_scope_id; cicp_hwport_mask_t hwports = 0; @@ -5240,7 +5241,8 @@ ci_sock_set_ip6_scope_id(ci_netif* ni, ci_sock_cmn* s, if( at_connect && s->cp.so_bindtodevice && s->cp.so_bindtodevice != ifindex ) return -1; - rc = oo_cp_find_llap(ni->cplane, ifindex, NULL, NULL, &hwports, NULL, NULL); + rc = + oo_cp_find_llap(ni->cplane, ifindex, NULL, NULL, &hwports, NULL, NULL); if( rc != 0 || hwports == 0 ) return -1; s->cp.so_bindtodevice = ifindex; @@ -5259,9 +5261,9 @@ extern ci_ifid_t ci_rx_pkt_ifindex(ci_netif* ni, const ci_ip_pkt_fmt* pkt); * ci_tcp_recvmsg() */ -ci_inline void ci_tcp_recvmsg_args_init(ci_tcp_recvmsg_args* a, - ci_netif* ni, ci_tcp_state* ts, - ci_msghdr* msg, int flags) { +ci_inline void ci_tcp_recvmsg_args_init(ci_tcp_recvmsg_args* a, ci_netif* ni, + ci_tcp_state* ts, ci_msghdr* msg, int flags) +{ a->ni = ni; a->ts = ts; a->msg = msg; @@ -5269,8 +5271,6 @@ ci_inline void ci_tcp_recvmsg_args_init(ci_tcp_recvmsg_args* a, } - - /********************************************************************* ***************************** Tcpdump support ************************ *********************************************************************/ @@ -5282,7 +5282,7 @@ ci_inline ci_uint16 oo_tcpdump_queue_len(ci_netif* ni) } /* Should we dump this packet? */ -ci_inline int oo_tcpdump_check(ci_netif *ni, ci_ip_pkt_fmt *pkt, int intf_i) +ci_inline int oo_tcpdump_check(ci_netif* ni, ci_ip_pkt_fmt* pkt, int intf_i) { if( ni->state->dump_intf[intf_i] == OO_INTF_I_DUMP_ALL ) { if( oo_tcpdump_queue_len(ni) < CI_CFG_DUMPQUEUE_LEN - 1 ) @@ -5294,8 +5294,8 @@ ci_inline int oo_tcpdump_check(ci_netif *ni, ci_ip_pkt_fmt *pkt, int intf_i) } /* Should we dump this no_match */ -ci_inline int oo_tcpdump_check_no_match(ci_netif *ni, ci_ip_pkt_fmt *pkt, - int intf_i) +ci_inline int oo_tcpdump_check_no_match( + ci_netif* ni, ci_ip_pkt_fmt* pkt, int intf_i) { if( ni->state->dump_intf[intf_i] == OO_INTF_I_DUMP_NO_MATCH ) { if( oo_tcpdump_queue_len(ni) < CI_CFG_DUMPQUEUE_LEN - 1 ) @@ -5310,12 +5310,12 @@ ci_inline int oo_tcpdump_check_no_match(ci_netif *ni, ci_ip_pkt_fmt *pkt, extern void oo_tcpdump_free_pkts(ci_netif* ni, ci_uint16 i); /* Dump this packet */ -ci_inline void oo_tcpdump_dump_pkt(ci_netif *ni, ci_ip_pkt_fmt *pkt) +ci_inline void oo_tcpdump_dump_pkt(ci_netif* ni, ci_ip_pkt_fmt* pkt) { ci_uint16 write_i = ni->state->dump_write_i; oo_pkt_p* dq = ni->state->dump_queue; - if(CI_UNLIKELY( pkt->flags & CI_PKT_FLAG_MSG_WARM )) + if( CI_UNLIKELY(pkt->flags & CI_PKT_FLAG_MSG_WARM) ) return; if( dq[write_i % CI_CFG_DUMPQUEUE_LEN] != OO_PP_NULL ) @@ -5339,14 +5339,13 @@ ci_inline void oo_tcpdump_dump_pkt(ci_netif *ni, ci_ip_pkt_fmt *pkt) *********************************************************************/ /* _bit_set() always increment seqno, even if the bit is already set */ -ci_inline void -oo_os_sock_status_bit_set(ci_sock_cmn *s, ci_int32 bits) +ci_inline void oo_os_sock_status_bit_set(ci_sock_cmn* s, ci_int32 bits) { ci_uint32 tmp; do { tmp = s->os_sock_status; - } while( ci_cas32u_fail(&s->os_sock_status, tmp, - (tmp + (1 << OO_OS_STATUS_SEQ_SHIFT)) | bits) ); + } while( ci_cas32u_fail( + &s->os_sock_status, tmp, (tmp + (1 << OO_OS_STATUS_SEQ_SHIFT)) | bits) ); } ci_inline ci_uint32 oo_os_sock_status_from_mask(int mask) @@ -5372,7 +5371,7 @@ ci_inline ci_uint32 oo_os_sock_status_from_mask(int mask) */ #ifdef __KERNEL__ -#define KERNEL_CAST_TO_UNSIGNED_LONG(v) ((unsigned long)(v)) +#define KERNEL_CAST_TO_UNSIGNED_LONG(v) ((unsigned long) (v)) #else #define KERNEL_CAST_TO_UNSIGNED_LONG(v) (v) #endif @@ -5389,7 +5388,7 @@ ci_inline unsigned oo_cycles64_to_usec(ci_netif* ni, ci_uint64 cycles) c = cycles * 1000; #ifdef __KERNEL__ /* 32-bit kernel can't divide 64-bit value */ - if( (unsigned long)c != cycles ) + if( (unsigned long) c != cycles ) val = cycles >> IPTIMER_STATE(ni)->ci_ip_time_frc2us; else #endif @@ -5406,11 +5405,11 @@ ci_inline ci_uint64 __oo_usec_to_cycles64(ci_uint32 khz, unsigned usec) return (ci_uint64) -1; if( usec == 0 ) return 0; - val = (ci_uint64)usec * khz; + val = (ci_uint64) usec * khz; #ifdef __KERNEL__ /* 32-bit kernel can't divide 64-bit value */ - if( (ci_uint64)(unsigned long)val != val ) - val = val << 10; + if( (ci_uint64) (unsigned long) val != val ) + val = val << 10; else #endif val = KERNEL_CAST_TO_UNSIGNED_LONG(val) / 1000; @@ -5418,7 +5417,7 @@ ci_inline ci_uint64 __oo_usec_to_cycles64(ci_uint32 khz, unsigned usec) } #undef KERNEL_CAST_TO_UNSIGNED_LONG #define oo_usec_to_cycles64(ni, usec) \ - __oo_usec_to_cycles64(IPTIMER_STATE(ni)->khz, usec) + __oo_usec_to_cycles64(IPTIMER_STATE(ni)->khz, usec) /********************************************************************** @@ -5440,11 +5439,11 @@ typedef struct oo_zc_buf* onload_zc_handle; * they're invalid pointers and users can't avoid calling zc_handle_to_... * in order to read them. If Intel ever do 6-level page tables then this * debugging facility will have to be removed. */ -#define CI_ZC_HANDLE_MAGIC_MASK 0xff00000000000000ull -#define CI_ZC_HANDLE_MAGIC 0xab00000000000000ull +#define CI_ZC_HANDLE_MAGIC_MASK 0xff00000000000000ull +#define CI_ZC_HANDLE_MAGIC 0xab00000000000000ull #else -#define CI_ZC_HANDLE_MAGIC_MASK ((uintptr_t)0) -#define CI_ZC_HANDLE_MAGIC ((uintptr_t)0) +#define CI_ZC_HANDLE_MAGIC_MASK ((uintptr_t) 0) +#define CI_ZC_HANDLE_MAGIC ((uintptr_t) 0) #endif struct ci_zc_usermem { @@ -5459,15 +5458,15 @@ struct ci_zc_usermem { static inline onload_zc_handle zc_pktbuf_to_handle(ci_ip_pkt_fmt* pkt) { - onload_zc_handle h = (onload_zc_handle)pkt; - CI_DEBUG(h = (onload_zc_handle)((uintptr_t)h | CI_ZC_HANDLE_MAGIC)); + onload_zc_handle h = (onload_zc_handle) pkt; + CI_DEBUG(h = (onload_zc_handle) ((uintptr_t) h | CI_ZC_HANDLE_MAGIC)); return h; } static inline onload_zc_handle zc_usermem_to_handle(struct ci_zc_usermem* um) { - onload_zc_handle h = (onload_zc_handle)((uintptr_t)um | 1); - CI_DEBUG(h = (onload_zc_handle)((uintptr_t)h | CI_ZC_HANDLE_MAGIC)); + onload_zc_handle h = (onload_zc_handle) ((uintptr_t) um | 1); + CI_DEBUG(h = (onload_zc_handle) ((uintptr_t) h | CI_ZC_HANDLE_MAGIC)); return h; } @@ -5475,48 +5474,47 @@ static inline void zc_handle_check(onload_zc_handle h) { /* The surprising -2 in the below is because we use the bottom bit to * indicate pktbuf-or-usermem */ - ci_assert_equal((uintptr_t)h & (sizeof(void*) - 2), 0); - ci_assert_equal((uintptr_t)h & CI_ZC_HANDLE_MAGIC_MASK, CI_ZC_HANDLE_MAGIC); + ci_assert_equal((uintptr_t) h & (sizeof(void*) - 2), 0); + ci_assert_equal((uintptr_t) h & CI_ZC_HANDLE_MAGIC_MASK, CI_ZC_HANDLE_MAGIC); } static inline bool zc_is_pktbuf(onload_zc_handle h) { zc_handle_check(h); - return ((uintptr_t)h & 1) == 0; + return ((uintptr_t) h & 1) == 0; } static inline bool zc_is_usermem(onload_zc_handle h) { zc_handle_check(h); - return ((uintptr_t)h & 1) == 1; + return ((uintptr_t) h & 1) == 1; } static inline ci_ip_pkt_fmt* zc_handle_to_pktbuf(onload_zc_handle h) { ci_assert(zc_is_pktbuf(h)); - CI_DEBUG(h = (onload_zc_handle)((uintptr_t)h &~ CI_ZC_HANDLE_MAGIC_MASK)); - return (ci_ip_pkt_fmt*)h; + CI_DEBUG(h = (onload_zc_handle) ((uintptr_t) h & ~CI_ZC_HANDLE_MAGIC_MASK)); + return (ci_ip_pkt_fmt*) h; } static inline struct ci_zc_usermem* zc_handle_to_usermem(onload_zc_handle h) { ci_assert(zc_is_usermem(h)); - CI_DEBUG(h = (onload_zc_handle)((uintptr_t)h &~ CI_ZC_HANDLE_MAGIC_MASK)); + CI_DEBUG(h = (onload_zc_handle) ((uintptr_t) h & ~CI_ZC_HANDLE_MAGIC_MASK)); /* -1 rather than &~1 because it allows better codegen */ - return (struct ci_zc_usermem*)((uintptr_t)h - 1); + return (struct ci_zc_usermem*) ((uintptr_t) h - 1); } -static inline ef_addr zc_usermem_dma_addr(struct ci_zc_usermem* um, - uint64_t user_ptr, int intf_i) +static inline ef_addr zc_usermem_dma_addr( + struct ci_zc_usermem* um, uint64_t user_ptr, int intf_i) { if( um->addr_space == EF_ADDRSPACE_LOCAL ) { uint64_t offset = user_ptr - um->base; - uint64_t* hw_addrs = um->hw_addrs + - ((intf_i * um->size) >> EF_VI_NIC_PAGE_SHIFT); + uint64_t* hw_addrs = + um->hw_addrs + ((intf_i * um->size) >> EF_VI_NIC_PAGE_SHIFT); return hw_addrs[offset >> EF_VI_NIC_PAGE_SHIFT] | (offset & (EF_VI_NIC_PAGE_SIZE - 1)); - } - else { + } else { return user_ptr; } } @@ -5526,5 +5524,5 @@ extern void ci_netif_handle_actions(ci_netif* ni); extern void ci_netif_close_pending(ci_netif* ni); #endif -#endif /* __CI_INTERNAL_IP_H__ */ +#endif /* __CI_INTERNAL_IP_H__ */ /*! \cidoxg_end */ diff --git a/src/include/ci/internal/transport_config_opt.h b/src/include/ci/internal/transport_config_opt.h index 3eee1ef32..1286b6375 100644 --- a/src/include/ci/internal/transport_config_opt.h +++ b/src/include/ci/internal/transport_config_opt.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author stg ** \brief Configuration options for transport lib @@ -23,35 +23,35 @@ ** TODO: Checking against MD5 has of the file would be better. ** See also include/ci/internal/ip.h where we do the same thing. */ -#define CI_CVS_OPT_HDR_VERSION ("$Revision$") +#define CI_CVS_OPT_HDR_VERSION ("$Revision$") /* Maximum number of network interfaces (ports) per stack. */ -#define CI_CFG_MAX_INTERFACES 30 +#define CI_CFG_MAX_INTERFACES 30 /* Maximim number of hwports in the system */ -#define CI_CFG_MAX_HWPORTS 30 +#define CI_CFG_MAX_HWPORTS 30 /* Maximum number of local IP addresses in the system */ -#define CI_CFG_MAX_LOCAL_IPADDRS 256 +#define CI_CFG_MAX_LOCAL_IPADDRS 256 /* Do we need team/bond support? */ -#define CI_CFG_TEAMING 1 +#define CI_CFG_TEAMING 1 /* Some defaults. These can be overridden at runtime. */ -#define CI_CFG_NETIF_MAX_ENDPOINTS (1<<13) +#define CI_CFG_NETIF_MAX_ENDPOINTS (1 << 13) /* The real max for endpoint order. * Do not forget to change CI_EPLOCK_NETIF_SOCKET_LIST if you increase * this number.*/ -#define CI_CFG_NETIF_MAX_ENDPOINTS_MAX (1<<21) +#define CI_CFG_NETIF_MAX_ENDPOINTS_MAX (1 << 21) /* ANVL assumes the 2MSL time is 60 secs. Set slightly smaller */ -#define CI_CFG_TCP_TCONST_MSL 25 +#define CI_CFG_TCP_TCONST_MSL 25 #define CI_CFG_TCP_FIN_TIMEOUT 60 -#define CI_CFG_BURST_CONTROL 1 +#define CI_CFG_BURST_CONTROL 1 #if CI_CFG_BURST_CONTROL -#define CI_CFG_TCP_BURST_CONTROL_LIMIT 0 +#define CI_CFG_TCP_BURST_CONTROL_LIMIT 0 #endif #define CI_CFG_CONG_AVOID_NOTIFIED 0 @@ -61,84 +61,84 @@ /* Debug aids. Off by default, as some add lots of overhead. */ #ifndef CI_CFG_RANDOM_DROP -#define CI_CFG_RANDOM_DROP 0 +#define CI_CFG_RANDOM_DROP 0 #endif #ifndef CI_CFG_POISON_BUFS -#define CI_CFG_POISON_BUFS 0 +#define CI_CFG_POISON_BUFS 0 #endif #ifndef CI_CFG_DETAILED_CHECKS -#define CI_CFG_DETAILED_CHECKS 0 +#define CI_CFG_DETAILED_CHECKS 0 #endif /* Whether to hook the syscall function from libc. Currently supported only * on x86-64 to simplify the implementation. */ #ifdef __x86_64__ -#define CI_CFG_USERSPACE_SYSCALL 1 +#define CI_CFG_USERSPACE_SYSCALL 1 #else -#define CI_CFG_USERSPACE_SYSCALL 0 +#define CI_CFG_USERSPACE_SYSCALL 0 #endif /* Maximum number of onload stacks handled by single epoll object. * See also epoll_max_stacks module parameter. * Socket from other stacks will look just like "regular file descriptor" * for the onload object, without onload-specific acceleration. */ -#define CI_CFG_EPOLL_MAX_STACKS 16 +#define CI_CFG_EPOLL_MAX_STACKS 16 /* Maximum number of postponed epoll_ctl operations, in case of * EF_UL_EPOLL=2 and EF_EPOLL_CTL_FAST=1 */ -#define CI_CFG_EPOLL_MAX_POSTPONED 10 +#define CI_CFG_EPOLL_MAX_POSTPONED 10 /* Arbitrary limit of 1MB following linux kernel in Onload pipe * implementation */ -#define CI_CFG_MAX_PIPE_SIZE (1<<20) +#define CI_CFG_MAX_PIPE_SIZE (1 << 20) /* Enable this to support port striping. */ -#define CI_CFG_PORT_STRIPING 0 +#define CI_CFG_PORT_STRIPING 0 /* Non-RFC1191 recovery time: * when PMTU goes to min (a very small number, poss. a DoS attack) use - * a shorter recovery time than the RFC allows. + * a shorter recovery time than the RFC allows. * Set to 0 to keep ANVL happy */ -#define CI_CFG_FAST_RECOVER_PMTU_AT_MIN 0 +#define CI_CFG_FAST_RECOVER_PMTU_AT_MIN 0 -#define CI_CFG_SUPPORT_STATS_COLLECTION 1 -#define CI_CFG_TCP_SOCK_STATS 0 +#define CI_CFG_SUPPORT_STATS_COLLECTION 1 +#define CI_CFG_TCP_SOCK_STATS 0 /* Enable this to cause buffered stats (from sockopt) to be output * to the log rather than written to a buffer */ -#define CI_CFG_SEND_STATS_TO_LOG 1 +#define CI_CFG_SEND_STATS_TO_LOG 1 -#define CI_CFG_IP_TIMER_DEBUG 0 +#define CI_CFG_IP_TIMER_DEBUG 0 /* Enable this to return ENOTCONN when recv/recvfrom/recvmsg are * called when not bound/connected (UDP) (see udp_recv.c) */ -#define CI_CFG_POSIX_RECV 0 +#define CI_CFG_POSIX_RECV 0 /* Enable this to have recvmsg() on TCP socket fill the [msg_name]. Linux * certainly doesn't. */ -#define CI_CFG_TCP_RECVMSG_MSGNAME 0 +#define CI_CFG_TCP_RECVMSG_MSGNAME 0 /*! * Enable this to return EOPNOTSUPP when connect() is called after * listen() on the same socket (see tcp_connect.c). */ -#define CI_CFG_POSIX_CONNECT_AFTER_LISTEN 0 +#define CI_CFG_POSIX_CONNECT_AFTER_LISTEN 0 -/* send reset for connections with invalid options in SYN packets */ -#define CI_CFG_TCP_INVALID_OPT_RST 1 +/* send reset for connections with invalid options in SYN packets */ +#define CI_CFG_TCP_INVALID_OPT_RST 1 /* initial cwnd setting possible according to rfcs: ** 2001, 2581, 3390 */ -#define CI_CFG_TCP_INITIAL_CWND_RFC 2581 +#define CI_CFG_TCP_INITIAL_CWND_RFC 2581 /* check PAWs on fastpath ** Not necessary by rfc1323, but by ANVL tcp_highperf4.17 */ -#define CI_CFG_TCP_PAWS_ON_FASTPATH 1 +#define CI_CFG_TCP_PAWS_ON_FASTPATH 1 -/* strict check of SEG.SEQ <= Last.ACK.sent < SEG.SEQ + SEG.LEN +/* strict check of SEG.SEQ <= Last.ACK.sent < SEG.SEQ + SEG.LEN ** as on rfc1323 p16 or the looser on p35: ** SEG.SEQ <= Last.ACK.sent <= SEG.SEQ + SEG.LEN implied ** Setting this to 1 will cause it to not update the echoed value @@ -146,21 +146,21 @@ ** Setting this to 0 will leave it vulnerable to misdetection of ** failures when zero length packets get reordered. */ -#define CI_CFG_TCP_RFC1323_STRICT_TSO 0 +#define CI_CFG_TCP_RFC1323_STRICT_TSO 0 /* Minimum MSS value */ -/* ANVL requires some pretty small MSS values. +/* ANVL requires some pretty small MSS values. This is chosen to match the ANVL parameter */ -#define CI_CFG_TCP_MINIMUM_MSS 64 +#define CI_CFG_TCP_MINIMUM_MSS 64 /* Default MSS value */ -#define CI_CFG_TCP_DEFAULT_MSS 536 +#define CI_CFG_TCP_DEFAULT_MSS 536 /* How many RX descriptors to push at a time. */ -#define CI_CFG_RX_DESC_BATCH 16 +#define CI_CFG_RX_DESC_BATCH 16 /* How many packets to fill on TX path before pushing them out. */ -#define CI_CFG_TCP_TX_BATCH 8 +#define CI_CFG_TCP_TX_BATCH 8 /* Maximum receive window size. This used to be 0x7fff. Here's why: ** @@ -173,69 +173,69 @@ ** there's a rumour that issues with signed arithmetic may become a problem. ** We have done a few development days of testing with 0xffff without this. */ -#define CI_CFG_TCP_MAX_WINDOW 0xffff +#define CI_CFG_TCP_MAX_WINDOW 0xffff /* RFCs specify that if the receiver shrinks the window the sender * should be robust and notice this. We used to, in the name of * efficiency, ignore shrinking windows. Set to zero to get this old * behaviour */ -#define CI_CFG_NOTICE_WINDOW_SHRINKAGE 1 +#define CI_CFG_NOTICE_WINDOW_SHRINKAGE 1 /* ** Base value for dupack threshold. -*/ -#define CI_CFG_TCP_DUPACK_THRESH_BASE 3 +*/ +#define CI_CFG_TCP_DUPACK_THRESH_BASE 3 /* -** Maximum value for dupack threshold. Should be less than typical window +** Maximum value for dupack threshold. Should be less than typical window ** size (in calculated packets, not in bytes). */ -#define CI_CFG_TCP_DUPACK_THRESH_MAX 127 +#define CI_CFG_TCP_DUPACK_THRESH_MAX 127 /* IP TTL settings */ -#define CI_IP_DFLT_TTL 64 -#define CI_IP_MAX_TTL 255 +#define CI_IP_DFLT_TTL 64 +#define CI_IP_MAX_TTL 255 /* IP TOS default */ -#define CI_IP_DFLT_TOS 0 +#define CI_IP_DFLT_TOS 0 /* 8-bit field - but individual bits have (ignored) meaning */ /* IPv6 Traffic Class default */ -#define CI_IPV6_DFLT_TCLASS 0 +#define CI_IPV6_DFLT_TCLASS 0 /* IPv6 hop limit defaults. Both are equal to corresponding Linux ones. */ -#define CI_IPV6_DFLT_HOPLIMIT 64 -#define CI_IPV6_DFLT_MCASTHOPS 1 +#define CI_IPV6_DFLT_HOPLIMIT 64 +#define CI_IPV6_DFLT_MCASTHOPS 1 /* Should we generate code that protects us against invalid shared state? ** By default we want the kernel to be robust to arbitrary shared state, ** but user-level to be fast. */ #ifndef CI_CFG_NETIF_HARDEN -# ifdef __KERNEL__ -# define CI_CFG_NETIF_HARDEN 1 -# else -# define CI_CFG_NETIF_HARDEN 0 -# endif +#ifdef __KERNEL__ +#define CI_CFG_NETIF_HARDEN 1 +#else +#define CI_CFG_NETIF_HARDEN 0 +#endif #endif /* Support H/W timer to give stack a kick when events are left unhandled * for a while. */ -#define CI_CFG_HW_TIMER 1 +#define CI_CFG_HW_TIMER 1 /* Enable invariant checking on entry/exit to library (sockcall intercept) */ -#define CI_CFG_FDTABLE_CHECKS 0 +#define CI_CFG_FDTABLE_CHECKS 0 /* ** Configuration options for TCP/IP striping. ** - we stripe between hosts if we have a common netmask -** - dupack threshold can be rasied to make the stack more +** - dupack threshold can be rasied to make the stack more ** tolerant to reordering ** - default is all 1s - i.e. striping off */ -#define CI_CFG_STRIPE_DEFAULT_NETMASK 0xffffffff -#define CI_CFG_STRIPE_DEFAULT_DUPACK_THRESHOLD 3 +#define CI_CFG_STRIPE_DEFAULT_NETMASK 0xffffffff +#define CI_CFG_STRIPE_DEFAULT_DUPACK_THRESHOLD 3 /* The default TCP header option number used for striping. We'd like a ** proper assignment, but for now this will have to do: @@ -244,92 +244,92 @@ ** pancakes, and Black Jumbo ate Fifty-five but Little Black Sambo ate a ** Hundred and Sixty-nine, because he was so hungry." */ -#define CI_CFG_STRIPE_DEFAULT_TCP_OPT 251 +#define CI_CFG_STRIPE_DEFAULT_TCP_OPT 251 -/* +/* ** Defaults for non-Linux and for broken Linux. -** Normally, we hope to get these values from OS. +** Normally, we hope to get these values from OS. */ -#define CI_CFG_UDP_SNDBUF_DEFAULT 212992 -#define CI_CFG_UDP_RCVBUF_DEFAULT 212992 -#define CI_CFG_UDP_SNDBUF_MAX 212992 -#define CI_CFG_UDP_RCVBUF_MAX 212992 +#define CI_CFG_UDP_SNDBUF_DEFAULT 212992 +#define CI_CFG_UDP_RCVBUF_DEFAULT 212992 +#define CI_CFG_UDP_SNDBUF_MAX 212992 +#define CI_CFG_UDP_RCVBUF_MAX 212992 /* -**These values are chosen to match the Linux definition of +**These values are chosen to match the Linux definition of **SOCK_MIN_SNDBUF and SOCK_MIN_RCVBUF */ #ifndef SOCK_MIN_SNDBUF -# define CI_SOCK_MIN_SNDBUF 2048 +#define CI_SOCK_MIN_SNDBUF 2048 #else -# define CI_SOCK_MIN_SNDBUF SOCK_MIN_SNDBUF +#define CI_SOCK_MIN_SNDBUF SOCK_MIN_SNDBUF #endif #ifndef SOCK_MIN_RCVBUF -# define CI_SOCK_MIN_RCVBUF 256 +#define CI_SOCK_MIN_RCVBUF 256 #else -# define CI_SOCK_MIN_RCVBUF SOCK_MIN_RCVBUF +#define CI_SOCK_MIN_RCVBUF SOCK_MIN_RCVBUF #endif -#define CI_CFG_UDP_SNDBUF_MIN CI_SOCK_MIN_SNDBUF -#define CI_CFG_UDP_RCVBUF_MIN CI_SOCK_MIN_RCVBUF +#define CI_CFG_UDP_SNDBUF_MIN CI_SOCK_MIN_SNDBUF +#define CI_CFG_UDP_RCVBUF_MIN CI_SOCK_MIN_RCVBUF /* TCP sndbuf */ -#define CI_CFG_TCP_SNDBUF_MIN CI_SOCK_MIN_SNDBUF -#define CI_CFG_TCP_SNDBUF_DEFAULT 16384 -#define CI_CFG_TCP_SNDBUF_MAX 4194304 +#define CI_CFG_TCP_SNDBUF_MIN CI_SOCK_MIN_SNDBUF +#define CI_CFG_TCP_SNDBUF_DEFAULT 16384 +#define CI_CFG_TCP_SNDBUF_MAX 4194304 -#define CI_CFG_TCP_RCVBUF_MIN CI_SOCK_MIN_RCVBUF +#define CI_CFG_TCP_RCVBUF_MIN CI_SOCK_MIN_RCVBUF -#define CI_CFG_TCP_RCVBUF_DEFAULT 87380 -#define CI_CFG_TCP_RCVBUF_MAX 6291456 +#define CI_CFG_TCP_RCVBUF_DEFAULT 87380 +#define CI_CFG_TCP_RCVBUF_MAX 6291456 /* These configuration "options" describe whether the host O/S normally * inherits specific socket state when accept() is called. */ -#define CI_CFG_ACCEPT_INHERITS_NONBLOCK 0 +#define CI_CFG_ACCEPT_INHERITS_NONBLOCK 0 /* Maximum possible value for listen queue (backlog). * It is substituted from OS, when possible. */ -#define CI_TCP_LISTENQ_MAX 256 +#define CI_TCP_LISTENQ_MAX 256 /* Assume this number of listening socket per stack when calculating * EF_TCP_SYNRECV_MAX. */ -#define CI_CFG_ASSUME_LISTEN_SOCKS 4 +#define CI_CFG_ASSUME_LISTEN_SOCKS 4 /* TCP window scale maximum and default. * Maximum is taken from RFC1323 and may be overriden by OS settings for * send value. * Default is overriden based on receive buffer. */ -#define CI_TCP_WSCL_MAX 14 /* RFC 1323 max shift */ +#define CI_TCP_WSCL_MAX 14 /* RFC 1323 max shift */ -/* It is supposed that +/* It is supposed that * CI_TCP_RETRANSMIT_THRESHOLD > CI_TCP_RETRANSMIT_THRESHOLD_SYN. * Do not break this! */ -#define CI_TCP_RETRANSMIT_THRESHOLD 15 /* retransmit 15 times */ -#define CI_TCP_RETRANSMIT_THRESHOLD_ORPHAN 8 /* orphaned sock: 8 times */ -#define CI_TCP_RETRANSMIT_THRESHOLD_SYN 4 /* retransmit SYN 4 times */ +#define CI_TCP_RETRANSMIT_THRESHOLD 15 /* retransmit 15 times */ +#define CI_TCP_RETRANSMIT_THRESHOLD_ORPHAN 8 /* orphaned sock: 8 times */ +#define CI_TCP_RETRANSMIT_THRESHOLD_SYN 4 /* retransmit SYN 4 times */ /* Should we send DSACK option in TCP? */ -#define CI_CFG_TCP_DSACK 1 +#define CI_CFG_TCP_DSACK 1 /* Do we assassinate TIME-WAIT TCP connections when needed? * Default value for EF_TCP_TIME_WAIT_ASSASSINATION. */ -#define CI_CFG_TIME_WAIT_ASSASSINATE 1 +#define CI_CFG_TIME_WAIT_ASSASSINATE 1 /* Default challenge ACK limitation (in count per second), * same as of linux-4.19 */ -#define CI_CFG_CHALLENGE_ACK_LIMIT 1000 +#define CI_CFG_CHALLENGE_ACK_LIMIT 1000 /* Default ACK limitation when sending respnse to invalid packet, * in ms, same as of linux-4.19 */ -#define CI_CFG_TCP_OUT_OF_WINDOW_ACK_RATELIMIT 500 +#define CI_CFG_TCP_OUT_OF_WINDOW_ACK_RATELIMIT 500 /* Path to the /proc/sys/ */ -#define CI_CFG_PROC_PATH "/proc/sys/" +#define CI_CFG_PROC_PATH "/proc/sys/" /* The real max is 30, but let's use larger value. */ -#define CI_CFG_PROC_PATH_LEN_MAX 70 +#define CI_CFG_PROC_PATH_LEN_MAX 70 /* Match procfs/sysctl line limits. */ -#define CI_CFG_PROC_LINE_LEN_MAX 1025 +#define CI_CFG_PROC_LINE_LEN_MAX 1025 /* * CI_CFG_CONGESTION_WINDOW_VALIDATION actviates RFC2861 compliance; @@ -341,12 +341,12 @@ * miliseconds, they end with a tiny congestion window which needs to * be opened up. * - * Make sure you read the comment below for - * CI_CFG_CONGESTION_WINDOW_VALIDATION_DELACK_SCALING if you activate this; - * it is recommended that you activate that option as well if you want this + * Make sure you read the comment below for + * CI_CFG_CONGESTION_WINDOW_VALIDATION_DELACK_SCALING if you activate this; + * it is recommended that you activate that option as well if you want this * option. */ -#define CI_CFG_CONGESTION_WINDOW_VALIDATION 0 +#define CI_CFG_CONGESTION_WINDOW_VALIDATION 0 /* * A substantial performance problem with congestion window validation @@ -366,18 +366,19 @@ /* When the netif is wedged, due to userspace dying while the kernel is in an * inconsistent state, rather than go through the full process of closing the - * endpoint (which could fail, due to the inconsistent state), if DESTROY_WEDGED - * is set, we remove the filters and go straight to deleting data structures. + * endpoint (which could fail, due to the inconsistent state), if + * DESTROY_WEDGED is set, we remove the filters and go straight to deleting + * data structures. */ -#define CI_CFG_DESTROY_WEDGED 1 +#define CI_CFG_DESTROY_WEDGED 1 /* Include support for reducing the rate at which the congestion window is * increased during congestion avoidance. */ -#define CI_CFG_CONG_AVOID_SCALE_BACK 1 +#define CI_CFG_CONG_AVOID_SCALE_BACK 1 -/* +/* * Define how aggressive we should be in opening the congestion window * during slow start. * 0: RFC3465 behaviour (at most 2MSS increase for each received ACK) @@ -387,38 +388,38 @@ * See Section 2.2 and 2.3 of RFC3465 for discussion of this, and the * implementation of tcp_slow_start() in the kernel */ -#define CI_CFG_CONG_AVOID_SLOW_START_MODE 2 +#define CI_CFG_CONG_AVOID_SLOW_START_MODE 2 -/* +/* * When CI_CFG_CONG_AVOID_SLOW_START_MODE is zero, and so * RFC3465 behaviour is selected, this supplies the value for "L" from * that RFC. It should be between 1 and 2 to comply - */ -#define CI_CFG_CONG_AVOID_RFC3465_L_VALUE 2 + */ +#define CI_CFG_CONG_AVOID_RFC3465_L_VALUE 2 /* Detect cases where delayed acks could be detrimental to performance * (e.g. in slow start, or after data loss) and send ACKs for all * packets. */ -#define CI_CFG_TCP_FASTSTART 1 +#define CI_CFG_TCP_FASTSTART 1 /* If a tail drop is suspected, try to probe it with a retransmission. -*/ -#define CI_CFG_TAIL_DROP_PROBE 1 + */ +#define CI_CFG_TAIL_DROP_PROBE 1 /* Dump users of TCP and UDP sockets to a log file. */ -#define CI_CFG_LOG_SOCKET_USERS 0 +#define CI_CFG_LOG_SOCKET_USERS 0 /* Include fake IPv6 support (0 - off, 1 - on) */ -#define CI_CFG_FAKE_IPV6 1 +#define CI_CFG_FAKE_IPV6 1 /* Include support for caching file descriptors at user-level. */ -#define CI_CFG_FD_CACHING 1 +#define CI_CFG_FD_CACHING 1 /* Active wild support */ -#define CI_CFG_TCP_SHARED_LOCAL_PORTS 1 +#define CI_CFG_TCP_SHARED_LOCAL_PORTS 1 /* Enable endpoint move. * It is used in: @@ -428,19 +429,19 @@ * - clustering (aka SO_REUSEPORT). * You probably want it to be turned on. */ -#define CI_CFG_ENDPOINT_MOVE 1 +#define CI_CFG_ENDPOINT_MOVE 1 /* Maintain statistics for listening sockets. At time of writing these are ** all gathered off the fast path, so there is no significant performance ** penalty for having them on. */ -#define CI_CFG_STATS_TCP_LISTEN 1 +#define CI_CFG_STATS_TCP_LISTEN 1 /* Maintain per-netif statistics for things like event-queue callbacks etc. ** At time of writing these are all gathered off the fast path, so there is ** no significant performance penalty for having them on. */ -#define CI_CFG_STATS_NETIF 1 +#define CI_CFG_STATS_NETIF 1 /* Per-netif statistics for spin rounds inside each operation. * It depends on CI_CFG_STATS_NETIF being on. */ @@ -453,31 +454,31 @@ /* Size of packet buffers. Must be 2048 or 4096. The larger value reduces * overhead when packets are large, but wastes memory when they aren't. */ -#define CI_CFG_PKT_BUF_SIZE 2048 +#define CI_CFG_PKT_BUF_SIZE 2048 /* Maximum number of retransmit for SYN-ACKs */ #define CI_CFG_TCP_SYNACK_RETRANS_MAX 10 /* Enable inspection of packets before delivery */ -#define CI_CFG_ZC_RECV_FILTER 1 +#define CI_CFG_ZC_RECV_FILTER 1 /* HACK: Limit the advertised MSS for TCP because our TCP path does not * currently cope with frames that don't fit in a single packet buffer. * This define really exists just to make it easy to find and remove this * hack. */ -#define CI_CFG_LIMIT_AMSS 1 -#define CI_CFG_LIMIT_SMSS 1 +#define CI_CFG_LIMIT_AMSS 1 +#define CI_CFG_LIMIT_SMSS 1 /* Max length of "name" of a stack. */ -#define CI_CFG_STACK_NAME_LEN 26 +#define CI_CFG_STACK_NAME_LEN 26 /* Max length of "name" of a cluster. */ -#define CI_CFG_CLUSTER_NAME_LEN (CI_CFG_STACK_NAME_LEN >> 1) +#define CI_CFG_CLUSTER_NAME_LEN (CI_CFG_STACK_NAME_LEN >> 1) /* Onload tcpdump support */ -#define CI_CFG_TCPDUMP 1 +#define CI_CFG_TCPDUMP 1 #if CI_CFG_TCPDUMP /* Dump queue length, should be 2^x, x <= 16 */ @@ -486,7 +487,7 @@ /* Support for reducing ACK rate at high throughput to improve efficiency */ -#define CI_CFG_DYNAMIC_ACK_RATE 1 +#define CI_CFG_DYNAMIC_ACK_RATE 1 /* Allocate packets in huge pages when possible * Ignored unless your kernel has CONFIG_HUGETLB_PAGE turned on (all the @@ -498,62 +499,62 @@ * To use huge pages, we should allocate exactly 2^10 pkts per set. * DO NOT CHANGE THIS VALUE if you have CI_CFG_PKTS_AS_HUGE_PAGES=1 */ #if CI_CFG_PKT_BUF_SIZE == 2048 -#define CI_CFG_PKTS_PER_SET_S 10u +#define CI_CFG_PKTS_PER_SET_S 10u #elif CI_CFG_PKT_BUF_SIZE == 4096 -#define CI_CFG_PKTS_PER_SET_S 9u +#define CI_CFG_PKTS_PER_SET_S 9u #else #error "Incorrect CI_CFG_PKT_BUF_SIZE value" #endif -#define PKTS_PER_SET (1u << CI_CFG_PKTS_PER_SET_S) -#define PKTS_PER_SET_M (PKTS_PER_SET - 1u) +#define PKTS_PER_SET (1u << CI_CFG_PKTS_PER_SET_S) +#define PKTS_PER_SET_M (PKTS_PER_SET - 1u) /* When all packet sets have less than this number of packets available to * use, we'll allocate more packet sets */ -#define CI_CFG_PKT_SET_LOW_WATER (PKTS_PER_SET / 2) +#define CI_CFG_PKT_SET_LOW_WATER (PKTS_PER_SET / 2) /* A packet set with this number of available packets is considered as good * as a completely-unused set. It allows for packet set reuse when there * are a few long-living TCP connections which use 1-10 packets from each * set. */ -#define CI_CFG_PKT_SET_HIGH_WATER (PKTS_PER_SET - PKTS_PER_SET / 32) +#define CI_CFG_PKT_SET_HIGH_WATER (PKTS_PER_SET - PKTS_PER_SET / 32) /* Whether to include code to transmit small packets via PIO */ -#define CI_CFG_PIO 1 -#define CI_CFG_MIN_PIO_BLOCK_ORDER 7 +#define CI_CFG_PIO 1 +#define CI_CFG_MIN_PIO_BLOCK_ORDER 7 /* Whether to include code to transmit packets via CTPIO */ -#define CI_CFG_CTPIO 1 +#define CI_CFG_CTPIO 1 /* How many epolls sets will have a ready list maintained by the stack */ #define CI_CFG_EPOLL1_SETS_PER_STACK 4 /* How many ready lists are maintained */ -#define CI_CFG_N_READY_LISTS CI_CFG_EPOLL1_SETS_PER_STACK +#define CI_CFG_N_READY_LISTS CI_CFG_EPOLL1_SETS_PER_STACK /* Do we need SO_TIMESTAMPING, WODA, ...? */ -#define CI_CFG_TIMESTAMPING 1 +#define CI_CFG_TIMESTAMPING 1 /* Enable native kernel BPF program functionality * (subject to kernel support see CI_HAVE_BPF_NATIVE). * Currently aarch64 doesn't support Onload BPF. */ #ifndef __aarch64__ -#define CI_CFG_WANT_BPF_NATIVE 1 +#define CI_CFG_WANT_BPF_NATIVE 1 #else -#define CI_CFG_WANT_BPF_NATIVE 0 +#define CI_CFG_WANT_BPF_NATIVE 0 #endif /* Most users want epoll2 and epoll3 modes */ -#define CI_CFG_EPOLL2 1 -#define CI_CFG_EPOLL3 1 +#define CI_CFG_EPOLL2 1 +#define CI_CFG_EPOLL3 1 /* Inject packets into kernel if they match hardware filters but do not * match software ones. See inject_kernel_gid module parameter. */ -#define CI_CFG_INJECT_PACKETS 1 +#define CI_CFG_INJECT_PACKETS 1 /* NIC reset, suspend and hot-plug support */ -#define CI_CFG_NIC_RESET_SUPPORT 1 +#define CI_CFG_NIC_RESET_SUPPORT 1 /* Handle incoming ICMP for Onloaded sockets */ -#define CI_CFG_HANDLE_ICMP 1 +#define CI_CFG_HANDLE_ICMP 1 /* Enable cooperation with the SmartNIC TCP reordering plugin */ #define CI_CFG_TCP_OFFLOAD_RECYCLER 0 @@ -575,7 +576,7 @@ #endif /* Enable cooperation with the SmartNIC TX CRC-offload plugin */ -#define CI_CFG_TX_CRC_OFFLOAD 0 +#define CI_CFG_TX_CRC_OFFLOAD 0 /* Do not use SmartNIC TX CRC-offload plugin for NVMeoTCP and instead calculate * PDU digests in Onload. Useful for testing of Onload CRC-offload logic. */ #define CI_CFG_NVME_LOCAL_CRC_MODE 0 @@ -593,7 +594,7 @@ * * * temporary disabled for linux-5.10 (ON-12686) */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,18,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) #define CI_HAVE_BPF_NATIVE 1 #else #define CI_HAVE_BPF_NATIVE 0 @@ -609,9 +610,9 @@ /* Size of socket shared state buffer. Must be 1024 or 2048. Larger * value is needed if you enable too many CI_CFG_* options, such as * CI_CFG_TCP_SOCK_STATS. */ -#define CI_CFG_EP_BUF_SIZE 1024 +#define CI_CFG_EP_BUF_SIZE 1024 -#if CI_CFG_IPV6 && !CI_CFG_FAKE_IPV6 +#if CI_CFG_IPV6 && ! CI_CFG_FAKE_IPV6 #error "CI_CFG_FAKE_IPV6 should be enabled to support IPv6" #endif diff --git a/src/lib/ciul/efswxtch_vi.c b/src/lib/ciul/efswxtch_vi.c index e197ba14a..b20fa953e 100644 --- a/src/lib/ciul/efswxtch_vi.c +++ b/src/lib/ciul/efswxtch_vi.c @@ -12,31 +12,35 @@ static const char *_TX_COMP_RING = "TX_COMP_RING"; static const char *_RX_RING = "RX_RING"; static const char *_RX_FILL_RING = "RX_FILL_RING"; static const char *_RX_MBUF_POOL = "RX_MBUF_POOL"; -static const char *_TX_PREP_RING = "TX_PREP_RING"; -static const char *_RX_PREP_RING = "RX_PREP_RING"; static const char *_RX_PENDING_RING = "RX_PENDING_RING"; -static const unsigned RECEIVE_PUSH_SIZE = 16; + +typedef struct swxtch_ring_state { + uint32_t old_head; + uint32_t new_head; +} swxtch_ring_state; + +/* This type is a wrapper around DPDK rings that maintains state and allows + * splitting enqueue operations across function calls */ +typedef struct swxtch_ring { + struct rte_ring *r; + swxtch_ring_state states[16]; + uint16_t num_states; +} swxtch_ring; + typedef struct swxtch_rings { struct rte_mempool *mempool; // basic mempool to pull mbufs from - struct rte_ring *rx_fill_ring; // rx fill ring to fill indicate to that - // rx packets can be received + swxtch_ring rx_fill_ring; // rx fill ring to fill indicate to + // that rx packets can be received struct rte_ring *rx_ring; // ring containing rx packets - struct rte_ring *tx_ring; // ring contain packets to send + struct swxtch_ring tx_ring; // ring contain packets to send struct rte_ring *tx_comp_ring; // ring containing packets that were sent - // the prep rings are semi hacky and are used as a staging area for - // rx|tx_init before _push is called - struct rte_ring *tx_prep_ring; - struct rte_ring *rx_prep_ring; // in between polling and reading rx packets live here struct rte_ring *rx_pending_ring; } swxtch_rings; static swxtch_rings m_rings; -// testing using this as our "fill pkt" -static int fake_fill_pkt = 1; - // drain a ring on startup to free any stuck mbufs void efswxtch_drain_ring(struct rte_ring *ring, int should_free) { @@ -44,6 +48,7 @@ void efswxtch_drain_ring(struct rte_ring *ring, int should_free) int count = 0; int burst_size = 32; void *bufs[burst_size]; + unsigned drained = 0; do { count = rte_ring_dequeue_burst(ring, &bufs[0], burst_size, &available); @@ -51,16 +56,16 @@ void efswxtch_drain_ring(struct rte_ring *ring, int should_free) if( should_free ) { rte_pktmbuf_free_bulk((struct rte_mbuf **) bufs, count); } + + drained += count; } while( available != 0 ); } void efswxtch_drain_rings(void) { - efswxtch_drain_ring(m_rings.rx_fill_ring, 0); - efswxtch_drain_ring(m_rings.tx_ring, 1); + efswxtch_drain_ring(m_rings.rx_fill_ring.r, 0); + efswxtch_drain_ring(m_rings.tx_ring.r, 1); efswxtch_drain_ring(m_rings.rx_ring, 1); - efswxtch_drain_ring(m_rings.rx_prep_ring, 0); - efswxtch_drain_ring(m_rings.tx_prep_ring, 1); efswxtch_drain_ring(m_rings.tx_comp_ring, 1); efswxtch_drain_ring(m_rings.rx_pending_ring, 1); } @@ -68,26 +73,25 @@ void efswxtch_drain_rings(void) int efswxtch_init_rings(void) { m_rings.mempool = rte_mempool_lookup(_RX_MBUF_POOL); - m_rings.rx_fill_ring = rte_ring_lookup(_RX_FILL_RING); + m_rings.rx_fill_ring.r = rte_ring_lookup(_RX_FILL_RING); m_rings.rx_ring = rte_ring_lookup(_RX_RING); - m_rings.tx_ring = rte_ring_lookup(_TX_RING); + m_rings.tx_ring.r = rte_ring_lookup(_TX_RING); m_rings.tx_comp_ring = rte_ring_lookup(_TX_COMP_RING); - m_rings.tx_prep_ring = rte_ring_lookup(_TX_PREP_RING); - m_rings.rx_prep_ring = rte_ring_lookup(_RX_PREP_RING); m_rings.rx_pending_ring = rte_ring_lookup(_RX_PENDING_RING); if( m_rings.mempool == NULL ) { ef_log("NO MEMPOOL"); return -1; } - if( m_rings.tx_ring == NULL ) { + if( m_rings.tx_ring.r == NULL ) { ef_log("NO TX RING"); return -1; } + if( m_rings.tx_comp_ring == NULL ) { ef_log("NO TX COMP RING"); return -1; } - if( m_rings.rx_fill_ring == NULL ) { + if( m_rings.rx_fill_ring.r == NULL ) { ef_log("NO FILL RING"); return -1; } @@ -95,14 +99,6 @@ int efswxtch_init_rings(void) ef_log("NO RX RING"); return -1; } - if( m_rings.tx_prep_ring == NULL ) { - ef_log("NO PREP RING"); - return -1; - } - if( m_rings.rx_prep_ring == NULL ) { - ef_log("NO RX PREP RING"); - return -1; - } if( m_rings.rx_pending_ring == NULL ) { ef_log("NO RX Pending RING"); return -1; @@ -119,7 +115,7 @@ static int efswxtch_ef_vi_safe_enqueue( struct rte_ring *ring, struct rte_mbuf **mbufs, unsigned count) { unsigned enq = rte_ring_enqueue_burst(ring, (void **) mbufs, count, NULL); - if( enq != count ) { + if( unlikely(enq != count) ) { ef_log("Only enqueued %d:%d on ring: %s", enq, count, ring->name); rte_pktmbuf_free_bulk((struct rte_mbuf **) &mbufs[enq], count - enq); return 0; @@ -128,6 +124,111 @@ static int efswxtch_ef_vi_safe_enqueue( return 1; } +static __rte_always_inline void swxtch_ring_add_state( + swxtch_ring *ring, uint32_t prev, uint32_t new) +{ + if( likely(ring->r->prod.single) ) { + return; + } + + if( unlikely(ring->num_states == 0) ) { + ring->num_states++; + ring->states[0].new_head = new; + ring->states[0].old_head = prev; + return; + } + + swxtch_ring_state *state = &ring->states[ring->num_states - 1]; + if( likely(state->new_head == prev) ) { + // the new state to add is continugous with the previously added one. Just + // extend the range and move on. + state->new_head = new; + } else { + ring->num_states++; + state = &ring->states[ring->num_states - 1]; + state->new_head = new; + state->old_head = prev; + } +} + +static __rte_always_inline int swxtch_ring_enqueue( + swxtch_ring *ring, unsigned n) +{ + const uint32_t capacity = ring->r->capacity; + unsigned int max = n; + int success; + uint32_t free_entries; + uint32_t old_head, new_head; + + do { + /* Reset n to the initial burst count */ + n = max; + + old_head = ring->r->prod.head; + + /* add rmb barrier to avoid load/load reorder in weak + * memory model. It is noop on x86 + */ + rte_smp_rmb(); + + /* + * The subtraction is done between two unsigned 32bits value + * (the result is always modulo 32 bits even if we have + * *old_head > cons_tail). So 'free_entries' is always between 0 + * and capacity (which is < size). + */ + free_entries = (capacity + ring->r->cons.tail - old_head); + + /* check that we have enough room in ring */ + if( unlikely(n > free_entries) ) + n = 0; + + if( n == 0 ) + return 0; + + new_head = old_head + n; + if( likely(ring->r->prod.single) ) { + success = 1; + ring->r->prod.head = new_head; + } else { + new_head = old_head + n; + success = rte_atomic32_cmpset(&ring->r->prod.head, old_head, new_head); + } + + } while( unlikely(success == 0) ); + + swxtch_ring_add_state(ring, old_head, new_head); + return n; +} + +/* This function only works for single producers and 1 packet*/ +static __rte_always_inline void swxtch_enqueue_ptrs( + swxtch_ring *ring, void **obj_table) +{ + uint32_t head = ring->r->prod.head - 1; + uint32_t idx = head & ring->r->mask; + void **start = (void **) &ring->r[1]; + + start[idx] = obj_table[0]; +} + +static __rte_always_inline void swxtch_ring_confirm(swxtch_ring *ring) +{ + rte_smp_wmb(); + if( likely(ring->r->prod.single) ) { + ring->r->prod.tail = ring->r->prod.head; + return; + } + for( int i = 0; i < ring->num_states; ++i ) { + while( unlikely(ring->r->prod.tail != ring->states[i].old_head) ) { + rte_pause(); + } + ring->r->prod.tail = ring->states[i].new_head; + } + ring->num_states = 0; +} + + static void efswxtch_ef_vi_tx_fill_pkt( ef_vi *vi, const char *pkt, const unsigned len) { @@ -135,8 +236,10 @@ static void efswxtch_ef_vi_tx_fill_pkt( if( rte_mempool_get_bulk(m_rings.mempool, (void **) mbufs, 1) == 0 ) { memcpy(rte_pktmbuf_mtod(mbufs[0], char *), pkt, len); mbufs[0]->data_len = len; - efswxtch_ef_vi_safe_enqueue( - m_rings.tx_prep_ring, (struct rte_mbuf **) mbufs, 1); + if( swxtch_ring_enqueue(&m_rings.tx_ring, 1) == 0 ) { + ef_log("failed to enqueue tx packet."); + } + swxtch_enqueue_ptrs(&m_rings.tx_ring, (void **) mbufs); } else { ef_log("failed to fill tx packet. Out of buffers"); } @@ -162,16 +265,7 @@ static int efswxtch_ef_vi_transmitv_init( static void efswxtch_ef_vi_transmit_push(ef_vi *vi) { - struct rte_mbuf *mbufs[EF_VI_TRANSMIT_BATCH]; - int removed; - - removed = rte_ring_dequeue_burst( - m_rings.tx_prep_ring, (void **) mbufs, EF_VI_TRANSMIT_BATCH, NULL); - if( removed != 0 ) { - efswxtch_ef_vi_safe_enqueue(m_rings.tx_ring, mbufs, removed); - } else { - ef_log("pushing but have no data"); - } + swxtch_ring_confirm(&m_rings.tx_ring); } static int efswxtch_ef_vi_transmit( @@ -179,7 +273,7 @@ static int efswxtch_ef_vi_transmit( { ef_iovec iov = { base, len }; int rc = efswxtch_ef_vi_transmitv_init(vi, &iov, 1, dma_id); - if( rc == 0 ) { + if( likely(rc == 0) ) { wmb(); efswxtch_ef_vi_transmit_push(vi); } @@ -190,7 +284,7 @@ static int efswxtch_ef_vi_transmitv( ef_vi *vi, const ef_iovec *iov, int iov_len, ef_request_id dma_id) { int rc = efswxtch_ef_vi_transmitv_init(vi, iov, iov_len, dma_id); - if( rc == 0 ) { + if( likely(rc == 0) ) { wmb(); efswxtch_ef_vi_transmit_push(vi); } @@ -296,55 +390,30 @@ static int efswxtch_ef_vi_transmit_memcpy_sync( return -EOPNOTSUPP; } + static int efswxtch_ef_vi_receive_init( ef_vi *vi, ef_addr addr, ef_request_id dma_id) { ef_vi_rxq *q = &vi->vi_rxq; ef_vi_rxq_state *qs = &vi->ep_state->rxq; int i; - if( qs->added - qs->removed >= q->mask ) + if( unlikely(qs->added - qs->removed >= q->mask) ) return -EAGAIN; i = qs->added++ & q->mask; q->ids[i] = dma_id; - if( rte_ring_enqueue(m_rings.rx_prep_ring, &fake_fill_pkt) != 0 ) { - ef_log("Unable to initalize the receive queue"); + if( unlikely(swxtch_ring_enqueue(&m_rings.rx_fill_ring, 1) == 0) ) { + ef_log("Unable to initialize the RX Fill ring"); return -EAGAIN; } - /* - if( rte_mempool_get(m_rings.mempool, (void **) &mbufs[0]) == 0 ) { - if( ! efswxtch_ef_vi_safe_enqueue(m_rings.rx_prep_ring, mbufs, 1) ) { - return -2; - } - } else { - ef_log("Unable to get mbuf to enqueue on the rx prep ring: %d left", - rte_mempool_avail_count(m_rings.mempool)); - return -1; - } - */ - return 0; } static void efswxtch_ef_vi_receive_push(ef_vi *vi) { - unsigned available = 0; - void *fake_pkts[RECEIVE_PUSH_SIZE]; - do { - int dequeued = rte_ring_dequeue_burst( - m_rings.rx_prep_ring, fake_pkts, RECEIVE_PUSH_SIZE, &available); - - if( dequeued == 0 ) { - ef_log("failed to get rx prep ring buffs"); - return; - } - if( rte_ring_enqueue_bulk( - m_rings.rx_fill_ring, fake_pkts, dequeued, NULL) == 0 ) { - ef_log("Unable to enqueue the fake pkts onto the fill ring"); - } - } while( available != 0 ); + swxtch_ring_confirm(&m_rings.rx_fill_ring); } @@ -356,17 +425,14 @@ static void efswxtch_ef_eventq_prime(ef_vi *vi) static void efswxtch_rx_fill_pkt(ef_vi *vi, char *pkt, int index) { struct rte_mbuf *mbuf[1]; - if( rte_ring_dequeue(m_rings.rx_pending_ring, (void **) &mbuf[0]) != 0 ) { + if( unlikely(rte_ring_dequeue(m_rings.rx_pending_ring, (void **) &mbuf[0]) != + 0) ) { ef_log("Nothing to fill in the rx pkts"); return; } memcpy(pkt, rte_pktmbuf_mtod(mbuf[0], unsigned char *), rte_pktmbuf_data_len(mbuf[0])); - if( mbuf[0] == NULL ) { - ef_log("freeing NULL"); - } else { - rte_pktmbuf_free(mbuf[0]); - } + rte_pktmbuf_free(mbuf[0]); } static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) @@ -374,7 +440,7 @@ static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) // n is the index of the current event we're filling in. consists of both RX // events and TX completion events int n = 0, count = 0; - unsigned available = 0, page = 0; + unsigned available = 0, page_start = 0; ef_vi_rxq *rx_q = &vi->vi_rxq; ef_vi_txq *tx_q = &vi->vi_txq; @@ -409,25 +475,24 @@ static int efswxtch_ef_eventq_poll(ef_vi *vi, ef_event *evs, int evs_len) if( n < evs_len ) { available = 0; - page = 0; do { - // TX can acknowledge multiple at once using the last id + // TX can acknowledge upto EF_VI_TRANSMIT_BATCH at once using the last id + // for a single TYPE_TX event count = rte_ring_dequeue_burst(m_rings.tx_comp_ring, (void **) tx_bufs, EF_VI_TRANSMIT_BATCH, &available); - if( count != 0 ) { - int desc_id = - (tx_qs->removed + count + (EF_VI_TRANSMIT_BATCH * page)) & - tx_q->mask; + if( likely(count != 0) ) { + int desc_id = (tx_qs->removed + count + page_start) & tx_q->mask; evs[n].tx.type = EF_EVENT_TYPE_TX; evs[n].tx.desc_id = desc_id; evs[n].tx.flags = 0; evs[n].tx.q_id = 0; ++n; - ++page; + page_start += count; rte_pktmbuf_free_bulk(tx_bufs, count); } - } while( available != 0 && n < evs_len ); + // don't waste our time confirming anything less than the transmit max? + } while( available > EF_VI_TRANSMIT_BATCH && n < evs_len ); } return n; @@ -456,27 +521,7 @@ static void efswxtch_ef_eventq_timer_zero(ef_vi *vi) int efswxtch_ef_eventq_check_event(const ef_vi *_vi) { return rte_ring_count(m_rings.rx_ring) > 0 || - rte_ring_count(m_rings.tx_comp_ring) > 0; -} - -static int efswxtch_ef_vi_refill_rx(ef_vi *vi) -{ - unsigned existing_count = rte_ring_count(m_rings.rx_fill_ring); - unsigned count_needed = - vi->ep_state->rxq.added - vi->ep_state->rxq.removed - existing_count; - if( count_needed > 0 ) { - struct rte_mbuf *pkts[count_needed]; - if( rte_mempool_get_bulk(m_rings.mempool, (void **) pkts, count_needed) != - 0 ) { - ef_log("Unabble to refil the RX fill packets"); - return 0; - } - - return efswxtch_ef_vi_safe_enqueue( - m_rings.rx_fill_ring, pkts, count_needed); - } - - return 1; + rte_ring_count(m_rings.tx_comp_ring) >= EF_VI_TRANSMIT_BATCH; } void efswxtch_vi_init(ef_vi *vi) @@ -510,7 +555,6 @@ void efswxtch_vi_init(ef_vi *vi) vi->ops.transmit_memcpy_sync = efswxtch_ef_vi_transmit_memcpy_sync; vi->ops.rx_fill_pkt = efswxtch_rx_fill_pkt; vi->ops.tx_fill_pkt = efswxtch_ef_vi_tx_fill_pkt; - vi->ops.refill_rx = efswxtch_ef_vi_refill_rx; if( vi->vi_flags & EF_VI_TX_CTPIO ) { vi->ops.transmit_ctpio_fallback = efswxtch_ef_vi_transmit_ctpio_fallback; vi->ops.transmitv_ctpio_fallback = efswxtch_ef_vi_transmitv_ctpio_fallback; diff --git a/src/lib/ciul/efxdp_vi.c b/src/lib/ciul/efxdp_vi.c index 0259b41a3..b65be66fc 100644 --- a/src/lib/ciul/efxdp_vi.c +++ b/src/lib/ciul/efxdp_vi.c @@ -38,7 +38,7 @@ static void efxdp_tx_kick(ef_vi* vi) { if( vi->xdp_kick(vi) == 0 ) { ef_vi_txq_state* qs = &vi->ep_state->txq; - qs->previous = qs->added; + qs->previous = qs->added; } } @@ -65,10 +65,10 @@ static struct efab_af_xdp_offsets* xdp_offsets(ef_vi* vi) static int efxdp_ef_vi_transmitv_init( ef_vi* vi, const ef_iovec* iov, int iov_len, ef_request_id dma_id) { - ef_vi_txq* q = &vi->vi_txq; + ef_vi_txq* q = &vi->vi_txq; ef_vi_txq_state* qs = &vi->ep_state->txq; struct xdp_desc* dq = RING_DESC(vi, tx); - int i; + int i; if( iov_len != 1 ) return -EINVAL; /* Multiple buffers per packet not supported */ @@ -76,9 +76,9 @@ static int efxdp_ef_vi_transmitv_init( if( qs->added - qs->removed >= q->mask ) return -EAGAIN; - i = qs->added++ & q->mask; + i = qs->added++ & q->mask; dq[i].addr = iov->iov_base; - dq[i].len = iov->iov_len; + dq[i].len = iov->iov_len; EF_VI_BUG_ON(q->ids[i] != EF_REQUEST_ID_MASK); q->ids[i] = dma_id; return 0; @@ -106,7 +106,7 @@ static int efxdp_ef_vi_transmit( ef_vi* vi, ef_addr base, int len, ef_request_id dma_id) { ef_iovec iov = { base, len }; - int rc = efxdp_ef_vi_transmitv_init(vi, &iov, 1, dma_id); + int rc = efxdp_ef_vi_transmitv_init(vi, &iov, 1, dma_id); if( rc == 0 ) { wmb(); efxdp_ef_vi_transmit_push(vi); @@ -228,15 +228,15 @@ static int efxdp_ef_vi_transmit_memcpy_sync( static int efxdp_ef_vi_receive_init( ef_vi* vi, ef_addr addr, ef_request_id dma_id) { - ef_vi_rxq* q = &vi->vi_rxq; + ef_vi_rxq* q = &vi->vi_rxq; ef_vi_rxq_state* qs = &vi->ep_state->rxq; - uint64_t* dq = RING_DESC(vi, fr); - int i; + uint64_t* dq = RING_DESC(vi, fr); + int i; if( qs->added - qs->removed >= q->mask ) return -EAGAIN; - i = qs->added++ & q->mask; + i = qs->added++ & q->mask; dq[i] = addr; return 0; } @@ -254,9 +254,6 @@ static void efxdp_ef_eventq_prime(ef_vi* vi) int efxdp_ef_eventq_check_event(const ef_vi* _vi, int look_ahead) { - ef_vi* vi = (ef_vi*) _vi; /* drop const */ - EF_VI_ASSERT(vi->evq_base); - EF_VI_BUG_ON(look_ahead < 0); return 0; } @@ -278,15 +275,15 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) uint32_t prod = *RING_PRODUCER(vi, rx); if( cons != prod ) { - ef_vi_rxq* q = &vi->vi_rxq; + ef_vi_rxq* q = &vi->vi_rxq; ef_vi_rxq_state* qs = &vi->ep_state->rxq; struct xdp_desc* dq = RING_DESC(vi, rx); do { unsigned desc_i = qs->removed++ & q->mask; - evs[n].rx.type = EF_EVENT_TYPE_RX; - evs[n].rx.q_id = 0; + evs[n].rx.type = EF_EVENT_TYPE_RX; + evs[n].rx.q_id = 0; /* AF_XDP devices do not use dma_ids as * FIFO behaviour of rx ring is not guaranteed (Zerocopy). @@ -297,14 +294,14 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) * for the client to resolve themselves. */ evs[n].rx.rq_id = dq[desc_i].addr / vi->rx_buffer_len; - q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ + q->ids[desc_i] = EF_REQUEST_ID_MASK; /* Debug only? */ /* FIXME: handle jumbo, multicast */ evs[n].rx.flags = EF_EVENT_FLAG_SOP; /* In case of AF_XDP offset of the placement of payload from * the beginning of the packet buffer may vary. */ - evs[n].rx.ofs = dq[desc_i].addr & (vi->rx_buffer_len - 1); - evs[n].rx.len = dq[desc_i].len; + evs[n].rx.ofs = dq[desc_i].addr & (vi->rx_buffer_len - 1); + evs[n].rx.len = dq[desc_i].len; ++n; ++cons; @@ -329,10 +326,10 @@ static int efxdp_ef_eventq_poll(ef_vi* vi, ef_event* evs, int evs_len) else cons += EF_VI_TRANSMIT_BATCH; - evs[n].tx.type = EF_EVENT_TYPE_TX; + evs[n].tx.type = EF_EVENT_TYPE_TX; evs[n].tx.desc_id = cons; - evs[n].tx.flags = 0; - evs[n].tx.q_id = 0; + evs[n].tx.flags = 0; + evs[n].tx.q_id = 0; ++n; } while( cons != prod && n != evs_len ); @@ -372,33 +369,33 @@ void efxdp_vi_init(ef_vi* vi) { EF_VI_BUILD_ASSERT(EFAB_AF_XDP_DESC_BYTES == sizeof(struct xdp_desc)); - vi->ops.transmit = efxdp_ef_vi_transmit; - vi->ops.transmitv = efxdp_ef_vi_transmitv; - vi->ops.transmitv_init = efxdp_ef_vi_transmitv_init; - vi->ops.transmit_push = efxdp_ef_vi_transmit_push; - vi->ops.transmit_pio = efxdp_ef_vi_transmit_pio; - vi->ops.transmit_copy_pio = efxdp_ef_vi_transmit_copy_pio; - vi->ops.transmit_pio_warm = efxdp_ef_vi_transmit_pio_warm; - vi->ops.transmit_copy_pio_warm = efxdp_ef_vi_transmit_copy_pio_warm; - vi->ops.transmitv_ctpio = efxdp_ef_vi_transmitv_ctpio; - vi->ops.transmitv_ctpio_copy = efxdp_ef_vi_transmitv_ctpio_copy; - vi->ops.transmit_alt_select = efxdp_ef_vi_transmit_alt_select; + vi->ops.transmit = efxdp_ef_vi_transmit; + vi->ops.transmitv = efxdp_ef_vi_transmitv; + vi->ops.transmitv_init = efxdp_ef_vi_transmitv_init; + vi->ops.transmit_push = efxdp_ef_vi_transmit_push; + vi->ops.transmit_pio = efxdp_ef_vi_transmit_pio; + vi->ops.transmit_copy_pio = efxdp_ef_vi_transmit_copy_pio; + vi->ops.transmit_pio_warm = efxdp_ef_vi_transmit_pio_warm; + vi->ops.transmit_copy_pio_warm = efxdp_ef_vi_transmit_copy_pio_warm; + vi->ops.transmitv_ctpio = efxdp_ef_vi_transmitv_ctpio; + vi->ops.transmitv_ctpio_copy = efxdp_ef_vi_transmitv_ctpio_copy; + vi->ops.transmit_alt_select = efxdp_ef_vi_transmit_alt_select; vi->ops.transmit_alt_select_default = efxdp_ef_vi_transmit_alt_select_normal; - vi->ops.transmit_alt_stop = efxdp_ef_vi_transmit_alt_stop; - vi->ops.transmit_alt_go = efxdp_ef_vi_transmit_alt_go; - vi->ops.transmit_alt_discard = efxdp_ef_vi_transmit_alt_discard; - vi->ops.receive_init = efxdp_ef_vi_receive_init; - vi->ops.receive_push = efxdp_ef_vi_receive_push; - vi->ops.eventq_poll = efxdp_ef_eventq_poll; - vi->ops.eventq_prime = efxdp_ef_eventq_prime; - vi->ops.eventq_timer_prime = efxdp_ef_eventq_timer_prime; - vi->ops.eventq_timer_run = efxdp_ef_eventq_timer_run; - vi->ops.eventq_timer_clear = efxdp_ef_eventq_timer_clear; - vi->ops.eventq_timer_zero = efxdp_ef_eventq_timer_zero; - vi->ops.transmit_memcpy = efxdp_ef_vi_transmit_memcpy; - vi->ops.transmit_memcpy_sync = efxdp_ef_vi_transmit_memcpy_sync; + vi->ops.transmit_alt_stop = efxdp_ef_vi_transmit_alt_stop; + vi->ops.transmit_alt_go = efxdp_ef_vi_transmit_alt_go; + vi->ops.transmit_alt_discard = efxdp_ef_vi_transmit_alt_discard; + vi->ops.receive_init = efxdp_ef_vi_receive_init; + vi->ops.receive_push = efxdp_ef_vi_receive_push; + vi->ops.eventq_poll = efxdp_ef_eventq_poll; + vi->ops.eventq_prime = efxdp_ef_eventq_prime; + vi->ops.eventq_timer_prime = efxdp_ef_eventq_timer_prime; + vi->ops.eventq_timer_run = efxdp_ef_eventq_timer_run; + vi->ops.eventq_timer_clear = efxdp_ef_eventq_timer_clear; + vi->ops.eventq_timer_zero = efxdp_ef_eventq_timer_zero; + vi->ops.transmit_memcpy = efxdp_ef_vi_transmit_memcpy; + vi->ops.transmit_memcpy_sync = efxdp_ef_vi_transmit_memcpy_sync; if( vi->vi_flags & EF_VI_TX_CTPIO ) { - vi->ops.transmit_ctpio_fallback = efxdp_ef_vi_transmit_ctpio_fallback; + vi->ops.transmit_ctpio_fallback = efxdp_ef_vi_transmit_ctpio_fallback; vi->ops.transmitv_ctpio_fallback = efxdp_ef_vi_transmitv_ctpio_fallback; } else { vi->ops.transmit_ctpio_fallback = @@ -407,8 +404,8 @@ void efxdp_vi_init(ef_vi* vi) efxdp_ef_vi_transmitv_ctpio_fallback_not_supp; } - vi->rx_buffer_len = 2048; - vi->rx_prefix_len = 0; + vi->rx_buffer_len = 2048; + vi->rx_prefix_len = 0; vi->evq_phase_bits = 1; /* We set this flag for ef_eventq_has_event */ } diff --git a/src/lib/ciul/mmake.mk b/src/lib/ciul/mmake.mk index 625802bd2..22582a19b 100644 --- a/src/lib/ciul/mmake.mk +++ b/src/lib/ciul/mmake.mk @@ -9,8 +9,6 @@ TARGETS := $(CIUL_LIB) endif MMAKE_TYPE := LIB -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu # Standalone subset for descriptor munging only. @@ -32,6 +30,11 @@ LIB_SRCS := \ checksum.c ifneq ($(DRIVER),1) +ifeq ($(RTE_SDK),) +$(error "Please define RTE_SDK environment variable") +endif +MMAKE_INCLUDE += -I$(RTE_SDK)/build/install/include +MMAKE_DPDK := $(DEFAULT_DPDK) LIB_SRCS += \ open.c \ event_q.c \ @@ -113,7 +116,7 @@ $(objd)efch_intf_ver.h: $(EFCH_INTF_HDRS) $(objd)$(MMAKE_OBJ_PREFIX)pt_endpoint.o: $(objd)efch_intf_ver.h $(objd)$(MMAKE_OBJ_PREFIX)vi_init.o: $(objd)efch_intf_ver.h - +$(MMAKE_OBJ_PREFIX)efswxtch_vi.o: cwarnings += -Wno-error=deprecated-declarations -Wno-error=implicit-fallthrough ###################################################### # UL library diff --git a/src/lib/efthrm/tcp_helper_endpoint.c b/src/lib/efthrm/tcp_helper_endpoint.c index 8034db6df..cb38c7362 100644 --- a/src/lib/efthrm/tcp_helper_endpoint.c +++ b/src/lib/efthrm/tcp_helper_endpoint.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author Andrew Rybchenko ** \brief Kernel-private endpoints routines @@ -29,10 +29,8 @@ \**************************************************************************/ /* See description in include/driver/efab/tcp_helper_endpoint.h */ -void -tcp_helper_endpoint_ctor(tcp_helper_endpoint_t *ep, - tcp_helper_resource_t * thr, - int id) +void tcp_helper_endpoint_ctor( + tcp_helper_endpoint_t* ep, tcp_helper_resource_t* thr, int id) { int i; @@ -74,31 +72,31 @@ tcp_helper_endpoint_ctor(tcp_helper_endpoint_t *ep, /*--------------------------------------------------------------------*/ -static void -clear_plugin_state(tcp_helper_endpoint_t * ep) +static void clear_plugin_state(tcp_helper_endpoint_t* ep) { #if CI_CFG_TCP_OFFLOAD_RECYCLER ci_netif* ni = &ep->thr->netif; int intf_i; - ci_assert( ! in_atomic() ); - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + ci_assert(! in_atomic()); + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct xsn_ceph_destroy_stream param = {}; int rc; ci_uint32 conn_id; /* This function can be called from tcp_helper_endpoint_clear_filters() * without the stack lock */ - conn_id = ci_xchg32(&ep->plugin_stream_id[intf_i], - INVALID_PLUGIN_HANDLE); + conn_id = ci_xchg32(&ep->plugin_stream_id[intf_i], INVALID_PLUGIN_HANDLE); if( conn_id == INVALID_PLUGIN_HANDLE ) continue; - param.in_conn_id = cpu_to_le32(conn_id);; - rc = efrm_ext_msg(ni->nic_hw[intf_i].plugin_rx, - XSN_CEPH_DESTROY_STREAM, ¶m, sizeof(param)); + param.in_conn_id = cpu_to_le32(conn_id); + ; + rc = efrm_ext_msg(ni->nic_hw[intf_i].plugin_rx, XSN_CEPH_DESTROY_STREAM, + ¶m, sizeof(param)); if( rc ) - OO_DEBUG_ERR(ci_log("%s: ERROR: Destroy Ceph stream failed (%d)", - __FUNCTION__, rc)); + OO_DEBUG_ERR(ci_log( + "%s: ERROR: Destroy Ceph stream failed (%d)", __FUNCTION__, rc)); } #endif } @@ -112,8 +110,7 @@ clear_plugin_state(tcp_helper_endpoint_t * ep) #endif /* See description in include/onload/tcp_helper_endpoint.h */ -void -tcp_helper_endpoint_dtor(tcp_helper_endpoint_t * ep) +void tcp_helper_endpoint_dtor(tcp_helper_endpoint_t* ep) { unsigned long lock_flags; #ifndef BREAK_SCALABLE_FILTERS @@ -133,20 +130,20 @@ tcp_helper_endpoint_dtor(tcp_helper_endpoint_t * ep) clear_plugin_state(ep); #ifndef BREAK_SCALABLE_FILTERS if( s->s_flags & CI_SOCK_FLAG_STACK_FILTER ) - ci_tcp_sock_clear_stack_filter(&ep->thr->netif, - SP_TO_TCP(&ep->thr->netif, ep->id)); + ci_tcp_sock_clear_stack_filter( + &ep->thr->netif, SP_TO_TCP(&ep->thr->netif, ep->id)); #endif oof_socket_del(oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); - oof_socket_mcast_del_all(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter); + oof_socket_mcast_del_all( + oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); oof_socket_dtor(&ep->oofilter); spin_lock_irqsave(&ep->lock, lock_flags); if( ep->os_socket != NULL ) { if( ID_TO_WAITABLE_OBJ(&ep->thr->netif, ep->id)->waitable.state != CI_TCP_STATE_ACTIVE_WILD ) { - OO_DEBUG_ERR(ci_log(FEP_FMT "ERROR: O/S socket still referenced", - FEP_PRI_ARGS(ep))); + OO_DEBUG_ERR(ci_log( + FEP_FMT "ERROR: O/S socket still referenced", FEP_PRI_ARGS(ep))); } files_to_drop[num_files_to_drop++] = ep->os_socket; ep->os_socket = NULL; @@ -161,8 +158,8 @@ tcp_helper_endpoint_dtor(tcp_helper_endpoint_t * ep) fput(files_to_drop[i]); if( ep->alien_ref != NULL ) { - OO_DEBUG_ERR(ci_log(FEP_FMT "ERROR: alien socket still referenced", - FEP_PRI_ARGS(ep))); + OO_DEBUG_ERR(ci_log( + FEP_FMT "ERROR: alien socket still referenced", FEP_PRI_ARGS(ep))); fput(ep->alien_ref->_filp); ep->alien_ref = NULL; } @@ -176,17 +173,16 @@ tcp_helper_endpoint_dtor(tcp_helper_endpoint_t * ep) #if CI_CFG_ENDPOINT_MOVE -static int -tcp_helper_endpoint_reuseaddr_cleanup(ci_netif* ni, ci_sock_cmn* s) +static int tcp_helper_endpoint_reuseaddr_cleanup(ci_netif* ni, ci_sock_cmn* s) { int i; if( (~s->b.state & CI_TCP_STATE_TCP) || s->b.state == CI_TCP_LISTEN ) return 0; - for( i = 0; i < (int)ni->state->n_ep_bufs; ++i ) { + for( i = 0; i < (int) ni->state->n_ep_bufs; ++i ) { citp_waitable_obj* wo = ID_TO_WAITABLE_OBJ(ni, i); - + if( wo->waitable.state != CI_TCP_TIME_WAIT ) continue; @@ -231,8 +227,8 @@ tcp_helper_endpoint_reuseaddr_cleanup(ci_netif* ni, ci_sock_cmn* s) * lIP/lp rIP/rp from_tcp_id=n TCP connection passively opened * (use filter from this TCP ep) * aIP/ap rIP/rp s_flags & TPROXY - * && phys_port=n TCP connection using transparent - * shared filter + * && phys_port=n TCP connection using + *transparent shared filter * * *--------------------------------------------------------------------*/ @@ -242,13 +238,12 @@ tcp_helper_endpoint_reuseaddr_cleanup(ci_netif* ni, ci_sock_cmn* s) * normally scheduled to be done asnychronously by tcp_helper_do_non_atomic() * in workqueue context. * Flushing is required before setting new filter. */ -static int -tcp_helper_flush_clear_filters(tcp_helper_endpoint_t* ep) +static int tcp_helper_flush_clear_filters(tcp_helper_endpoint_t* ep) { #if ! CI_CFG_UL_INTERRUPT_HELPER /* Avoid racing with tcp_helper_do_non_atomic(). */ unsigned ep_aflags; - ci_assert( ci_netif_is_locked(&ep->thr->netif) ); + ci_assert(ci_netif_is_locked(&ep->thr->netif)); again: if( (ep_aflags = ep->ep_aflags) & OO_THR_EP_AFLAG_NON_ATOMIC ) { if( in_atomic() ) @@ -258,29 +253,28 @@ tcp_helper_flush_clear_filters(tcp_helper_endpoint_t* ep) * retransmission. */ return -EAGAIN; /* do not expect this endpoint to be going to be freed */ - ci_assert(!(ep_aflags & OO_THR_EP_AFLAG_NEED_FREE)); + ci_assert(! (ep_aflags & OO_THR_EP_AFLAG_NEED_FREE)); if( (ep_aflags = ep->ep_aflags) & OO_THR_EP_AFLAG_CLEAR_FILTERS ) { /* let us try to steal the flag, so we can do the operation ourselves */ if( ci_cas32_fail(&ep->ep_aflags, ep_aflags, - ep_aflags & ~ OO_THR_EP_AFLAG_CLEAR_FILTERS) ) + ep_aflags & ~OO_THR_EP_AFLAG_CLEAR_FILTERS) ) goto again; /* we have stolen the flag, clearing the filters */ tcp_helper_endpoint_clear_filters(ep, 0); return 0; } - /* Looks we clashed with the tcp_helper_do_non_atomic() while it is running, - * let us wait till it finishes */ + /* Looks we clashed with the tcp_helper_do_non_atomic() while it is + * running, let us wait till it finishes */ flush_work(&ep->thr->non_atomic_work); - ci_assert(!(ep->ep_aflags & OO_THR_EP_AFLAG_NON_ATOMIC)); + ci_assert(! (ep->ep_aflags & OO_THR_EP_AFLAG_NON_ATOMIC)); } #endif return 0; } -static int -ci_tcp_use_mac_filter(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex, - oo_sp from_tcp_id) +static int ci_tcp_use_mac_filter( + ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex, oo_sp from_tcp_id) { int use_mac_filter = 0; int mode; @@ -300,8 +294,9 @@ ci_tcp_use_mac_filter(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex, /* Passively opened sockets accepted from a listener using a MAC filter * also use the MAC filter. */ - use_mac_filter |= OO_SP_NOT_NULL(from_tcp_id) && - (SP_TO_SOCK(ni, from_tcp_id)->s_flags & CI_SOCK_FLAG_STACK_FILTER); + use_mac_filter |= + OO_SP_NOT_NULL(from_tcp_id) && + (SP_TO_SOCK(ni, from_tcp_id)->s_flags & CI_SOCK_FLAG_STACK_FILTER); #ifndef BREAK_SCALABLE_FILTERS if( (use_mac_filter == 0) && (s->b.state == CI_TCP_LISTEN) && @@ -319,9 +314,8 @@ ci_tcp_use_mac_filter(ci_netif* ni, ci_sock_cmn* s, ci_ifid_t ifindex, } -int -tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, - ci_ifid_t bindto_ifindex, oo_sp from_tcp_id) +int tcp_helper_endpoint_set_filters( + tcp_helper_endpoint_t* ep, ci_ifid_t bindto_ifindex, oo_sp from_tcp_id) { struct file* os_sock_ref; ci_netif* ni = &ep->thr->netif; @@ -337,9 +331,9 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, ! CI_IPX_ADDR_IS_ANY(sock_raddr(s)); #endif - OO_DEBUG_TCPH(ci_log("%s: [%d:%d] bindto_ifindex=%d from_tcp_id=%d", - __FUNCTION__, ep->thr->id, - OO_SP_FMT(ep->id), bindto_ifindex, from_tcp_id)); + OO_DEBUG_TCPH( + ci_log("%s: [%d:%d] bindto_ifindex=%d from_tcp_id=%d", __FUNCTION__, + ep->thr->id, OO_SP_FMT(ep->id), bindto_ifindex, from_tcp_id)); /* Make sure the endpoint is not subject to pending async filter operations. * @@ -349,12 +343,12 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, * Before proceeding with setting the filter a pending filter clear * operation needs to be flushed. */ rc = tcp_helper_flush_clear_filters(ep); - if(CI_UNLIKELY( rc < 0 )) + if( CI_UNLIKELY(rc < 0) ) return rc; /* The lock is needed for assertions with CI_NETIF_FLAG_IN_DL_CONTEXT * flag only. */ - ci_assert( ci_netif_is_locked(&ep->thr->netif) ); + ci_assert(ci_netif_is_locked(&ep->thr->netif)); #if CI_CFG_FD_CACHING /* The special cases that allow active-wild sharers to be cacheable depend on @@ -379,14 +373,11 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, */ spin_lock_irqsave(&ep->lock, lock_flags); if( OO_SP_NOT_NULL(from_tcp_id) && - ! ( use_mac_filter && - NI_OPTS(ni).scalable_listen == - CITP_SCALABLE_LISTEN_ACCELERATED_ONLY ) ) { - + ! (use_mac_filter && NI_OPTS(ni).scalable_listen == + CITP_SCALABLE_LISTEN_ACCELERATED_ONLY) ) { listen_ep = ci_trs_get_valid_ep(ep->thr, from_tcp_id); os_sock_ref = listen_ep->os_socket; - } - else { + } else { os_sock_ref = ep->os_socket; } if( os_sock_ref != NULL ) @@ -406,8 +397,8 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, * However, the user can call OO_IOC_EP_FILTER_SET for any endpoint, * and we should not crash (at least in NDEBUG build). */ ci_assert(ep->os_port_keeper); - ci_assert( ! in_atomic() ); - ci_assert( ~ep->thr->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT ); + ci_assert(! in_atomic()); + ci_assert(~ep->thr->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT); ci_assert_equal(protocol, IPPROTO_UDP); /* Closing a listening socket without being able to get the stack @@ -419,41 +410,40 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, if( os_sock_ref != NULL ) { fput(os_sock_ref); os_sock_ref = NULL; - } - else { - OO_DEBUG_ERR(ci_log( - "ERROR: %s is changing the socket [%d:%d] filter to " - "%s " IPX_PORT_FMT " -> " IPX_PORT_FMT ", " - "the filter already exists and there is no backing socket. " - "Something went awry.", - __func__, ep->thr->id, OO_SP_FMT(ep->id), - protocol == IPPROTO_UDP ? "UDP" : "TCP", - IPX_ARG(AF_IP(laddr)), lport, IPX_ARG(AF_IP(raddr)), rport)); + } else { + OO_DEBUG_ERR( + ci_log("ERROR: %s is changing the socket [%d:%d] filter to " + "%s " IPX_PORT_FMT " -> " IPX_PORT_FMT ", " + "the filter already exists and there is no backing socket. " + "Something went awry.", + __func__, ep->thr->id, OO_SP_FMT(ep->id), + protocol == IPPROTO_UDP ? "UDP" : "TCP", IPX_ARG(AF_IP(laddr)), + lport, IPX_ARG(AF_IP(raddr)), rport)); ci_assert(0); } - if( protocol == IPPROTO_UDP && !CI_IPX_ADDR_IS_ANY(raddr) && + if( protocol == IPPROTO_UDP && ! CI_IPX_ADDR_IS_ANY(raddr) && CI_IPX_ADDR_IS_ANY(ep->oofilter.sf_raddr) ) { return oof_udp_connect(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter, af_space, laddr, raddr, rport); + &ep->oofilter, af_space, laddr, raddr, rport); } if( protocol != IPPROTO_UDP ) { /* UDP re-connect is OK, but we do not expect anything else. * We've already crashed in DEBUG, but let's complain in NDEBUG. */ - OO_DEBUG_ERR(ci_log( - "ERROR: %s is changing the socket [%d:%d] filter to " - "%s " IPX_PORT_FMT" -> " IPX_PORT_FMT ", " - "but some filter is already installed. Something went awry.", - __func__, ep->thr->id, OO_SP_FMT(ep->id), - protocol == IPPROTO_UDP ? "UDP" : "TCP", - IPX_ARG(AF_IP(laddr)), lport, IPX_ARG(AF_IP(raddr)), rport)); + OO_DEBUG_ERR( + ci_log("ERROR: %s is changing the socket [%d:%d] filter to " + "%s " IPX_PORT_FMT " -> " IPX_PORT_FMT ", " + "but some filter is already installed. Something went awry.", + __func__, ep->thr->id, OO_SP_FMT(ep->id), + protocol == IPPROTO_UDP ? "UDP" : "TCP", IPX_ARG(AF_IP(laddr)), + lport, IPX_ARG(AF_IP(raddr)), rport)); /* Filter is cleared so that endpoint comes back to consistent state: * tcp sockets after failed set filter operations have no filter. * However, as we are afraid that endpoint is compromised we * return error to prevent its use. */ - tcp_helper_endpoint_clear_filters - (ep, - (ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT) ? - EP_CLEAR_FILTERS_FLAG_SUPRESS_HW : 0); + tcp_helper_endpoint_clear_filters( + ep, (ni->flags & CI_NETIF_FLAG_IN_DL_CONTEXT) + ? EP_CLEAR_FILTERS_FLAG_SUPRESS_HW + : 0); return -EALREADY; } oof_socket_del(oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); @@ -468,19 +458,20 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, rc = ci_tcp_sock_set_stack_filter(ni, SP_TO_SOCK(ni, ep->id)); else #endif - if( OO_SP_NOT_NULL(from_tcp_id) ) + if( OO_SP_NOT_NULL(from_tcp_id) ) rc = oof_socket_share(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter, &listen_ep->oofilter, - af_space, laddr, raddr, lport, rport); + &ep->oofilter, &listen_ep->oofilter, af_space, laddr, raddr, lport, + rport); else { int flags; - ci_assert( ! in_atomic() ); - ci_assert( ~ep->thr->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT ); + ci_assert(! in_atomic()); + ci_assert(~ep->thr->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT); flags = #if CI_CFG_ENDPOINT_MOVE - (ep->thr->thc != NULL && (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0) ? - OOF_SOCKET_ADD_FLAG_CLUSTERED : + (ep->thr->thc != NULL && (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0) + ? OOF_SOCKET_ADD_FLAG_CLUSTERED + : #endif 0; @@ -500,22 +491,22 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, } rc = oof_socket_add(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter, flags, protocol, - af_space, laddr, lport, raddr, rport, NULL); + &ep->oofilter, flags, protocol, af_space, laddr, lport, raddr, rport, + NULL); #if CI_CFG_ENDPOINT_MOVE if( rc != 0 && rc != -EFILTERSSOME && (s->s_flags & CI_SOCK_FLAG_REUSEADDR) && tcp_helper_endpoint_reuseaddr_cleanup(&ep->thr->netif, s) ) { rc = oof_socket_add(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter, flags, protocol, - af_space, laddr, lport, raddr, rport, NULL); + &ep->oofilter, flags, protocol, af_space, laddr, lport, raddr, rport, + NULL); } #endif if( rc == 0 || rc == -EFILTERSSOME ) s->s_flags |= CI_SOCK_FLAG_FILTER; } - set_os_port_keeper_and_out: +set_os_port_keeper_and_out: if( os_sock_ref != NULL && (rc == 0 || rc == -EFILTERSSOME) ) os_sock_ref = oo_file_xchg(&ep->os_port_keeper, os_sock_ref); if( os_sock_ref != NULL ) @@ -525,8 +516,9 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, if( rc == 0 && enable_recycler ) { int intf_i; int stream_count = 0; - ci_assert( ! in_atomic() ); - OO_STACK_FOR_EACH_INTF_I(ni, intf_i) { + ci_assert(! in_atomic()); + OO_STACK_FOR_EACH_INTF_I(ni, intf_i) + { struct xsn_ceph_create_stream create; ci_netif_state_nic_t* nsn = &ni->state->nic[intf_i]; @@ -537,10 +529,10 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, if( ! ci_netif_tcp_plugin_uses_p2h(ni, intf_i) && intf_i != s->pkt.intf_i ) continue; - create = (struct xsn_ceph_create_stream){ + create = (struct xsn_ceph_create_stream) { .tcp.in_app_id = cpu_to_le32(ni->nic_hw[intf_i].plugin_rx_app_id), .tcp.in_user_mark = cpu_to_le32(ep->id), - .tcp.in_synchronised = false, /* passive-open not supported */ + .tcp.in_synchronised = false, /* passive-open not supported */ .tcp.in_source_ip = raddr.ip4, .tcp.in_dest_ip = laddr.ip4, .tcp.in_source_port = rport, @@ -548,7 +540,7 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, .in_data_buf_capacity = NI_OPTS(ni).ceph_data_buf_bytes, }; rc = efrm_ext_msg(ni->nic_hw[intf_i].plugin_rx, XSN_CEPH_CREATE_STREAM, - &create, sizeof(create)); + &create, sizeof(create)); if( rc ) { OO_DEBUG_ERR(ci_log("ERROR: Can't create Ceph stream state (%d)", rc)); continue; @@ -564,13 +556,12 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, } if( stream_count > 0 ) { rc = 0; - } - else { + } else { /* Current policy is to hand over, so choose an error code that will * cause this. We may add alternative options later. */ rc = -EBUSY; - oof_socket_del(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter); + oof_socket_del( + oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); } } #endif @@ -589,32 +580,28 @@ tcp_helper_endpoint_set_filters(tcp_helper_endpoint_t* ep, * *--------------------------------------------------------------------*/ -int -tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, - int flags) +int tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, int flags) { struct file* os_sock_ref; ci_sock_cmn* s = SP_TO_SOCK(&ep->thr->netif, ep->id); int rc = 0; int handled_flags = CI_SOCK_FLAG_FILTER | CI_SOCK_FLAG_STACK_FILTER; - OO_DEBUG_TCPH( - ci_log("%s: [%d:%d] %s%s%s", __FUNCTION__, ep->thr->id, OO_SP_FMT(ep->id), - in_atomic() ? "ATOMIC":"", - flags & EP_CLEAR_FILTERS_FLAG_SUPRESS_HW ? " SUPRESS_HW":"", - flags & EP_CLEAR_FILTERS_FLAG_NEED_UPDATE ? " NEED_UPDATE":"") - ); + OO_DEBUG_TCPH(ci_log("%s: [%d:%d] %s%s%s", __FUNCTION__, ep->thr->id, + OO_SP_FMT(ep->id), in_atomic() ? "ATOMIC" : "", + flags & EP_CLEAR_FILTERS_FLAG_SUPRESS_HW ? " SUPRESS_HW" : "", + flags & EP_CLEAR_FILTERS_FLAG_NEED_UPDATE ? " NEED_UPDATE" : "")); /* Sockets have either FILTER or MAC_FILTER with exception of * scalable SO_REUSEPORT listen sockets, which can have both */ ci_assert_impl(! (s->b.state == CI_TCP_LISTEN && - (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0), - (s->s_flags & CI_SOCK_FLAG_FILTER) == 0 || - (s->s_flags & CI_SOCK_FLAG_STACK_FILTER) == 0); + (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0), + (s->s_flags & CI_SOCK_FLAG_FILTER) == 0 || + (s->s_flags & CI_SOCK_FLAG_STACK_FILTER) == 0); #if CI_CFG_FD_CACHING if( (flags & EP_CLEAR_FILTERS_FLAG_NEED_UPDATE) && - !(s->s_flags & CI_SOCK_FLAGS_SCALABLE) ) + ! (s->s_flags & CI_SOCK_FLAGS_SCALABLE) ) tcp_helper_endpoint_update_filter_details(ep); #endif @@ -622,11 +609,12 @@ tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, ci_assert_flags(flags, EP_CLEAR_FILTERS_FLAG_SUPRESS_HW); } - if( (s->s_flags & (CI_SOCK_FLAGS_SCALABLE | CI_SOCK_FLAG_STACK_FILTER)) != 0 ) { + if( (s->s_flags & (CI_SOCK_FLAGS_SCALABLE | CI_SOCK_FLAG_STACK_FILTER)) != + 0 ) { #ifndef BREAK_SCALABLE_FILTERS if( (s->s_flags & CI_SOCK_FLAG_STACK_FILTER) != 0 ) - ci_tcp_sock_clear_stack_filter(&ep->thr->netif, - SP_TO_TCP(&ep->thr->netif,ep->id)); + ci_tcp_sock_clear_stack_filter( + &ep->thr->netif, SP_TO_TCP(&ep->thr->netif, ep->id)); #endif if( (s->s_flags & CI_SOCK_FLAG_FILTER) == 0 ) { @@ -645,8 +633,8 @@ tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, * delivered to this endpoint. Defer oof_socket_del() if needed * to non-atomic context. */ - if( oof_socket_del_sw(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter) ) { + if( oof_socket_del_sw( + oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter) ) { tcp_helper_endpoint_queue_non_atomic(ep, OO_THR_EP_AFLAG_CLEAR_FILTERS); /* If we have been called from atomic context, we sill might actually * have a hw filter. However in such a case there is a non-atomic work @@ -654,20 +642,18 @@ tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, * socket filter flags */ rc = -EAGAIN; handled_flags = CI_SOCK_FLAG_STACK_FILTER; - } - else { + } else { os_sock_ref = oo_file_xchg(&ep->os_port_keeper, NULL); if( os_sock_ref != NULL ) fput(os_sock_ref); } - } - else + } else #endif { clear_plugin_state(ep); oof_socket_del(oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); - oof_socket_mcast_del_all(oo_filter_ns_to_manager(ep->thr->filter_ns), - &ep->oofilter); + oof_socket_mcast_del_all( + oo_filter_ns_to_manager(ep->thr->filter_ns), &ep->oofilter); os_sock_ref = oo_file_xchg(&ep->os_port_keeper, NULL); if( os_sock_ref != NULL ) fput(os_sock_ref); @@ -697,16 +683,14 @@ tcp_helper_endpoint_clear_filters(tcp_helper_endpoint_t* ep, * This function MUST NOT clear software filters from ep_from, * because there might be handled packets for it in the stack rx queue. */ -int -tcp_helper_endpoint_move_filters_pre(tcp_helper_endpoint_t* ep_from, - tcp_helper_endpoint_t* ep_to, - int drop_filter) +int tcp_helper_endpoint_move_filters_pre(tcp_helper_endpoint_t* ep_from, + tcp_helper_endpoint_t* ep_to, int drop_filter) { struct file* os_sock_ref; int rc; ci_sock_cmn* s = SP_TO_SOCK(&ep_from->thr->netif, ep_from->id); - ci_assert(!in_atomic()); + ci_assert(! in_atomic()); if( ep_to->os_port_keeper != NULL ) { ci_log("%s: non-null target port keeper", __func__); @@ -718,21 +702,20 @@ tcp_helper_endpoint_move_filters_pre(tcp_helper_endpoint_t* ep_from, ep_from->oofilter.sf_local_port != NULL ) { if( (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0 && (NI_OPTS(&ep_from->thr->netif).cluster_ignore == 0 || - NI_OPTS(&ep_to->thr->netif).cluster_ignore == 0) ) { - LOG_E(ci_log("%s: ERROR: reuseport being set and socket not closed", - __func__)); + NI_OPTS(&ep_to->thr->netif).cluster_ignore == 0) ) { + LOG_E(ci_log( + "%s: ERROR: reuseport being set and socket not closed", __func__)); return -EINVAL; } rc = tcp_helper_endpoint_set_filters(ep_to, CI_IFID_BAD, OO_SP_NULL); if( rc != 0 ) return rc; - } - else { + } else { /* Before further operations we need to ensure no clear filter operations * is pending, typically tcp_helper_endpoint_set_filters() would do that * but we do not call it here */ rc = tcp_helper_flush_clear_filters(ep_to); - if(CI_UNLIKELY( rc < 0 )) + if( CI_UNLIKELY(rc < 0) ) return rc; } @@ -757,9 +740,8 @@ tcp_helper_endpoint_move_filters_pre(tcp_helper_endpoint_t* ep_from, * All ep_from filters should be cleared; * ep_to should have properly-installed filters. */ -void -tcp_helper_endpoint_move_filters_post(tcp_helper_endpoint_t* ep_from, - tcp_helper_endpoint_t* ep_to) +void tcp_helper_endpoint_move_filters_post( + tcp_helper_endpoint_t* ep_from, tcp_helper_endpoint_t* ep_to) { tcp_helper_endpoint_clear_filters(ep_from, 0); } @@ -768,9 +750,8 @@ tcp_helper_endpoint_move_filters_post(tcp_helper_endpoint_t* ep_from, * All ep_to filters should be cleared; * ep_from should have properly-installed filters. */ -void -tcp_helper_endpoint_move_filters_undo(tcp_helper_endpoint_t* ep_from, - tcp_helper_endpoint_t* ep_to) +void tcp_helper_endpoint_move_filters_undo( + tcp_helper_endpoint_t* ep_from, tcp_helper_endpoint_t* ep_to) { struct file* os_sock_ref; @@ -786,42 +767,39 @@ tcp_helper_endpoint_move_filters_undo(tcp_helper_endpoint_t* ep_from, tcp_helper_endpoint_clear_filters(ep_to, 0); } -void -tcp_helper_endpoint_update_filter_details(tcp_helper_endpoint_t* ep) +void tcp_helper_endpoint_update_filter_details(tcp_helper_endpoint_t* ep) { ci_netif* ni = &ep->thr->netif; ci_sock_cmn* s = SP_TO_SOCK(ni, ep->id); struct oof_manager* om = oo_filter_ns_to_manager(ep->thr->filter_ns); - if( !(s->s_flags & (CI_SOCK_FLAG_STACK_FILTER | CI_SOCK_FLAGS_SCALABLE)) ) - oof_socket_update_sharer_details(om, &ep->oofilter, - sock_ipx_raddr(s), sock_rport_be16(s)); + if( ! (s->s_flags & (CI_SOCK_FLAG_STACK_FILTER | CI_SOCK_FLAGS_SCALABLE)) ) + oof_socket_update_sharer_details( + om, &ep->oofilter, sock_ipx_raddr(s), sock_rport_be16(s)); } static void oof_socket_dump_fn(void* arg, oo_dump_log_fn_t log, void* log_arg) { -/* FIXME SCJ OOF */ + /* FIXME SCJ OOF */ oof_onload_socket_dump(&efab_tcp_driver, arg, log, log_arg); } static void oof_manager_dump_fn(void* arg, oo_dump_log_fn_t log, void* log_arg) { -/* FIXME SCJ OOF */ + /* FIXME SCJ OOF */ oof_onload_manager_dump(&efab_tcp_driver, log, log_arg); } -int -tcp_helper_endpoint_filter_dump(tcp_helper_resource_t* thr, oo_sp sockp, - void* user_buf, int user_buf_len) +int tcp_helper_endpoint_filter_dump( + tcp_helper_resource_t* thr, oo_sp sockp, void* user_buf, int user_buf_len) { if( OO_SP_NOT_NULL(sockp) ) { tcp_helper_endpoint_t* ep = ci_trs_get_valid_ep(thr, sockp); - return oo_dump_to_user(oof_socket_dump_fn, &ep->oofilter, - user_buf, user_buf_len); - } - else { + return oo_dump_to_user( + oof_socket_dump_fn, &ep->oofilter, user_buf, user_buf_len); + } else { return oo_dump_to_user(oof_manager_dump_fn, NULL, user_buf, user_buf_len); } } @@ -840,11 +818,10 @@ tcp_helper_endpoint_filter_dump(tcp_helper_resource_t* thr, oo_sp sockp, * *--------------------------------------------------------------------*/ -int -tcp_helper_endpoint_shutdown(tcp_helper_resource_t* thr, oo_sp ep_id, - int how, ci_uint32 old_state) +int tcp_helper_endpoint_shutdown( + tcp_helper_resource_t* thr, oo_sp ep_id, int how, ci_uint32 old_state) { - tcp_helper_endpoint_t * ep = ci_trs_get_valid_ep(thr, ep_id); + tcp_helper_endpoint_t* ep = ci_trs_get_valid_ep(thr, ep_id); int rc, supress_hw_ops = thr->netif.flags & CI_NETIF_FLAG_IN_DL_CONTEXT; ci_assert_equal(old_state, CI_TCP_LISTEN); @@ -852,27 +829,27 @@ tcp_helper_endpoint_shutdown(tcp_helper_resource_t* thr, oo_sp ep_id, /* This must be done before we remove filters, as the information must be * correct for sockets sharing our filter when we do the un-share fixup. */ - ci_tcp_listen_update_cached(&thr->netif, - SP_TO_TCP_LISTEN(&thr->netif, ep->id)); + ci_tcp_listen_update_cached( + &thr->netif, SP_TO_TCP_LISTEN(&thr->netif, ep->id)); #endif /* Calling shutdown on the socket unbinds it in most situations. * Since we must never have a filter configured for an unbound * socket, we clear the filters here. */ tcp_helper_endpoint_clear_filters( - ep, supress_hw_ops ? EP_CLEAR_FILTERS_FLAG_SUPRESS_HW : 0); + ep, supress_hw_ops ? EP_CLEAR_FILTERS_FLAG_SUPRESS_HW : 0); /* Filter flags should have been cleared by * tcp_helper_endpoint_clear_filters. */ ci_assert_nflags(SP_TO_SOCK(&thr->netif, ep_id)->s_flags, - (CI_SOCK_FLAG_FILTER | CI_SOCK_FLAG_STACK_FILTER)); + (CI_SOCK_FLAG_FILTER | CI_SOCK_FLAG_STACK_FILTER)); rc = efab_tcp_helper_shutdown_os_sock(ep, how); #if ! CI_CFG_UL_INTERRUPT_HELPER ci_assert(ci_netif_is_locked(&thr->netif)); - ci_tcp_listen_shutdown_queues(&thr->netif, - SP_TO_TCP_LISTEN(&thr->netif, ep->id)); + ci_tcp_listen_shutdown_queues( + &thr->netif, SP_TO_TCP_LISTEN(&thr->netif, ep->id)); #endif return rc; } diff --git a/src/lib/transport/ip/ip_internal.h b/src/lib/transport/ip/ip_internal.h index 0190dc6d6..07972fad5 100644 --- a/src/lib/transport/ip/ip_internal.h +++ b/src/lib/transport/ip/ip_internal.h @@ -63,7 +63,7 @@ **************************** Logging etc. ***************************** **********************************************************************/ -extern unsigned ci_tp_log CI_HV; +extern unsigned ci_tp_log CI_HV; extern unsigned ci_tp_max_dump CI_HV; @@ -130,8 +130,8 @@ ci_inline void ci_tcp_update_rtt(ci_netif* netif, ci_tcp_state* ts, int m) ts->rto = tcp_srtt(ts) + ts->sv; /* RTO <- SRTT + 4*RTTVAR */ } else { /* first rtt estimate so follow (2.2) of RFC2988 */ - ts->sa = (m << 3u); - ts->sv = (m << 1u); + ts->sa = (m << 3u); + ts->sv = (m << 1u); ts->rto = m + ts->sv; } @@ -163,7 +163,7 @@ void ip_cmsg_recv_timestamping(ci_netif* ni, const ci_ip_pkt_fmt* pkt, do { \ ci_uint64 __sleep_seq; \ ci_uint32 t = (timeout); \ - *(prc) = 0; \ + *(prc) = 0; \ while( 1 ) { \ __sleep_seq = (w)->sleep_seq.all; \ ci_rmb(); \ @@ -227,7 +227,7 @@ ci_inline int ci_tcp_ep_set_filters( ci_netif_get_driver_handle(ni), sock_id, bindto_ifindex, from_tcp_id); #endif - LOG_U(if( rc < 0 ) ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); + LOG_TC(if( rc < 0 ) ci_log(" ---> %s (rc=%d)", __FUNCTION__, rc)); return rc; } @@ -400,10 +400,10 @@ ci_inline int ci_tcp_ep_mcast_add_del(ci_netif* ni, oo_sp sock_id, * the headers in use. */ struct oo_sock_extended_err { ci_uint32 ee_errno; - ci_uint8 ee_origin; - ci_uint8 ee_type; - ci_uint8 ee_code; - ci_uint8 ee_pad; + ci_uint8 ee_origin; + ci_uint8 ee_type; + ci_uint8 ee_code; + ci_uint8 ee_pad; ci_uint32 ee_info; ci_uint32 ee_data; }; @@ -451,7 +451,7 @@ ci_inline int ci_getsockopt_final( { if( (level == SOL_SOCKET || level == SOL_IP) && val_size == sizeof(int) && *optlen >= sizeof(char) && *optlen < sizeof(int) ) { - int ival = *((int*) val); + int ival = *((int*) val); unsigned char ucval = (unsigned char) ival; if( ival >= 0 && ival <= 255 ) return ci_getsockopt_final_pre( @@ -566,7 +566,7 @@ extern int ci_set_sol_socket_nolock(ci_netif*, ci_sock_cmn* s, int optname, #ifdef __KERNEL__ #define CI_IOCTL_ARG_OK(t, a) \ ({ \ - t _v; \ + t _v; \ int _rc = get_user(_v, (t*) (a)); \ (void) _v; \ _rc == 0; \ @@ -628,8 +628,8 @@ extern int ci_set_sol_socket_nolock(ci_netif*, ci_sock_cmn* s, int optname, * \param os_socket_exists Non-zero if OS socket extsts * \return As for ioctl() */ -extern int ci_cmn_ioctl(ci_netif* netif, ci_sock_cmn* s, int request, - void* arg, int os_rc, int os_socket_exists); +extern int ci_cmn_ioctl(ci_netif* netif, ci_sock_cmn* s, int request, + void* arg, int os_rc, int os_socket_exists); /*! Compute the time stamp delta for the given packet time stamp and * return in in ts @@ -743,7 +743,7 @@ ci_inline int oo_spinloop_pause_check_signals(ci_netif* ni, #ifndef __KERNEL__ extern citp_init_thread_callback init_thread_callback CI_HV; -extern oo_signal_terminate_fn signal_terminate_fn CI_HV; +extern oo_signal_terminate_fn signal_terminate_fn CI_HV; #endif @@ -787,7 +787,7 @@ ci_netif_pkt_release_in_poll( ci_netif_pkt_put(netif, pkt); } else if( ps != NULL ) { *ps->tx_pkt_free_list_insert = OO_PKT_P(pkt); - ps->tx_pkt_free_list_insert = &pkt->next; + ps->tx_pkt_free_list_insert = &pkt->next; ++ps->tx_pkt_free_list_n; } else { ci_netif_pkt_free_nonb_list(netif, OO_PKT_P(pkt), pkt); @@ -843,8 +843,8 @@ ci_inline void ci_pkt_zc_free_clean( ****************************** ZC send offloads ********************* *********************************************************************/ -ci_int8 ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix); +ci_int8 ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, + struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix); ci_uint8 ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix); diff --git a/src/lib/transport/ip/netif_event.c b/src/lib/transport/ip/netif_event.c index 3a7ae977d..3284e146e 100644 --- a/src/lib/transport/ip/netif_event.c +++ b/src/lib/transport/ip/netif_event.c @@ -183,6 +183,7 @@ int ci_ip_options_parse(ci_netif* netif, ci_ip4_hdr* ip, const int hdr_size) return error; } +#if CI_CFG_TIMESTAMPING static void record_rx_timestamp(ci_netif* netif, ci_netif_state_nic_t* nsn, ci_ip_pkt_fmt* pkt, ef_timespec stamp, unsigned sync_flags) { @@ -200,6 +201,7 @@ static void record_rx_timestamp(ci_netif* netif, ci_netif_state_nic_t* nsn, LOG_NR(log(LPF "RX id=%d timestamp: %lu.%09lu sync %d", OO_PKT_FMT(pkt), (long) stamp.tv_sec, stamp.tv_nsec, sync_flags)); } +#endif static void get_rx_timestamp(ci_netif* netif, ci_ip_pkt_fmt* pkt) { diff --git a/src/lib/transport/ip/netif_pkt.c b/src/lib/transport/ip/netif_pkt.c index b42c134ad..29ee20260 100644 --- a/src/lib/transport/ip/netif_pkt.c +++ b/src/lib/transport/ip/netif_pkt.c @@ -12,7 +12,7 @@ /*! \cidoxg_lib_transport_ip */ #include "ip_internal.h" -#if !defined(__KERNEL__) +#if ! defined(__KERNEL__) #include #include @@ -23,9 +23,9 @@ ci_ip_pkt_fmt* __ci_netif_pkt(ci_netif* ni, unsigned id) int rc; ci_ip_pkt_fmt* pkt = 0; unsigned setid = id >> CI_CFG_PKTS_PER_SET_S; - void *p; + void* p; - ci_assert(id != (unsigned)(-1)); + ci_assert(id != (unsigned) (-1)); pthread_mutex_lock(&citp_pkt_map_lock); /* Recheck the condition now we have the lock */ @@ -36,44 +36,40 @@ ci_ip_pkt_fmt* __ci_netif_pkt(ci_netif* ni, unsigned id) #if CI_CFG_PKTS_AS_HUGE_PAGES if( ni->packets->set[setid].shm_id >= 0 ) { p = shmat(ni->packets->set[setid].shm_id, NULL, 0); - if( p == (void *)-1) { + if( p == (void*) -1 ) { if( errno == EACCES ) { - ci_log("Failed to mmap packet buffer for [%s] with errno=EACCES.\n" - "Probably, you are using this stack from processes with " - "different UIDs.\n" - "Try either allowing user stack sharing: EF_SHARE_WITH=-1\n" - "or turn off huge pages: EF_USE_HUGE_PAGES=0\n", - ni->state->pretty_name); - } - else { + ci_log( + "Failed to mmap packet buffer for [%s] with errno=EACCES.\n" + "Probably, you are using this stack from processes with " + "different UIDs.\n" + "Try either allowing user stack sharing: EF_SHARE_WITH=-1\n" + "or turn off huge pages: EF_USE_HUGE_PAGES=0\n", + ni->state->pretty_name); + } else { ci_log("%s: shmat(0x%x) failed for pkt set %d (%d)", __FUNCTION__, - ni->packets->set[setid].shm_id, setid, -errno); + ni->packets->set[setid].shm_id, setid, -errno); } goto out; } - } - else + } else #endif { - rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), - OO_MMAP_TYPE_NETIF, - CI_NETIF_MMAP_ID_PKTSET(setid), - CI_CFG_PKT_BUF_SIZE * PKTS_PER_SET, - OO_MMAP_FLAG_POPULATE, - &p); + rc = oo_resource_mmap(ci_netif_get_driver_handle(ni), OO_MMAP_TYPE_NETIF, + CI_NETIF_MMAP_ID_PKTSET(setid), CI_CFG_PKT_BUF_SIZE * PKTS_PER_SET, + OO_MMAP_FLAG_POPULATE, &p); if( rc < 0 ) { - ci_log("%s: oo_resource_mmap for pkt set %d failed (%d)", - __FUNCTION__, setid, rc); + ci_log("%s: oo_resource_mmap for pkt set %d failed (%d)", __FUNCTION__, + setid, rc); goto out; } } ci_assert(p); ni->pkt_bufs[setid] = p; - got_pkt_out: +got_pkt_out: pkt = (ci_ip_pkt_fmt*) __PKT_BUF(ni, id); - out: +out: pthread_mutex_unlock(&citp_pkt_map_lock); if( CI_UNLIKELY(pkt == NULL) ) { ci_log("Failed to map packets!"); @@ -89,8 +85,8 @@ ci_ip_pkt_fmt* __ci_netif_pkt(ci_netif* ni, unsigned id) int ci_netif_pktset_best(ci_netif* ni) { int i, ret = -1, n_free = 0; - - for( i = 0; i < ni->packets->sets_n; i ++ ) { + + for( i = 0; i < ni->packets->sets_n; i++ ) { if( ni->packets->set[i].n_free > n_free ) { n_free = ni->packets->set[i].n_free; ret = i; @@ -119,7 +115,7 @@ ci_ip_pkt_fmt* ci_netif_pkt_alloc_slow(ci_netif* ni, int flags) if( (flags & CI_PKT_ALLOC_USE_NONB) || (ni->packets->n_free == 0 && - ni->packets->sets_n == ni->packets->sets_max) ) + ni->packets->sets_n == ni->packets->sets_max) ) if( (pkt = ci_netif_pkt_alloc_nonb(ni)) != NULL ) { --ni->state->n_async_pkts; CITP_STATS_NETIF_INC(ni, pkt_nonb_steal); @@ -128,19 +124,19 @@ ci_ip_pkt_fmt* ci_netif_pkt_alloc_slow(ci_netif* ni, int flags) } if( flags & CI_PKT_ALLOC_FOR_TCP_TX ) - if(CI_UNLIKELY( ! ci_netif_pkt_tx_may_alloc(ni) )) + if( CI_UNLIKELY(! ci_netif_pkt_tx_may_alloc(ni)) ) return NULL; ci_assert_equal(ni->packets->id, NI_PKT_SET(ni)); ci_assert_equal(ni->packets->set[NI_PKT_SET(ni)].n_free, 0); ci_assert(OO_PP_IS_NULL(ni->packets->set[NI_PKT_SET(ni)].free)); #if OO_DO_STACK_POLL - again: +again: #endif bufset_id = ci_netif_pktset_best(ni); if( bufset_id != -1 ) { - ci_netif_pkt_set_change(ni, bufset_id, - ci_netif_pkt_set_is_underfilled(ni, bufset_id)); + ci_netif_pkt_set_change( + ni, bufset_id, ci_netif_pkt_set_is_underfilled(ni, bufset_id)); return ci_netif_pkt_get(ni, bufset_id); } @@ -169,14 +165,15 @@ ci_ip_pkt_fmt* ci_netif_pkt_alloc_slow(ci_netif* ni, int flags) } -ci_inline void __ci_dbg_poison_header(ci_ip_pkt_fmt* pkt, ci_uint32 pattern) +ci_inline void __ci_dbg_poison_header(ci_ip_pkt_fmt* pkt, ci_uint32 pattern) { unsigned i; - ci_uint32* pkt_u32 = (ci_uint32 *)oo_ether_hdr(pkt); + ci_uint32* pkt_u32 = (ci_uint32*) oo_ether_hdr(pkt); ci_uint32 patn_u32 = CI_BSWAP_BE32(pattern); - ci_uint32 len = (ETH_HLEN + ETH_VLAN_HLEN + 2) + sizeof(ci_ip4_hdr) + - sizeof(ci_tcp_hdr); - for( i = 0; i < len/4; i++ ) pkt_u32[i] = patn_u32; + ci_uint32 len = + (ETH_HLEN + ETH_VLAN_HLEN + 2) + sizeof(ci_ip4_hdr) + sizeof(ci_tcp_hdr); + for( i = 0; i < len / 4; i++ ) + pkt_u32[i] = patn_u32; } @@ -190,33 +187,33 @@ void ci_netif_set_merge_atomic_flag(ci_netif* ni) if( val & CI_EPLOCK_NETIF_MERGE_ATOMIC_COUNTERS ) break; else if( ef_eplock_set_flags_if_locked( - &ni->state->lock, - CI_EPLOCK_NETIF_MERGE_ATOMIC_COUNTERS) ) { + &ni->state->lock, CI_EPLOCK_NETIF_MERGE_ATOMIC_COUNTERS) ) { break; - } - else if( ci_netif_trylock(ni) ) { - ef_eplock_holder_set_flag(&ni->state->lock, - CI_EPLOCK_NETIF_MERGE_ATOMIC_COUNTERS); + } else if( ci_netif_trylock(ni) ) { + ef_eplock_holder_set_flag( + &ni->state->lock, CI_EPLOCK_NETIF_MERGE_ATOMIC_COUNTERS); ci_netif_unlock(ni); break; } if( iter-- == 0 ) { - ci_log("%s: [%d] failed to set MERGE_ATOMIC_COUNTERS flag, " - "something nasty is going on with the shared state " - "of the Onload stack", __func__, NI_ID(ni)); + ci_log( + "%s: [%d] failed to set MERGE_ATOMIC_COUNTERS flag, " + "something nasty is going on with the shared state " + "of the Onload stack", + __func__, NI_ID(ni)); break; } } } #endif -void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt - CI_KERNEL_ARG(int* p_netif_is_locked)) +void ci_netif_pkt_free( + ci_netif* ni, ci_ip_pkt_fmt* pkt CI_KERNEL_ARG(int* p_netif_is_locked)) { ci_assert(pkt->refcount == 0); #ifdef __KERNEL__ ci_assert(p_netif_is_locked); - ci_assert(!*p_netif_is_locked || ci_netif_is_locked(ni)); + ci_assert(! *p_netif_is_locked || ci_netif_is_locked(ni)); #else ci_assert(ci_netif_is_locked(ni)); #endif @@ -224,8 +221,8 @@ void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt if( OO_PP_NOT_NULL(pkt->frag_next) ) { #ifdef __KERNEL__ - ci_netif_pkt_release_mnl(ni, PKT_CHK(ni, pkt->frag_next), - p_netif_is_locked); + ci_netif_pkt_release_mnl( + ni, PKT_CHK(ni, pkt->frag_next), p_netif_is_locked); #else ci_netif_pkt_release(ni, PKT_CHK(ni, pkt->frag_next)); #endif @@ -233,15 +230,14 @@ void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt } #if defined(__KERNEL__) && OO_DO_STACK_POLL - if( CI_UNLIKELY( (! *p_netif_is_locked) && - (~pkt->flags & CI_PKT_FLAG_NONB_POOL)) ) { + if( CI_UNLIKELY( + (! *p_netif_is_locked) && (~pkt->flags & CI_PKT_FLAG_NONB_POOL)) ) { /* It is useless to call ci_netif_lock(), because we can get here only * if previous call to ci_netif_lock() have failed with -ERESTARTSYS. * But we can try trylock(). */ if( ci_netif_trylock(ni) ) { *p_netif_is_locked = 1; - } - else { + } else { /* We've failed to get the lock. Release the packet to non-blocking * pool - it is better than nothing. */ pkt->flags |= CI_PKT_FLAG_NONB_POOL; @@ -257,17 +253,16 @@ void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt __ci_dbg_poison_header(pkt, 0xDECEA5ED); #endif - if( pkt->flags & CI_PKT_FLAG_NONB_POOL ) { + if( pkt->flags & CI_PKT_FLAG_NONB_POOL ) { ci_netif_pkt_free_nonb_list(ni, OO_PKT_P(pkt), pkt); CI_NETIF_STATE_MOD(ni, *p_netif_is_locked, n_async_pkts, +); - } - else { + } else { ci_assert(ci_netif_is_locked(ni)); ci_netif_pkt_put(ni, pkt); } #if defined(__KERNEL__) && OO_DO_STACK_POLL - if( CI_UNLIKELY( ! *p_netif_is_locked ) ) { + if( CI_UNLIKELY(! *p_netif_is_locked) ) { ci_netif_set_merge_atomic_flag(ni); } #endif @@ -275,7 +270,8 @@ void ci_netif_pkt_free(ci_netif* ni, ci_ip_pkt_fmt* pkt #if OO_DO_STACK_POLL -int ci_netif_pkt_try_to_free(ci_netif* ni, int desperation, int stop_once_freed_n) +int ci_netif_pkt_try_to_free( + ci_netif* ni, int desperation, int stop_once_freed_n) { unsigned id; int freed = 0; @@ -288,8 +284,9 @@ int ci_netif_pkt_try_to_free(ci_netif* ni, int desperation, int stop_once_freed_ * that we have an array. This assertion should give some protection * against changes that break our assumption. */ - ci_assert(&ni->state->stats.pkt_scramble2 - &ni->state->stats.pkt_scramble0 - == CI_NETIF_PKT_TRY_TO_FREE_MAX_DESP); + ci_assert( + &ni->state->stats.pkt_scramble2 - &ni->state->stats.pkt_scramble0 == + CI_NETIF_PKT_TRY_TO_FREE_MAX_DESP); CITP_STATS_NETIF(++(&ni->state->stats.pkt_scramble0)[desperation]); for( id = 0; id < ni->state->n_ep_bufs; ++id ) { @@ -305,17 +302,15 @@ int ci_netif_pkt_try_to_free(ci_netif* ni, int desperation, int stop_once_freed_ } -int ci_netif_pkt_alloc_block(ci_netif* ni, ci_sock_cmn* s, - int* p_netif_locked, - int can_block, - ci_ip_pkt_fmt** p_pkt) +int ci_netif_pkt_alloc_block(ci_netif* ni, ci_sock_cmn* s, int* p_netif_locked, + int can_block, ci_ip_pkt_fmt** p_pkt) { int was_locked = *p_netif_locked; ci_ip_pkt_fmt* pkt; int rc; ci_tcp_state* ts = NULL; - again: +again: if( *p_netif_locked == 0 ) { if( (pkt = ci_netif_pkt_alloc_nonb(ni)) ) { *p_pkt = pkt; @@ -323,13 +318,12 @@ int ci_netif_pkt_alloc_block(ci_netif* ni, ci_sock_cmn* s, } if( ! ci_netif_trylock(ni) ) { rc = ci_netif_lock(ni); - if(CI_UNLIKELY( ci_netif_lock_was_interrupted(rc) )) + if( CI_UNLIKELY(ci_netif_lock_was_interrupted(rc)) ) return rc; - CITP_STATS_NETIF_INC(ni, udp_send_ni_lock_contends/*??*/); + CITP_STATS_NETIF_INC(ni, udp_send_ni_lock_contends /*??*/); } *p_netif_locked = 1; } - if( s->b.state & CI_TCP_STATE_TCP_CONN ) ts = SOCK_TO_TCP(s); @@ -345,9 +339,9 @@ int ci_netif_pkt_alloc_block(ci_netif* ni, ci_sock_cmn* s, return 0; } - if( !can_block ) + if( ! can_block ) return -ENOBUFS; - + *p_netif_locked = 0; rc = ci_netif_pkt_wait(ni, s, CI_SLEEP_NETIF_LOCKED); if( ci_netif_pkt_wait_was_interrupted(rc) ) @@ -383,8 +377,7 @@ int ci_netif_pkt_pass_to_kernel(ci_netif* ni, ci_ip_pkt_fmt* pkt) ci_assert(OO_PP_IS_NULL(ni->state->kernel_packets_tail)); ci_assert_equal(ni->state->kernel_packets_pending, 0); ni->state->kernel_packets_head = OO_PKT_P(pkt); - } - else { + } else { PKT_CHK(ni, ni->state->kernel_packets_tail)->next = OO_PKT_P(pkt); } ++ni->state->kernel_packets_pending; diff --git a/src/lib/transport/ip/netif_table.c b/src/lib/transport/ip/netif_table.c index d7f071b9d..a150c6a0f 100644 --- a/src/lib/transport/ip/netif_table.c +++ b/src/lib/transport/ip/netif_table.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief Software implemented endpoint lookup. @@ -10,7 +10,7 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_ip */ #include @@ -36,9 +36,9 @@ #define FILTER_TABLE_STATE_MASK (~FILTER_TABLE_ID_MASK) enum { OCCUPIED_PREFERRED = 0, - OCCUPIED_REHASHED = (1u << FILTER_TABLE_ID_BITS), - EMPTY = (2u << FILTER_TABLE_ID_BITS), - TOMBSTONE = (3u << FILTER_TABLE_ID_BITS), + OCCUPIED_REHASHED = (1u << FILTER_TABLE_ID_BITS), + EMPTY = (2u << FILTER_TABLE_ID_BITS), + TOMBSTONE = (3u << FILTER_TABLE_ID_BITS), }; ci_inline ci_uint32 STATE(ci_netif_filter_table_entry_fast* entry) @@ -59,33 +59,32 @@ ci_inline ci_uint32 ID(ci_netif_filter_table_entry_fast* entry) return __ID(entry); } -ci_inline void -set_entry_state(ci_netif_filter_table_entry_fast* entry, ci_uint32 state) +ci_inline void set_entry_state( + ci_netif_filter_table_entry_fast* entry, ci_uint32 state) { entry->__id_and_state = __ID(entry) | state; } #if OO_DO_STACK_POLL -ci_inline void -set_entry_id(ci_netif_filter_table_entry_fast* entry, ci_uint32 id) +ci_inline void set_entry_id( + ci_netif_filter_table_entry_fast* entry, ci_uint32 id) { ci_assert_nflags(id, FILTER_TABLE_STATE_MASK); entry->__id_and_state = STATE(entry) | id; } -#define CI_NETIF_FILTER_ID_TO_SOCK_ID(ni, filter_id) \ +#define CI_NETIF_FILTER_ID_TO_SOCK_ID(ni, filter_id) \ OO_SP_FROM_INT((ni), ID(&(ni)->filter_table->table[filter_id])) #if CI_CFG_IPV6 -#define CI_NETIF_IP6_FILTER_ID_TO_SOCK_ID(ni, filter_id) \ +#define CI_NETIF_IP6_FILTER_ID_TO_SOCK_ID(ni, filter_id) \ OO_SP_FROM_INT((ni), (ni)->ip6_filter_table->table[filter_id].id) #endif /* Returns table entry index, or -1 if lookup failed. */ -static int -ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, unsigned protocol) +static int ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, + unsigned lport, unsigned raddr, unsigned rport, unsigned protocol) { unsigned hash1, hash2 = 0; ci_netif_filter_table* tbl; @@ -96,16 +95,15 @@ ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, unsigned lport, ci_assert(netif->filter_table); tbl = netif->filter_table; - hash1 = __onload_hash1(tbl->table_size_mask, laddr, lport, - raddr, rport, protocol); + hash1 = __onload_hash1( + tbl->table_size_mask, laddr, lport, raddr, rport, protocol); first = hash1; - LOG_NV(log("tbl_lookup: %s %s:%u->%s:%u hash=%u:%u at=%u", - CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - first, __onload_hash2(laddr, lport, raddr, rport, protocol), - hash1)); + LOG_NT(log("tbl_lookup: %s %s:%u->%s:%u hash=%u:%u at=%u", + CI_IP_PROTOCOL_STR(protocol), ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), first, + __onload_hash2(laddr, lport, raddr, rport, protocol), hash1)); while( 1 ) { ci_netif_filter_table_entry_fast* entry = &tbl->table[hash1]; @@ -117,14 +115,13 @@ ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, unsigned lport, if( CI_LIKELY(OCCUPIED(entry)) ) { ci_sock_cmn* s = ID_TO_SOCK(netif, ID(entry)); - if( ((laddr - entry->laddr ) | - (lport - entry_ext->lport ) | - (raddr - sock_raddr_be32(s)) | - (rport - sock_rport_be16(s)) | - (protocol - sock_protocol(s) )) == 0 ) - return hash1; + if( ((laddr - entry->laddr) | (lport - entry_ext->lport) | + (raddr - sock_raddr_be32(s)) | (rport - sock_rport_be16(s)) | + (protocol - sock_protocol(s))) == 0 ) + return hash1; } - if( STATE(entry) == EMPTY ) break; + if( STATE(entry) == EMPTY ) + break; /* We defer calculating hash2 until it's needed, just to make the fast * case that little bit faster. */ if( hash1 == first ) @@ -132,8 +129,8 @@ ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, unsigned lport, hash1 = (hash1 + hash2) & tbl->table_size_mask; if( hash1 == first ) { LOG_E(ci_log(FN_FMT "ERROR: LOOP %s:%u->%s:%u hash=%u:%u", - FN_PRI_ARGS(netif), ip_addr_str(laddr), lport, - ip_addr_str(raddr), rport, hash1, hash2)); + FN_PRI_ARGS(netif), ip_addr_str(laddr), lport, ip_addr_str(raddr), + rport, hash1, hash2)); return -ELOOP; } } @@ -144,46 +141,42 @@ ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, unsigned lport, /* Sometimes user is not interested in particular entry id; they may be * interested in yes/no. This functions looks up in both IPv4 and IPv6 * tables and returns the answer. */ -oo_sp -ci_netif_filter_lookup(ci_netif* netif, int af_space, - ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, - unsigned protocol) +oo_sp ci_netif_filter_lookup(ci_netif* netif, int af_space, ci_addr_t laddr, + unsigned lport, ci_addr_t raddr, unsigned rport, unsigned protocol) { int rc = -ENOENT; #if CI_CFG_IPV6 if( IS_AF_SPACE_IP6(af_space) ) { - rc = ci_ip6_netif_filter_lookup(netif, laddr, lport, - raddr, rport, protocol); + rc = ci_ip6_netif_filter_lookup( + netif, laddr, lport, raddr, rport, protocol); if( rc >= 0 ) return CI_NETIF_IP6_FILTER_ID_TO_SOCK_ID(netif, rc); } if( IS_AF_SPACE_IP4(af_space) ) #endif - rc = ci_ip4_netif_filter_lookup(netif, laddr.ip4, lport, - raddr.ip4, rport, protocol); + rc = ci_ip4_netif_filter_lookup( + netif, laddr.ip4, lport, raddr.ip4, rport, protocol); if( rc >= 0 ) return CI_NETIF_FILTER_ID_TO_SOCK_ID(netif, rc); return OO_SP_NULL; } -int ci_netif_listener_lookup(ci_netif* netif, int af_space, - ci_addr_t laddr, unsigned lport) +int ci_netif_listener_lookup( + ci_netif* netif, int af_space, ci_addr_t laddr, unsigned lport) { - oo_sp sock = ci_netif_filter_lookup(netif, af_space, laddr, lport, - addr_any, 0, IPPROTO_TCP); + oo_sp sock = ci_netif_filter_lookup( + netif, af_space, laddr, lport, addr_any, 0, IPPROTO_TCP); if( OO_SP_IS_NULL(sock) ) - sock = ci_netif_filter_lookup(netif, af_space, addr_any, lport, - addr_any, 0, IPPROTO_TCP); + sock = ci_netif_filter_lookup( + netif, af_space, addr_any, lport, addr_any, 0, IPPROTO_TCP); return sock; } -ci_uint32 -ci_netif_filter_hash(ci_netif* ni, ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, unsigned protocol) +ci_uint32 ci_netif_filter_hash(ci_netif* ni, ci_addr_t laddr, unsigned lport, + ci_addr_t raddr, unsigned rport, unsigned protocol) { return onload_hash3(laddr, lport, raddr, rport, protocol); } @@ -191,11 +184,10 @@ ci_netif_filter_hash(ci_netif* ni, ci_addr_t laddr, unsigned lport, ci_inline int /*bool*/ handle_entry(ci_netif* ni, ci_netif_filter_table_entry_fast* entry, - ci_netif_filter_table_entry_ext* entry_ext, - unsigned laddr, unsigned lport, unsigned raddr, unsigned rport, - unsigned protocol, int intf_i, int vlan, - int (*callback)(ci_sock_cmn*, void*), void* callback_arg, - int /*bool*/ check_lport) + ci_netif_filter_table_entry_ext* entry_ext, unsigned laddr, unsigned lport, + unsigned raddr, unsigned rport, unsigned protocol, int intf_i, int vlan, + int (*callback)(ci_sock_cmn*, void*), void* callback_arg, + int /*bool*/ check_lport) { ci_sock_cmn* s = ID_TO_SOCK(ni, ID(entry)); int is_match = 0; @@ -204,23 +196,22 @@ handle_entry(ci_netif* ni, ci_netif_filter_table_entry_fast* entry, * packets, but it has IPv4 ipcache, so its sock_raddr_be32() is 0 and * can be used without checking for CI_SOCK_FLAG_CONNECTED, in contrast * to the equivlalent test in ci_netif_filter_for_each_match_ip6(). */ - if( ((laddr - entry->laddr ) | - /* check_lport is expected to be a compile-time constant, so when - * inlining this function the compiler should either generate sensible - * code here. */ - (lport - entry_ext->lport) * !! check_lport | - (raddr - sock_raddr_be32(s)) | - (rport - sock_rport_be16(s)) | - (protocol - sock_protocol(s) )) == 0 ) + if( ((laddr - entry->laddr) | + /* check_lport is expected to be a compile-time constant, so when + * inlining this function the compiler should either generate + * sensible code here. */ + (lport - entry_ext->lport) * ! ! check_lport | + (raddr - sock_raddr_be32(s)) | (rport - sock_rport_be16(s)) | + (protocol - sock_protocol(s))) == 0 ) is_match = 1; LOG_NV(ci_log("%s match=%d: %s %s:%u->%s:%u hash=%u:%u at=%u check_lport=%d", - __FUNCTION__, is_match, CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - __onload_hash1(ni->filter_table->table_size_mask, laddr, lport, - raddr, rport, protocol), - __onload_hash2(laddr, lport, raddr, rport, protocol), - (unsigned) (entry - ni->filter_table->table), check_lport)); + __FUNCTION__, is_match, CI_IP_PROTOCOL_STR(protocol), ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), + __onload_hash1(ni->filter_table->table_size_mask, laddr, lport, raddr, + rport, protocol), + __onload_hash2(laddr, lport, raddr, rport, protocol), + (unsigned) (entry - ni->filter_table->table), check_lport)); if( is_match && CI_LIKELY((s->rx_bind2dev_ifindex == CI_IFID_BAD || @@ -231,13 +222,10 @@ handle_entry(ci_netif* ni, ci_netif_filter_table_entry_fast* entry, } -int -ci_netif_filter_for_each_match(ci_netif* ni, - unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, - unsigned protocol, int intf_i, int vlan, - int (*callback)(ci_sock_cmn*, void*), - void* callback_arg, ci_uint32* hash_out) +int ci_netif_filter_for_each_match(ci_netif* ni, unsigned laddr, + unsigned lport, unsigned raddr, unsigned rport, unsigned protocol, + int intf_i, int vlan, int (*callback)(ci_sock_cmn*, void*), + void* callback_arg, ci_uint32* hash_out) { ci_netif_filter_table* tbl = NULL; unsigned hash1, hash2 = 0; @@ -249,16 +237,15 @@ ci_netif_filter_for_each_match(ci_netif* ni, if( hash_out != NULL ) *hash_out = __onload_hash3(laddr, lport, raddr, rport, protocol); - hash1 = __onload_hash1(table_size_mask, laddr, lport, raddr, rport, - protocol); + hash1 = + __onload_hash1(table_size_mask, laddr, lport, raddr, rport, protocol); first = hash1; - LOG_NV(log("%s: %s %s:%u->%s:%u hash=%u:%u at=%u", - __FUNCTION__, CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - first, __onload_hash2(laddr, lport, raddr, rport, protocol), - hash1)); + LOG_NV(log("%s: %s %s:%u->%s:%u hash=%u:%u at=%u", __FUNCTION__, + CI_IP_PROTOCOL_STR(protocol), ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), first, + __onload_hash2(laddr, lport, raddr, rport, protocol), hash1)); /* The loop a little way below iterates over the hash table looking for * matches. The test of the first entry in our walk through the table is @@ -283,8 +270,8 @@ ci_netif_filter_for_each_match(ci_netif* ni, /* We pass the entry in filter_table_ext here, but as check_lport is false * it won't be used, and moreover the inlining will drop it entirely. */ if( handle_entry(ni, entry, &ni->filter_table_ext[hash1], laddr, lport, - raddr, rport, protocol, intf_i, vlan, callback, - callback_arg, 0 /*check_lport*/) ) + raddr, rport, protocol, intf_i, vlan, callback, callback_arg, + 0 /*check_lport*/) ) return 1; } /* If the state of that first entry was OCCUPIED_REHASHED, it's a guaranteed @@ -302,16 +289,16 @@ ci_netif_filter_for_each_match(ci_netif* ni, hash1 = (hash1 + hash2) & table_size_mask; if( hash1 == first ) { LOG_NV(ci_log(FN_FMT "ITERATE FULL %s:%u->%s:%u hash=%u:%u", - FN_PRI_ARGS(ni), ip_addr_str(laddr), CI_BSWAP_BE16(lport), - ip_addr_str(raddr), CI_BSWAP_BE16(rport), hash1, hash2)); + FN_PRI_ARGS(ni), ip_addr_str(laddr), CI_BSWAP_BE16(lport), + ip_addr_str(raddr), CI_BSWAP_BE16(rport), hash1, hash2)); break; } entry = &tbl->table[hash1]; entry_ext = &ni->filter_table_ext[hash1]; if( OCCUPIED(entry) ) { if( handle_entry(ni, entry, entry_ext, laddr, lport, raddr, rport, - protocol, intf_i, vlan, callback, callback_arg, - 1 /*check_lport*/) ) + protocol, intf_i, vlan, callback, callback_arg, + 1 /*check_lport*/) ) return 1; } } @@ -320,23 +307,20 @@ ci_netif_filter_for_each_match(ci_netif* ni, /* Insert for either TCP or UDP */ -static int -ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, - ci_netif* netif, oo_sp tcp_id, - unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, - unsigned protocol) +static int ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, + ci_netif* netif, oo_sp tcp_id, unsigned laddr, unsigned lport, + unsigned raddr, unsigned rport, unsigned protocol) { ci_netif_filter_table_entry_fast* entry; ci_netif_filter_table_entry_ext* entry_ext; unsigned hash1, hash2; -#if !defined(NDEBUG) || CI_CFG_STATS_NETIF +#if ! defined(NDEBUG) || CI_CFG_STATS_NETIF unsigned hops = 1; #endif unsigned first; - hash1 = __onload_hash1(tbl->table_size_mask, laddr, lport, - raddr, rport, protocol); + hash1 = __onload_hash1( + tbl->table_size_mask, laddr, lport, raddr, rport, protocol); hash2 = __onload_hash2(laddr, lport, raddr, rport, protocol); first = hash1; @@ -344,10 +328,11 @@ ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, while( 1 ) { entry = &tbl->table[hash1]; entry_ext = &netif->filter_table_ext[hash1]; - if( ! OCCUPIED(entry) ) break; + if( ! OCCUPIED(entry) ) + break; ++entry_ext->route_count; -#if !defined(NDEBUG) || CI_CFG_STATS_NETIF +#if ! defined(NDEBUG) || CI_CFG_STATS_NETIF ++hops; #endif @@ -355,19 +340,18 @@ ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, * entry has a different [laddr]. */ ci_assert( - !((ID(entry) == OO_SP_TO_INT(tcp_id)) && (laddr == entry->laddr)) ); + ! ((ID(entry) == OO_SP_TO_INT(tcp_id)) && (laddr == entry->laddr))); hash1 = (hash1 + hash2) & tbl->table_size_mask; if( hash1 == first ) { - ci_sock_cmn *s = SP_TO_SOCK_CMN(netif, tcp_id); + ci_sock_cmn* s = SP_TO_SOCK_CMN(netif, tcp_id); if( ! (s->s_flags & CI_SOCK_FLAG_SW_FILTER_FULL) ) { LOG_E(ci_log(FN_FMT "%d FULL %s %s:%u->%s:%u hops=%u", - FN_PRI_ARGS(netif), - OO_SP_FMT(tcp_id), CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - hops)); + FN_PRI_ARGS(netif), OO_SP_FMT(tcp_id), + CI_IP_PROTOCOL_STR(protocol), ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), hops)); s->s_flags |= CI_SOCK_FLAG_SW_FILTER_FULL; } @@ -377,12 +361,13 @@ ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, } /* Now insert the new entry. */ - LOG_TC(ci_log(FN_FMT "%d INSERT %s %s:%u->%s:%u hash=%u:%u at=%u " - "over=%u:%u hops=%u", FN_PRI_ARGS(netif), OO_SP_FMT(tcp_id), - CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - first, hash2, hash1, STATE(entry), __ID(entry), hops)); + LOG_TC( + ci_log(FN_FMT "%d INSERT %s %s:%u->%s:%u hash=%u:%u at=%u " + "over=%u:%u hops=%u", + FN_PRI_ARGS(netif), OO_SP_FMT(tcp_id), CI_IP_PROTOCOL_STR(protocol), + ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), + ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), first, hash2, + hash1, STATE(entry), __ID(entry), hops)); #if CI_CFG_STATS_NETIF if( hops > netif->state->stats.table_max_hops ) @@ -391,15 +376,15 @@ ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, if( netif->state->stats.table_mean_hops == 0 ) netif->state->stats.table_mean_hops = 1; netif->state->stats.table_mean_hops = - (netif->state->stats.table_mean_hops * 9 + hops) / 10; + (netif->state->stats.table_mean_hops * 9 + hops) / 10; if( STATE(entry) == EMPTY ) ++netif->state->stats.table_n_slots; ++netif->state->stats.table_n_entries; #endif - set_entry_state(entry, - hash1 == first ? OCCUPIED_PREFERRED : OCCUPIED_REHASHED); + set_entry_state( + entry, hash1 == first ? OCCUPIED_PREFERRED : OCCUPIED_REHASHED); set_entry_id(entry, OO_SP_TO_INT(tcp_id)); entry->laddr = laddr; entry_ext->lport = lport; @@ -407,10 +392,9 @@ ci_ip4_netif_filter_insert(ci_netif_filter_table* tbl, } -static void -__ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, ci_netif* ni, - unsigned hash1, unsigned hash2, - int hops, unsigned last_tbl_i) +static void __ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, + ci_netif* ni, unsigned hash1, unsigned hash2, int hops, + unsigned last_tbl_i) { ci_netif_filter_table_entry_fast* entry; ci_netif_filter_table_entry_ext* entry_ext; @@ -437,19 +421,15 @@ __ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, ci_netif* ni, if( entry_ext->route_count == 0 ) { CITP_STATS_NETIF(--ni->state->stats.table_n_slots); set_entry_state(entry, EMPTY); - } - else { + } else { set_entry_state(entry, TOMBSTONE); } } -static void -ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, - ci_netif* netif, oo_sp sock_p, - unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, - unsigned protocol) +static void ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, + ci_netif* netif, oo_sp sock_p, unsigned laddr, unsigned lport, + unsigned raddr, unsigned rport, unsigned protocol) { ci_netif_filter_table_entry_fast* entry; unsigned hash1, hash2, tbl_i; @@ -462,19 +442,17 @@ ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, * Do not complain about this. */ || netif2tcp_helper_resource(netif)->ref[OO_THR_REF_BASE] == 0 #endif - ); + ); - hash1 = __onload_hash1(tbl->table_size_mask, laddr, lport, - raddr, rport, protocol); + hash1 = __onload_hash1( + tbl->table_size_mask, laddr, lport, raddr, rport, protocol); hash2 = __onload_hash2(laddr, lport, raddr, rport, protocol); first = hash1; - LOG_TC(ci_log("%s: [%d:%d] REMOVE %s %s:%u->%s:%u hash=%u:%u", - __FUNCTION__, NI_ID(netif), OO_SP_FMT(sock_p), - CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - hash1, hash2)); + LOG_NV(ci_log("%s: [%d:%d] REMOVE %s %s:%u->%s:%u hash=%u:%u", __FUNCTION__, + NI_ID(netif), OO_SP_FMT(sock_p), CI_IP_PROTOCOL_STR(protocol), + ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), hash1, hash2)); tbl_i = hash1; while( 1 ) { @@ -482,8 +460,7 @@ ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, if( OCCUPIED(entry) && ID(entry) == OO_SP_TO_INT(sock_p) ) { if( laddr == entry->laddr ) break; - } - else if( STATE(entry) == EMPTY ) { + } else if( STATE(entry) == EMPTY ) { /* We allow multiple removes of the same filter -- helps avoid some * complexity in the filter module. */ @@ -493,10 +470,9 @@ ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, ++hops; if( tbl_i == first ) { LOG_E(ci_log(FN_FMT "ERROR: LOOP [%d] %s %s:%u->%s:%u", - FN_PRI_ARGS(netif), OO_SP_FMT(sock_p), - CI_IP_PROTOCOL_STR(protocol), - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport))); + FN_PRI_ARGS(netif), OO_SP_FMT(sock_p), CI_IP_PROTOCOL_STR(protocol), + ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), + ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport))); return; } } @@ -504,11 +480,9 @@ ci_ip4_netif_filter_remove(ci_netif_filter_table* tbl, __ci_ip4_netif_filter_remove(tbl, netif, hash1, hash2, hops, tbl_i); } -int -ci_netif_filter_insert(ci_netif* netif, oo_sp tcp_id, int af_space, - const ci_addr_t laddr, unsigned lport, - const ci_addr_t raddr, unsigned rport, - unsigned protocol) +int ci_netif_filter_insert(ci_netif* netif, oo_sp tcp_id, int af_space, + const ci_addr_t laddr, unsigned lport, const ci_addr_t raddr, + unsigned rport, unsigned protocol) { ci_netif_filter_table* ip4_tbl; int rc = 0; @@ -525,8 +499,7 @@ ci_netif_filter_insert(ci_netif* netif, oo_sp tcp_id, int af_space, ip6_tbl = netif->ip6_filter_table; rc = ci_ip6_netif_filter_insert(ip6_tbl, netif, tcp_id, laddr, lport, - CI_IPX_ADDR_IS_ANY(raddr) ? addr_any : raddr, - rport, protocol); + CI_IPX_ADDR_IS_ANY(raddr) ? addr_any : raddr, rport, protocol); if( rc < 0 ) return rc; } @@ -537,8 +510,8 @@ ci_netif_filter_insert(ci_netif* netif, oo_sp tcp_id, int af_space, ci_assert(netif->filter_table); ip4_tbl = netif->filter_table; - rc = ci_ip4_netif_filter_insert(ip4_tbl, netif, tcp_id, laddr.ip4, lport, - raddr.ip4, rport, protocol); + rc = ci_ip4_netif_filter_insert( + ip4_tbl, netif, tcp_id, laddr.ip4, lport, raddr.ip4, rport, protocol); /* Fixme: should we roll back the IPv6 insertion when trying to listen * in the both worlds, and IPv4 fails? */ if( rc < 0 ) @@ -548,11 +521,9 @@ ci_netif_filter_insert(ci_netif* netif, oo_sp tcp_id, int af_space, return 0; } -void -ci_netif_filter_remove(ci_netif* netif, oo_sp sock_p, int af_space, - const ci_addr_t laddr, unsigned lport, - const ci_addr_t raddr, unsigned rport, - unsigned protocol) +void ci_netif_filter_remove(ci_netif* netif, oo_sp sock_p, int af_space, + const ci_addr_t laddr, unsigned lport, const ci_addr_t raddr, + unsigned rport, unsigned protocol) { ci_netif_filter_table* ip4_tbl; #if CI_CFG_IPV6 @@ -567,8 +538,7 @@ ci_netif_filter_remove(ci_netif* netif, oo_sp sock_p, int af_space, ip6_tbl = netif->ip6_filter_table; ci_ip6_netif_filter_remove(ip6_tbl, netif, sock_p, laddr, lport, - CI_IPX_ADDR_IS_ANY(raddr) ? addr_any : raddr, - rport, protocol); + CI_IPX_ADDR_IS_ANY(raddr) ? addr_any : raddr, rport, protocol); } if( IS_AF_SPACE_IP4(af_space) ) @@ -577,8 +547,8 @@ ci_netif_filter_remove(ci_netif* netif, oo_sp sock_p, int af_space, ci_assert(netif->filter_table); ip4_tbl = netif->filter_table; - ci_ip4_netif_filter_remove(ip4_tbl, netif, sock_p, laddr.ip4, lport, - raddr.ip4, rport, protocol); + ci_ip4_netif_filter_remove( + ip4_tbl, netif, sock_p, laddr.ip4, lport, raddr.ip4, rport, protocol); } } #endif @@ -597,7 +567,7 @@ void ci_netif_filter_init(ci_netif* ni, int size_lg2) ci_assert(ni); ci_assert(ni->filter_table); ci_assert(ni->filter_table_ext); - ci_assert_ge(size_lg2, 16); /* For ci_netif_filter_for_each_match(). */ + ci_assert_ge(size_lg2, 16); /* For ci_netif_filter_for_each_match(). */ ci_assert_le(size_lg2, 32); ni->filter_table->table_size_mask = size - 1; @@ -613,60 +583,53 @@ void ci_netif_filter_init(ci_netif* ni, int size_lg2) #endif #if OO_DO_STACK_POLL -int -__ci_ip4_netif_filter_lookup(ci_netif* netif, - unsigned laddr, unsigned lport, - unsigned raddr, unsigned rport, - unsigned protocol) +int __ci_ip4_netif_filter_lookup(ci_netif* netif, unsigned laddr, + unsigned lport, unsigned raddr, unsigned rport, unsigned protocol) { int rc; /* try full lookup */ - rc = ci_ip4_netif_filter_lookup(netif, laddr, lport, raddr, rport, protocol); - LOG_NV(log(LPF "FULL LOOKUP %s:%u->%s:%u rc=%d", - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - rc)); + rc = ci_ip4_netif_filter_lookup(netif, laddr, lport, raddr, rport, protocol); + LOG_NV(log(LPF "FULL LOOKUP %s:%u->%s:%u rc=%d", ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), rc)); - if(CI_LIKELY( rc >= 0 )) + if( CI_LIKELY(rc >= 0) ) return rc; /* try wildcard lookup */ raddr = rport = 0; rc = ci_ip4_netif_filter_lookup(netif, laddr, lport, raddr, rport, protocol); - LOG_NV(log(LPF "WILD LOOKUP %s:%u->%s:%u rc=%d", - ip_addr_str(laddr), (unsigned) CI_BSWAP_BE16(lport), - ip_addr_str(raddr), (unsigned) CI_BSWAP_BE16(rport), - rc)); + LOG_NV(log(LPF "WILD LOOKUP %s:%u->%s:%u rc=%d", ip_addr_str(laddr), + (unsigned) CI_BSWAP_BE16(lport), ip_addr_str(raddr), + (unsigned) CI_BSWAP_BE16(rport), rc)); - if(CI_LIKELY( rc >= 0 )) + if( CI_LIKELY(rc >= 0) ) return rc; return -ENOENT; } -ci_sock_cmn* -__ci_netif_filter_lookup(ci_netif* netif, int af_space, - ci_addr_t laddr, unsigned lport, - ci_addr_t raddr, unsigned rport, - unsigned protocol) +ci_sock_cmn* __ci_netif_filter_lookup(ci_netif* netif, int af_space, + ci_addr_t laddr, unsigned lport, ci_addr_t raddr, unsigned rport, + unsigned protocol) { int rc; #if CI_CFG_IPV6 if( IS_AF_SPACE_IP6(af_space) ) { - rc = __ci_ip6_netif_filter_lookup(netif, laddr, lport, raddr, rport, - protocol); - if(CI_LIKELY( rc >= 0 )) + rc = __ci_ip6_netif_filter_lookup( + netif, laddr, lport, raddr, rport, protocol); + if( CI_LIKELY(rc >= 0) ) return ID_TO_SOCK(netif, netif->ip6_filter_table->table[rc].id); } if( IS_AF_SPACE_IP4(af_space) ) #endif { - rc = __ci_ip4_netif_filter_lookup(netif, laddr.ip4, lport, raddr.ip4, rport, - protocol); - if(CI_LIKELY( rc >= 0 )) + rc = __ci_ip4_netif_filter_lookup( + netif, laddr.ip4, lport, raddr.ip4, rport, protocol); + if( CI_LIKELY(rc >= 0) ) return ID_TO_SOCK(netif, ID(&netif->filter_table->table[rc])); } @@ -704,15 +667,15 @@ void ci_netif_filter_dump(ci_netif* ni) unsigned raddr = sock_raddr_be32(s); int rport = sock_rport_be16(s); int protocol = sock_protocol(s); - unsigned hash1 = __onload_hash1(tbl->table_size_mask, laddr, lport, - raddr, rport, protocol); + unsigned hash1 = __onload_hash1( + tbl->table_size_mask, laddr, lport, raddr, rport, protocol); unsigned hash2 = __onload_hash2(laddr, lport, raddr, rport, protocol); - log("%010d state=%u id=%-10d rt_ct=%d %s "CI_IP_PRINTF_FORMAT":%d " - CI_IP_PRINTF_FORMAT":%d %010d:%010d", + log("%010d state=%u id=%-10d rt_ct=%d %s " CI_IP_PRINTF_FORMAT + ":%d " CI_IP_PRINTF_FORMAT ":%d %010d:%010d", i, STATE(entry) >> FILTER_TABLE_ID_BITS, ID(entry), entry_ext->route_count, CI_IP_PROTOCOL_STR(protocol), CI_IP_PRINTF_ARGS(&laddr), CI_BSWAP_BE16(lport), - CI_IP_PRINTF_ARGS(&raddr), CI_BSWAP_BE16(rport), hash1, hash2); + CI_IP_PRINTF_ARGS(&raddr), CI_BSWAP_BE16(rport), hash1, hash2); } } #if CI_CFG_IPV6 diff --git a/src/lib/transport/ip/netif_tx.c b/src/lib/transport/ip/netif_tx.c index d55f25ad3..4d7b4578c 100644 --- a/src/lib/transport/ip/netif_tx.c +++ b/src/lib/transport/ip/netif_tx.c @@ -44,9 +44,9 @@ static inline void calc_csum_if_needed( ci_netif* ni, ef_vi* vi, ci_ip_pkt_fmt* pkt) { /* Calculate packet checksum in case of AF_XDP */ - if( CI_UNLIKELY((vi->nic_type.arch == EF_VI_ARCH_AF_XDP || - vi->nic_type.arch == EF_VI_ARCH_SWXTCH) && - is_to_primary_vi(pkt)) ) { + if( CI_LIKELY((vi->nic_type.arch == EF_VI_ARCH_AF_XDP || + vi->nic_type.arch == EF_VI_ARCH_SWXTCH) && + is_to_primary_vi(pkt)) ) { struct iovec my_iov[CI_IP_PKT_SEGMENTS_MAX]; ci_uint8 protocol; diff --git a/src/lib/transport/ip/tcp_connect.c b/src/lib/transport/ip/tcp_connect.c index b82e26d99..688975a9a 100644 --- a/src/lib/transport/ip/tcp_connect.c +++ b/src/lib/transport/ip/tcp_connect.c @@ -499,8 +499,10 @@ int ci_tcp_sock_set_stack_filter(ci_netif* ni, ci_sock_cmn* s) int rc; oo_sp sock; - LOG_TC(log(NSS_FMT " %s", NSS_PRI_ARGS(ni, s), __FUNCTION__)); - ci_assert((s->s_flags & CI_SOCK_FLAG_STACK_FILTER) == 0); + LOG_TC(log(NSS_FMT " %s %d", NSS_PRI_ARGS(ni, s), __FUNCTION__, s->s_flags)); + ci_assert_equal(s->s_flags & CI_SOCK_FLAG_STACK_FILTER, 0); + + // todo figure out something here sock = ci_netif_filter_lookup(ni, sock_af_space(s), sock_ipx_laddr(s), sock_lport_be16(s), sock_ipx_raddr(s), sock_rport_be16(s), @@ -523,7 +525,6 @@ int ci_tcp_sock_set_stack_filter(ci_netif* ni, ci_sock_cmn* s) void ci_tcp_sock_clear_stack_filter(ci_netif* ni, ci_tcp_state* ts) { - LOG_TC(log(LNT_FMT " %s", LNT_PRI_ARGS(ni, ts), __FUNCTION__)); ci_assert((ts->s.s_flags & CI_SOCK_FLAG_STACK_FILTER) != 0); ci_netif_filter_remove(ni, S_ID(ts), sock_af_space(&ts->s), tcp_ipx_laddr(ts), tcp_lport_be16(ts), tcp_ipx_raddr(ts), diff --git a/src/lib/transport/ip/tcp_helper.c b/src/lib/transport/ip/tcp_helper.c index 0213c7cba..7e49469d7 100644 --- a/src/lib/transport/ip/tcp_helper.c +++ b/src/lib/transport/ip/tcp_helper.c @@ -9,8 +9,8 @@ ** \**************************************************************************/ -/* - * stg 2006/11/06 : Moved to transport/ip from transport/ciul +/* + * stg 2006/11/06 : Moved to transport/ip from transport/ciul */ #include "ip_internal.h" @@ -29,21 +29,21 @@ int ci_tcp_helper_more_bufs(ci_netif* ni) { - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_TCP_MORE_BUFS, NULL); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_TCP_MORE_BUFS, NULL); } int ci_tcp_helper_more_socks(ci_netif* ni) { - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_TCP_MORE_SOCKS, NULL); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_TCP_MORE_SOCKS, NULL); } #if CI_CFG_FD_CACHING int ci_tcp_helper_clear_epcache(ci_netif* ni) { - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_TCP_CLEAR_EPCACHE, NULL); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_TCP_CLEAR_EPCACHE, NULL); } #endif @@ -64,24 +64,22 @@ int ci_tcp_helper_clear_epcache(ci_netif* ni) * \return standard error codes * *--------------------------------------------------------------------*/ -int ci_tcp_helper_ep_set_filters(ci_fd_t fd, - oo_sp ep, - ci_ifid_t bindto_ifindex, - oo_sp from_tcp_id) +int ci_tcp_helper_ep_set_filters( + ci_fd_t fd, oo_sp ep, ci_ifid_t bindto_ifindex, oo_sp from_tcp_id) { oo_tcp_filter_set_t op; int rc; - op.tcp_id = ep; + op.tcp_id = ep; op.bindto_ifindex = bindto_ifindex; - op.from_tcp_id = from_tcp_id; + op.from_tcp_id = from_tcp_id; VERB(ci_log("%s: id=%d", __FUNCTION__, ep)); rc = oo_resource_op(fd, OO_IOC_EP_FILTER_SET, &op); if( rc < 0 ) - LOG_SV(ci_log("%s: failed for %d (rc=%d)", __FUNCTION__, - OO_SP_FMT(ep), rc)); + LOG_SV( + ci_log("%s: failed for %d (rc=%d)", __FUNCTION__, OO_SP_FMT(ep), rc)); return rc; } @@ -92,13 +90,9 @@ int ci_tcp_helper_ep_set_filters(ci_fd_t fd, * TODO * *--------------------------------------------------------------------*/ -int ci_tcp_helper_ep_reuseport_bind(ci_fd_t fd, - const char* cluster_name, - ci_int32 cluster_size, - ci_uint32 cluster_restart_opt, - ci_uint32 cluster_hot_restart_opt, - ci_addr_t addr, - ci_uint16 port_be16) +int ci_tcp_helper_ep_reuseport_bind(ci_fd_t fd, const char* cluster_name, + ci_int32 cluster_size, ci_uint32 cluster_restart_opt, + ci_uint32 cluster_hot_restart_opt, ci_addr_t addr, ci_uint16 port_be16) { oo_tcp_reuseport_bind_t op; int rc; @@ -107,8 +101,7 @@ int ci_tcp_helper_ep_reuseport_bind(ci_fd_t fd, op.cluster_name[CI_CFG_CLUSTER_NAME_LEN] = '\0'; op.cluster_size = cluster_size; op.cluster_restart_opt = cluster_restart_opt; - op.cluster_hot_restart_opt = cluster_hot_restart_opt, - op.addr = addr; + op.cluster_hot_restart_opt = cluster_hot_restart_opt, op.addr = addr; op.port_be16 = port_be16; VERB(ci_log("%s: id=%d", __FUNCTION__, fd)); rc = oo_resource_op(fd, OO_IOC_EP_REUSEPORT_BIND, &op); @@ -151,15 +144,15 @@ int ci_tcp_helper_ep_clear_filters(ci_fd_t fd, oo_sp ep, int need_update) oo_tcp_filter_clear_t op; int rc; - op.tcp_id = ep; - op.need_update = !!need_update; + op.tcp_id = ep; + op.need_update = ! ! need_update; VERB(ci_log("%s: id=%d", __FUNCTION__, ep)); rc = oo_resource_op(fd, OO_IOC_EP_FILTER_CLEAR, &op); if( rc < 0 ) - LOG_SV(ci_log("%s: failed for %d (rc=%d)", __FUNCTION__, - OO_SP_FMT(ep), rc)); + LOG_SV( + ci_log("%s: failed for %d (rc=%d)", __FUNCTION__, OO_SP_FMT(ep), rc)); return rc; } @@ -189,7 +182,7 @@ int ci_tcp_helper_ep_filter_dump(void* opaque, void* buf, int buf_len) /*-------------------------------------------------------------------- *! * Adds or deletes multicast address to/from socket list. - * + * * \param fd File descriptor of tcp_helper * \param ep TCP control block id * \param phys_port L5 physcial port index to support SO_BINDTODEVICE @@ -200,37 +193,30 @@ int ci_tcp_helper_ep_filter_dump(void* opaque, void* buf, int buf_len) * \return standard error codes * *--------------------------------------------------------------------*/ -int ci_tcp_helper_ep_mcast_add_del(ci_fd_t fd, - oo_sp ep, - ci_uint32 mcast_addr, - ci_ifid_t ifindex, - int add) +int ci_tcp_helper_ep_mcast_add_del( + ci_fd_t fd, oo_sp ep, ci_uint32 mcast_addr, ci_ifid_t ifindex, int add) { oo_tcp_filter_mcast_t op; int rc; - op.tcp_id = ep; - op.ifindex = ifindex; - op.addr = mcast_addr; + op.tcp_id = ep; + op.ifindex = ifindex; + op.addr = mcast_addr; - VERB(ci_log("%s: id=%d %s", __FUNCTION__, OO_SP_FMT(ep), - add ? "add" : "del")); - rc = oo_resource_op(fd, - add ? OO_IOC_EP_FILTER_MCAST_ADD : - OO_IOC_EP_FILTER_MCAST_DEL, - &op); + VERB(ci_log( + "%s: id=%d %s", __FUNCTION__, OO_SP_FMT(ep), add ? "add" : "del")); + rc = oo_resource_op( + fd, add ? OO_IOC_EP_FILTER_MCAST_ADD : OO_IOC_EP_FILTER_MCAST_DEL, &op); if( rc < 0 ) - LOG_SV(ci_log("%s: %s failed for %d (rc=%d)", - __FUNCTION__, add ? "add" : "del", OO_SP_FMT(ep), rc)); + LOG_SV(ci_log("%s: %s failed for %d (rc=%d)", __FUNCTION__, + add ? "add" : "del", OO_SP_FMT(ep), rc)); return rc; } int __ci_tcp_helper_stack_attach(ci_fd_t from_fd, - efrm_nic_set_t *out_ptr_nic_set, - ci_uint32 *out_map_size, - bool is_service) + efrm_nic_set_t* out_ptr_nic_set, ci_uint32* out_map_size, bool is_service) { int rc; oo_stack_attach_t op; @@ -246,16 +232,15 @@ int __ci_tcp_helper_stack_attach(ci_fd_t from_fd, return op.fd; } -int ci_tcp_helper_stack_attach(ci_fd_t from_fd, - efrm_nic_set_t *out_ptr_nic_set, - ci_uint32 *out_map_size) +int ci_tcp_helper_stack_attach( + ci_fd_t from_fd, efrm_nic_set_t* out_ptr_nic_set, ci_uint32* out_map_size) { - return __ci_tcp_helper_stack_attach(from_fd, out_ptr_nic_set, - out_map_size, false); + return __ci_tcp_helper_stack_attach( + from_fd, out_ptr_nic_set, out_map_size, false); } -int ci_tcp_helper_sock_attach(ci_fd_t stack_fd, oo_sp ep_id, - int domain, int type) +int ci_tcp_helper_sock_attach( + ci_fd_t stack_fd, oo_sp ep_id, int domain, int type) { int rc; oo_sock_attach_t op; @@ -265,7 +250,7 @@ int ci_tcp_helper_sock_attach(ci_fd_t stack_fd, oo_sp ep_id, op.domain = domain; oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(stack_fd, OO_IOC_SOCK_ATTACH, &op); - oo_rwlock_unlock_read (&citp_dup2_lock); + oo_rwlock_unlock_read(&citp_dup2_lock); if( rc < 0 ) return rc; return op.fd; @@ -280,7 +265,7 @@ int ci_tcp_helper_sock_attach_to_existing_file(ci_fd_t stack_fd, oo_sp ep_id) op.ep_id = ep_id; oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(stack_fd, OO_IOC_SOCK_ATTACH_TO_EXISTING, &op); - oo_rwlock_unlock_read (&citp_dup2_lock); + oo_rwlock_unlock_read(&citp_dup2_lock); if( rc < 0 ) return rc; return op.fd; @@ -289,8 +274,8 @@ int ci_tcp_helper_sock_attach_to_existing_file(ci_fd_t stack_fd, oo_sp ep_id) #endif -int ci_tcp_helper_tcp_accept_sock_attach(ci_fd_t stack_fd, oo_sp ep_id, - int type) +int ci_tcp_helper_tcp_accept_sock_attach( + ci_fd_t stack_fd, oo_sp ep_id, int type) { int rc; oo_tcp_accept_sock_attach_t op; @@ -299,14 +284,14 @@ int ci_tcp_helper_tcp_accept_sock_attach(ci_fd_t stack_fd, oo_sp ep_id, op.type = type; oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(stack_fd, OO_IOC_TCP_ACCEPT_SOCK_ATTACH, &op); - oo_rwlock_unlock_read (&citp_dup2_lock); + oo_rwlock_unlock_read(&citp_dup2_lock); if( rc < 0 ) return rc; return op.fd; } -int ci_tcp_helper_pipe_attach(ci_fd_t stack_fd, oo_sp ep_id, - int flags, int fds[2]) +int ci_tcp_helper_pipe_attach( + ci_fd_t stack_fd, oo_sp ep_id, int flags, int fds[2]) { int rc; oo_pipe_attach_t op; @@ -336,7 +321,7 @@ ci_fd_t ci_tcp_helper_get_sock_fd(ci_fd_t fd) rc = oo_resource_op(fd, OO_IOC_OS_SOCK_FD_GET, &op); if( rc == 0 ) return op.fd_out; - oo_rwlock_unlock_read (&citp_dup2_lock); + oo_rwlock_unlock_read(&citp_dup2_lock); return (ci_fd_t) rc; /*! \TODO FIXME: remove cast */ } @@ -344,14 +329,14 @@ ci_fd_t ci_tcp_helper_get_sock_fd(ci_fd_t fd) int ci_tcp_helper_rel_sock_fd(ci_fd_t fd) { int rc = 0; - rc = ci_sys_close (fd); - oo_rwlock_unlock_read (&citp_dup2_lock); + rc = ci_sys_close(fd); + oo_rwlock_unlock_read(&citp_dup2_lock); return rc; } int ci_tcp_helper_bind_os_sock(ci_fd_t fd, const struct sockaddr* address, - size_t addrlen, ci_uint16* out_port) + size_t addrlen, ci_uint16* out_port) { int rc; oo_tcp_bind_os_sock_t op; @@ -361,15 +346,16 @@ int ci_tcp_helper_bind_os_sock(ci_fd_t fd, const struct sockaddr* address, rc = oo_resource_op(fd, OO_IOC_TCP_BIND_OS_SOCK, &op); - if (rc < 0) { + if( rc < 0 ) { errno = -rc; return -1; } ci_assert(rc == 0); /* Bug 646: only write back source port if bind succeeds! */ - if (out_port) + if( out_port ) *out_port = op.addrlen; + return rc; } @@ -379,17 +365,17 @@ int ci_tcp_helper_listen_os_sock(ci_fd_t fd, int backlog) int rc; rc = oo_resource_op(fd, OO_IOC_TCP_LISTEN_OS_SOCK, &backlog); - if (rc < 0) { + if( rc < 0 ) { errno = -rc; return -1; } - ci_assert (rc == 0); + ci_assert(rc == 0); return rc; } -int ci_tcp_helper_endpoint_shutdown(ci_netif *ni, oo_sp sock_id, - int how, ci_uint32 old_state) +int ci_tcp_helper_endpoint_shutdown( + ci_netif* ni, oo_sp sock_id, int how, ci_uint32 old_state) { oo_tcp_endpoint_shutdown_t op; int rc; @@ -397,21 +383,21 @@ int ci_tcp_helper_endpoint_shutdown(ci_netif *ni, oo_sp sock_id, op.sock_id = sock_id; op.how = how; op.old_state = old_state; - rc = oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_TCP_ENDPOINT_SHUTDOWN, &op); - if (rc < 0) { + rc = oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_TCP_ENDPOINT_SHUTDOWN, &op); + if( rc < 0 ) { errno = -rc; return -1; } - ci_assert (rc == 0); + ci_assert(rc == 0); return rc; } -int ci_tcp_helper_set_tcp_close_os_sock(ci_netif *ni, oo_sp sock_id) +int ci_tcp_helper_set_tcp_close_os_sock(ci_netif* ni, oo_sp sock_id) { - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_TCP_CLOSE_OS_SOCK, &sock_id); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_TCP_CLOSE_OS_SOCK, &sock_id); } @@ -419,10 +405,8 @@ int ci_tcp_helper_set_tcp_close_os_sock(ci_netif *ni, oo_sp sock_id) * option is passed with level >= 0 then that option is synced to the OS * socket after creation. */ -int ci_tcp_helper_os_sock_create_and_set(ci_netif *ni, ci_fd_t fd, - ci_sock_cmn *s, int level, - int optname, const void* optval, - int optlen) +int ci_tcp_helper_os_sock_create_and_set(ci_netif* ni, ci_fd_t fd, + ci_sock_cmn* s, int level, int optname, const void* optval, int optlen) { int rc; oo_tcp_create_set_t op; @@ -435,7 +419,8 @@ int ci_tcp_helper_os_sock_create_and_set(ci_netif *ni, ci_fd_t fd, * we need to have created the OS socket (if needed) before installing a * filter. */ - ci_assert_nflags(s->s_flags, CI_SOCK_FLAG_FILTER | CI_SOCK_FLAG_STACK_FILTER); + ci_assert_nflags( + s->s_flags, CI_SOCK_FLAG_FILTER | CI_SOCK_FLAG_STACK_FILTER); /* This must be called before we turn into a listening socket. If F_SETFL * is used after a socket enters the listening state onload filters the * request to ensure that the OS socket remains non-blocking. @@ -457,13 +442,13 @@ int ci_tcp_helper_os_sock_create_and_set(ci_netif *ni, ci_fd_t fd, #if CI_CFG_TCP_SHARED_LOCAL_PORTS -int ci_tcp_helper_alloc_active_wild(ci_netif *ni, ci_addr_t laddr) +int ci_tcp_helper_alloc_active_wild(ci_netif* ni, ci_addr_t laddr) { oo_alloc_active_wild_t aaw = { .laddr = laddr, }; - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_ALLOC_ACTIVE_WILD, &aaw); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_ALLOC_ACTIVE_WILD, &aaw); } #endif @@ -474,22 +459,22 @@ int ci_netif_evq_poll_k(ci_netif* ni, int _n) ci_uint32 intf_i = _n; CITP_STATS_NETIF_INC(ni, ioctl_evq_polls); - return oo_resource_op(ci_netif_get_driver_handle(ni), OO_IOC_EVQ_POLL, - &intf_i); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_EVQ_POLL, &intf_i); } #endif -int ci_tcp_helper_zc_register_buffers(ci_netif* ni, void* base, int num_pages, - uint64_t* hw_addrs, uint64_t* id) +int ci_tcp_helper_zc_register_buffers( + ci_netif* ni, void* base, int num_pages, uint64_t* hw_addrs, uint64_t* id) { oo_zc_register_buffers_t arg = { - .base_ptr = (uintptr_t)base, + .base_ptr = (uintptr_t) base, .num_pages = num_pages, - .hw_addrs_ptr = (uintptr_t)hw_addrs, + .hw_addrs_ptr = (uintptr_t) hw_addrs, }; - int rc = oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_ZC_REGISTER_BUFFERS, &arg); + int rc = oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_ZC_REGISTER_BUFFERS, &arg); if( rc < 0 ) return rc; *id = arg.id; @@ -498,6 +483,6 @@ int ci_tcp_helper_zc_register_buffers(ci_netif* ni, void* base, int num_pages, int ci_tcp_helper_zc_unregister_buffers(ci_netif* ni, uint64_t id) { - return oo_resource_op(ci_netif_get_driver_handle(ni), - OO_IOC_ZC_UNREGISTER_BUFFERS, &id); + return oo_resource_op( + ci_netif_get_driver_handle(ni), OO_IOC_ZC_UNREGISTER_BUFFERS, &id); } diff --git a/src/lib/transport/ip/tcp_send.c b/src/lib/transport/ip/tcp_send.c index a26214296..b9a5e05d2 100644 --- a/src/lib/transport/ip/tcp_send.c +++ b/src/lib/transport/ip/tcp_send.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr ** \brief TCP sendmsg() etc. @@ -22,7 +22,7 @@ #include "crc32c.h" #endif -#if !defined(__KERNEL__) +#if ! defined(__KERNEL__) #include #include #include @@ -39,9 +39,9 @@ #ifdef __KERNEL__ -# define OO_EINTR ERESTARTSYS +#define OO_EINTR ERESTARTSYS #else -# define OO_EINTR EINTR +#define OO_EINTR EINTR #endif /* If not locked then trylock, and if successful set locked flag and (in @@ -49,10 +49,9 @@ * false. si_ variants take a [struct udp_send_info*]. */ -#define trylock(ni, locked) \ +#define trylock(ni, locked) \ ((locked) || (ci_netif_trylock(ni) && ((locked) = 1))) -#define si_trylock(ni, sinf) \ - trylock((ni), (sinf)->stack_locked) +#define si_trylock(ni, sinf) trylock((ni), (sinf)->stack_locked) struct tcp_send_info { int rc; @@ -90,12 +89,12 @@ static void ci_tcp_tx_advance_nagle(ci_netif* ni, ci_tcp_state* ts) ci_assert(! ci_ip_queue_is_empty(sendq)); if( (sendq->num != 1) | (ci_tcp_inflight(ts) == 0) | - OO_SP_NOT_NULL(ts->local_peer)) { + OO_SP_NOT_NULL(ts->local_peer) ) { advance_now: /* NB. We call advance() before poll() to get best latency. */ ci_ip_time_resync(IPTIMER_STATE(ni)); ci_tcp_tx_advance(ts, ni); - if(CI_UNLIKELY( ts->tcpflags & CI_TCPT_FLAG_MSG_WARM )) + if( CI_UNLIKELY(ts->tcpflags & CI_TCPT_FLAG_MSG_WARM) ) return; goto poll_and_out; } @@ -107,11 +106,11 @@ static void ci_tcp_tx_advance_nagle(ci_netif* ni, ci_tcp_state* ts) ** enqueue data. */ pkt = PKT_CHK(ni, sendq->head); - ci_assert(!(TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt)->tcp_flags & - (CI_TCP_FLAG_SYN|CI_TCP_FLAG_FIN))); + ci_assert(! (TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt)->tcp_flags & + (CI_TCP_FLAG_SYN | CI_TCP_FLAG_FIN))); if( (PKT_TCP_TX_SEQ_SPACE(pkt) >= tcp_eff_mss(ts)) | - (SEQ_LT(tcp_snd_una(ts), tcp_snd_up(ts)) ) ) + (SEQ_LT(tcp_snd_una(ts), tcp_snd_up(ts))) ) goto advance_now; if( ts->s.s_aflags & CI_SOCK_AFLAG_NODELAY ) { @@ -127,26 +126,28 @@ static void ci_tcp_tx_advance_nagle(ci_netif* ni, ci_tcp_state* ts) goto advance_now; } - LOG_TV(log(LPF "%d Nagle snd=%08x-%08x-%08x enq=%08x pkt=%x-%x", - S_FMT(ts), tcp_snd_una(ts), tcp_snd_nxt(ts), - ts->snd_max, tcp_enq_nxt(ts), - pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq)); + LOG_TV(log(LPF "%d Nagle snd=%08x-%08x-%08x enq=%08x pkt=%x-%x", S_FMT(ts), + tcp_snd_una(ts), tcp_snd_nxt(ts), ts->snd_max, tcp_enq_nxt(ts), + pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq)); ++ts->stats.tx_stop_nagle; - poll_and_out: +poll_and_out: if( ci_netif_may_poll(ni) && ci_netif_has_event(ni) ) ci_netif_poll(ni); } -ci_inline int ci_tcp_tx_n_pkts_needed(int eff_mss, int maxbytes, - int maxbufs, int sendq_credit) { +ci_inline int ci_tcp_tx_n_pkts_needed( + int eff_mss, int maxbytes, int maxbufs, int sendq_credit) +{ /* Calculate how many packet buffers we need to accommodate , ** assuming each will hold bytes, but do not exceed . */ int n = (maxbytes + eff_mss - 1) / eff_mss; - if( n > sendq_credit ) n = sendq_credit; - if( n > maxbufs ) n = maxbufs; + if( n > sendq_credit ) + n = sendq_credit; + if( n > maxbufs ) + n = maxbufs; return n; } @@ -167,26 +168,23 @@ ci_inline void ci_tcp_tx_pkt_init(ci_ip_pkt_fmt* pkt, int hdrlen, int mss) } -static -int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, - struct tcp_send_info* sinf, - ci_iovec_ptr* piov, int hdrlen, - int maxlen - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) +static int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, + struct tcp_send_info* sinf, ci_iovec_ptr* piov, int hdrlen, + int maxlen CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { /* Initialise and fill a packet buffer from an iovec. */ int n; - ci_ip_pkt_fmt* pkt = oo_pkt_filler_next_pkt(ni, &sinf->pf, sinf->stack_locked); + ci_ip_pkt_fmt* pkt = + oo_pkt_filler_next_pkt(ni, &sinf->pf, sinf->stack_locked); ci_assert(pkt); ci_assert(! ci_iovec_ptr_is_empty_proper(piov)); ci_tcp_tx_pkt_init(pkt, hdrlen, maxlen); - oo_pkt_filler_init(&sinf->pf, pkt, - (uint8_t*) oo_tx_l3_hdr(pkt) + hdrlen); + oo_pkt_filler_init(&sinf->pf, pkt, (uint8_t*) oo_tx_l3_hdr(pkt) + hdrlen); #if CI_CFG_IPV6 if( ipcache_af(&ts->s.pkt) == AF_INET ) - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; else pkt->flags |= CI_PKT_FLAG_IS_IP6; #endif @@ -198,13 +196,12 @@ int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, n = sinf->total_unsent - sinf->fill_list_bytes; n = CI_MIN(maxlen, n); - sinf->rc = oo_pkt_fill(ni, &ts->s, NULL/*p_netif_locked*/, - CI_FALSE/*can_block*/, &sinf->pf, piov, - n CI_KERNEL_ARG(addr_spc)); + sinf->rc = oo_pkt_fill(ni, &ts->s, NULL /*p_netif_locked*/, + CI_FALSE /*can_block*/, &sinf->pf, piov, n CI_KERNEL_ARG(addr_spc)); /* oo_pkt_fill does not allocate packets. So, it can fail with * -EFAULT only, in kernel mode only, because of oo_pkt_fill_copy(). */ #ifdef __KERNEL__ - if( CI_UNLIKELY( sinf->rc < 0 ) ) { + if( CI_UNLIKELY(sinf->rc < 0) ) { ci_assert_equal(sinf->rc, -EFAULT); goto fill_failed; } @@ -213,15 +210,15 @@ int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, #endif /* This assumes that packet filler only used a single buffer. - * offbuf use on the TCP send path needs to go long term + * offbuf use on the TCP send path needs to go long term */ ci_assert_ge(oo_offbuf_left(&pkt->buf), n); oo_offbuf_advance(&pkt->buf, n); /* We should have either filled the segment, or run out of data. */ LOG_TV(log("%s: iov.len=%d iovlen=%d n=%d pkt=%d left=%d", __FUNCTION__, - (int) CI_IOVEC_LEN(&piov->io), piov->iovlen, n, - OO_PKT_FMT(pkt), oo_offbuf_left(&pkt->buf))); + (int) CI_IOVEC_LEN(&piov->io), piov->iovlen, n, OO_PKT_FMT(pkt), + oo_offbuf_left(&pkt->buf))); #ifndef __KERNEL__ /* This can fail in the kernel due to bad user-level pointer, so can't assert this */ @@ -229,13 +226,13 @@ int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, oo_offbuf_left(&pkt->buf) == 0 || pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX); #else -# ifndef NDEBUG - if(!(ci_iovec_ptr_is_empty_proper(piov) || - oo_offbuf_left(&pkt->buf) == 0 || - pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX)) +#ifndef NDEBUG + if( ! (ci_iovec_ptr_is_empty_proper(piov) || + oo_offbuf_left(&pkt->buf) == 0 || + pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX) ) LOG_U(ci_log("%s: couldn't copy data, probably bad user-level pointer", - __FUNCTION__)); -# endif + __FUNCTION__)); +#endif #endif /* We must remember the header length the packet was initialised with, and @@ -245,12 +242,11 @@ int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, */ pkt->pf.tcp_tx.end_seq = n; - ci_assert_equal(TX_PKT_LEN(pkt), - oo_offbuf_ptr(&pkt->buf) - PKT_START(pkt)); + ci_assert_equal(TX_PKT_LEN(pkt), oo_offbuf_ptr(&pkt->buf) - PKT_START(pkt)); return n; #ifdef __KERNEL__ - fill_failed: +fill_failed: LOG_U(ci_log("%s: fill failed: %d\n", __FUNCTION__, sinf->rc)); ci_assert(0); return 0; @@ -259,8 +255,7 @@ int ci_tcp_sendmsg_fill_pkt(ci_netif* ni, ci_tcp_state* ts, static int ci_tcp_fill_stolen_buffer(ci_netif* ni, ci_ip_pkt_fmt* pkt, - ci_iovec_ptr* piov - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) + ci_iovec_ptr* piov CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { /* Fill a single packet, which must be initialised already (and may ** contain data), from an iovec. Used for the "stolen packet" case. @@ -271,22 +266,20 @@ static int ci_tcp_fill_stolen_buffer(ci_netif* ni, ci_ip_pkt_fmt* pkt, /* We should have either filled the segment, or run out of data. */ LOG_TV(log("%s: iov.len=%d iovlen=%d n=%d pkt=%d left=%d", __FUNCTION__, - (int) CI_IOVEC_LEN(&piov->io), piov->iovlen, n, - OO_PKT_FMT(pkt), oo_offbuf_left(&pkt->buf))); -#ifndef __KERNEL__ + (int) CI_IOVEC_LEN(&piov->io), piov->iovlen, n, OO_PKT_FMT(pkt), + oo_offbuf_left(&pkt->buf))); +#ifndef __KERNEL__ /* This can fail in the kernel due to bad user-level pointer, so can't assert this */ - ci_assert(ci_iovec_ptr_is_empty(piov) || - oo_offbuf_left(&pkt->buf) == 0 || + ci_assert(ci_iovec_ptr_is_empty(piov) || oo_offbuf_left(&pkt->buf) == 0 || pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX); #else -# ifndef NDEBUG - if(!(ci_iovec_ptr_is_empty(piov) || - oo_offbuf_left(&pkt->buf) == 0 || - pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX)) +#ifndef NDEBUG + if( ! (ci_iovec_ptr_is_empty(piov) || oo_offbuf_left(&pkt->buf) == 0 || + pkt->n_buffers == CI_IP_PKT_SEGMENTS_MAX) ) LOG_U(ci_log("%s: couldn't copy data, probably bad user-level pointer", - __FUNCTION__)); -# endif + __FUNCTION__)); +#endif #endif /* Fixup the packet meta-data. */ pkt->pf.tcp_tx.end_seq += n; @@ -307,11 +300,9 @@ static int tcp_payload_len(ci_ip_pkt_fmt* pkt) #endif -static -void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, - ci_iovec_ptr* piov, - struct tcp_send_info* sinf - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) +static void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, + ci_iovec_ptr* piov, + struct tcp_send_info* sinf CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { ci_ip_pkt_queue* sendq = &ts->send; ci_ip_pkt_fmt* pkt; @@ -321,10 +312,9 @@ void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, ci_assert(ci_ip_queue_not_empty(sendq)); pkt = PKT_CHK(ni, sendq->tail); - if( ts->s.tx_errno == 0 && - (NI_OPTS(ni).tcp_combine_sends_mode == 0 || - pkt->flags & CI_PKT_FLAG_TX_MORE) ) { - if(CI_UNLIKELY( pkt->flags & CI_PKT_FLAG_INDIRECT )) { + if( ts->s.tx_errno == 0 && (NI_OPTS(ni).tcp_combine_sends_mode == 0 || + pkt->flags & CI_PKT_FLAG_TX_MORE) ) { + if( CI_UNLIKELY(pkt->flags & CI_PKT_FLAG_INDIRECT) ) { /* Making this work in kernelspace is not particularly difficult, but * so rarely used that it's not worth the effort. The only thing which * is needed is a version of ci_copy_iovec which calls copy_from_user. */ @@ -339,18 +329,19 @@ void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, int mss = tcp_eff_mss(ts); int last_seg; int space; - if(CI_LIKELY( zch->segs < CI_IP_PKT_SEGMENTS_MAX - 1 && - (space = oo_tx_zc_left(pkt) - - CI_MEMBER_OFFSET(struct ci_pkt_zc_payload, local)) > 0 && - /* NB: annoyingly unavoidable division: */ - (last_seg = tcp_payload_len(pkt) % mss) != 0 )) { + if( CI_LIKELY(zch->segs < CI_IP_PKT_SEGMENTS_MAX - 1 && + (space = oo_tx_zc_left(pkt) - + CI_MEMBER_OFFSET( + struct ci_pkt_zc_payload, local)) > 0 && + /* NB: annoyingly unavoidable division: */ + (last_seg = tcp_payload_len(pkt) % mss) != 0) ) { /* Missed optimisation: the last zc_payload could have already been * a non-remote one so we could append there. Figuring that out, * though, would require walking the existing list of payloads. It's * better to be network-inefficient in an extremely rare case than to * be CPU-inefficient always. */ - struct ci_pkt_zc_payload* zcp = (struct ci_pkt_zc_payload*) - ((char*)zch + zch->end); + struct ci_pkt_zc_payload* zcp = + (struct ci_pkt_zc_payload*) ((char*) zch + zch->end); int n = ci_copy_iovec(zcp->local, CI_MIN(space, mss - last_seg), piov); zcp->len = n; zcp->prefix_space = 0; @@ -369,14 +360,13 @@ void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, sinf->total_unsent -= n; } #endif - } - else if( oo_offbuf_left(&pkt->buf) > 0 ) { - n = ci_tcp_fill_stolen_buffer(ni, pkt, piov CI_KERNEL_ARG(addr_spc)); - LOG_TV(ci_log("%s: "NT_FMT "sq=%d if=%d bytes=%d piov.left=%d " - "pkt.left=%d", __FUNCTION__, NT_PRI_ARGS(ni, ts), - SEQ_SUB(tcp_enq_nxt(ts), tcp_snd_nxt(ts)), - ci_tcp_inflight(ts), n, ci_iovec_ptr_bytes_count(piov), - oo_offbuf_left(&pkt->buf))); + } else if( oo_offbuf_left(&pkt->buf) > 0 ) { + n = ci_tcp_fill_stolen_buffer(ni, pkt, piov CI_KERNEL_ARG(addr_spc)); + LOG_TV(ci_log("%s: " NT_FMT "sq=%d if=%d bytes=%d piov.left=%d " + "pkt.left=%d", + __FUNCTION__, NT_PRI_ARGS(ni, ts), + SEQ_SUB(tcp_enq_nxt(ts), tcp_snd_nxt(ts)), ci_tcp_inflight(ts), n, + ci_iovec_ptr_bytes_count(piov), oo_offbuf_left(&pkt->buf))); tcp_enq_nxt(ts) += n; sinf->total_sent += n; sinf->total_unsent -= n; @@ -393,8 +383,8 @@ void ci_tcp_tx_fill_sendq_tail(ci_netif* ni, ci_tcp_state* ts, } -ci_inline void ci_tcp_sendmsg_prep_pkt(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* pkt, unsigned seq) +ci_inline void ci_tcp_sendmsg_prep_pkt( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* pkt, unsigned seq) { int orig_hdrlen, extra_opts; #ifndef NDEBUG @@ -410,7 +400,7 @@ ci_inline void ci_tcp_sendmsg_prep_pkt(ci_netif* ni, ci_tcp_state* ts, ** before we correct the sequence numbers (we stashed it away in [start_seq] ** when the buffer was filled). */ - orig_hdrlen = (int)pkt->pf.tcp_tx.start_seq; + orig_hdrlen = (int) pkt->pf.tcp_tx.start_seq; /* Sequence numbers in packet are 0...n, so we need to fix them up. ** (Note that, in the stolen packet case, the sequence numbers are OK and @@ -422,7 +412,7 @@ ci_inline void ci_tcp_sendmsg_prep_pkt(ci_netif* ni, ci_tcp_state* ts, pkt->pf.tcp_tx.block_end = OO_PP_NULL; LOG_TV(log(LPF "%s: %d: %x-%x", __FUNCTION__, OO_PKT_FMT(pkt), - pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq)); + pkt->pf.tcp_tx.start_seq, pkt->pf.tcp_tx.end_seq)); /* It's possible that we thought we didn't need space for TCP options when ** the buffer was initialised, but now it turns out that we do. (The dup @@ -435,18 +425,17 @@ ci_inline void ci_tcp_sendmsg_prep_pkt(ci_netif* ni, ci_tcp_state* ts, */ extra_opts = ts->outgoing_hdrs_len - orig_hdrlen; if( extra_opts ) - ci_tcp_tx_insert_option_space(ni, ts, pkt, - orig_hdrlen + oo_tx_ether_hdr_size(pkt), - extra_opts); + ci_tcp_tx_insert_option_space( + ni, ts, pkt, orig_hdrlen + oo_tx_ether_hdr_size(pkt), extra_opts); /* The sequence space consumed should match the bytes in the buffer. */ ci_assert_equal(oo_tx_l3_len(pkt), - CI_IPX_HDR_SIZE(af) + sizeof(ci_tcp_hdr) - + CI_TCP_HDR_OPT_LEN(TX_PKT_IPX_TCP(af, pkt)) - + SEQ_SUB(pkt->pf.tcp_tx.end_seq, pkt->pf.tcp_tx.start_seq)); + CI_IPX_HDR_SIZE(af) + sizeof(ci_tcp_hdr) + + CI_TCP_HDR_OPT_LEN(TX_PKT_IPX_TCP(af, pkt)) + + SEQ_SUB(pkt->pf.tcp_tx.end_seq, pkt->pf.tcp_tx.start_seq)); /* Correct offbuf end as might have been constructed with diff eff_mss */ - if(CI_LIKELY( ! (pkt->flags & CI_PKT_FLAG_INDIRECT) )) + if( CI_LIKELY(! (pkt->flags & CI_PKT_FLAG_INDIRECT)) ) ci_tcp_tx_pkt_set_end(ts, pkt); } @@ -456,7 +445,7 @@ ci_inline void ci_tcp_sendmsg_prep_pkt(ci_netif* ni, ci_tcp_state* ts, static int ci_tcp_tmpl_offset(void) { return CI_CFG_PKT_BUF_SIZE - sizeof(struct tcp_send_info) - - sizeof(struct oo_msg_template); + sizeof(struct oo_msg_template); } @@ -474,12 +463,10 @@ static void __ci_tcp_tmpl_handle_nic_reset(ci_netif* ni, ci_tcp_state* ts) if( tmpl->pio_addr >= 0 ) { if( ni->state->nic[tmpl->intf_i].oo_vi_flags & OO_VI_FLAGS_PIO_EN ) { CI_DEBUG_TRY(ef_pio_memcpy(ci_netif_vi(ni, tmpl->intf_i), - PKT_START(tmpl), - tmpl->pio_addr, tmpl->buf_len)); - } - else { + PKT_START(tmpl), tmpl->pio_addr, tmpl->buf_len)); + } else { ci_pio_buddy_free(ni, &ni->state->nic[tmpl->intf_i].pio_buddy, - tmpl->pio_addr, tmpl->pio_order); + tmpl->pio_addr, tmpl->pio_order); tmpl->pio_addr = -1; } } @@ -509,8 +496,8 @@ void ci_tcp_tmpl_handle_nic_reset(ci_netif* ni) /* Remove this template from the socket's template list. */ -static void ci_tcp_tmpl_remove(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* tmpl) +static void ci_tcp_tmpl_remove( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* tmpl) { struct oo_msg_template* omt = ci_tcp_tmpl_pkt_to_omt(tmpl); oo_pkt_p* pp; @@ -519,7 +506,7 @@ static void ci_tcp_tmpl_remove(ci_netif* ni, ci_tcp_state* ts, pp = &(PKT_CHK(ni, *pp)->next); *pp = tmpl->next; --(ts->stats.tx_tmpl_active); - omt->oomt_sock_id = OO_SP_NULL; /* TODO: debug only? */ + omt->oomt_sock_id = OO_SP_NULL; /* TODO: debug only? */ } @@ -528,8 +515,8 @@ static void ci_tcp_tmpl_remove(ci_netif* ni, ci_tcp_state* ts, * * Must be called with the stack lock held. */ -static void ci_tcp_tmpl_free(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* tmpl, int in_list) +static void ci_tcp_tmpl_free( + ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* tmpl, int in_list) { ci_assert(ni); ci_assert(ts); @@ -537,7 +524,7 @@ static void ci_tcp_tmpl_free(ci_netif* ni, ci_tcp_state* ts, if( tmpl->pio_addr >= 0 ) { ci_pio_buddy_free(ni, &ni->state->nic[tmpl->intf_i].pio_buddy, - tmpl->pio_addr, tmpl->pio_order); + tmpl->pio_addr, tmpl->pio_order); tmpl->pio_addr = -1; } if( in_list ) @@ -570,8 +557,8 @@ static ci_ip_pkt_fmt* ci_tcp_tmpl_omt_to_pkt(struct oo_msg_template* omt) } -static struct tcp_send_info* - ci_tcp_tmpl_omt_to_sinf(struct oo_msg_template* omt) +static struct tcp_send_info* ci_tcp_tmpl_omt_to_sinf( + struct oo_msg_template* omt) { return (void*) (omt + 1); } @@ -587,16 +574,16 @@ static struct tcp_send_info* * blocks. It returns the errno returned by ci_tcp_sendmsg(). */ static int __ci_tcp_tmpl_normal_send(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* tmpl, - struct tcp_send_info* sinf, unsigned flags) + ci_ip_pkt_fmt* tmpl, struct tcp_send_info* sinf, unsigned flags) { -#define CI_NOT_NULL ((void *)-1) +#define CI_NOT_NULL ((void*) -1) struct iovec iov[1]; int rc; ci_assert(ci_netif_is_locked(ni)); - iov[0].iov_base = CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(ipcache_af(&ts->s.pkt), tmpl)); + iov[0].iov_base = + CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(ipcache_af(&ts->s.pkt), tmpl)); iov[0].iov_len = sinf->total_unsent; if( ts->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY) ) @@ -609,12 +596,10 @@ static int __ci_tcp_tmpl_normal_send(ci_netif* ni, ci_tcp_state* ts, rc = ci_tcp_sendmsg(ni, ts, iov, 1, flags & ~ONLOAD_TEMPLATE_FLAGS_SEND_NOW); if( rc < 0 ) { rc = -errno; - } - else if( rc < sinf->total_unsent ) { + } else if( rc < sinf->total_unsent ) { /* We sent less than we wanted to. Connection probably closed. */ rc = -ts->s.tx_errno; - } - else { + } else { ci_assert_equal(rc, sinf->total_unsent); rc = 0; } @@ -628,8 +613,8 @@ static int __ci_tcp_tmpl_normal_send(ci_netif* ni, ci_tcp_state* ts, int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template** omt_pp, - const struct iovec* initial_msg, int mlen, unsigned flags) + struct oo_msg_template** omt_pp, const struct iovec* initial_msg, int mlen, + unsigned flags) { int i, max_payload; int rc = 0; @@ -651,19 +636,19 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, /* Templated sends currently require two data structures both of * which are stored on the packet buffer to avoid memory * allocations. They are placed at the end of the packet buffer. - */ + */ /* This is needed to ensure that an app written to a later version of the * API gets an error if they try to use a flag we don't understand. */ - if(CI_UNLIKELY( flags & ~ONLOAD_TEMPLATE_FLAGS_PIO_RETRY )) { + if( CI_UNLIKELY(flags & ~ONLOAD_TEMPLATE_FLAGS_PIO_RETRY) ) { LOG_E(ci_log("%s: called with unsupported flags=%x", __FUNCTION__, flags)); return -EINVAL; } ci_netif_lock(ni); - if(CI_UNLIKELY( (~ts->s.b.state & CI_TCP_STATE_SYNCHRONISED) )) { + if( CI_UNLIKELY((~ts->s.b.state & CI_TCP_STATE_SYNCHRONISED)) ) { /* Only handling connected connections. */ LOG_U(ci_log("ci_tcp_tmpl_alloc: not synchronized\n")); @@ -674,40 +659,40 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, /* Check for valid cplane information. */ - if(CI_UNLIKELY( ! oo_cp_ipcache_is_valid(ni, ipcache) )) { + if( CI_UNLIKELY(! oo_cp_ipcache_is_valid(ni, ipcache)) ) { oo_tcp_ipcache_update(ni, ts); switch( ipcache->status ) { - case retrrc_success: - /* Successfully validated cplane info on the socket. We will copy - * it into the packet later in this function. - */ - break; - - case retrrc_nomac: - /* We could not validate cplane info on the socket. We will - * copy incorrect MAC info to the packet later in this function. - * But it doesn't matter as we will do additional testing in - * tmpl_update() to ensure that we only send with valid cplane - * info. - * - * TODO: Maybe we want to request an arp at this point - */ - break; + case retrrc_success: + /* Successfully validated cplane info on the socket. We will copy + * it into the packet later in this function. + */ + break; + + case retrrc_nomac: + /* We could not validate cplane info on the socket. We will + * copy incorrect MAC info to the packet later in this function. + * But it doesn't matter as we will do additional testing in + * tmpl_update() to ensure that we only send with valid cplane + * info. + * + * TODO: Maybe we want to request an arp at this point + */ + break; - case retrrc_localroute: - goto local_route; + case retrrc_localroute: + goto local_route; - default: - LOG_U(ci_log("%s: cplane status=%d", __FUNCTION__, ipcache->status)); - rc = -EHOSTUNREACH; - goto out; + default: + LOG_U(ci_log("%s: cplane status=%d", __FUNCTION__, ipcache->status)); + rc = -EHOSTUNREACH; + goto out; } } if( ipcache->flags & CI_IP_CACHE_IS_LOCALROUTE ) { - local_route: + local_route: LOG_U(ci_log("%s: templated sends not supported on loopback connections", - __FUNCTION__)); + __FUNCTION__)); rc = -EOPNOTSUPP; goto out; } @@ -740,7 +725,7 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, int max_pio_pkt, max_buf_pkt; max_pio_pkt = nsn->pio_io_len - ETH_VLAN_HLEN; max_buf_pkt = - CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start); + CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, dma_start); max_payload = CI_MIN(max_buf_pkt, max_pio_pkt); max_payload -= ts->outgoing_hdrs_len + ETH_HLEN; max_payload -= sizeof(struct tcp_send_info); @@ -766,8 +751,9 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, */ ci_assert_equal(pkt->pio_addr, -1); pkt->intf_i = intf_i; - pkt->pio_order = ci_log2_ge(ts->outgoing_hdrs_len + ETH_HLEN + ETH_VLAN_HLEN - + total_unsent, CI_CFG_MIN_PIO_BLOCK_ORDER); + pkt->pio_order = ci_log2_ge( + ts->outgoing_hdrs_len + ETH_HLEN + ETH_VLAN_HLEN + total_unsent, + CI_CFG_MIN_PIO_BLOCK_ORDER); pkt->pio_addr = ci_pio_buddy_alloc(ni, &nsn->pio_buddy, pkt->pio_order); if( pkt->pio_addr < 0 ) { pkt->pio_addr = -1; @@ -780,7 +766,7 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, } #if CI_CFG_IPV6 if( af == AF_INET ) - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; else pkt->flags |= CI_PKT_FLAG_IS_IP6; #endif @@ -813,16 +799,15 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, /* XXX: Do I have to worry about MSG_CORK? */ /* TODO: look at this sinf stuff */ ci_iovec_ptr_init_nz(&piov, initial_msg, mlen); - sinf->fill_list_bytes += - ci_tcp_sendmsg_fill_pkt(ni, ts, sinf, &piov, ts->outgoing_hdrs_len, - tcp_eff_mss(ts)); + sinf->fill_list_bytes += ci_tcp_sendmsg_fill_pkt( + ni, ts, sinf, &piov, ts->outgoing_hdrs_len, tcp_eff_mss(ts)); ++sinf->n_filled; CI_USER_PTR_SET(sinf->pf.pkt->pf.tcp_tx.next, sinf->fill_list); sinf->fill_list = sinf->pf.pkt; ci_tcp_sendmsg_prep_pkt(ni, ts, pkt, tcp_enq_nxt(ts)); TX_PKT_IPX_TCP(af, sinf->fill_list)->tcp_flags = - CI_TCP_FLAG_PSH | CI_TCP_FLAG_ACK; + CI_TCP_FLAG_PSH | CI_TCP_FLAG_ACK; /* Initialise the protocol headers. We don't set those parts that will * always be rewritten when we do the actual send. */ @@ -838,24 +823,23 @@ int ci_tcp_tmpl_alloc(ci_netif* ni, ci_tcp_state* ts, ci_ip_set_mac_and_port(ni, ipcache, pkt); if( pkt->pio_addr >= 0 ) { - rc = ef_pio_memcpy(ci_netif_vi(ni, intf_i), PKT_START(pkt), - pkt->pio_addr, pkt->buf_len); + rc = ef_pio_memcpy( + ci_netif_vi(ni, intf_i), PKT_START(pkt), pkt->pio_addr, pkt->buf_len); ci_assert_equal(rc, 0); } ++ts->stats.tx_tmpl_active; - out: +out: ci_netif_unlock(ni); return rc; } -int -ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template* omt, - const struct onload_template_msg_update_iovec* updates, - int ulen, unsigned flags) +int ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, + struct oo_msg_template* omt, + const struct onload_template_msg_update_iovec* updates, int ulen, + unsigned flags) { /* XXX: In fast path, check if need to update ack. If send next is * what we expect it to be, we are in fast path. We should save @@ -876,8 +860,8 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, /* This is needed to ensure that an app written to a later version of the * API gets an error if they try to use a flag we don't understand. */ - if(CI_UNLIKELY( flags & ~(ONLOAD_TEMPLATE_FLAGS_SEND_NOW | - ONLOAD_TEMPLATE_FLAGS_DONTWAIT) )) { + if( CI_UNLIKELY(flags & ~(ONLOAD_TEMPLATE_FLAGS_SEND_NOW | + ONLOAD_TEMPLATE_FLAGS_DONTWAIT)) ) { LOG_E(ci_log("%s: called with unsupported flags=%x", __FUNCTION__, flags)); return -EINVAL; } @@ -886,40 +870,38 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, ipcache = &ts->s.pkt; pkt = ci_tcp_tmpl_omt_to_pkt(omt); - tcp = TX_PKT_IPX_TCP(af, pkt);; + tcp = TX_PKT_IPX_TCP(af, pkt); + ; vi = ci_netif_vi(ni, pkt->intf_i); tcp_opts = CI_TCP_HDR_OPTS(tcp); sinf = ci_tcp_tmpl_omt_to_sinf(omt); - if(CI_UNLIKELY( omt->oomt_sock_id != S_SP(ts) )) { + if( CI_UNLIKELY(omt->oomt_sock_id != S_SP(ts)) ) { rc = -EINVAL; ci_tcp_tmpl_free(ni, ts, pkt, 1); goto out; } - if(CI_UNLIKELY( ts->s.so_error )) { + if( CI_UNLIKELY(ts->s.so_error) ) { rc = -ci_get_so_error(&ts->s); if( rc < 0 ) { ci_tcp_tmpl_free(ni, ts, pkt, 1); goto out; } } - if(CI_UNLIKELY( ts->s.tx_errno )) { + if( CI_UNLIKELY(ts->s.tx_errno) ) { rc = -ts->s.tx_errno; ci_tcp_tmpl_free(ni, ts, pkt, 1); goto out; } - if(CI_UNLIKELY( pkt->pio_addr == -1 && - ! (flags & ONLOAD_TEMPLATE_FLAGS_SEND_NOW) )) { - pkt->pio_addr = - ci_pio_buddy_alloc(ni, &ni->state->nic[pkt->intf_i].pio_buddy, - pkt->pio_order); + if( CI_UNLIKELY(pkt->pio_addr == -1 && + ! (flags & ONLOAD_TEMPLATE_FLAGS_SEND_NOW)) ) { + pkt->pio_addr = ci_pio_buddy_alloc( + ni, &ni->state->nic[pkt->intf_i].pio_buddy, pkt->pio_order); if( pkt->pio_addr >= 0 ) { - rc = ef_pio_memcpy(vi, PKT_START(pkt), - pkt->pio_addr, pkt->buf_len); + rc = ef_pio_memcpy(vi, PKT_START(pkt), pkt->pio_addr, pkt->buf_len); ci_assert(rc == 0); - } - else { + } else { pkt->pio_addr = -1; } } @@ -928,8 +910,7 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, */ for( i = 0; i < ulen; ++i ) { /* TODO: Think about what checks we want at runtime. */ - if( updates[i].otmu_len == 0 || - updates[i].otmu_offset < 0 || + if( updates[i].otmu_len == 0 || updates[i].otmu_offset < 0 || #ifndef NDEBUG updates[i].otmu_base == NULL || #endif @@ -938,18 +919,21 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, goto out; } ci_assert((CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) - PKT_START(pkt)) + - updates[i].otmu_offset >= 0); + updates[i].otmu_offset >= + 0); - if(CI_UNLIKELY( pkt->pio_addr != -1 )) { + if( CI_UNLIKELY(pkt->pio_addr != -1) ) { rc = ef_pio_memcpy(vi, updates[i].otmu_base, - pkt->pio_addr + (ci_uint32) - (CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) - PKT_START(pkt)) + - updates[i].otmu_offset, - updates[i].otmu_len); + pkt->pio_addr + + (ci_uint32) (CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) - + PKT_START(pkt)) + + updates[i].otmu_offset, + updates[i].otmu_len); ci_assert_equal(rc, 0); } - memcpy((char*)CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) + updates[i].otmu_offset, - updates[i].otmu_base, updates[i].otmu_len); + memcpy((char*) CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) + + updates[i].otmu_offset, + updates[i].otmu_base, updates[i].otmu_len); } if( ! (flags & ONLOAD_TEMPLATE_FLAGS_SEND_NOW) ) { @@ -965,21 +949,19 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, cplane_is_valid = oo_cp_ipcache_is_valid(ni, ipcache); if( cplane_is_valid && ! memcmp(oo_tx_ether_hdr(pkt), ci_ip_cache_ether_hdr(ipcache), - oo_tx_ether_hdr_size(pkt)) && + oo_tx_ether_hdr_size(pkt)) && pkt->pio_addr != -1 ) { /* Socket has valid cplane info, the same info is on the pkt, and * it has a pio region allocated so we can send using pio. */ - } - else if( pkt->pio_addr == -1 ) { + } else if( pkt->pio_addr == -1 ) { /* We didn't get a PIO region. This can happen due to various * reasons including a NIC reset while the template was allocated * or we never had one to start with so use normal send. * __ci_tcp_tmpl_normal_send() releases the lock. */ return __ci_tcp_tmpl_normal_send(ni, ts, pkt, sinf, flags); - } - else if( cplane_is_valid ) { + } else if( cplane_is_valid ) { /* The pkt doesn't have the right cplane info but the socket does. * So update the pkt with the latest information. This can cause * the pkt size to change if the route changed from one with vlan @@ -989,16 +971,15 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, */ ci_assert_ge(pkt->pio_addr, 0); ci_ip_set_mac_and_port(ni, ipcache, pkt); - if( oo_tx_ether_hdr_size(pkt) == - (char*)&ipcache->ipx.ip4 - (char*)ci_ip_cache_ether_hdr(ipcache) ) + if( oo_tx_ether_hdr_size(pkt) == + (char*) &ipcache->ipx.ip4 - (char*) ci_ip_cache_ether_hdr(ipcache) ) /* TODO: we need to copy just the ethernet header here. */ rc = ef_pio_memcpy(vi, PKT_START(pkt), pkt->pio_addr, - (char*)PKT_IPX_TCP_HDR(af, pkt) - PKT_START(pkt)); + (char*) PKT_IPX_TCP_HDR(af, pkt) - PKT_START(pkt)); else rc = ef_pio_memcpy(vi, PKT_START(pkt), pkt->pio_addr, pkt->buf_len); ci_assert_equal(rc, 0); - } - else { + } else { /* We could not get mac info, do a normal send. * __ci_tcp_tmpl_normal_send() releases the lock. */ return __ci_tcp_tmpl_normal_send(ni, ts, pkt, sinf, flags); @@ -1040,9 +1021,9 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, /* XXX: Currently, updating the entire TCP header. Should only * update the affected portion and only if necessary */ rc = ef_pio_memcpy(vi, TX_PKT_IPX_TCP(af, pkt), - pkt->pio_addr + (char*) TX_PKT_IPX_TCP(af, pkt) - - PKT_START(pkt), CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) - - (char*)TX_PKT_IPX_TCP(af, pkt)); + pkt->pio_addr + (char*) TX_PKT_IPX_TCP(af, pkt) - PKT_START(pkt), + CI_TCP_PAYLOAD(PKT_IPX_TCP_HDR(af, pkt)) - + (char*) TX_PKT_IPX_TCP(af, pkt)); ci_assert_equal(rc, 0); /* This cannot fail as we already checked that there is space in @@ -1059,8 +1040,7 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, --ni->state->n_async_pkts; ++ts->stats.tx_tmpl_send_fast; CITP_STATS_NETIF_INC(ni, pio_pkts); - } - else { + } else { /* Unable to send via pio due to tcp state machinery or full TXQ. * So do a normal send. __ci_tcp_tmpl_normal_send() releases the * lock. @@ -1068,14 +1048,14 @@ ci_tcp_tmpl_update(ci_netif* ni, ci_tcp_state* ts, return __ci_tcp_tmpl_normal_send(ni, ts, pkt, sinf, flags); } - out: +out: ci_netif_unlock(ni); return rc; } -int ci_tcp_tmpl_abort(ci_netif* ni, ci_tcp_state* ts, - struct oo_msg_template* omt) +int ci_tcp_tmpl_abort( + ci_netif* ni, ci_tcp_state* ts, struct oo_msg_template* omt) { ci_ip_pkt_fmt* tmpl = ci_tcp_tmpl_omt_to_pkt(omt); int rc = 0; @@ -1085,7 +1065,7 @@ int ci_tcp_tmpl_abort(ci_netif* ni, ci_tcp_state* ts, goto out; } ci_tcp_tmpl_free(ni, ts, tmpl, 1); - out: +out: ci_netif_unlock(ni); return rc; } @@ -1095,9 +1075,7 @@ int ci_tcp_tmpl_abort(ci_netif* ni, ci_tcp_state* ts, static int ci_tcp_sendmsg_enqueue(ci_netif* ni, ci_tcp_state* ts, - ci_ip_pkt_fmt* reverse_list, - int total_bytes, - ci_ip_pkt_queue* sendq) + ci_ip_pkt_fmt* reverse_list, int total_bytes, ci_ip_pkt_queue* sendq) { unsigned seq = tcp_enq_nxt(ts) + total_bytes; oo_pkt_p tail_pkt_id = OO_PKT_P(reverse_list); @@ -1110,7 +1088,7 @@ static int ci_tcp_sendmsg_enqueue(ci_netif* ni, ci_tcp_state* ts, do { pkt = reverse_list; - reverse_list = (ci_ip_pkt_fmt *)CI_USER_PTR_GET(pkt->pf.tcp_tx.next); + reverse_list = (ci_ip_pkt_fmt*) CI_USER_PTR_GET(pkt->pf.tcp_tx.next); seq -= pkt->pf.tcp_tx.end_seq; ci_tcp_sendmsg_prep_pkt(ni, ts, pkt, seq); @@ -1118,8 +1096,7 @@ static int ci_tcp_sendmsg_enqueue(ci_netif* ni, ci_tcp_state* ts, pkt->next = send_list; send_list = OO_PKT_P(pkt); ++n_pkts; - } - while( reverse_list ); + } while( reverse_list ); ci_assert_equal(tcp_enq_nxt(ts), seq); tcp_enq_nxt(ts) += total_bytes; @@ -1133,16 +1110,15 @@ static int ci_tcp_sendmsg_enqueue(ci_netif* ni, ci_tcp_state* ts, PKT_CHK(ni, sendq->tail)->next = send_list; sendq->tail = tail_pkt_id; - LOG_TV(ci_log("%s: "NT_FMT "sendq.num=%d enq_nxt=%x", - __FUNCTION__, NT_PRI_ARGS(ni, ts), - sendq->num, tcp_enq_nxt(ts))); + LOG_TV(ci_log("%s: " NT_FMT "sendq.num=%d enq_nxt=%x", __FUNCTION__, + NT_PRI_ARGS(ni, ts), sendq->num, tcp_enq_nxt(ts))); CHECK_TS(ni, ts); return n_pkts; } -static int/*bool*/ +static int /*bool*/ ci_tcp_tx_prequeue(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* fill_list) { ci_ip_pkt_fmt* next; @@ -1153,7 +1129,8 @@ ci_tcp_tx_prequeue(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* fill_list) pkt = fill_list; while( 1 ) { ++n_pkts; - if( ! (next = CI_USER_PTR_GET(pkt->pf.tcp_tx.next)) ) break; + if( ! (next = CI_USER_PTR_GET(pkt->pf.tcp_tx.next)) ) + break; pkt->next = OO_PKT_P(next); pkt = next; } @@ -1164,9 +1141,8 @@ ci_tcp_tx_prequeue(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* fill_list) if( next == OO_PP_ID_INVALID ) return 0; OO_PP_INIT(ni, pkt->next, next); - } - while( ci_cas32_fail(&ts->send_prequeue, - OO_PP_ID(pkt->next), OO_PKT_ID(fill_list)) ); + } while( ci_cas32_fail( + &ts->send_prequeue, OO_PP_ID(pkt->next), OO_PKT_ID(fill_list)) ); oo_atomic_add(&ts->send_prequeue_in, n_pkts); ++ts->stats.tx_defer; @@ -1175,8 +1151,8 @@ ci_tcp_tx_prequeue(ci_netif* ni, ci_tcp_state* ts, ci_ip_pkt_fmt* fill_list) } -void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, ci_tcp_state* ts, - int/*bool*/ shutdown) +void ci_tcp_sendmsg_enqueue_prequeue( + ci_netif* ni, ci_tcp_state* ts, int /*bool*/ shutdown) { ci_ip_pkt_queue* sendq = &ts->send; ci_ip_pkt_fmt* pkt; @@ -1192,10 +1168,10 @@ void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, ci_tcp_state* ts, /* Grab the contents of the prequeue atomically. */ do { OO_PP_INIT(ni, id, ts->send_prequeue); - if( OO_PP_IS_NULL(id) && ! shutdown) + if( OO_PP_IS_NULL(id) && ! shutdown ) return; } while( ci_cas32_fail(&ts->send_prequeue, OO_PP_ID(id), - shutdown ? OO_PP_ID_INVALID : OO_PP_ID_NULL) ); + shutdown ? OO_PP_ID_INVALID : OO_PP_ID_NULL) ); /* Exit if nothing to send */ if( OO_PP_IS_NULL(id) ) { @@ -1211,18 +1187,19 @@ void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, ci_tcp_state* ts, pkt->next = send_list; send_list = OO_PKT_P(pkt); ++n_pkts; - } - while( OO_PP_NOT_NULL(id) ); + } while( OO_PP_NOT_NULL(id) ); /* Prep each packet. */ while( 1 ) { bytes = pkt->pf.tcp_tx.end_seq; ci_tcp_sendmsg_prep_pkt(ni, ts, pkt, tcp_enq_nxt(ts)); if( pkt->flags & CI_PKT_FLAG_TX_PSH ) - TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt)->tcp_flags |= CI_TCP_FLAG_PSH; + TX_PKT_IPX_TCP(ipcache_af(&ts->s.pkt), pkt)->tcp_flags |= + CI_TCP_FLAG_PSH; tcp_enq_nxt(ts) += bytes; - if( OO_PP_IS_NULL(pkt->next) ) break; + if( OO_PP_IS_NULL(pkt->next) ) + break; pkt = PKT_CHK(ni, pkt->next); } @@ -1236,8 +1213,7 @@ void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, ci_tcp_state* ts, if( OO_PP_IS_NULL(sendq->head) ) { sendq->head = send_list; pkt = PKT_CHK(ni, send_list); - } - else { + } else { pkt = PKT_CHK(ni, sendq->tail); pkt->next = send_list; } @@ -1246,8 +1222,7 @@ void ci_tcp_sendmsg_enqueue_prequeue(ci_netif* ni, ci_tcp_state* ts, static int ci_tcp_sendmsg_free_pkt_list(ci_netif* ni, ci_tcp_state* ts, - oo_pkt_p pkt_list, int netif_locked, - int check_aop) + oo_pkt_p pkt_list, int netif_locked, int check_aop) { /* NB. Packets must be "asynchronous". That is, accounted for in * [n_async_pkts]. @@ -1256,7 +1231,7 @@ static int ci_tcp_sendmsg_free_pkt_list(ci_netif* ni, ci_tcp_state* ts, int n_pkts = 0; ci_assert(OO_PP_NOT_NULL(pkt_list)); - ci_assert( ! netif_locked || ci_netif_is_locked(ni)); + ci_assert(! netif_locked || ci_netif_is_locked(ni)); if( ! netif_locked && ! ci_netif_trylock(ni) ) { do { @@ -1264,14 +1239,13 @@ static int ci_tcp_sendmsg_free_pkt_list(ci_netif* ni, ci_tcp_state* ts, pkt_list = pkt->next; /* ?? TODO: cope with these cases */ ci_assert_equal(pkt->refcount, 1); - ci_assert(!(pkt->flags & CI_PKT_FLAG_RX)); + ci_assert(! (pkt->flags & CI_PKT_FLAG_RX)); pkt->refcount = 0; __ci_netif_pkt_clean(pkt); ci_netif_pkt_free_nonb_list(ni, OO_PKT_P(pkt), pkt); ++n_pkts; } while( OO_PP_NOT_NULL(pkt_list) ); - } - else { + } else { do { pkt = PKT_CHK(ni, pkt_list); pkt_list = pkt->next; @@ -1279,7 +1253,8 @@ static int ci_tcp_sendmsg_free_pkt_list(ci_netif* ni, ci_tcp_state* ts, ++n_pkts; } while( OO_PP_NOT_NULL(pkt_list) ); ni->state->n_async_pkts -= n_pkts; - if( ! netif_locked ) ci_netif_unlock(ni); + if( ! netif_locked ) + ci_netif_unlock(ni); } return n_pkts; @@ -1301,19 +1276,20 @@ static void ci_netif_pkt_convert_ptr_list(ci_netif* ni, ci_ip_pkt_fmt* list) } -static void -ci_tcp_tx_free_prequeue(ci_netif* ni, ci_tcp_state* ts, int netif_locked) +static void ci_tcp_tx_free_prequeue( + ci_netif* ni, ci_tcp_state* ts, int netif_locked) { int n_pkts; oo_pkt_p id; - ci_assert( ! netif_locked || ci_netif_is_locked(ni)); + ci_assert(! netif_locked || ci_netif_is_locked(ni)); /* Grab contents of prequeue atomically. We might not be the only thread ** trying to free it! */ do { OO_PP_INIT(ni, id, ts->send_prequeue); - if( OO_PP_IS_NULL(id) ) return; + if( OO_PP_IS_NULL(id) ) + return; } while( ci_cas32_fail(&ts->send_prequeue, OO_PP_ID(id), OO_PP_ID_NULL) ); n_pkts = ci_tcp_sendmsg_free_pkt_list(ni, ts, id, netif_locked, 1); @@ -1344,22 +1320,22 @@ void ci_tcp_sendmsg_enqueue_prequeue_deferred(ci_netif* ni, ci_tcp_state* ts) } -ci_inline void ci_tcp_sendmsg_free_unused_pkts(ci_netif* ni, - struct tcp_send_info* sinf) +ci_inline void ci_tcp_sendmsg_free_unused_pkts( + ci_netif* ni, struct tcp_send_info* sinf) { oo_pkt_filler_free_unused_pkts(ni, &sinf->stack_locked, &sinf->pf); } -static int ci_tcp_sendmsg_notsynchronised(ci_netif* ni, ci_tcp_state* ts, - int flags, struct tcp_send_info* sinf) +static int ci_tcp_sendmsg_notsynchronised( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { sinf->rc = 1; /* The same sanity check is done in intercept. This one here is to make ** sure (whether needed or not) that internal calls are checked. */ if( ts->s.b.state == CI_TCP_CLOSED ) - sinf->rc = 0; /* use tx_errno */ + sinf->rc = 0; /* use tx_errno */ /* State must be SYN-SENT, but can change under our feet as we don't have ** the netif lock. If non-blocking, return EAGAIN. */ @@ -1369,16 +1345,16 @@ static int ci_tcp_sendmsg_notsynchronised(ci_netif* ni, ci_tcp_state* ts, if( sinf->rc <= 0 ) return -1; -#define CONNECT_IN_PROGRESS ((ts->s.b.state == CI_TCP_SYN_SENT) && \ - ts->s.tx_errno == 0) +#define CONNECT_IN_PROGRESS \ + ((ts->s.b.state == CI_TCP_SYN_SENT) && ts->s.tx_errno == 0) - if( !sinf->stack_locked ) { + if( ! sinf->stack_locked ) { if( (sinf->rc = ci_netif_lock(ni)) ) return -1; sinf->stack_locked = 1; } - CI_TCP_SLEEP_WHILE(ni, ts, CI_SB_FLAG_WAKE_RX, ts->s.so.rcvtimeo_msec, - CONNECT_IN_PROGRESS, &sinf->rc); + CI_TCP_SLEEP_WHILE(ni, ts, CI_SB_FLAG_WAKE_RX, ts->s.so.rcvtimeo_msec, + CONNECT_IN_PROGRESS, &sinf->rc); if( sinf->rc != 0 || ts->s.tx_errno != 0 ) return -1; @@ -1386,10 +1362,8 @@ static int ci_tcp_sendmsg_notsynchronised(ci_netif* ni, ci_tcp_state* ts, } -static void ci_tcp_sendmsg_handle_rc_or_tx_errno(ci_netif* ni, - ci_tcp_state* ts, - int flags, - struct tcp_send_info* sinf) +static void ci_tcp_sendmsg_handle_rc_or_tx_errno( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { sinf->set_errno = 0; @@ -1401,8 +1375,7 @@ static void ci_tcp_sendmsg_handle_rc_or_tx_errno(ci_netif* ni, if( sinf->total_sent ) { sinf->rc = sinf->total_sent; sinf->set_errno = 0; - } - else { + } else { if( ts->s.so_error ) { ci_int32 rc1 = ci_get_so_error(&ts->s); if( rc1 != 0 ) { @@ -1413,7 +1386,7 @@ static void ci_tcp_sendmsg_handle_rc_or_tx_errno(ci_netif* ni, if( sinf->rc == 0 && ts->s.tx_errno ) { LOG_TC(log(LNT_FMT "tx_errno=%d flags=%x total_sent=%d", - LNT_PRI_ARGS(ni, ts), ts->s.tx_errno, flags, sinf->total_sent)); + LNT_PRI_ARGS(ni, ts), ts->s.tx_errno, flags, sinf->total_sent)); sinf->rc = ts->s.tx_errno; sinf->set_errno = 1; } @@ -1426,31 +1399,27 @@ static void ci_tcp_sendmsg_handle_rc_or_tx_errno(ci_netif* ni, } -static void ci_tcp_sendmsg_handle_zero_or_tx_errno(ci_netif* ni, - ci_tcp_state* ts, - int flags, - struct tcp_send_info* sinf) +static void ci_tcp_sendmsg_handle_zero_or_tx_errno( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { sinf->rc = 0; return ci_tcp_sendmsg_handle_rc_or_tx_errno(ni, ts, flags, sinf); } -static void ci_tcp_sendmsg_free_fill_list(ci_netif* ni, ci_tcp_state* ts, - int flags, - struct tcp_send_info* sinf) +static void ci_tcp_sendmsg_free_fill_list( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { if( sinf->fill_list ) { ci_netif_pkt_convert_ptr_list(ni, sinf->fill_list); - ci_tcp_sendmsg_free_pkt_list(ni, ts, OO_PKT_P(sinf->fill_list), - sinf->stack_locked, 0); + ci_tcp_sendmsg_free_pkt_list( + ni, ts, OO_PKT_P(sinf->fill_list), sinf->stack_locked, 0); } } -static void ci_tcp_sendmsg_handle_tx_errno(ci_netif* ni, ci_tcp_state* ts, - int flags, - struct tcp_send_info* sinf) +static void ci_tcp_sendmsg_handle_tx_errno( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { ci_tcp_sendmsg_free_fill_list(ni, ts, flags, sinf); ci_tcp_sendmsg_free_unused_pkts(ni, sinf); @@ -1459,9 +1428,8 @@ static void ci_tcp_sendmsg_handle_tx_errno(ci_netif* ni, ci_tcp_state* ts, } -static void ci_tcp_sendmsg_handle_sent_or_rc(ci_netif* ni, ci_tcp_state* ts, - int flags, - struct tcp_send_info* sinf) +static void ci_tcp_sendmsg_handle_sent_or_rc( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { ci_tcp_sendmsg_free_fill_list(ni, ts, flags, sinf); ci_tcp_sendmsg_free_unused_pkts(ni, sinf); @@ -1472,21 +1440,20 @@ static void ci_tcp_sendmsg_handle_sent_or_rc(ci_netif* ni, ci_tcp_state* ts, if( sinf->total_sent ) { sinf->rc = sinf->total_sent; sinf->set_errno = 0; - } - else { + } else { sinf->rc = -sinf->rc; sinf->set_errno = 1; } } -static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, - int flags, struct tcp_send_info* sinf) +static int ci_tcp_sendmsg_no_pkt_buf( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { ci_ip_pkt_fmt* pkt; do { pkt = ci_netif_pkt_alloc_nonb(ni); - if( pkt ) + if( pkt ) oo_pkt_filler_add_pkt(&sinf->pf, pkt); else break; @@ -1496,7 +1463,7 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, return 0; else { CITP_STATS_NETIF_INC(ni, tcp_send_nonb_pool_empty); - if( !si_trylock(ni, sinf) ) { + if( ! si_trylock(ni, sinf) ) { if( sinf->n_filled ) return 1; if( (sinf->rc = ci_netif_lock(ni)) != 0 ) { @@ -1514,7 +1481,7 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, * it might be provoked to allocate more memory when none is needed. */ ci_netif_poll(ni); - + while( 1 ) { ci_assert(ci_netif_is_locked(ni)); do { @@ -1526,12 +1493,10 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, pkt->flags = CI_PKT_FLAG_NONB_POOL; ++ni->state->n_async_pkts; oo_pkt_filler_add_pkt(&sinf->pf, pkt); - } - else if( sinf->n_filled ) { + } else if( sinf->n_filled ) { /* If we've filled any packets, push them out before blocking. */ return 1; - } - else + } else break; } while( --sinf->n_needed > 0 ); @@ -1541,7 +1506,7 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, ci_assert(sinf->fill_list == 0); /* Do not block on pkt allocation if this is non-blocking send */ - if( (flags & MSG_DONTWAIT) && + if( (flags & MSG_DONTWAIT) && (NI_OPTS(ni).tcp_nonblock_no_pkts_mode == 1) ) { /* errno based on reading of __ip_append_data() and * udp_sendmsg() when skb allocation fails in kernel 3.16. @@ -1551,8 +1516,8 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, return -1; } - sinf->rc = ci_netif_pkt_wait(ni, &ts->s, sinf->stack_locked ? - CI_SLEEP_NETIF_LOCKED : 0); + sinf->rc = ci_netif_pkt_wait( + ni, &ts->s, sinf->stack_locked ? CI_SLEEP_NETIF_LOCKED : 0); sinf->stack_locked = 0; if( ci_netif_pkt_wait_was_interrupted(sinf->rc) ) { ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, sinf); @@ -1560,7 +1525,7 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, } do { pkt = ci_netif_pkt_alloc_nonb(ni); - if( pkt ) + if( pkt ) oo_pkt_filler_add_pkt(&sinf->pf, pkt); else break; @@ -1576,7 +1541,7 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, /* Start of loop expects lock to be held */ ci_assert(sinf->stack_locked == 0); - if( !si_trylock(ni, sinf) ) { + if( ! si_trylock(ni, sinf) ) { if( (sinf->rc = ci_netif_lock(ni)) != 0 ) { ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, sinf); return -1; @@ -1592,8 +1557,8 @@ static int ci_tcp_sendmsg_no_pkt_buf(ci_netif* ni, ci_tcp_state* ts, } -ci_inline int ci_tcp_sendmsg_spin(ci_netif* ni, ci_tcp_state* ts, - int flags, struct tcp_send_info* sinf) +ci_inline int ci_tcp_sendmsg_spin( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { ci_uint64 now_frc; ci_uint64 schedule_frc; @@ -1607,8 +1572,8 @@ ci_inline int ci_tcp_sendmsg_spin(ci_netif* ni, ci_tcp_state* ts, schedule_frc = now_frc; if( ts->s.so.sndtimeo_msec ) { - ci_uint64 max_so_spin = (ci_uint64)ts->s.so.sndtimeo_msec * - IPTIMER_STATE(ni)->khz; + ci_uint64 max_so_spin = + (ci_uint64) ts->s.so.sndtimeo_msec * IPTIMER_STATE(ni)->khz; if( max_so_spin <= max_spin ) { max_spin = max_so_spin; spin_limit_by_so = 1; @@ -1629,8 +1594,7 @@ ci_inline int ci_tcp_sendmsg_spin(ci_netif* ni, ci_tcp_state* ts, ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, sinf); return -1; } - } - else if( ! ni->state->is_spinner ) + } else if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; } if( sinf->stack_locked ) { @@ -1638,9 +1602,8 @@ ci_inline int ci_tcp_sendmsg_spin(ci_netif* ni, ci_tcp_state* ts, sinf->stack_locked = 0; } ci_frc64(&now_frc); - sinf->rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, &schedule_frc, - ts->s.so.sndtimeo_msec, - NULL, si); + sinf->rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS( + ni, now_frc, &schedule_frc, ts->s.so.sndtimeo_msec, NULL, si); if( sinf->rc != 0 ) { ni->state->is_spinner = 0; ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, sinf); @@ -1669,22 +1632,21 @@ ci_inline int ci_tcp_sendmsg_spin(ci_netif* ni, ci_tcp_state* ts, } return 1; } - -static int ci_tcp_sendmsg_block(ci_netif* ni, ci_tcp_state* ts, - int flags, struct tcp_send_info* sinf) +static int ci_tcp_sendmsg_block( + ci_netif* ni, ci_tcp_state* ts, int flags, struct tcp_send_info* sinf) { ci_uint64 sleep_seq; - CI_IP_SOCK_STATS_INC_TXSTUCK( ts ); + CI_IP_SOCK_STATS_INC_TXSTUCK(ts); do { if( ts->s.tx_errno ) { ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, sinf); return -1; } - + /* Record the current [sleep_seq] and check again to ensure we do a * race-free block. */ @@ -1693,41 +1655,39 @@ static int ci_tcp_sendmsg_block(ci_netif* ni, ci_tcp_state* ts, sinf->sendq_credit = ci_tcp_tx_send_space(ni, ts); if( sinf->sendq_credit > 0 ) return 0; - - CI_IP_SOCK_STATS_INC_TXSLEEP( ts ); - - sinf->rc = - ci_sock_sleep(ni, &ts->s.b, CI_SB_FLAG_WAKE_TX, - sinf->stack_locked ? CI_SLEEP_NETIF_LOCKED : 0, - sleep_seq, &sinf->timeout); + + CI_IP_SOCK_STATS_INC_TXSLEEP(ts); + + sinf->rc = ci_sock_sleep(ni, &ts->s.b, CI_SB_FLAG_WAKE_TX, + sinf->stack_locked ? CI_SLEEP_NETIF_LOCKED : 0, sleep_seq, + &sinf->timeout); /* ci_sock_sleep drops lock */ sinf->stack_locked = 0; - + if( sinf->rc < 0 ) { ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, sinf); return -1; } - } while(1); + } while( 1 ); } -static int ci_tcp_sendmsg_slowpath(ci_netif* ni, ci_tcp_state* ts, - const ci_iovec* iov, unsigned long iovlen, - int flags, struct tcp_send_info* sinf - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) +static int ci_tcp_sendmsg_slowpath(ci_netif* ni, ci_tcp_state* ts, + const ci_iovec* iov, unsigned long iovlen, int flags, + struct tcp_send_info* sinf CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { /* Set NO_TX_ADVANCE flag out here in order to ensure that * ci_tcp_sendmsg can't really push any packets out; all it can do * is enqueue packets. Then we set [snd_up] to the correct value - * before unsetting the flag. + * before unsetting the flag. * * The whole point is that ci_tcp_sendmsg() can proceed without giving a * damn about urgent data. */ int rc; unsigned enq_nxt_before; - - if( !sinf->total_unsent ) { + + if( ! sinf->total_unsent ) { sinf->rc = 0; return -1; } @@ -1739,7 +1699,7 @@ static int ci_tcp_sendmsg_slowpath(ci_netif* ni, ci_tcp_state* ts, sinf->rc = rc; return -1; } - + /* Poll first, so we have an accurate view of space in the send queue. */ if( ci_netif_may_poll(ni) && ci_netif_need_poll(ni) ) ci_netif_poll(ni); @@ -1751,14 +1711,14 @@ static int ci_tcp_sendmsg_slowpath(ci_netif* ni, ci_tcp_state* ts, */ tcp_snd_up(ts) = tcp_enq_nxt(ts) + sinf->total_unsent; enq_nxt_before = tcp_enq_nxt(ts); - + ts->tcpflags |= CI_TCPT_FLAG_NO_TX_ADVANCE; ci_netif_unlock(ni); - sinf->rc = ci_tcp_sendmsg(ni, ts, iov, iovlen, (flags &~ MSG_OOB) - CI_KERNEL_ARG(addr_spc)); - + sinf->rc = ci_tcp_sendmsg( + ni, ts, iov, iovlen, (flags & ~MSG_OOB) CI_KERNEL_ARG(addr_spc)); + rc = ci_netif_lock(ni); if( rc != 0 ) { /* If this happens (should only be from the kernel, which can't @@ -1787,8 +1747,7 @@ static int ci_tcp_sendmsg_slowpath(ci_netif* ni, ci_tcp_state* ts, static int can_do_msg_warm(ci_netif* ni, ci_tcp_state* ts, - struct tcp_send_info* sinf, int total_unsent, - int flags) + struct tcp_send_info* sinf, int total_unsent, int flags) { /* Check all conditions that put us on the slow path for a normal * sends or unsupported conditions for ONLOAD_MSG_WARM. @@ -1800,25 +1759,20 @@ static int can_do_msg_warm(ci_netif* ni, ci_tcp_state* ts, * consider doing that in the future if we suspect that msg_warm can * help with them. */ - return si_trylock(ni, sinf) && - ci_ip_queue_is_empty(&ts->send) && - ci_ip_queue_is_empty(&ts->retrans) && - ! (flags & MSG_MORE) && - total_unsent < tcp_eff_mss(ts) && - total_unsent > 0 && - ! (ts->s.s_aflags & CI_SOCK_AFLAG_CORK) && - ! ts->s.tx_errno && - SEQ_LE(tcp_enq_nxt(ts) + total_unsent, ts->snd_max) && + return si_trylock(ni, sinf) && ci_ip_queue_is_empty(&ts->send) && + ci_ip_queue_is_empty(&ts->retrans) && ! (flags & MSG_MORE) && + total_unsent < tcp_eff_mss(ts) && total_unsent > 0 && + ! (ts->s.s_aflags & CI_SOCK_AFLAG_CORK) && ! ts->s.tx_errno && + SEQ_LE(tcp_enq_nxt(ts) + total_unsent, ts->snd_max) && #if CI_CFG_PORT_STRIPING - ! (ts->tcpflags & CI_TCPT_FLAG_STRIPE) && + ! (ts->tcpflags & CI_TCPT_FLAG_STRIPE) && #endif - ! (ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE); + ! (ts->s.pkt.flags & CI_IP_CACHE_IS_LOCALROUTE); } -static __attribute__ ((__noinline__)) void -unroll_msg_warm(ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf, - int is_zc_send) +static __attribute__((__noinline__)) void unroll_msg_warm( + ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf, int is_zc_send) { ci_ip_pkt_fmt* pkt; ++ts->stats.tx_msg_warm; @@ -1843,8 +1797,7 @@ unroll_msg_warm(ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf, if( ! is_zc_send ) { pkt = PKT_CHK(ni, ts->send.tail); ci_netif_pkt_release_1ref(ni, pkt); - } - else { + } else { /* ci_tcp_sendmsg_enqueue() decrements n_async_pkts. It is normally * rolled back in some way by pkt_release(), but in case of zc_send * we should fix this number. */ @@ -1854,9 +1807,8 @@ unroll_msg_warm(ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf, /* Grab packet buffers. */ -static int -ci_tcp_send_alloc_pkts(ci_netif* ni, ci_tcp_state* ts, - struct tcp_send_info* sinf, int got) +static int ci_tcp_send_alloc_pkts( + ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf, int got) { ci_ip_pkt_fmt* pkt; int rc; @@ -1864,9 +1816,8 @@ ci_tcp_send_alloc_pkts(ci_netif* ni, ci_tcp_state* ts, ci_assert_gt(sinf->total_unsent, 0); ci_assert_gt(sinf->sendq_credit, 0); - sinf->n_needed = ci_tcp_tx_n_pkts_needed(ts->eff_mss, sinf->total_unsent, - CI_CFG_TCP_TX_BATCH, - sinf->sendq_credit); + sinf->n_needed = ci_tcp_tx_n_pkts_needed(ts->eff_mss, sinf->total_unsent, + CI_CFG_TCP_TX_BATCH, sinf->sendq_credit); rc = sinf->n_needed; sinf->fill_list = 0; sinf->fill_list_bytes = 0; @@ -1879,10 +1830,10 @@ ci_tcp_send_alloc_pkts(ci_netif* ni, ci_tcp_state* ts, if( (pkt = ci_netif_pkt_tx_tcp_alloc(ni, ts)) ) { ++ni->state->n_async_pkts; oo_pkt_filler_add_pkt(&sinf->pf, pkt); - } - else - return rc;; - } else + } else + return rc; + ; + } else return rc; sinf->n_needed--; } @@ -1890,30 +1841,26 @@ ci_tcp_send_alloc_pkts(ci_netif* ni, ci_tcp_state* ts, return rc; } -static void -ci_tcp_send_fill_pkts(ci_netif* ni, ci_tcp_state* ts, - struct tcp_send_info* sinf, ci_iovec_ptr* piov, - int n_pkts - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) +static void ci_tcp_send_fill_pkts(ci_netif* ni, ci_tcp_state* ts, + struct tcp_send_info* sinf, ci_iovec_ptr* piov, + int n_pkts CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { ci_assert(! ci_iovec_ptr_is_empty_proper(piov)); ci_assert_equal(sinf->n_needed, 0); do { - sinf->fill_list_bytes += - ci_tcp_sendmsg_fill_pkt(ni, ts, sinf, piov, ts->outgoing_hdrs_len, - ts->eff_mss CI_KERNEL_ARG(addr_spc)); + sinf->fill_list_bytes += ci_tcp_sendmsg_fill_pkt(ni, ts, sinf, piov, + ts->outgoing_hdrs_len, ts->eff_mss CI_KERNEL_ARG(addr_spc)); ++sinf->n_filled; CI_USER_PTR_SET(sinf->pf.pkt->pf.tcp_tx.next, sinf->fill_list); sinf->fill_list = sinf->pf.pkt; - } - while( --n_pkts > 0 ); + } while( --n_pkts > 0 ); } /* returns 1 if data sent, 0 otherwise */ -static int ci_tcp_send_via_prequeue(ci_netif* ni, ci_tcp_state* ts, - struct tcp_send_info* sinf) +static int ci_tcp_send_via_prequeue( + ci_netif* ni, ci_tcp_state* ts, struct tcp_send_info* sinf) { int queued = ci_tcp_tx_prequeue(ni, ts, sinf->fill_list); @@ -1935,10 +1882,8 @@ static int ci_tcp_send_via_prequeue(ci_netif* ni, ci_tcp_state* ts, /* It is not safe to call this function while holding the netif lock */ /*! \todo Confirm */ -int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, - const ci_iovec* iov, unsigned long iovlen, - int flags - CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) +int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, const ci_iovec* iov, + unsigned long iovlen, int flags CI_KERNEL_ARG(ci_addr_spc_t addr_spc)) { ci_ip_pkt_queue* sendq = &ts->send; ci_ip_pkt_fmt* pkt; @@ -1968,8 +1913,8 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, sinf.timeout = ts->s.so.sndtimeo_msec; sinf.sendq_credit = 0; #ifndef __KERNEL__ - sinf.tcp_send_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); + sinf.tcp_send_spin = + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); if( sinf.tcp_send_spin ) ci_frc64(&sinf.start_frc); #else @@ -1977,10 +1922,10 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, #endif - if(CI_UNLIKELY( (~ts->s.b.state & CI_TCP_STATE_SYNCHRONISED) )) + if( CI_UNLIKELY((~ts->s.b.state & CI_TCP_STATE_SYNCHRONISED)) ) goto not_synchronised; - is_sync: +is_sync: /* We want (int)(2 * MAX_SEND_CHUNK) > 0 * sinf.total_unsent is `int` and must be positive, otherwise our code @@ -1989,13 +1934,14 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, * MAX_SEND_CHUNK. */ #define MAX_SEND_CHUNK 0x3fffffff - for( m = 0; m < (int)iovlen; ++m ) { + for( m = 0; m < (int) iovlen; ++m ) { sinf.total_unsent += CI_IOVEC_LEN(&iov[m]); - if(CI_UNLIKELY( CI_IOVEC_BASE(&iov[m]) == NULL && - CI_IOVEC_LEN(&iov[m]) > 0 )) { + if( CI_UNLIKELY( + CI_IOVEC_BASE(&iov[m]) == NULL && CI_IOVEC_LEN(&iov[m]) > 0) ) { sinf.rc = -EFAULT; ci_tcp_sendmsg_handle_rc_or_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } if( CI_IOVEC_LEN(&iov[m]) > MAX_SEND_CHUNK || @@ -2006,15 +1952,15 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, } #undef MAX_SEND_CHUNK - if(CI_UNLIKELY( ! sinf.total_unsent || - (flags & (MSG_OOB | ONLOAD_MSG_WARM)) )) + if( CI_UNLIKELY( + ! sinf.total_unsent || (flags & (MSG_OOB | ONLOAD_MSG_WARM))) ) goto slow_path; - fast_path: +fast_path: ci_iovec_ptr_init_nz(&piov, iov, iovlen); ci_assert_le(tcp_eff_mss(ts), - CI_MAX_ETH_DATA_LEN - sizeof(ci_tcp_hdr) - sizeof(ci_ip4_hdr)); + CI_MAX_ETH_DATA_LEN - sizeof(ci_tcp_hdr) - sizeof(ci_ip4_hdr)); if( si_trylock(ni, &sinf) && ci_ip_queue_not_empty(sendq) ) { ci_assert(! (flags & ONLOAD_MSG_WARM)); @@ -2026,19 +1972,18 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, /* If we have more data to send, do it. */ if( sinf.total_unsent > 0 ) goto non_fast; - + /* This is last packet. Set PUSH flag and MORE flag. * Send it if possible. */ pkt = PKT_CHK(ni, sendq->tail); if( (flags & MSG_MORE) || (ts->s.s_aflags & CI_SOCK_AFLAG_CORK) ) { pkt->flags |= CI_PKT_FLAG_TX_MORE; - pkt->flags &=~ CI_PKT_FLAG_TX_PSH_ON_ACK; - } - else { + pkt->flags &= ~CI_PKT_FLAG_TX_PSH_ON_ACK; + } else { pkt->flags &= ~CI_PKT_FLAG_TX_MORE; TX_PKT_IPX_TCP(af, pkt)->tcp_flags |= CI_TCP_FLAG_PSH; } - + /* We should somehow push the packet. However, it was not pushed * before. It means: * - we have no window, and zero window timer will wake us up; @@ -2049,16 +1994,16 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, * just call it. */ #ifdef MSG_SENDPAGE_NOTLAST - if( ~flags & MSG_SENDPAGE_NOTLAST || - ci_tcp_tx_send_space(ni, ts) <= 0 ) + if( ~flags & MSG_SENDPAGE_NOTLAST || ci_tcp_tx_send_space(ni, ts) <= 0 ) #endif - ci_tcp_tx_advance_nagle(ni, ts); + ci_tcp_tx_advance_nagle(ni, ts); - if( sinf.stack_locked ) ci_netif_unlock(ni); + if( sinf.stack_locked ) + ci_netif_unlock(ni); return sinf.total_sent; } - non_fast: +non_fast: ci_assert(sinf.total_unsent > 0); ci_assert(! ci_iovec_ptr_is_empty_proper(&piov)); @@ -2072,13 +2017,14 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, * ci_tcp_tx_send_space() constrains. */ if( sinf.sendq_credit <= 0 && NI_OPTS(ni).tcp_sndbuf_mode && sinf.total_sent && - ( ts->congstate == CI_TCP_CONG_OPEN || - ts->congstate == CI_TCP_CONG_FAST_RECOV ) ) + (ts->congstate == CI_TCP_CONG_OPEN || + ts->congstate == CI_TCP_CONG_FAST_RECOV) ) sinf.sendq_credit += ts->retrans.num >> 1; - if( sinf.sendq_credit <= 0 ) goto send_q_full; + if( sinf.sendq_credit <= 0 ) + goto send_q_full; - try_again: +try_again: while( 1 ) { /* Grab packet buffers and fill them with data. */ m = ci_tcp_send_alloc_pkts(ni, ts, &sinf, 0); @@ -2091,7 +2037,7 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, /* Look on MSG_MORE: do not send the last packet if it is not full */ if( (flags & MSG_MORE) || (ts->s.s_aflags & CI_SOCK_AFLAG_CORK) ) { sinf.pf.pkt->flags |= CI_PKT_FLAG_TX_MORE; - sinf.pf.pkt->flags &=~ CI_PKT_FLAG_TX_PSH_ON_ACK; + sinf.pf.pkt->flags &= ~CI_PKT_FLAG_TX_PSH_ON_ACK; } filled_some_pkts: @@ -2102,15 +2048,14 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, if( ts->s.tx_errno ) { ci_assert(! (flags & ONLOAD_MSG_WARM)); ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } /* eff_mss may now be != ts->eff_mss */ - ts->send_in += ci_tcp_sendmsg_enqueue(ni, ts, - sinf.fill_list, - sinf.fill_list_bytes, - &ts->send); + ts->send_in += ci_tcp_sendmsg_enqueue( + ni, ts, sinf.fill_list, sinf.fill_list_bytes, &ts->send); sinf.total_sent += sinf.fill_list_bytes; sinf.total_unsent -= sinf.fill_list_bytes; @@ -2129,13 +2074,14 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, ci_tcp_tx_send_space(ni, ts) <= 0 ) #endif { - ci_tcp_tx_advance_nagle(ni, ts); - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) - unroll_msg_warm(ni, ts, &sinf, 0); + ci_tcp_tx_advance_nagle(ni, ts); + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) + unroll_msg_warm(ni, ts, &sinf, 0); } /* Assert that there's no need to free unused packets */ ci_assert_equal(sinf.pf.alloc_pkt, NULL); - if( sinf.stack_locked ) ci_netif_unlock(ni); + if( sinf.stack_locked ) + ci_netif_unlock(ni); return sinf.total_sent; } @@ -2144,30 +2090,31 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, ci_tcp_tx_send_space(ni, ts) <= 0 ) #endif { - /* Stuff left to do -- push out what we've got first. */ - ci_assert(! (flags & ONLOAD_MSG_WARM)); - if( ci_netif_may_poll(ni) && ci_netif_need_poll(ni) ) - ci_netif_poll(ni); - sinf.fill_list = 0; - if( ts->s.tx_errno ) { - ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); - return sinf.rc; - } - if(CI_LIKELY( ! ci_ip_queue_is_empty(sendq) )) - ci_tcp_tx_advance(ts, ni); + /* Stuff left to do -- push out what we've got first. */ + ci_assert(! (flags & ONLOAD_MSG_WARM)); + if( ci_netif_may_poll(ni) && ci_netif_need_poll(ni) ) + ci_netif_poll(ni); + sinf.fill_list = 0; + if( ts->s.tx_errno ) { + ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); + return sinf.rc; + } + if( CI_LIKELY(! ci_ip_queue_is_empty(sendq)) ) + ci_tcp_tx_advance(ts, ni); } - } - else { + } else { if( sinf.total_unsent == sinf.fill_list_bytes ) /* The last segment needs to have the PSH flag set. */ - if ( ! (sinf.fill_list->flags & CI_PKT_FLAG_TX_MORE) ) + if( ! (sinf.fill_list->flags & CI_PKT_FLAG_TX_MORE) ) sinf.fill_list->flags |= CI_PKT_FLAG_TX_PSH; /* Couldn't get the netif lock, so enqueue packets on the prequeue. */ if( ! ci_tcp_send_via_prequeue(ni, ts, &sinf) ) { ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } sinf.total_sent += sinf.fill_list_bytes; @@ -2175,7 +2122,8 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, if( sinf.total_unsent == 0 ) { /* Assert that there's no need to free unused packets */ ci_assert_equal(sinf.pf.alloc_pkt, NULL); - if( sinf.stack_locked ) ci_netif_unlock(ni); + if( sinf.stack_locked ) + ci_netif_unlock(ni); return sinf.total_sent; } /* We've more to send, so keep filling buffers. */ @@ -2186,11 +2134,12 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, /* It looks like we don't have any credit in the send queue; * let's check for sure. */ sinf.sendq_credit = ci_tcp_tx_send_space(ni, ts); - if( sinf.sendq_credit <= 0 ) goto send_q_full; + if( sinf.sendq_credit <= 0 ) + goto send_q_full; } } - send_q_full: +send_q_full: /* We jump into here when the send queue (including prequeue) is full. */ ci_assert(! (flags & ONLOAD_MSG_WARM)); ci_assert(sinf.total_unsent > 0); @@ -2201,11 +2150,13 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, ci_netif_poll(ni); if( ts->s.tx_errno ) { ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } sinf.sendq_credit = ci_tcp_tx_send_space(ni, ts); - if( sinf.sendq_credit > 0 ) goto try_again; + if( sinf.sendq_credit > 0 ) + goto try_again; } /* The send queue is full, the prequeue is empty, and the netif has been @@ -2220,7 +2171,8 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, */ sinf.rc = -EAGAIN; ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } @@ -2230,7 +2182,8 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, if( rc == 0 ) goto try_again; else if( rc == -1 ) { - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } sinf.tcp_send_spin = 0; @@ -2239,38 +2192,39 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, if( ci_tcp_sendmsg_block(ni, ts, flags, &sinf) == 0 ) goto try_again; else { - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } - no_pkt_buf: - { - int rc; - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) { - /* ONLOAD_MSG_WARM should only try to allocate 1 buffer and if - * that failed, then the buffer list should be empty. As we are - * not hitting the fast path, just return. - */ - ++ts->stats.tx_msg_warm_abort; - ci_assert_equal(sinf.pf.alloc_pkt, NULL); - if( sinf.stack_locked ) - ci_netif_unlock(ni); - return 0; - } - rc = ci_tcp_sendmsg_no_pkt_buf(ni, ts, flags, &sinf); - if( rc == 0 ) - goto got_pkt_buf; - else if( rc == 1 ) - goto filled_some_pkts; - else { - ci_assert(rc == -1); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); - return sinf.rc; - } +no_pkt_buf : { + int rc; + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) { + /* ONLOAD_MSG_WARM should only try to allocate 1 buffer and if + * that failed, then the buffer list should be empty. As we are + * not hitting the fast path, just return. + */ + ++ts->stats.tx_msg_warm_abort; + ci_assert_equal(sinf.pf.alloc_pkt, NULL); + if( sinf.stack_locked ) + ci_netif_unlock(ni); + return 0; + } + rc = ci_tcp_sendmsg_no_pkt_buf(ni, ts, flags, &sinf); + if( rc == 0 ) + goto got_pkt_buf; + else if( rc == 1 ) + goto filled_some_pkts; + else { + ci_assert(rc == -1); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); + return sinf.rc; } +} - not_synchronised: - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) { +not_synchronised: + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) { ++ts->stats.tx_msg_warm_abort; if( sinf.stack_locked ) ci_netif_unlock(ni); @@ -2279,13 +2233,14 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, if( ci_tcp_sendmsg_notsynchronised(ni, ts, flags, &sinf) == -1 ) { ci_tcp_sendmsg_handle_rc_or_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } goto is_sync; - slow_path: - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) { +slow_path: + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) { if( can_do_msg_warm(ni, ts, &sinf, sinf.total_unsent, flags) ) { ts->tcpflags |= CI_TCPT_FLAG_MSG_WARM; #if CI_CFG_BURST_CONTROL @@ -2301,10 +2256,11 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, RET_WITH_ERRNO(EINVAL); return 0; } - if( ci_tcp_sendmsg_slowpath(ni, ts, iov, iovlen, flags, &sinf - CI_KERNEL_ARG(addr_spc)) == -1 ) { + if( ci_tcp_sendmsg_slowpath( + ni, ts, iov, iovlen, flags, &sinf CI_KERNEL_ARG(addr_spc)) == -1 ) { ci_tcp_sendmsg_handle_rc_or_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } return sinf.rc; @@ -2312,10 +2268,8 @@ int ci_tcp_sendmsg(ci_netif* ni, ci_tcp_state* ts, #if CI_CFG_TX_CRC_OFFLOAD -ci_int8 -ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct ci_pkt_zc_payload* zcp, - unsigned payload_offset, void* prefix) +ci_int8 ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, + struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix) { struct ci_tcp_offload_zc_send_prefix* crc_prefix = prefix; ci_tcp_state* ts = SP_TO_TCP(ni, pkt->pf.tcp_tx.sock_id); @@ -2336,8 +2290,8 @@ ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, crc_prefix->accum_crc.reset = (id == ZC_NVME_CRC_ID_INVALID); if( crc_prefix->accum_crc.reset ) { - rc = ci_nvme_plugin_crc_id_alloc(&ni->state->nvme_crc_plugin_idp[intf_i], - &id); + rc = ci_nvme_plugin_crc_id_alloc( + &ni->state->nvme_crc_plugin_idp[intf_i], &id); if( rc < 0 ) return rc; } @@ -2347,15 +2301,19 @@ ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, #if CI_CFG_NVME_LOCAL_CRC_MODE #ifdef __KERNEL__ - ci_log("WARNING: Unable to compute CRC in kernel context; " - "emitted CRC will be invalid"); + ci_log( + "WARNING: Unable to compute CRC in kernel context; " + "emitted CRC will be invalid"); #else if( zcp->local_addr == NULL ) { ci_log("ERROR: %s: buffer is non-local\n", __func__); abort(); } - ci_uint32 crc = crc_prefix->accum_crc.reset ? 0 : ni->state->nvme_crc_plugin_idp[intf_i].crcs[id]; - ni->state->nvme_crc_plugin_idp[intf_i].crcs[id] = crc32c(crc ^ 0xffffffff, zcp->local_addr, zcp->len); + ci_uint32 crc = crc_prefix->accum_crc.reset + ? 0 + : ni->state->nvme_crc_plugin_idp[intf_i].crcs[id]; + ni->state->nvme_crc_plugin_idp[intf_i].crcs[id] = + crc32c(crc ^ 0xffffffff, zcp->local_addr, zcp->len); #endif #endif @@ -2363,10 +2321,8 @@ ci_tcp_offload_zc_send_accum_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, } -ci_uint8 -ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - struct ci_pkt_zc_payload* zcp, - unsigned payload_offset, void* prefix) +ci_uint8 ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, + struct ci_pkt_zc_payload* zcp, unsigned payload_offset, void* prefix) { struct ci_tcp_offload_zc_send_prefix* crc_prefix = prefix; ci_tcp_state* ts = SP_TO_TCP(ni, pkt->pf.tcp_tx.sock_id); @@ -2374,7 +2330,8 @@ ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, ci_assert_equal(NI_OPTS(ni).tcp_offload_plugin, CITP_TCP_OFFLOAD_NVME); crc_prefix->type = CI_TCP_OFFLOAD_ZC_SEND_PREFIX_TYPE_INSERT; - crc_prefix->data_offset = payload_offset + zcp->len - zcp->crc_insert_n_bytes; + crc_prefix->data_offset = + payload_offset + zcp->len - zcp->crc_insert_n_bytes; crc_prefix->insert_crc.first_byte = zcp->crc_insert_first_byte; crc_prefix->insert_crc.n_bytes = zcp->crc_insert_n_bytes; if( zcp->crc_id == ZC_NVME_CRC_ID_INVALID ) { @@ -2388,15 +2345,18 @@ ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, #if CI_CFG_NVME_LOCAL_CRC_MODE #ifdef __KERNEL__ - ci_log("WARNING: Unable to insert CRC in kernel context; " - "emitted CRC will be invalid"); + ci_log( + "WARNING: Unable to insert CRC in kernel context; " + "emitted CRC will be invalid"); #else if( zcp->local_addr == NULL ) { ci_log("ERROR: %s: buffer is non-local\n", __func__); abort(); } - char* src = (char*)&ni->state->nvme_crc_plugin_idp[pkt->intf_i].crcs[zcp->crc_id] + zcp->crc_insert_first_byte; - char* dst = (char*)zcp->local_addr + zcp->len - zcp->crc_insert_n_bytes; + char* src = + (char*) &ni->state->nvme_crc_plugin_idp[pkt->intf_i].crcs[zcp->crc_id] + + zcp->crc_insert_first_byte; + char* dst = (char*) zcp->local_addr + zcp->len - zcp->crc_insert_n_bytes; memcpy(dst, src, zcp->crc_insert_n_bytes); #endif #endif @@ -2409,9 +2369,8 @@ ci_tcp_offload_zc_send_insert_crc(ci_netif* ni, ci_ip_pkt_fmt* pkt, #ifndef __KERNEL__ -ci_uint8 -ci_tcp_offload_zc_send_get_prefix_len(ci_netif* ni, - const struct onload_zc_iovec* iov) +ci_uint8 ci_tcp_offload_zc_send_get_prefix_len( + ci_netif* ni, const struct onload_zc_iovec* iov) { ci_uint8 prefix_len = 0; if( iov->iov_flags & ONLOAD_ZC_SEND_FLAG_ACCUM_CRC ) @@ -2425,16 +2384,16 @@ ci_tcp_offload_zc_send_get_prefix_len(ci_netif* ni, static inline ci_uint32 zc_iov_flags_to_zcp_flags(unsigned iov_flags) { ci_uint32 zcp_flags = 0; - if( iov_flags & ONLOAD_ZC_SEND_FLAG_ACCUM_CRC) + if( iov_flags & ONLOAD_ZC_SEND_FLAG_ACCUM_CRC ) zcp_flags |= ZC_PAYLOAD_FLAG_ACCUM_CRC; - if( iov_flags & ONLOAD_ZC_SEND_FLAG_INSERT_CRC) + if( iov_flags & ONLOAD_ZC_SEND_FLAG_INSERT_CRC ) zcp_flags |= ZC_PAYLOAD_FLAG_INSERT_CRC; return zcp_flags; } -static inline ci_uint8 -zc_prefix_reservation(ci_netif* ni, const struct onload_zc_iovec* iov) +static inline ci_uint8 zc_prefix_reservation( + ci_netif* ni, const struct onload_zc_iovec* iov) { if( iov->iov_flags == 0 ) return 0; @@ -2442,7 +2401,7 @@ zc_prefix_reservation(ci_netif* ni, const struct onload_zc_iovec* iov) } -/* +/* * TODO: * - improve TCP send path (in general) to handle fragmented buffers, then: * o append a small buffer to the existing send queue (via frag @@ -2451,33 +2410,33 @@ zc_prefix_reservation(ci_netif* ni, const struct onload_zc_iovec* iov) * packet; */ -static inline bool ci_tcp_tx_has_room_for_zc(ci_netif* ni, ci_ip_pkt_fmt* pkt, - ci_uint8 prefix_resv) +static inline bool ci_tcp_tx_has_room_for_zc( + ci_netif* ni, ci_ip_pkt_fmt* pkt, ci_uint8 prefix_resv) { if( pkt->flags & CI_PKT_FLAG_INDIRECT ) { return oo_tx_zc_left(pkt) >= oo_tx_zc_payload_size(ni) + prefix_resv && /* We need one additional segment for the header: */ oo_tx_zc_header(pkt)->segs < CI_IP_PKT_SEGMENTS_MAX - 1; - } - else { - return CI_PTR_ALIGN_FWD(oo_offbuf_end(&pkt->buf), CI_PKT_ZC_PAYLOAD_ALIGN) - + sizeof(struct ci_pkt_zc_header) + oo_tx_zc_payload_size(ni) + - prefix_resv - <= (char*)pkt + CI_CFG_PKT_BUF_SIZE; + } else { + return CI_PTR_ALIGN_FWD( + oo_offbuf_end(&pkt->buf), CI_PKT_ZC_PAYLOAD_ALIGN) + + sizeof(struct ci_pkt_zc_header) + oo_tx_zc_payload_size(ni) + + prefix_resv <= + (char*) pkt + CI_CFG_PKT_BUF_SIZE; } } -int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, - int flags) +int ci_tcp_zc_send( + ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, int flags) { struct tcp_send_info sinf; ci_ip_pkt_fmt* pkt; int j; unsigned eff_mss; - uint32_t tcp_pay_len = 0; int af = ipcache_af(&ts->s.pkt); #if CI_CFG_TIMESTAMPING + uint32_t tcp_pay_len = 0; bool reusing_prev_pkt; #endif @@ -2495,24 +2454,24 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, sinf.pf.alloc_pkt = NULL; sinf.timeout = ts->s.so.sndtimeo_msec; #ifndef __KERNEL__ - sinf.tcp_send_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); + sinf.tcp_send_spin = + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); if( sinf.tcp_send_spin ) ci_frc64(&sinf.start_frc); #else sinf.tcp_send_spin = 0; #endif - if( !(ts->s.b.state & CI_TCP_STATE_SYNCHRONISED) && - ci_tcp_sendmsg_notsynchronised(ni, ts, flags, &sinf) == -1) { + if( ! (ts->s.b.state & CI_TCP_STATE_SYNCHRONISED) && + ci_tcp_sendmsg_notsynchronised(ni, ts, flags, &sinf) == -1 ) { ci_tcp_sendmsg_handle_rc_or_tx_errno(ni, ts, flags, &sinf); msg->rc = sinf.set_errno ? -sinf.rc : sinf.rc; return 1; } eff_mss = tcp_eff_mss(ts); - ci_assert_le(eff_mss, - CI_MAX_ETH_DATA_LEN - sizeof(ci_tcp_hdr) - sizeof(ci_ip4_hdr)); + ci_assert_le( + eff_mss, CI_MAX_ETH_DATA_LEN - sizeof(ci_tcp_hdr) - sizeof(ci_ip4_hdr)); j = 0; @@ -2521,7 +2480,7 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, * branches in fast path. */ if( sinf.sendq_credit <= 0 || flags & ONLOAD_MSG_WARM ) { - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) { + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) { if( ! can_do_msg_warm(ni, ts, &sinf, msg->msg.iov[0].iov_len, flags) || msg->msg.msghdr.msg_iovlen > 1 ) { ++ts->stats.tx_msg_warm_abort; @@ -2538,13 +2497,12 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, sinf.old_burst_window = ts->burst_window; #endif sinf.old_tcp_snd_nxt = tcp_snd_nxt(ts); - } - else { + } else { goto send_q_full; } } - - send_q_not_full: + +send_q_not_full: pkt = NULL; #if CI_CFG_TIMESTAMPING reusing_prev_pkt = false; @@ -2552,47 +2510,47 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, while( j < msg->msg.msghdr.msg_iovlen ) { if( msg->msg.iov[j].buf == ONLOAD_ZC_HANDLE_NONZC ) { goto bad_buffer; - } - else if( zc_is_pktbuf(msg->msg.iov[j].buf) ) { + } else if( zc_is_pktbuf(msg->msg.iov[j].buf) ) { pkt = zc_handle_to_pktbuf(msg->msg.iov[j].buf); ci_assert_equal(pkt->stack_id, ni->state->stack_id); ci_assert(msg->msg.iov[j].iov_base != NULL); ci_assert_gt(msg->msg.iov[j].iov_len, 0); ci_assert_le(msg->msg.iov[j].iov_len, eff_mss); - ci_assert_gt((char*)msg->msg.iov[j].iov_base, - PKT_START(pkt) + ts->outgoing_hdrs_len); - ci_assert_lt((char*)msg->msg.iov[j].iov_base + - msg->msg.iov[j].iov_len, - ((char*)pkt) + CI_CFG_PKT_BUF_SIZE); + ci_assert_gt((char*) msg->msg.iov[j].iov_base, + PKT_START(pkt) + ts->outgoing_hdrs_len); + ci_assert_lt((char*) msg->msg.iov[j].iov_base + msg->msg.iov[j].iov_len, + ((char*) pkt) + CI_CFG_PKT_BUF_SIZE); if( pkt->stack_id != ni->state->stack_id || - msg->msg.iov[j].iov_len <= 0 || - msg->msg.iov[j].iov_len > eff_mss || - (char*)msg->msg.iov[j].iov_base < - PKT_START(pkt) + ts->outgoing_hdrs_len || - (char*)msg->msg.iov[j].iov_base + msg->msg.iov[j].iov_len > - ((char*)pkt) + CI_CFG_PKT_BUF_SIZE ) + msg->msg.iov[j].iov_len <= 0 || msg->msg.iov[j].iov_len > eff_mss || + (char*) msg->msg.iov[j].iov_base < + PKT_START(pkt) + ts->outgoing_hdrs_len || + (char*) msg->msg.iov[j].iov_base + msg->msg.iov[j].iov_len > + ((char*) pkt) + CI_CFG_PKT_BUF_SIZE ) goto bad_buffer; pkt->pio_addr = -1; oo_pkt_af_set(pkt, af); - __ci_tcp_tx_pkt_init(pkt, ((uint8_t*) msg->msg.iov[j].iov_base - - (uint8_t*) oo_tx_l3_hdr(pkt)), eff_mss); + __ci_tcp_tx_pkt_init(pkt, + ((uint8_t*) msg->msg.iov[j].iov_base - (uint8_t*) oo_tx_l3_hdr(pkt)), + eff_mss); pkt->n_buffers = 1; pkt->buf_len += msg->msg.iov[j].iov_len; pkt->pay_len += msg->msg.iov[j].iov_len; oo_offbuf_advance(&pkt->buf, msg->msg.iov[j].iov_len); pkt->pf.tcp_tx.end_seq = msg->msg.iov[j].iov_len; +#if CI_CFG_TIMESTAMPING tcp_pay_len = msg->msg.iov[j].iov_len; +#endif - ci_assert_equal(TX_PKT_LEN(pkt), oo_offbuf_ptr(&pkt->buf) - PKT_START(pkt)); + ci_assert_equal( + TX_PKT_LEN(pkt), oo_offbuf_ptr(&pkt->buf) - PKT_START(pkt)); CI_USER_PTR_SET(pkt->pf.tcp_tx.next, sinf.fill_list); sinf.fill_list = pkt; --sinf.sendq_credit; sinf.fill_list_bytes += msg->msg.iov[j].iov_len; - } - else { + } else { #if ! CI_CFG_TIMESTAMPING /* We use all the TX timestamping delivery machinery to handle * completions, therefore this feature is removed when timestamps are @@ -2638,10 +2596,10 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, ci_assert_gt(msg->msg.iov[j].iov_len, 0); ci_assert_le(msg->msg.iov[j].iov_len, um->size); ci_assert_le(msg->msg.iov[j].iov_ptr + msg->msg.iov[j].iov_len, - um->base + um->size); + um->base + um->size); - if( !pkt && ci_ip_queue_not_empty(&ts->send) ) { - ci_ip_pkt_fmt *tail_pkt = PKT_CHK(ni, ts->send.tail); + if( ! pkt && ci_ip_queue_not_empty(&ts->send) ) { + ci_ip_pkt_fmt* tail_pkt = PKT_CHK(ni, ts->send.tail); if( NI_OPTS(ni).tcp_combine_sends_mode == 0 || tail_pkt->flags & CI_PKT_FLAG_TX_MORE ) { pkt = tail_pkt; @@ -2651,18 +2609,18 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, } /* Chop up the user's buffer in to contiguous DMA regions */ - iov_base = (uintptr_t)msg->msg.iov[j].iov_base; + iov_base = (uintptr_t) msg->msg.iov[j].iov_base; iov_len = msg->msg.iov[j].iov_len; while( iov_len ) { - const uint64_t NIC_PAGE_MASK = ~(uint64_t)(EF_VI_NIC_PAGE_SIZE - 1); + const uint64_t NIC_PAGE_MASK = ~(uint64_t) (EF_VI_NIC_PAGE_SIZE - 1); /* Max size is bounded by ci_ip_pkt_fmt::pay_len, minus slack to make * the boundary case in the loop below easier */ const uint32_t MAX_CONTIG_LEN = INT_MAX - EF_VI_NIC_PAGE_SIZE; uint32_t contig_len, room_len, remaining_len; /* Up to the end of the current page is guaranteed to be contiguous */ - contig_len = ((iov_base + EF_VI_NIC_PAGE_SIZE) & NIC_PAGE_MASK) - - iov_base; + contig_len = + ((iov_base + EF_VI_NIC_PAGE_SIZE) & NIC_PAGE_MASK) - iov_base; if( NI_OPTS(ni).packet_buffer_mode == CITP_PKTBUF_MODE_PHYS ) { /* Keep going until we find any noncontiguity. It'll be common that * there isn't any, so this optimisation is worth it. @@ -2671,18 +2629,19 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, * so it's a good idea to ensure that we don't try to enqueue such a * large single block that it overflows the whole txq on its own. */ while( contig_len < CI_MIN(iov_len, MAX_CONTIG_LEN) ) { - uint64_t ix = (iov_base + contig_len - (uintptr_t)um->base) >> + uint64_t ix = (iov_base + contig_len - (uintptr_t) um->base) >> EF_VI_NIC_PAGE_SHIFT; uint64_t size = um->size >> EF_VI_NIC_PAGE_SHIFT; bool noncontig = false; - OO_STACK_FOR_EACH_INTF_I(ni, i) { + OO_STACK_FOR_EACH_INTF_I(ni, i) + { if( um->hw_addrs[i * size + ix] != um->hw_addrs[i * size + ix - 1] + EF_VI_NIC_PAGE_SIZE ) { noncontig = true; break; } } - if (noncontig) + if( noncontig ) break; contig_len += EF_VI_NIC_PAGE_SIZE; } @@ -2730,23 +2689,23 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, zch->segs = 0; zch->prefix_spc = 0; zch->end = sizeof(*zch); - + CI_USER_PTR_SET(pkt->pf.tcp_tx.next, sinf.fill_list); sinf.fill_list = pkt; --sinf.sendq_credit; - } - else { + } else { room_len = CI_MIN(eff_mss - tcp_pay_len, contig_len); - + if( ! (pkt->flags & CI_PKT_FLAG_INDIRECT) ) { /* ci_tcp_tx_has_room_for_zc() has already decided that we can do * this */ pkt->flags |= CI_PKT_FLAG_INDIRECT; pkt->pf.tcp_tx.sock_id = ts->s.b.bufid; - oo_offbuf_set_end(&pkt->buf, CI_PTR_ALIGN_FWD( - CI_MIN(oo_offbuf_end(&pkt->buf), - oo_offbuf_ptr(&pkt->buf) + CI_TCP_MAX_OPTS_LEN), - CI_PKT_ZC_PAYLOAD_ALIGN)); + oo_offbuf_set_end(&pkt->buf, + CI_PTR_ALIGN_FWD( + CI_MIN(oo_offbuf_end(&pkt->buf), + oo_offbuf_ptr(&pkt->buf) + CI_TCP_MAX_OPTS_LEN), + CI_PKT_ZC_PAYLOAD_ALIGN)); zch = oo_tx_zc_header(pkt); zch->segs = 0; zch->prefix_spc = 0; @@ -2754,10 +2713,10 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, } } zch = oo_tx_zc_header(pkt); - zcp = (struct ci_pkt_zc_payload*)((char*)zch + zch->end); + zcp = (struct ci_pkt_zc_payload*) ((char*) zch + zch->end); zch->end += oo_tx_zc_payload_size(ni); ++zch->segs; - + pkt->pf.tcp_tx.end_seq += room_len; tcp_pay_len += room_len; pkt->pay_len += room_len; @@ -2765,47 +2724,46 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, zcp->crc_id = ZC_NVME_CRC_ID_INVALID; zcp->use_remote_cookie = iov_len == room_len; zcp->len = room_len; - zcp->remote.app_cookie = (uintptr_t)msg->msg.iov[j].app_cookie; + zcp->remote.app_cookie = (uintptr_t) msg->msg.iov[j].app_cookie; zcp->remote.addr_space = um->addr_space; #if CI_CFG_NVME_LOCAL_CRC_MODE if( zcp->remote.addr_space == EF_ADDRSPACE_LOCAL ) - zcp->local_addr = (void*)iov_base; + zcp->local_addr = (void*) iov_base; else zcp->local_addr = NULL; #endif OO_STACK_FOR_EACH_INTF_I(ni, i) - zcp->remote.dma_addr[i] = zc_usermem_dma_addr(um, iov_base, i); + zcp->remote.dma_addr[i] = zc_usermem_dma_addr(um, iov_base, i); zcp->prefix_space = prefix_resv; zch->prefix_spc += prefix_resv; - zcp->zcp_flags = zc_iov_flags_to_zcp_flags(msg->msg.iov[j].iov_flags); + zcp->zcp_flags = + zc_iov_flags_to_zcp_flags(msg->msg.iov[j].iov_flags); remaining_len = iov_len - room_len; if( zcp->zcp_flags & ZC_PAYLOAD_FLAG_INSERT_CRC ) { /* The INSERT_CRC flag should only be attached to the final 4 bytes * of the iov */ if( remaining_len >= 4 ) { zcp->zcp_flags &= ~ZC_PAYLOAD_FLAG_INSERT_CRC; - } - else { + } else { zcp->crc_insert_first_byte = (iov_len < 4) ? 4 - iov_len : 0; - zcp->crc_insert_n_bytes = (4 - remaining_len - - zcp->crc_insert_first_byte); + zcp->crc_insert_n_bytes = + (4 - remaining_len - zcp->crc_insert_first_byte); ci_assert_lt(remaining_len + zcp->crc_insert_first_byte, 4); } } ASSERT_VALID_PKT(ni, pkt); - + iov_base += room_len; iov_len -= room_len; - + if( reusing_prev_pkt ) { sinf.total_sent += room_len; tcp_enq_nxt(ts) += room_len; - } - else + } else sinf.fill_list_bytes += room_len; - + contig_len -= room_len; if( contig_len > 0 ) @@ -2828,7 +2786,7 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, if( ((flags & MSG_MORE) || (ts->s.s_aflags & CI_SOCK_AFLAG_CORK)) ) { pkt->flags |= CI_PKT_FLAG_TX_MORE; - pkt->flags &=~ CI_PKT_FLAG_TX_PSH_ON_ACK; + pkt->flags &= ~CI_PKT_FLAG_TX_PSH_ON_ACK; } /* If we can grab the lock now, setup the meta-data and get sending. @@ -2838,27 +2796,24 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, if( ts->s.tx_errno ) goto tx_errno; if( sinf.fill_list ) { - ts->send_in += ci_tcp_sendmsg_enqueue(ni, ts, - sinf.fill_list, - sinf.fill_list_bytes, - &ts->send); + ts->send_in += ci_tcp_sendmsg_enqueue( + ni, ts, sinf.fill_list, sinf.fill_list_bytes, &ts->send); sinf.total_sent += sinf.fill_list_bytes; } if( pkt->flags & CI_PKT_FLAG_TX_MORE ) TX_PKT_IPX_TCP(af, pkt)->tcp_flags = CI_TCP_FLAG_ACK; else - TX_PKT_IPX_TCP(af, pkt)->tcp_flags = CI_TCP_FLAG_PSH|CI_TCP_FLAG_ACK; + TX_PKT_IPX_TCP(af, pkt)->tcp_flags = CI_TCP_FLAG_PSH | CI_TCP_FLAG_ACK; ci_tcp_tx_advance_nagle(ni, ts); - if(CI_UNLIKELY( flags & ONLOAD_MSG_WARM )) { + if( CI_UNLIKELY(flags & ONLOAD_MSG_WARM) ) { unroll_msg_warm(ni, ts, &sinf, 1); } - } - else { + } else { if( ts->s.tx_errno ) goto tx_errno; - if( !(pkt->flags & CI_PKT_FLAG_TX_MORE) ) + if( ! (pkt->flags & CI_PKT_FLAG_TX_MORE) ) pkt->flags |= CI_PKT_FLAG_TX_PSH; if( ! ci_tcp_send_via_prequeue(ni, ts, &sinf) ) @@ -2875,12 +2830,12 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, else goto send_q_full; } - if( sinf.stack_locked ) + if( sinf.stack_locked ) ci_netif_unlock(ni); msg->rc = sinf.total_sent; return 1; - send_q_full: +send_q_full: if( ci_netif_may_poll(ni) && ci_netif_need_poll(ni) && si_trylock(ni, &sinf) ) { ci_netif_poll(ni); @@ -2906,11 +2861,11 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, if( rc == 0 ) goto send_q_not_full; else if( rc == -1 ) { - if( sinf.stack_locked ) + if( sinf.stack_locked ) ci_netif_unlock(ni); if( j == 0 ) /* Must invert error sign as functions shared with sendmsg store - * error as positive + * error as positive */ msg->rc = -sinf.rc; return 1; @@ -2920,19 +2875,19 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, if( ci_tcp_sendmsg_block(ni, ts, flags, &sinf) == 0 ) goto send_q_not_full; else { - if( sinf.stack_locked ) + if( sinf.stack_locked ) ci_netif_unlock(ni); if( j == 0 ) /* Must invert error sign as functions shared with sendmsg store - * error as positive + * error as positive */ msg->rc = -sinf.rc; return 1; } - bad_buffer: - if(CI_UNLIKELY( ts->tcpflags & CI_TCPT_FLAG_MSG_WARM )) { +bad_buffer: + if( CI_UNLIKELY(ts->tcpflags & CI_TCPT_FLAG_MSG_WARM) ) { ++ts->stats.tx_msg_warm_abort; if( sinf.stack_locked ) ci_netif_unlock(ni); @@ -2944,14 +2899,11 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, if( si_trylock(ni, &sinf) ) { if( ts->s.tx_errno ) goto tx_errno; - ts->send_in += ci_tcp_sendmsg_enqueue(ni, ts, - sinf.fill_list, - sinf.fill_list_bytes, - &ts->send); + ts->send_in += ci_tcp_sendmsg_enqueue( + ni, ts, sinf.fill_list, sinf.fill_list_bytes, &ts->send); sinf.total_sent += sinf.fill_list_bytes; sinf.fill_list = 0; - } - else { + } else { if( ! ci_tcp_send_via_prequeue(ni, ts, &sinf) ) goto tx_errno; sinf.total_sent += sinf.fill_list_bytes; @@ -2966,7 +2918,7 @@ int ci_tcp_zc_send(ci_netif* ni, ci_tcp_state* ts, struct onload_zc_mmsg* msg, ci_netif_unlock(ni); return 1; - tx_errno: +tx_errno: /* Similar to ci_tcp_sendmsg_handle_tx_errno(), but * - no need to free the fill_list: user owns the packets in case of * error; @@ -3018,15 +2970,12 @@ static int ci_tcp_ds_get_arp(ci_netif* ni, ci_tcp_state* ts) return 0; } -#define MAX_HEADERS_LEN \ - ( ETH_HLEN + ETH_VLAN_HLEN + sizeof(ci_ip4_hdr) + \ - 0xf * sizeof(ci_uint32) ) +#define MAX_HEADERS_LEN \ + (ETH_HLEN + ETH_VLAN_HLEN + sizeof(ci_ip4_hdr) + 0xf * sizeof(ci_uint32)) -enum onload_delegated_send_rc -ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, - void* headers, int* headers_len_inout, - int* ip_tcp_hdr_len_out, - int* tcp_seq_offset_out, int* ip_len_offset_out) +enum onload_delegated_send_rc ci_tcp_ds_fill_headers(ci_netif* ni, + ci_tcp_state* ts, unsigned flags, void* headers, int* headers_len_inout, + int* ip_tcp_hdr_len_out, int* tcp_seq_offset_out, int* ip_len_offset_out) { int headers_len; int ether_header_len; @@ -3039,7 +2988,7 @@ ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, /* Try to get valid cache */ if( ! oo_cp_ipcache_is_valid(ni, &ts->s.pkt) && - (~flags & ONLOAD_DELEGATED_SEND_FLAG_IGNORE_ARP ) && + (~flags & ONLOAD_DELEGATED_SEND_FLAG_IGNORE_ARP) && ! ci_tcp_ds_get_arp(ni, ts) ) { return ONLOAD_DELEGATED_SEND_RC_NOARP; } @@ -3058,8 +3007,9 @@ ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, /* Create a "packet" which we are pretending to transmit. */ memcpy(headers, ci_ip_cache_ether_hdr(&ts->s.pkt), headers_len); - ip = (void*)((ci_uintptr_t)headers + ether_header_len); - tcp = (void*)((ci_uintptr_t)headers + ether_header_len + sizeof(ci_ip4_hdr)); + ip = (void*) ((ci_uintptr_t) headers + ether_header_len); + tcp = + (void*) ((ci_uintptr_t) headers + ether_header_len + sizeof(ci_ip4_hdr)); /* tcp_snd_nxt, tcp_rcv_nxt, tsrecent, eff_mss could change after we've * passed our header to the user, so there is nothing to do with it. */ @@ -3072,11 +3022,10 @@ ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, ci_uint8* opt = CI_TCP_HDR_OPTS(tcp); ci_tcp_tx_opt_tso(&opt, ci_tcp_time_now(ni), ts->tsrecent); } - ip->ip_tot_len_be16 = - CI_BSWAP_BE16(ts->outgoing_hdrs_len + ts->eff_mss); + ip->ip_tot_len_be16 = CI_BSWAP_BE16(ts->outgoing_hdrs_len + ts->eff_mss); ip->ip_id_be16 = 0; - ci_assert_equal(CI_TCP_HDR_LEN(tcp), - ts->outgoing_hdrs_len - sizeof(ci_tcp_hdr)); + ci_assert_equal( + CI_TCP_HDR_LEN(tcp), ts->outgoing_hdrs_len - sizeof(ci_tcp_hdr)); ci_assert_equal(ip->ip_check_be16, 0); ci_assert_equal(tcp->tcp_check_be16, 0); ci_assert_equal(tcp->tcp_urg_ptr_be16, 0); @@ -3085,15 +3034,14 @@ ci_tcp_ds_fill_headers(ci_netif* ni, ci_tcp_state* ts, unsigned flags, *ip_tcp_hdr_len_out = ts->outgoing_hdrs_len; *tcp_seq_offset_out = ether_header_len + sizeof(ci_ip4_hdr) + CI_MEMBER_OFFSET(ci_tcp_hdr, tcp_seq_be32); - *ip_len_offset_out = ether_header_len + - CI_MEMBER_OFFSET(ci_ip4_hdr, ip_tot_len_be16); + *ip_len_offset_out = + ether_header_len + CI_MEMBER_OFFSET(ci_ip4_hdr, ip_tot_len_be16); return ONLOAD_DELEGATED_SEND_RC_OK; } -int -ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, - const ci_iovec *iov, int iovlen, int flags) +int ci_tcp_ds_done( + ci_netif* ni, ci_tcp_state* ts, const ci_iovec* iov, int iovlen, int flags) { int already_acked, i; ci_iovec_ptr piov; @@ -3109,7 +3057,7 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, sinf.pf.alloc_pkt = NULL; sinf.timeout = 0; /* ignore ts->s.so.sndtimeo_msec */ sinf.tcp_send_spin = - oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); + oo_per_thread_get()->spinstate & (1 << ONLOAD_SPIN_TCP_SEND); sinf.fill_list = 0; for( i = 0; i < iovlen; ++i ) @@ -3120,14 +3068,14 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( sinf.total_unsent > ts->snd_delegated ) RET_WITH_ERRNO(EMSGSIZE); - try_again: +try_again: while( 1 ) { if( ! si_trylock(ni, &sinf) ) { ci_netif_lock(ni); sinf.stack_locked = 1; } - already_acked = SEQ_SUB(ts->snd_una, ts->snd_nxt); + already_acked = SEQ_SUB(ts->snd_una, ts->snd_nxt); /* already_acked > 0 => some of our data is already ACKed; * already_acked == 0 => retransmit queue is empty, but our data is not * acked; @@ -3158,7 +3106,7 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, iov_offset = 0; } } - if( sinf.total_unsent == 0) + if( sinf.total_unsent == 0 ) goto out; /* copy data from iov to retransmit queue */ @@ -3174,7 +3122,8 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, ci_iovec_ptr_advance(&piov, already_acked + iov_offset); ci_assert(! ci_iovec_ptr_is_empty_proper(&piov)); - if( sinf.sendq_credit <= 0 ) goto send_q_full; + if( sinf.sendq_credit <= 0 ) + goto send_q_full; /* Either: * - we got all the buffers we needed and then used them, so got is 0; @@ -3211,12 +3160,13 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( ts->s.tx_errno ) { ci_assert(! (flags & ONLOAD_MSG_WARM)); ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } /* add to retrans q */ - ci_tcp_sendmsg_enqueue(ni, ts, sinf.fill_list, sinf.fill_list_bytes, - &ts->retrans); + ci_tcp_sendmsg_enqueue( + ni, ts, sinf.fill_list, sinf.fill_list_bytes, &ts->retrans); sinf.total_sent += sinf.fill_list_bytes; sinf.total_unsent -= sinf.fill_list_bytes; ts->snd_nxt += sinf.fill_list_bytes; @@ -3242,7 +3192,8 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( ts->s.tx_errno ) { ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } @@ -3251,18 +3202,19 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, /* It looks like we don't have any credit in the send queue; * let's check for sure. */ sinf.sendq_credit = ci_tcp_tx_send_space(ni, ts); - if( sinf.sendq_credit <= 0 ) goto send_q_full; + if( sinf.sendq_credit <= 0 ) + goto send_q_full; } } - out: +out: ci_assert(sinf.stack_locked); /* Set up the retransmit timer if: * (1) we've added something to the retrans queue; * (2) it was not acked in ci_netif_poll() we call above. */ - if( sinf.total_sent > already_acked && !ci_ip_queue_is_empty(&ts->retrans)) + if( sinf.total_sent > already_acked && ! ci_ip_queue_is_empty(&ts->retrans) ) ci_tcp_rto_check_and_set(ni, ts); /* We may have allocated some packets and then found they weren't neeeded. @@ -3286,11 +3238,13 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, ci_netif_poll(ni); if( ts->s.tx_errno ) { ci_tcp_sendmsg_handle_tx_errno(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } sinf.sendq_credit = ci_tcp_tx_send_space(ni, ts); - if( sinf.sendq_credit > 0 ) goto try_again; + if( sinf.sendq_credit > 0 ) + goto try_again; /* We are pushing our data to retransmit queue; send queue is empty; * tx timestamp queue is guaranteed to be disabled. So, the only @@ -3301,7 +3255,8 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( flags & MSG_DONTWAIT ) { sinf.rc = -EAGAIN; ci_tcp_sendmsg_handle_sent_or_rc(ni, ts, flags, &sinf); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } @@ -3311,7 +3266,8 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( rc == 0 ) goto try_again; else if( rc == -1 ) { - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } sinf.tcp_send_spin = 0; @@ -3320,29 +3276,28 @@ ci_tcp_ds_done(ci_netif* ni, ci_tcp_state* ts, if( ci_tcp_sendmsg_block(ni, ts, flags, &sinf) == 0 ) goto try_again; else { - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); return sinf.rc; } - no_pkt_buf: - { - int rc; - rc = ci_tcp_sendmsg_no_pkt_buf(ni, ts, flags, &sinf); - if( rc == 0 ) { - got = last_needed - sinf.n_needed; - goto try_again; - } - else { - /* Once we've filled some packets we're guaranteed to queue them, so - * we should never be calling ci_tcp_sendmsg_no_pkt_buf with some - * packets filled. - */ - ci_assert(rc == -1); - if( sinf.set_errno ) CI_SET_ERROR(sinf.rc, sinf.rc); - return sinf.rc; - } +no_pkt_buf : { + int rc; + rc = ci_tcp_sendmsg_no_pkt_buf(ni, ts, flags, &sinf); + if( rc == 0 ) { + got = last_needed - sinf.n_needed; + goto try_again; + } else { + /* Once we've filled some packets we're guaranteed to queue them, so + * we should never be calling ci_tcp_sendmsg_no_pkt_buf with some + * packets filled. + */ + ci_assert(rc == -1); + if( sinf.set_errno ) + CI_SET_ERROR(sinf.rc, sinf.rc); + return sinf.rc; } - +} } #endif diff --git a/src/lib/transport/ip/udp_connect.c b/src/lib/transport/ip/udp_connect.c index 25093f3b8..e7d1f89b5 100644 --- a/src/lib/transport/ip/udp_connect.c +++ b/src/lib/transport/ip/udp_connect.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk/stg ** \brief UDP connection routines: @@ -11,7 +11,7 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_ip */ #include "ip_internal.h" @@ -21,50 +21,44 @@ #include #endif -#define LPF "ci_udp_" -#define LPFIN "-> " LPF -#define LPFOUT "<- " LPF +#define LPF "ci_udp_" +#define LPFIN "-> " LPF +#define LPFOUT "<- " LPF #define INADDR_ANY_BE32 (CI_BSWAPC_BE32(INADDR_ANY)) #ifndef __ci_driver__ #ifndef NDEBUG -static char * ci_udp_addr_str( ci_udp_state* us ) +static char* ci_udp_addr_str(ci_udp_state* us) { static char buf[128]; ci_assert(us); - snprintf( buf, sizeof(buf), "L[" IPX_PORT_FMT "] R[" IPX_PORT_FMT "]", - IPX_ARG(AF_IP(udp_ipx_laddr(us))), - CI_BSWAP_BE16(udp_lport_be16(us)), - IPX_ARG(AF_IP(udp_ipx_raddr(us))), - CI_BSWAP_BE16(udp_rport_be16(us)) ); + snprintf(buf, sizeof(buf), "L[" IPX_PORT_FMT "] R[" IPX_PORT_FMT "]", + IPX_ARG(AF_IP(udp_ipx_laddr(us))), CI_BSWAP_BE16(udp_lport_be16(us)), + IPX_ARG(AF_IP(udp_ipx_raddr(us))), CI_BSWAP_BE16(udp_rport_be16(us))); return buf; } -#define CI_UDP_EP_ADDR_STR(ep) \ - ci_udp_addr_str((ep)->state) +#define CI_UDP_EP_ADDR_STR(ep) ci_udp_addr_str((ep)->state) -# define CI_UDPSTATE_SHOW(us) \ - LOG_UV(log( "%s: %d UDP %s Fl[%s]", \ - __FUNCTION__, S_FMT(us), \ - ci_udp_addr_str((us)), \ - UDP_GET_FLAG((us), CI_UDPF_FILTERED) ? "Flt " : "" \ - )) +#define CI_UDPSTATE_SHOW(us) \ + LOG_UV(log("%s: %d UDP %s Fl[%s]", __FUNCTION__, S_FMT(us), \ + ci_udp_addr_str((us)), \ + UDP_GET_FLAG((us), CI_UDPF_FILTERED) ? "Flt " : "")) -#define CI_UDPSTATE_SHOW_EP(ep) \ - CI_UDPSTATE_SHOW( SOCK_TO_UDP((ep)->s) ) +#define CI_UDPSTATE_SHOW_EP(ep) CI_UDPSTATE_SHOW(SOCK_TO_UDP((ep)->s)) #else -# define CI_UDPSTATE_SHOW(us) -# define CI_UDPSTATE_SHOW_EP(ep) +#define CI_UDPSTATE_SHOW(us) +#define CI_UDPSTATE_SHOW_EP(ep) #endif /* Encapsulation of sys_getsockname for UDP EPs */ -static int ci_udp_sys_getsockname( ci_fd_t sock, citp_socket* ep ) +static int ci_udp_sys_getsockname(ci_fd_t sock, citp_socket* ep) { socklen_t salen; int rc; @@ -79,21 +73,21 @@ static int ci_udp_sys_getsockname( ci_fd_t sock, citp_socket* ep ) salen = sizeof(sa_u); - rc = ci_sys_getsockname( sock, &sa_u.sa, &salen ); + rc = ci_sys_getsockname(sock, &sa_u.sa, &salen); if( rc ) return rc; if( sa_u.sa.sa_family != ep->s->domain || salen < sizeof(struct sockaddr_in) #if CI_CFG_FAKE_IPV6 - || (ep->s->domain == AF_INET6 && salen < sizeof(struct sockaddr_in6) ) + || (ep->s->domain == AF_INET6 && salen < sizeof(struct sockaddr_in6)) #endif - ) { - LOG_UV(log("%s: OS sock domain %d != expected domain %d or " - "sys_getsockname struct small (%d exp %d)", - __FUNCTION__, sa_u.sa.sa_family, ep->s->domain, - salen, - (int)(ep->s->domain == AF_INET ? sizeof(struct sockaddr_in) : - sizeof(struct sockaddr_in6)))); + ) { + LOG_UV( + log("%s: OS sock domain %d != expected domain %d or " + "sys_getsockname struct small (%d exp %d)", + __FUNCTION__, sa_u.sa.sa_family, ep->s->domain, salen, + (int) (ep->s->domain == AF_INET ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6)))); return -1; } @@ -103,12 +97,12 @@ static int ci_udp_sys_getsockname( ci_fd_t sock, citp_socket* ep ) } /* Wrapper for call down to OS disconnect. */ -ci_inline int ci_udp_sys_disconnect( ci_fd_t sock, citp_socket* ep ) +ci_inline int ci_udp_sys_disconnect(ci_fd_t sock, citp_socket* ep) { struct sockaddr_in sin; - + sin.sin_family = AF_UNSPEC; - return ci_sys_connect( sock, (struct sockaddr*)&sin, sizeof(sin) ); + return ci_sys_connect(sock, (struct sockaddr*) &sin, sizeof(sin)); } @@ -129,11 +123,14 @@ static int ci_udp_set_filters(citp_socket* ep, ci_udp_state* us) ci_assert(ep); ci_assert(us); + if( udp_lport_be16(us) == 0 ) return 0; - rc = ci_tcp_ep_set_filters(ep->netif, S_SP(us), us->s.cp.so_bindtodevice, - OO_SP_NULL); + LOG_UC(log(FNS_FMT "Setting UDP filters", FNS_PRI_ARGS(ep->netif, ep->s))); + + rc = ci_tcp_ep_set_filters( + ep->netif, S_SP(us), us->s.cp.so_bindtodevice, OO_SP_NULL); if( rc == -EFILTERSSOME ) { if( CITP_OPTS.no_fail ) rc = 0; @@ -143,8 +140,6 @@ static int ci_udp_set_filters(citp_socket* ep, ci_udp_state* us) } } if( rc < 0 ) { - LOG_UC(log(FNS_FMT "ci_tcp_ep_set_filters failed (%d)", - FNS_PRI_ARGS(ep->netif, ep->s), -rc)); CI_SET_ERROR(rc, -rc); return rc; } @@ -157,36 +152,36 @@ static int ci_udp_set_filters(citp_socket* ep, ci_udp_state* us) * Interface */ -static int ci_udp_should_handover(citp_socket* ep, ci_addr_t laddr, - ci_uint16 lport) +static int ci_udp_should_handover( + citp_socket* ep, ci_addr_t laddr, ci_uint16 lport) { if( (CI_BSWAP_BE16(lport) >= NI_OPTS(ep->netif).udp_port_handover_min && - CI_BSWAP_BE16(lport) <= NI_OPTS(ep->netif).udp_port_handover_max) || + CI_BSWAP_BE16(lport) <= NI_OPTS(ep->netif).udp_port_handover_max) || (CI_BSWAP_BE16(lport) >= NI_OPTS(ep->netif).udp_port_handover2_min && - CI_BSWAP_BE16(lport) <= NI_OPTS(ep->netif).udp_port_handover2_max) || + CI_BSWAP_BE16(lport) <= NI_OPTS(ep->netif).udp_port_handover2_max) || (CI_BSWAP_BE16(lport) >= NI_OPTS(ep->netif).udp_port_handover3_min && - CI_BSWAP_BE16(lport) <= NI_OPTS(ep->netif).udp_port_handover3_max) ) { + CI_BSWAP_BE16(lport) <= + NI_OPTS(ep->netif).udp_port_handover3_max) ) { LOG_UC(log(FNS_FMT "HANDOVER (%d <= %d <= %d)", - FNS_PRI_ARGS(ep->netif, ep->s), - NI_OPTS(ep->netif).udp_port_handover_min, - CI_BSWAP_BE16(lport), - NI_OPTS(ep->netif).udp_port_handover_max)); + FNS_PRI_ARGS(ep->netif, ep->s), + NI_OPTS(ep->netif).udp_port_handover_min, CI_BSWAP_BE16(lport), + NI_OPTS(ep->netif).udp_port_handover_max)); goto handover; } if( ~ep->netif->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS && ! CI_IPX_ADDR_IS_ANY(laddr) && - ! cicp_user_addr_is_local_efab(ep->netif, laddr) && + ! cicp_user_addr_is_local_efab(ep->netif, laddr) && ! CI_IPX_IS_MULTICAST(laddr) ) { /* Either the bind/getsockname indicated that we need to let the OS - * take this or the local address is not one of ours - so we can safely - * hand-over as bind to a non-ANY addr cannot be revoked. - * The filters (if any) have already been removed, so we just get out. */ + * take this or the local address is not one of ours - so we can safely + * hand-over as bind to a non-ANY addr cannot be revoked. + * The filters (if any) have already been removed, so we just get out. */ goto handover; } return 0; - handover: +handover: return 1; } @@ -194,7 +189,8 @@ static int ci_udp_should_handover(citp_socket* ep, ci_addr_t laddr, static void ci_udp_init_ipcache_ip4_hdr(ci_udp_state* us) { /* Move source and destination ports */ - memmove(&us->s.pkt.ipx.ip4 + 1, &us->s.pkt.ipx.ip6 + 1, sizeof(ci_uint16) * 2); + memmove( + &us->s.pkt.ipx.ip4 + 1, &us->s.pkt.ipx.ip6 + 1, sizeof(ci_uint16) * 2); ci_init_ipcache_ip4_hdr(&us->s); us->ephemeral_pkt.ether_type = CI_ETHERTYPE_IP; memset(&us->ephemeral_pkt.ipx.ip4, 0, sizeof(us->ephemeral_pkt.ipx.ip4)); @@ -208,7 +204,8 @@ static void ci_udp_init_ipcache_ip4_hdr(ci_udp_state* us) static void ci_udp_init_ipcache_ip6_hdr(ci_udp_state* us) { /* Move source and destination ports */ - memmove(&us->s.pkt.ipx.ip6 + 1, &us->s.pkt.ipx.ip4 + 1, sizeof(ci_uint16) * 2); + memmove( + &us->s.pkt.ipx.ip6 + 1, &us->s.pkt.ipx.ip4 + 1, sizeof(ci_uint16) * 2); ci_init_ipcache_ip6_hdr(&us->s); us->ephemeral_pkt.ether_type = CI_ETHERTYPE_IP6; memset(&us->ephemeral_pkt.ipx.ip6, 0, sizeof(us->ephemeral_pkt.ipx.ip6)); @@ -222,10 +219,9 @@ static void ci_udp_init_ipcache_ip6_hdr(ci_udp_state* us) void ci_udp_ipcache_convert(int af, ci_udp_state* us) { if( IS_AF_INET6(af) ) { - if( !ipcache_is_ipv6(&us->s.pkt) ) + if( ! ipcache_is_ipv6(&us->s.pkt) ) ci_udp_init_ipcache_ip6_hdr(us); - } - else if( ipcache_is_ipv6(&us->s.pkt) ) { + } else if( ipcache_is_ipv6(&us->s.pkt) ) { ci_udp_init_ipcache_ip4_hdr(us); } } @@ -236,7 +232,7 @@ void ci_udp_ipcache_convert(int af, ci_udp_state* us) * called on an OS socket. [lport] and CI_SIN(addr)->sin_port do not * have to be the same value. */ int ci_udp_bind_conclude(citp_socket* ep, const struct sockaddr* addr, - socklen_t addrlen, ci_uint16 lport) + socklen_t addrlen, ci_uint16 lport) { ci_udp_state* us; ci_addr_t laddr; @@ -271,8 +267,8 @@ int ci_udp_bind_conclude(citp_socket* ep, const struct sockaddr* addr, ci_sock_cmn_set_laddr(ep->s, laddr, lport); - if( !CI_IPX_ADDR_IS_ANY(laddr) && !CI_IPX_IS_MULTICAST(laddr) ) { - us->s.cp.sock_cp_flags &=~ OO_SCP_UDP_WILD; + if( ! CI_IPX_ADDR_IS_ANY(laddr) && ! CI_IPX_IS_MULTICAST(laddr) ) { + us->s.cp.sock_cp_flags &= ~OO_SCP_UDP_WILD; us->s.cp.sock_cp_flags |= OO_SCP_BOUND_ADDR; } /* reset any rx/tx that have taken place already */ @@ -281,15 +277,15 @@ int ci_udp_bind_conclude(citp_socket* ep, const struct sockaddr* addr, /* OS source addrs have already been handed-over, so this must be one of * our src addresses. */ - rc = ci_udp_set_filters( ep, us); - ci_assert( !UDP_GET_FLAG(us, CI_UDPF_EF_BIND) ); + rc = ci_udp_set_filters(ep, us); + ci_assert(! UDP_GET_FLAG(us, CI_UDPF_EF_BIND)); /*! \todo FIXME isn't the port the thing to be testing here? */ - if( !CI_IPX_ADDR_IS_ANY(udp_ipx_laddr(us)) ) + if( ! CI_IPX_ADDR_IS_ANY(udp_ipx_laddr(us)) ) UDP_SET_FLAG(us, CI_UDPF_EF_BIND); - CI_UDPSTATE_SHOW_EP( ep ); - if( rc == CI_SOCKET_ERROR && CITP_OPTS.no_fail) { + CI_UDPSTATE_SHOW_EP(ep); + if( rc == CI_SOCKET_ERROR && CITP_OPTS.no_fail ) { CITP_STATS_NETIF(++ep->netif->state->stats.udp_bind_no_filter); - goto handover; + goto filter_fail; } /* If we don't want unicast filters installed, and we've now got a unicast @@ -297,44 +293,50 @@ int ci_udp_bind_conclude(citp_socket* ep, const struct sockaddr* addr, * just handover now. */ if( UDP_GET_FLAG(us, CI_UDPF_NO_UCAST_FILTER) && - !CI_IPX_ADDR_IS_ANY(udp_ipx_laddr(us)) && - !CI_IPX_IS_MULTICAST(udp_ipx_laddr(us)) ) + ! CI_IPX_ADDR_IS_ANY(udp_ipx_laddr(us)) && + ! CI_IPX_IS_MULTICAST(udp_ipx_laddr(us)) ) goto handover; return rc; - handover: - LOG_UV(log("%s: "SK_FMT" HANDOVER", __FUNCTION__, SK_PRI_ARGS(ep))); +handover: + LOG_U(log("%s: " SK_FMT " HANDOVER", __FUNCTION__, SK_PRI_ARGS(ep))); return CI_SOCKET_HANDOVER; + +filter_fail: + return rc; } #if CI_CFG_ENDPOINT_MOVE -void ci_udp_handle_force_reuseport(ci_fd_t fd, citp_socket* ep, - const struct sockaddr* sa, socklen_t sa_len) +void ci_udp_handle_force_reuseport( + ci_fd_t fd, citp_socket* ep, const struct sockaddr* sa, socklen_t sa_len) { int rc; if( CITP_OPTS.udp_reuseports != 0 && - ((struct sockaddr_in*)sa)->sin_port != 0 ) { - struct ci_port_list *force_reuseport; + ((struct sockaddr_in*) sa)->sin_port != 0 ) { + struct ci_port_list* force_reuseport; CI_DLLIST_FOR_EACH2(struct ci_port_list, force_reuseport, link, - (ci_dllist*)(ci_uintptr_t)CITP_OPTS.udp_reuseports) { - if( force_reuseport->port == ((struct sockaddr_in*)sa)->sin_port ) { + (ci_dllist*) (ci_uintptr_t) CITP_OPTS.udp_reuseports) + { + if( force_reuseport->port == ((struct sockaddr_in*) sa)->sin_port ) { int one = 1; ci_fd_t os_sock = ci_get_os_sock_fd(fd); ci_assert(CI_IS_VALID_SOCKET(os_sock)); - rc = ci_sys_setsockopt(os_sock, SOL_SOCKET, SO_REUSEPORT, &one, - sizeof(one)); + rc = ci_sys_setsockopt( + os_sock, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)); ci_rel_os_sock_fd(os_sock); /* Fixme: shouldn't we handle errors? */ if( rc != 0 ) { log("%s: failed to set SO_REUSEPORT on OS socket: " - "rc=%d errno=%d", __func__, rc, errno); + "rc=%d errno=%d", + __func__, rc, errno); } ep->s->s_flags |= CI_SOCK_FLAG_REUSEPORT; - LOG_UC(log("%s "SF_FMT", applied legacy SO_REUSEPORT flag for port %u", - __FUNCTION__, SF_PRI_ARGS(ep, fd), force_reuseport->port)); + LOG_UC( + log("%s " SF_FMT ", applied legacy SO_REUSEPORT flag for port %u", + __FUNCTION__, SF_PRI_ARGS(ep, fd), force_reuseport->port)); } } } @@ -344,18 +346,14 @@ void ci_udp_handle_force_reuseport(ci_fd_t fd, citp_socket* ep, /* Set a reuseport bind on a socket. */ int ci_udp_reuseport_bind(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* sa, socklen_t sa_len, - ci_uint16 lport) + const struct sockaddr* sa, socklen_t sa_len, ci_uint16 lport) { int rc; ci_assert_nequal(ep->s->s_flags & CI_SOCK_FLAG_REUSEPORT, 0); if( (rc = ci_tcp_ep_reuseport_bind(fd, CITP_OPTS.cluster_name, - CITP_OPTS.cluster_size, - CITP_OPTS.cluster_restart_opt, - CITP_OPTS.cluster_hot_restart_opt, - ci_get_addr(sa), - lport)) != 0 ) { + CITP_OPTS.cluster_size, CITP_OPTS.cluster_restart_opt, + CITP_OPTS.cluster_hot_restart_opt, ci_get_addr(sa), lport)) != 0 ) { errno = -rc; return -1; } @@ -367,42 +365,41 @@ int ci_udp_reuseport_bind(citp_socket* ep, ci_fd_t fd, /* To handle bind we just let the underlying OS socket make all * of the decisions for us. If The bind leaves things such that * the source address is not one of ours then we hand it over to the - * OS (by returning CI_SOCKET_HANDOVER) - in which case the OS socket + * OS (by returning CI_SOCKET_HANDOVER) - in which case the OS socket * will be bound as expected. */ int ci_udp_bind_start(citp_socket* ep, ci_fd_t fd, const struct sockaddr* addr, - socklen_t addrlen, ci_uint16* lport) + socklen_t addrlen, ci_uint16* lport) { CHECK_UEP(ep); - LOG_UC(log("%s("SF_FMT", addrlen=%d)", __FUNCTION__, - SF_PRI_ARGS(ep,fd), addrlen)); + LOG_UC(log("%s(" SF_FMT ", addrlen=%d)", __FUNCTION__, SF_PRI_ARGS(ep, fd), + addrlen)); return ci_tcp_helper_bind_os_sock(fd, addr, addrlen, lport); } -static void ci_udp_set_raddr(ci_udp_state* us, ci_addr_t addr, - int rport_be16) +static void ci_udp_set_raddr(ci_udp_state* us, ci_addr_t addr, int rport_be16) { ci_ip_cache_invalidate(&us->s.pkt); ci_sock_set_raddr_port(&us->s, addr, rport_be16); } -#define IS_DISCONNECTING(sin) ( (sin)->sin_family == AF_UNSPEC ) +#define IS_DISCONNECTING(sin) ((sin)->sin_family == AF_UNSPEC) -static int -ci_udp_disconnect(citp_socket* ep, ci_udp_state* us, ci_fd_t os_sock) +static int ci_udp_disconnect( + citp_socket* ep, ci_udp_state* us, ci_fd_t os_sock) { int rc; if( (rc = ci_udp_sys_getsockname(os_sock, ep)) != 0 ) { LOG_E(log(FNS_FMT "ERROR: sys_getsockname failed (%d)", - FNS_PRI_ARGS(ep->netif, ep->s), errno)); + FNS_PRI_ARGS(ep->netif, ep->s), errno)); return rc; } ci_udp_set_raddr(us, addr_any, 0); - us->s.s_flags &=~ CI_SOCK_FLAG_CONNECTED; + us->s.s_flags &= ~CI_SOCK_FLAG_CONNECTED; /* TODO: We shouldn't really clear then set here; instead we should * insert wildcard filters before removing the full-match ones. ie. The @@ -413,8 +410,8 @@ ci_udp_disconnect(citp_socket* ep, ci_udp_state* us, ci_fd_t os_sock) if( (rc = ci_udp_set_filters(ep, us)) != 0 ) /* Not too bad -- should still get packets via OS socket. */ - LOG_U(log(FNS_FMT "ERROR: ci_udp_set_filters failed (%d)", - FNS_PRI_ARGS(ep->netif, ep->s), errno)); + LOG_UC(log(FNS_FMT "ERROR: ci_udp_set_filters failed (%d)", + FNS_PRI_ARGS(ep->netif, ep->s), errno)); if( ! (us->s.cp.sock_cp_flags & OO_SCP_BOUND_ADDR) ) us->s.cp.sock_cp_flags |= OO_SCP_UDP_WILD; return 0; @@ -426,8 +423,7 @@ ci_udp_disconnect(citp_socket* ep, ci_udp_state* us, ci_fd_t os_sock) * in here, then it can be consider an internal error or failing of onload. */ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* serv_addr, - socklen_t addrlen, ci_fd_t os_sock) + const struct sockaddr* serv_addr, socklen_t addrlen, ci_fd_t os_sock) { const struct sockaddr_in* serv_sin = (const struct sockaddr_in*) serv_addr; ci_addr_t dst; @@ -437,9 +433,11 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, CHECK_UEP(ep); + LOG_UC(log(FNT_FMT, FNT_PRI_ARGS(ep->netif, us))); + UDP_CLR_FLAG(us, CI_UDPF_EF_SEND); us->s.rx_errno = 0; - us->s.tx_errno = 0; + us->s.tx_errno = 0; if( IS_DISCONNECTING(serv_sin) ) { rc = ci_udp_disconnect(ep, us, os_sock); @@ -448,13 +446,13 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, if( NI_OPTS(ep->netif).udp_connect_handover == 2 ) { LOG_UC(log(FNT_FMT "HANDOVER (udp_connect_handover == 2)" IPX_PORT_FMT, - FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), - CI_BSWAP_BE16(serv_sin->sin_port))); + FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), + CI_BSWAP_BE16(serv_sin->sin_port))); goto handover; } -#if CI_CFG_FAKE_IPV6 && !CI_CFG_IPV6 - if( us->s.domain == PF_INET6 && !ci_tcp_ipv6_is_ipv4(serv_addr) ) { +#if CI_CFG_FAKE_IPV6 && ! CI_CFG_IPV6 + if( us->s.domain == PF_INET6 && ! ci_tcp_ipv6_is_ipv4(serv_addr) ) { LOG_UC(log(FNT_FMT "HANDOVER not IPv4", FNT_PRI_ARGS(ep->netif, us))); goto handover; } @@ -486,38 +484,41 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, if( (rc = ci_udp_sys_getsockname(os_sock, ep)) != 0 ) { LOG_E(log(FNT_FMT "ERROR: (" IPX_PORT_FMT ") sys_getsockname failed (%d)", - FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), - CI_BSWAP_BE16(serv_sin->sin_port), errno)); + FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), + CI_BSWAP_BE16(serv_sin->sin_port), errno)); goto out; } - us->s.cp.sock_cp_flags &=~ OO_SCP_UDP_WILD; + us->s.cp.sock_cp_flags &= ~OO_SCP_UDP_WILD; + + ci_udp_clr_filters(ep); ci_udp_set_raddr(us, dst, serv_sin->sin_port); us->s.s_flags |= CI_SOCK_FLAG_CONNECTED; cicp_user_retrieve(ep->netif, &us->s.pkt, &us->s.cp); switch( us->s.pkt.status ) { - case retrrc_success: - case retrrc_nomac: - onloadable = 1; - break; - default: - onloadable = 0; - if( NI_OPTS(ep->netif).udp_connect_handover ) { - LOG_UC(log(FNT_FMT "HANDOVER " IPX_PORT_FMT, FNT_PRI_ARGS(ep->netif, us), - IPX_ARG(AF_IP(dst)), CI_BSWAP_BE16(serv_sin->sin_port))); - goto handover; - } - break; + case retrrc_success: + case retrrc_nomac: + onloadable = 1; + break; + default: + onloadable = 0; + if( NI_OPTS(ep->netif).udp_connect_handover ) { + LOG_UC( + log(FNT_FMT "HANDOVER " IPX_PORT_FMT, FNT_PRI_ARGS(ep->netif, us), + IPX_ARG(AF_IP(dst)), CI_BSWAP_BE16(serv_sin->sin_port))); + goto handover; + } + break; } ci_ipcache_update_flowlabel(ep->netif, &us->s); if( CI_IPX_ADDR_IS_ANY(dst) || serv_sin->sin_port == 0 ) { LOG_UC(log(FNT_FMT IPX_PORT_FMT " - route via OS socket", - FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), - CI_BSWAP_BE16(serv_sin->sin_port))); + FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), + CI_BSWAP_BE16(serv_sin->sin_port))); ci_udp_clr_filters(ep); return 0; } @@ -526,7 +527,7 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, * else. */ LOG_UC(log(FNT_FMT "HANDOVER " IPX_PORT_FMT, FNT_PRI_ARGS(ep->netif, us), - IPX_ARG(AF_IP(dst)), CI_BSWAP_BE16(serv_sin->sin_port))); + IPX_ARG(AF_IP(dst)), CI_BSWAP_BE16(serv_sin->sin_port))); goto handover; } @@ -535,7 +536,7 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, * just handover now. */ if( UDP_GET_FLAG(us, CI_UDPF_NO_UCAST_FILTER) && - !CI_IPX_IS_MULTICAST(udp_ipx_laddr(us)) ) + ! CI_IPX_IS_MULTICAST(udp_ipx_laddr(us)) ) goto handover; if( onloadable ) { @@ -543,40 +544,38 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, /* Failed to set filters. Most likely we've run out of h/w filters. */ if( NI_OPTS(ep->netif).udp_connect_handover ) { - LOG_U(log(FNT_FMT - "ERROR: (" IPX_PORT_FMT ") ci_udp_set_filters failed (%d)", - FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), - CI_BSWAP_BE16(serv_sin->sin_port), rc)); + LOG_U(log(FNT_FMT "ERROR: (" IPX_PORT_FMT + ") ci_udp_set_filters failed (%d)", + FNT_PRI_ARGS(ep->netif, us), IPX_ARG(AF_IP(dst)), + CI_BSWAP_BE16(serv_sin->sin_port), rc)); CITP_STATS_NETIF(++ep->netif->state->stats.udp_connect_no_filter); goto out; - } - else { + } else { /* We aren't classing this as a failure. The app will be able to send * via the accelerated path, but will receive packets via the kernel. */ rc = 0; } } - } - else { + } else { ci_udp_clr_filters(ep); } - LOG_UC(log(LPF "connect: "SF_FMT" %sCONNECTED L:" IPX_PORT_FMT - " R:" IPX_PORT_FMT " (err:%d)", - SF_PRI_ARGS(ep,fd), udp_raddr_be32(us) ? "" : "DIS", - IPX_ARG(AF_IP(udp_ipx_laddr(us))), - (unsigned) CI_BSWAP_BE16(udp_lport_be16(us)), - IPX_ARG(AF_IP(udp_ipx_raddr(us))), - (unsigned) CI_BSWAP_BE16(udp_rport_be16(us)), errno)); + LOG_UC(log(LPF "connect: " SF_FMT " %sCONNECTED L:" IPX_PORT_FMT + " R:" IPX_PORT_FMT " (err:%d)", + SF_PRI_ARGS(ep, fd), udp_raddr_be32(us) ? "" : "DIS", + IPX_ARG(AF_IP(udp_ipx_laddr(us))), + (unsigned) CI_BSWAP_BE16(udp_lport_be16(us)), + IPX_ARG(AF_IP(udp_ipx_raddr(us))), + (unsigned) CI_BSWAP_BE16(udp_rport_be16(us)), errno)); return 0; - out: +out: if( rc < 0 && CITP_OPTS.no_fail ) goto handover; return rc; - handover: +handover: ci_udp_clr_filters(ep); return CI_SOCKET_HANDOVER; } @@ -586,23 +585,23 @@ int ci_udp_connect_conclude(citp_socket* ep, ci_fd_t fd, * This uses the OS to do all the work so that we don't have to emulate * some of the more unpleasant "tricks" of Linux. * - * When we're either handing-over OS-dest connects or when we're "no + * When we're either handing-over OS-dest connects or when we're "no * failing" connects we may return -2 (unhandled). In this case the * OS socket _has_ been connected & we therefore are handing-over to * a socket in the right state. */ int ci_udp_connect(citp_socket* ep, ci_fd_t fd, - const struct sockaddr* serv_addr, socklen_t addrlen ) + const struct sockaddr* serv_addr, socklen_t addrlen) { int rc; - ci_fd_t os_sock; + ci_fd_t os_sock; CHECK_UEP(ep); - LOG_UC(log("%s("SF_FMT", addrlen=%d)", __FUNCTION__, - SF_PRI_ARGS(ep,fd), addrlen)); + LOG_UC(log("%s(" SF_FMT ", addrlen=%d)", __FUNCTION__, SF_PRI_ARGS(ep, fd), + addrlen)); os_sock = ci_get_os_sock_fd(fd); - if( !CI_IS_VALID_SOCKET( os_sock ) ) { + if( ! CI_IS_VALID_SOCKET(os_sock) ) { LOG_U(ci_log("%s: no backing socket", __FUNCTION__)); return -1; } @@ -624,7 +623,7 @@ int ci_udp_connect(citp_socket* ep, ci_fd_t fd, return -1; } - rc = ci_udp_connect_conclude( ep, fd, serv_addr, addrlen, os_sock); + rc = ci_udp_connect_conclude(ep, fd, serv_addr, addrlen, os_sock); ci_rel_os_sock_fd(os_sock); return rc; } @@ -634,29 +633,29 @@ int __ci_udp_shutdown(ci_netif* netif, ci_udp_state* us, int how) { ci_assert(netif); ci_assert(us); - + if( CI_IPX_ADDR_IS_ANY(udp_ipx_raddr(us)) ) return -ENOTCONN; /* Maybe ESHUTDOWN is suitable, but Linux returns EPIPE */ switch( how ) { - case SHUT_RD: - us->s.rx_errno |= CI_SHUT_RD; - break; - case SHUT_WR: - us->s.rx_errno |= CI_SHUT_WR; - us->s.tx_errno = EPIPE; - break; - case SHUT_RDWR: - us->s.rx_errno |= (CI_SHUT_RD | CI_SHUT_WR); - us->s.tx_errno = EPIPE; - ci_assert(UDP_IS_SHUT_RDWR(us)); - break; - default: - ci_fail(("'how' parameter of shutdown() must be verified earlier")); - return -EINVAL; + case SHUT_RD: + us->s.rx_errno |= CI_SHUT_RD; + break; + case SHUT_WR: + us->s.rx_errno |= CI_SHUT_WR; + us->s.tx_errno = EPIPE; + break; + case SHUT_RDWR: + us->s.rx_errno |= (CI_SHUT_RD | CI_SHUT_WR); + us->s.tx_errno = EPIPE; + ci_assert(UDP_IS_SHUT_RDWR(us)); + break; + default: + ci_fail(("'how' parameter of shutdown() must be verified earlier")); + return -EINVAL; } /* shutdown() must not disconnect */ - return 0; + return 0; } #endif /* !__ci_driver__ */ @@ -666,23 +665,23 @@ int __ci_udp_shutdown(ci_netif* netif, ci_udp_state* us, int how) int ci_udp_shutdown(citp_socket* ep, ci_fd_t fd, int how) { - ci_fd_t os_sock; + ci_fd_t os_sock; int rc; CHECK_UEP(ep); - LOG_UV(log(LPF "shutdown("SF_FMT", %d)", SF_PRI_ARGS(ep,fd), how)); + LOG_UV(log(LPF "shutdown(" SF_FMT ", %d)", SF_PRI_ARGS(ep, fd), how)); os_sock = ci_get_os_sock_fd(fd); - if( CI_IS_VALID_SOCKET( os_sock ) ) { + if( CI_IS_VALID_SOCKET(os_sock) ) { rc = ci_sys_shutdown(os_sock, how); - ci_rel_os_sock_fd( os_sock ); + ci_rel_os_sock_fd(os_sock); if( rc < 0 ) return CI_SOCKET_ERROR; } rc = __ci_udp_shutdown(ep->netif, SOCK_TO_UDP(ep->s), how); - + if( rc < 0 ) { CI_SET_ERROR(rc, -rc); return rc; @@ -692,14 +691,15 @@ int ci_udp_shutdown(citp_socket* ep, ci_fd_t fd, int how) /*! \todo we can simplify this a lot by letting the kernel have it! */ -int ci_udp_getpeername(citp_socket*ep, struct sockaddr* name, socklen_t* namelen) +int ci_udp_getpeername( + citp_socket* ep, struct sockaddr* name, socklen_t* namelen) { ci_udp_state* us; int af; ci_addr_t addr; - + CHECK_UEP(ep); - + us = SOCK_TO_UDP(ep->s); af = ipcache_af(&us->s.pkt); addr = sock_ipx_raddr(&us->s); @@ -714,9 +714,8 @@ int ci_udp_getpeername(citp_socket*ep, struct sockaddr* name, socklen_t* namelen } else if( name == NULL || namelen == NULL ) { RET_WITH_ERRNO(EFAULT); } else { - ci_addr_to_user(name, namelen, af, ep->s->domain, - udp_rport_be16(us), CI_IPX_ADDR_PTR(af, addr), - us->s.cp.so_bindtodevice); + ci_addr_to_user(name, namelen, af, ep->s->domain, udp_rport_be16(us), + CI_IPX_ADDR_PTR(af, addr), us->s.cp.so_bindtodevice); return 0; } } @@ -747,16 +746,15 @@ void ci_udp_all_fds_gone(ci_netif* netif, oo_sp sock_id, int do_free) ci_assert(ci_netif_is_locked(netif)); ci_assert(us->s.b.state == CI_TCP_STATE_UDP); - LOG_UC(ci_log("ci_udp_all_fds_gone: "NTS_FMT, - NTS_PRI_ARGS(netif, us))); + LOG_UC(ci_log("ci_udp_all_fds_gone: " NTS_FMT, NTS_PRI_ARGS(netif, us))); if( UDP_GET_FLAG(us, CI_UDPF_FILTERED) ) { UDP_CLR_FLAG(us, CI_UDPF_FILTERED); ci_tcp_ep_clear_filters(netif, S_SP(us), 0); } #ifdef __KERNEL__ - ci_assert_equal(ci_netif_get_valid_ep(netif, sock_id)-> - oofilter.sf_local_port, NULL); + ci_assert_equal( + ci_netif_get_valid_ep(netif, sock_id)->oofilter.sf_local_port, NULL); #endif ci_udp_recv_q_drop(netif, &us->recv_q); oo_p_dllink_del(netif, oo_p_dllink_sb(netif, &us->s.b, &us->s.reap_link)); diff --git a/src/lib/transport/ip/udp_send.c b/src/lib/transport/ip/udp_send.c index 7aec1fcb3..7d87d6637 100644 --- a/src/lib/transport/ip/udp_send.c +++ b/src/lib/transport/ip/udp_send.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/stg ** \brief UDP sendmsg() etc. @@ -10,9 +10,9 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_ip */ - + #include "ip_internal.h" #include "udp_internal.h" #include "ip_tx.h" @@ -29,53 +29,51 @@ #if OO_DO_STACK_POLL #define VERB(x) -#define LPF "ci_udp_" -#define LPFIN "-> " LPF +#define LPF "ci_udp_" +#define LPFIN "-> " LPF #define LPFOUT "<- " LPF /* This just avoids some ugly #ifdef. This val is not used at userlevel. */ #ifndef __KERNEL__ -# define ERESTARTSYS 0 +#define ERESTARTSYS 0 #endif -#define TXQ_LEVEL(us) \ +#define TXQ_LEVEL(us) \ ((us)->tx_count + oo_atomic_read(&(us)->tx_async_q_level)) /* If not locked then trylock, and if successful set locked flag and (in * some cases) increment the counter. Return true if lock held, else * false. si_ variants take a [struct udp_send_info*]. */ -#define trylock(ni, locked) \ +#define trylock(ni, locked) \ ((locked) || (ci_netif_trylock(ni) && ((locked) = 1))) -#define si_trylock(ni, sinf) \ - trylock((ni), (sinf)->stack_locked) -#define trylock_and_inc(ni, locked, cntr) \ +#define si_trylock(ni, sinf) trylock((ni), (sinf)->stack_locked) +#define trylock_and_inc(ni, locked, cntr) \ ((locked) || (ci_netif_trylock(ni) && (++(cntr), (locked) = 1))) -#define si_trylock_and_inc(ni, sinf, cntr) \ +#define si_trylock_and_inc(ni, sinf, cntr) \ trylock_and_inc((ni), (sinf)->stack_locked, (cntr)) #if CI_CFG_IPV6 -#define msg_namelen_ok(af, namelen) ((af) == AF_INET6 ? \ - (namelen) >= sizeof(struct sockaddr_in6) : \ - (namelen) >= sizeof(struct sockaddr_in)) +#define msg_namelen_ok(af, namelen) \ + ((af) == AF_INET6 ? (namelen) >= sizeof(struct sockaddr_in6) \ + : (namelen) >= sizeof(struct sockaddr_in)) #else -#define msg_namelen_ok(af, namelen) \ - ((namelen) >= sizeof(struct sockaddr_in)) +#define msg_namelen_ok(af, namelen) ((namelen) >= sizeof(struct sockaddr_in)) #endif -#define oo_tx_udp_hdr(pkt) ((ci_udp_hdr*) oo_tx_ip_data(pkt)) +#define oo_tx_udp_hdr(pkt) ((ci_udp_hdr*) oo_tx_ip_data(pkt)) #define oo_tx_ipx_udp_hdr(af, pkt) ((ci_udp_hdr*) oo_tx_ipx_data(af, pkt)) struct udp_send_info { - int rc; - ci_ip_cached_hdrs ipcache; - int used_ipcache; - int stack_locked; - ci_uint32 timeout; - int old_ipcache_updated; + int rc; + ci_ip_cached_hdrs ipcache; + int used_ipcache; + int stack_locked; + ci_uint32 timeout; + int old_ipcache_updated; }; static bool ci_ipx_is_first_frag(int af, ci_ipx_hdr_t* ipx) @@ -88,15 +86,14 @@ static bool ci_ipx_is_first_frag(int af, ci_ipx_hdr_t* ipx) frag_hdr = ipx_hdr_data(af, ipx); if( (frag_hdr->frag_off & CI_BSWAPC_BE16(CI_IP6_OFFSET)) == 0 ) return true; - } - else + } else #endif { if( (ipx->ip4.ip_frag_off_be16 & CI_IP4_OFFSET_MASK) == 0 ) return true; } return false; - } +} /* Check if More Fragments flag is set for IPv4 or IPv6 header */ static bool ci_ipx_is_mf_set(int af, ci_ipx_hdr_t* ipx) @@ -109,8 +106,7 @@ static bool ci_ipx_is_mf_set(int af, ci_ipx_hdr_t* ipx) frag_hdr = ipx_hdr_data(af, ipx); if( frag_hdr->frag_off & CI_BSWAPC_BE16(CI_IP6_MF) ) return true; - } - else + } else #endif { if( ipx->ip4.ip_frag_off_be16 & CI_IP4_FRAG_MORE ) @@ -119,8 +115,8 @@ static bool ci_ipx_is_mf_set(int af, ci_ipx_hdr_t* ipx) return false; } -ci_noinline void ci_udp_sendmsg_chksum(ci_netif* ni, ci_ip_pkt_fmt* pkt, - int af, ci_ipx_hdr_t* first_hdr) +ci_noinline void ci_udp_sendmsg_chksum( + ci_netif* ni, ci_ip_pkt_fmt* pkt, int af, ci_ipx_hdr_t* first_hdr) { /* 1400*50 = 70000, i.e. in normal situation there are <50 fragments */ #define MAX_IP_FRAGMENTS 50 @@ -133,7 +129,7 @@ ci_noinline void ci_udp_sendmsg_chksum(ci_netif* ni, ci_ip_pkt_fmt* pkt, /* iterate all IP fragments */ while( OO_PP_NOT_NULL(p->next) ) { int frag_len; - char *frag_start; + char* frag_start; int max_sg_len; /* When too many fragments, let's send it without checksum */ @@ -141,27 +137,32 @@ ci_noinline void ci_udp_sendmsg_chksum(ci_netif* ni, ci_ip_pkt_fmt* pkt, return; if( first_frag ) { - frag_start = (char*)(udp + 1); - frag_len = ( WITH_CI_CFG_IPV6( IS_AF_INET6(af) ? - CI_BSWAP_BE16(first_hdr->ip6.payload_len) - sizeof(ci_ip6_frag_hdr) : ) - CI_BSWAP_BE16(first_hdr->ip4.ip_tot_len_be16) - - CI_IP4_IHL(&first_hdr->ip4)) - sizeof(ci_udp_hdr); + frag_start = (char*) (udp + 1); + frag_len = (WITH_CI_CFG_IPV6( + IS_AF_INET6(af) + ? CI_BSWAP_BE16(first_hdr->ip6.payload_len) - + sizeof(ci_ip6_frag_hdr) + :) CI_BSWAP_BE16(first_hdr->ip4.ip_tot_len_be16) - + CI_IP4_IHL(&first_hdr->ip4)) - + sizeof(ci_udp_hdr); first_frag = 0; - } - else { + } else { ci_ipx_hdr_t* p_ipx; p = PKT_CHK(ni, p->next); p_ipx = TX_PKT_IPX_HDR(af, p); - frag_len = WITH_CI_CFG_IPV6( IS_AF_INET6(af) ? - CI_BSWAP_BE16(p_ipx->ip6.payload_len) - sizeof(ci_ip6_frag_hdr) : ) - CI_BSWAP_BE16(p_ipx->ip4.ip_tot_len_be16) - CI_IP4_IHL(&p_ipx->ip4); - frag_start = (char*)ipx_hdr_data(af, p_ipx) + CI_IPX_FRAG_HDR_SIZE(af); + frag_len = WITH_CI_CFG_IPV6(IS_AF_INET6(af) + ? CI_BSWAP_BE16(p_ipx->ip6.payload_len) - + sizeof(ci_ip6_frag_hdr) + :) + CI_BSWAP_BE16(p_ipx->ip4.ip_tot_len_be16) - + CI_IP4_IHL(&p_ipx->ip4); + frag_start = (char*) ipx_hdr_data(af, p_ipx) + CI_IPX_FRAG_HDR_SIZE(af); } iov[n].iov_base = frag_start; iov[n].iov_len = frag_len; - max_sg_len = CI_PTR_ALIGN_FWD(PKT_START(p), CI_CFG_PKT_BUF_SIZE) - - frag_start; + max_sg_len = + CI_PTR_ALIGN_FWD(PKT_START(p), CI_CFG_PKT_BUF_SIZE) - frag_start; if( frag_len > max_sg_len ) { iov[n].iov_len = max_sg_len; frag_len -= max_sg_len; @@ -178,29 +179,26 @@ ci_noinline void ci_udp_sendmsg_chksum(ci_netif* ni, ci_ip_pkt_fmt* pkt, iov[n].iov_base = PKT_START(sg_pkt); iov[n].iov_len = frag_len; - max_sg_len = CI_PTR_ALIGN_FWD(PKT_START(sg_pkt), - CI_CFG_PKT_BUF_SIZE) - + max_sg_len = CI_PTR_ALIGN_FWD(PKT_START(sg_pkt), CI_CFG_PKT_BUF_SIZE) - PKT_START(sg_pkt); if( frag_len > max_sg_len ) { iov[n].iov_len = max_sg_len; frag_len -= max_sg_len; - } - else + } else frag_len = 0; } ci_assert_equal(frag_len, 0); } } - - udp->udp_check_be16 = WITH_CI_CFG_IPV6( IS_AF_INET6(af) ? - ci_ip6_udp_checksum(&first_hdr->ip6, udp, iov, n+1) : ) - ci_udp_checksum(&first_hdr->ip4, udp, iov, n+1); + + udp->udp_check_be16 = WITH_CI_CFG_IPV6( + IS_AF_INET6(af) ? ci_ip6_udp_checksum(&first_hdr->ip6, udp, iov, n + 1) + :) ci_udp_checksum(&first_hdr->ip4, udp, iov, n + 1); } -static void -ci_ip_send_udp_slow(ci_netif* ni, struct oo_sock_cplane* sock_cp, - ci_ip_pkt_fmt* pkt, ci_ip_cached_hdrs* ipcache) +static void ci_ip_send_udp_slow(ci_netif* ni, struct oo_sock_cplane* sock_cp, + ci_ip_pkt_fmt* pkt, ci_ip_cached_hdrs* ipcache) { int os_rc = 0; @@ -231,13 +229,14 @@ static int ci_udp_sendmsg_loop(ci_sock_cmn* s, void* opaque_arg) */ frag_head = state->pkt; udp = (ci_udp_hdr*) (oo_ip_hdr(frag_head) + 1); - frag_head->tstamp_frc = IPTIMER_STATE(state->ni)->frc; - frag_head->pf.udp.pay_len = CI_BSWAP_BE16(udp->udp_len_be16) - sizeof(*udp); + frag_head->tstamp_frc = IPTIMER_STATE(state->ni)->frc; + frag_head->pf.udp.pay_len = + CI_BSWAP_BE16(udp->udp_len_be16) - sizeof(*udp); buf_pkt = frag_head; seg_i = 0; while( 1 ) { ++state->ni->state->n_rx_pkts; - ci_assert(!(buf_pkt->flags & CI_PKT_FLAG_RX)); + ci_assert(! (buf_pkt->flags & CI_PKT_FLAG_RX)); buf_pkt->flags |= CI_PKT_FLAG_RX; if( buf_pkt == state->pkt ) /* First IP fragment, move past IP+UDP header */ @@ -246,7 +245,7 @@ static int ci_udp_sendmsg_loop(ci_sock_cmn* s, void* opaque_arg) /* Subsequent IP fragment, move past IP header */ buf_start = oo_ip_hdr(buf_pkt) + 1; else - /* Internal (jumbo) fragment, no header to move past */ + /* Internal (jumbo) fragment, no header to move past */ buf_start = PKT_START(buf_pkt); buf_len = buf_pkt->buf_len; buf_len -= (char*) buf_start - PKT_START(buf_pkt); @@ -265,13 +264,12 @@ static int ci_udp_sendmsg_loop(ci_sock_cmn* s, void* opaque_arg) ci_udp_rx_deliver(s, opaque_arg); citp_waitable_wake_not_in_poll(state->ni, &s->b, CI_SB_FLAG_WAKE_RX); - return 0; /* continue delivering to other sockets */ + return 0; /* continue delivering to other sockets */ } static void ci_udp_sendmsg_mcast(ci_netif* ni, ci_udp_state* us, - ci_ip_cached_hdrs* ipcache, - ci_ip_pkt_fmt* pkt) + ci_ip_cached_hdrs* ipcache, ci_ip_pkt_fmt* pkt) { /* NB. We don't deliver multicast packets directly to local sockets if * sending via the control plane (below) as they'll get there via the @@ -288,7 +286,7 @@ static void ci_udp_sendmsg_mcast(ci_netif* ni, ci_udp_state* us, if( ! (us->udpflags & CI_UDPF_MCAST_LOOP) || ! (NI_OPTS(ni).mcast_send & CITP_MCAST_SEND_FLAG_LOCAL) ) return; - if(CI_UNLIKELY( ni->state->n_rx_pkts >= NI_OPTS(ni).max_rx_packets )) { + if( CI_UNLIKELY(ni->state->n_rx_pkts >= NI_OPTS(ni).max_rx_packets) ) { ci_netif_try_to_reap(ni, 100); if( ni->state->n_rx_pkts >= NI_OPTS(ni).max_rx_packets ) { CITP_STATS_NETIF_INC(ni, udp_send_mcast_loop_drop); @@ -310,26 +308,19 @@ static void ci_udp_sendmsg_mcast(ci_netif* ni, ci_udp_state* us, */ ci_ip_time_resync(IPTIMER_STATE(ni)); - ci_netif_filter_for_each_match(ni, - oo_ip_hdr(pkt)->ip_daddr_be32, - udp->udp_dest_be16, - oo_ip_hdr(pkt)->ip_saddr_be32, - udp->udp_source_be16, - IPPROTO_UDP, ipcache->intf_i, - ipcache->encap.vlan_id, - ci_udp_sendmsg_loop, &state, NULL); - ci_netif_filter_for_each_match(ni, - oo_ip_hdr(pkt)->ip_daddr_be32, - udp->udp_dest_be16, - 0, 0, IPPROTO_UDP, ipcache->intf_i, - ipcache->encap.vlan_id, - ci_udp_sendmsg_loop, &state, NULL); + ci_netif_filter_for_each_match(ni, oo_ip_hdr(pkt)->ip_daddr_be32, + udp->udp_dest_be16, oo_ip_hdr(pkt)->ip_saddr_be32, udp->udp_source_be16, + IPPROTO_UDP, ipcache->intf_i, ipcache->encap.vlan_id, + ci_udp_sendmsg_loop, &state, NULL); + ci_netif_filter_for_each_match(ni, oo_ip_hdr(pkt)->ip_daddr_be32, + udp->udp_dest_be16, 0, 0, IPPROTO_UDP, ipcache->intf_i, + ipcache->encap.vlan_id, ci_udp_sendmsg_loop, &state, NULL); } /* Pass prepared packet to ip_send(), release our ref & and update stats */ ci_inline void prep_send_pkt(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt, ci_ip_cached_hdrs* ipcache) + ci_ip_pkt_fmt* pkt, ci_ip_cached_hdrs* ipcache) { int af = ipcache_af(&us->s.pkt); ci_ipx_hdr_t* ipx = oo_tx_ipx_hdr(af, pkt); @@ -342,7 +333,7 @@ ci_inline void prep_send_pkt(ci_netif* ni, ci_udp_state* us, us->tx_count += pkt->pf.udp.tx_length; pkt->flags |= CI_PKT_FLAG_UDP; pkt->pf.udp.tx_sock_id = S_SP(us); - CI_UDP_STATS_INC_OUT_DGRAMS( ni ); + CI_UDP_STATS_INC_OUT_DGRAMS(ni); #if CI_CFG_IPV6 if( IS_AF_INET6(af) ) { @@ -350,9 +341,8 @@ ci_inline void prep_send_pkt(ci_netif* ni, ci_udp_state* us, TX_PKT_SET_FLOWLABEL(af, pkt, ci_ip6_flowlabel_be32(&ipcache->ipx.ip6)); } pkt->flags |= CI_PKT_FLAG_IS_IP6; - } - else { - pkt->flags &=~ CI_PKT_FLAG_IS_IP6; + } else { + pkt->flags &= ~CI_PKT_FLAG_IS_IP6; } #endif @@ -372,9 +362,8 @@ ci_inline void prep_send_pkt(ci_netif* ni, ci_udp_state* us, #ifdef __KERNEL__ -static int do_sys_sendmsg(tcp_helper_endpoint_t *ep, oo_os_file os_sock, - const ci_msghdr* msg, - int flags, int user_buffers, int atomic) +static int do_sys_sendmsg(tcp_helper_endpoint_t* ep, oo_os_file os_sock, + const ci_msghdr* msg, int flags, int user_buffers, int atomic) { struct socket* sock; int i, bytes; @@ -385,8 +374,8 @@ static int do_sys_sendmsg(tcp_helper_endpoint_t *ep, oo_os_file os_sock, ci_assert(! user_buffers || ! atomic); LOG_NT(ci_log("%s: user_buffers=%d atomic=%d sk_allocation=%x ATOMIC=%x", - __FUNCTION__, user_buffers, atomic, - sock->sk->sk_allocation, GFP_ATOMIC)); + __FUNCTION__, user_buffers, atomic, sock->sk->sk_allocation, + GFP_ATOMIC)); if( atomic && sock->sk->sk_allocation != GFP_ATOMIC ) { ci_log("%s: cannot proceed", __FUNCTION__); @@ -400,11 +389,9 @@ static int do_sys_sendmsg(tcp_helper_endpoint_t *ep, oo_os_file os_sock, if( user_buffers ) { oo_msg_iov_init(&kmsg, WRITE, msg->msg_iov, msg->msg_iovlen, bytes); bytes = sock_sendmsg(sock, &kmsg); - } - else { - bytes = kernel_sendmsg(sock, &kmsg, - (struct kvec*) msg->msg_iov, msg->msg_iovlen, - bytes); + } else { + bytes = kernel_sendmsg( + sock, &kmsg, (struct kvec*) msg->msg_iov, msg->msg_iovlen, bytes); } /* Clear OS TX flag if necessary */ @@ -413,11 +400,10 @@ static int do_sys_sendmsg(tcp_helper_endpoint_t *ep, oo_os_file os_sock, } static int ci_udp_sendmsg_os(ci_netif* ni, ci_udp_state* us, - const ci_msghdr* msg, int flags, - int user_buffers, int atomic) + const ci_msghdr* msg, int flags, int user_buffers, int atomic) { int rc; - tcp_helper_endpoint_t *ep = ci_netif_ep_get(ni, us->s.b.bufid); + tcp_helper_endpoint_t* ep = ci_netif_ep_get(ni, us->s.b.bufid); oo_os_file os_sock; ++us->stats.n_tx_os; @@ -434,8 +420,7 @@ static int ci_udp_sendmsg_os(ci_netif* ni, ci_udp_state* us, #else ci_inline int ci_udp_sendmsg_os(ci_netif* ni, ci_udp_state* us, - const struct msghdr* msg, int flags, - int user_buffers, int atomic) + const struct msghdr* msg, int flags, int user_buffers, int atomic) { ++us->stats.n_tx_os; return oo_os_sock_sendmsg(ni, S_SP(us), msg, flags); @@ -450,24 +435,24 @@ ci_inline int ci_udp_sendmsg_os(ci_netif* ni, ci_udp_state* us, * * TODO: wrap it into ioctl: bind+getsockname. * */ -static int ci_udp_sendmsg_os_get_binding(citp_socket *ep, ci_fd_t fd, - const struct msghdr * msg, int flags) +static int ci_udp_sendmsg_os_get_binding( + citp_socket* ep, ci_fd_t fd, const struct msghdr* msg, int flags) { ci_netif* ni = ep->netif; ci_udp_state* us = SOCK_TO_UDP(ep->s); int rc; union ci_sockaddr_u sa_u = {}; socklen_t salen = sizeof(sa_u); - ci_fd_t os_sock = (ci_fd_t)ci_get_os_sock_fd(fd); + ci_fd_t os_sock = (ci_fd_t) ci_get_os_sock_fd(fd); ci_addr_t laddr; ci_uint16 lport; - ci_assert( !udp_lport_be16(us)); + ci_assert(! udp_lport_be16(us)); - if ( !CI_IS_VALID_SOCKET(os_sock) ) { - LOG_U( log("%s: "NT_FMT" can't get OS socket (%d)", __FUNCTION__, - NT_PRI_ARGS(ni,us), os_sock)); - RET_WITH_ERRNO((int)os_sock); /*! \todo FIXME remvoce cast */ + if( ! CI_IS_VALID_SOCKET(os_sock) ) { + LOG_U(log("%s: " NT_FMT " can't get OS socket (%d)", __FUNCTION__, + NT_PRI_ARGS(ni, us), os_sock)); + RET_WITH_ERRNO((int) os_sock); /*! \todo FIXME remvoce cast */ } /* Not bound. Probably not connected & sending for the first time, @@ -482,24 +467,25 @@ static int ci_udp_sendmsg_os_get_binding(citp_socket *ep, ci_fd_t fd, /* see what the kernel did - we'll do just the same */ if( rc == 0 ) - rc = ci_sys_getsockname( os_sock, &sa_u.sa, &salen); + rc = ci_sys_getsockname(os_sock, &sa_u.sa, &salen); /* Must release the os_sock fd before we can take the stack lock, as the * citp_dup2_lock is held until we do so, and lock ordering does not allow * us to take the stack lock with the dup2 lock held. */ - ci_rel_os_sock_fd( os_sock ); + ci_rel_os_sock_fd(os_sock); /* get out if getsockname fails or returns a non INET family - * or a sockaddr struct that's too darned small */ - if( CI_UNLIKELY( rc || (!rc && - ( sa_u.sa.sa_family != us->s.domain || - /* FIXME case when sa_family is AF_INET and us->s.domain is AF_INET6 */ - salen < IPX_SOCKADDR_SIZE(sa_u.sa.sa_family))))) { - LOG_UV(log("%s: "NT_FMT" sys_getsockname prob. (rc:%d err:%d, fam:%d, " - "len:%d - exp %u)", - __FUNCTION__, NT_PRI_ARGS(ni,us), rc, errno, sa_u.sa.sa_family, - salen, (unsigned)IPX_SOCKADDR_SIZE(sa_u.sa.sa_family))); + * or a sockaddr struct that's too darned small */ + if( CI_UNLIKELY(rc || (! rc && (sa_u.sa.sa_family != us->s.domain || + /* FIXME case when sa_family is AF_INET + and us->s.domain is AF_INET6 */ + salen < IPX_SOCKADDR_SIZE( + sa_u.sa.sa_family)))) ) { + LOG_UV(log("%s: " NT_FMT " sys_getsockname prob. (rc:%d err:%d, fam:%d, " + "len:%d - exp %u)", + __FUNCTION__, NT_PRI_ARGS(ni, us), rc, errno, sa_u.sa.sa_family, salen, + (unsigned) IPX_SOCKADDR_SIZE(sa_u.sa.sa_family))); return rc; } @@ -510,30 +496,30 @@ static int ci_udp_sendmsg_os_get_binding(citp_socket *ep, ci_fd_t fd, ci_sock_cmn_set_laddr(ep->s, laddr, lport); /* Add a filter if the local addressing is appropriate. */ - if( ~ni->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS && - lport != 0 && (CI_IPX_ADDR_IS_ANY(laddr) || - cicp_user_addr_is_local_efab(ni, laddr)) ) { - ci_assert( ! (us->udpflags & CI_UDPF_FILTERED) ); + if( ~ni->state->flags & CI_NETIF_FLAG_USE_ALIEN_LADDRS && lport != 0 && + (CI_IPX_ADDR_IS_ANY(laddr) || + cicp_user_addr_is_local_efab(ni, laddr)) ) { + ci_assert(! (us->udpflags & CI_UDPF_FILTERED)); - rc = ci_tcp_ep_set_filters(ni, S_SP(us), us->s.cp.so_bindtodevice, - OO_SP_NULL); + rc = ci_tcp_ep_set_filters( + ni, S_SP(us), us->s.cp.so_bindtodevice, OO_SP_NULL); if( rc ) { LOG_U(log("%s: FILTER ADD FAIL %d", __FUNCTION__, -rc)); if( rc == -EFILTERSSOME ) UDP_SET_FLAG(us, CI_UDPF_FILTERED); if( CITP_OPTS.no_fail ) rc = 0; - } - else { + } else { UDP_SET_FLAG(us, CI_UDPF_FILTERED); } } ci_netif_unlock(ni); laddr = sock_laddr(&us->s); - LOG_UV(ci_log("%s: "NT_FMT"Unbound: first send via OS got L:[" IPX_PORT_FMT "]", - __FUNCTION__, NT_PRI_ARGS(ni,us), - IPX_ARG(AF_IP(laddr)), udp_lport_be16(us))); + LOG_UV(ci_log("%s: " NT_FMT "Unbound: first send via OS got L:[" IPX_PORT_FMT + "]", + __FUNCTION__, NT_PRI_ARGS(ni, us), IPX_ARG(AF_IP(laddr)), + udp_lport_be16(us))); return rc; } @@ -541,8 +527,7 @@ static int ci_udp_sendmsg_os_get_binding(citp_socket *ep, ci_fd_t fd, static int ci_udp_sendmsg_send_pkt_via_os(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt, int flags, - struct udp_send_info* sinf) + ci_ip_pkt_fmt* pkt, int flags, struct udp_send_info* sinf) { int seg_i, buf_len, iov_i; ci_ip_pkt_fmt* frag_head; @@ -566,12 +551,11 @@ static int ci_udp_sendmsg_send_pkt_via_os(ci_netif* ni, ci_udp_state* us, { ci_addr_t daddr = TX_PKT_DADDR(af, pkt); if( ! CI_IPX_ADDR_IS_ANY(daddr) ) { - ss = ci_make_sockaddr_storage_from_addr(TX_PKT_UDP(pkt)->udp_dest_be16, - daddr); + ss = ci_make_sockaddr_storage_from_addr( + TX_PKT_UDP(pkt)->udp_dest_be16, daddr); m.msg_name = &ss; m.msg_namelen = IPX_SOCKADDR_SIZE(af); - } - else { + } else { m.msg_name = NULL; m.msg_namelen = 0; } @@ -592,7 +576,7 @@ static int ci_udp_sendmsg_send_pkt_via_os(ci_netif* ni, ci_udp_state* us, /* Subsequent IP fragment, move past IP header */ buf_start = oo_tx_ipx_data(af, buf_pkt); else - /* Internal (jumbo) fragment, no header to move past */ + /* Internal (jumbo) fragment, no header to move past */ buf_start = PKT_START(buf_pkt); buf_len = buf_pkt->buf_len; buf_len -= (char*) buf_start - PKT_START(buf_pkt); @@ -628,7 +612,7 @@ static int ci_udp_sendmsg_send_pkt_via_os(ci_netif* ni, ci_udp_state* us, } -static void fixup_pkt_not_transmitted(ci_netif *ni, ci_ip_pkt_fmt* pkt) +static void fixup_pkt_not_transmitted(ci_netif* ni, ci_ip_pkt_fmt* pkt) { ci_assert(ci_netif_is_locked(ni)); while( 1 ) { @@ -649,8 +633,7 @@ static void fixup_pkt_not_transmitted(ci_netif *ni, ci_ip_pkt_fmt* pkt) static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt, int flags, - struct udp_send_info* sinf) + ci_ip_pkt_fmt* pkt, int flags, struct udp_send_info* sinf) { ci_ip_pkt_fmt* first_pkt = pkt; ci_ip_cached_hdrs* ipcache; @@ -680,9 +663,8 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, if( oo_cp_ipcache_is_valid(ni, ipcache) ) goto done_hdr_update; old_ipcache_updated = 1; - } - else { - us->udpflags &=~ CI_UDPF_LAST_SEND_NOMAC; + } else { + us->udpflags &= ~CI_UDPF_LAST_SEND_NOMAC; ci_ipcache_set_daddr(ipcache, pkt_daddr); ipcache->dport_be16 = TX_PKT_IPX_DPORT(af, pkt); if( sinf != NULL && sinf->used_ipcache && @@ -702,8 +684,7 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, * footing cicp_user_retrieve(). */ ci_ip_cache_invalidate(ipcache); cicp_user_retrieve(ni, ipcache, &us->s.cp); - } - else { + } else { /********************************************************************** * Connected send. */ @@ -714,7 +695,7 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, if( CI_IPX_ADDR_IS_ANY(udp_raddr) ) goto no_longer_connected; ipcache = &us->s.pkt; - if(CI_UNLIKELY( ! oo_cp_ipcache_is_valid(ni, ipcache) )) { + if( CI_UNLIKELY(! oo_cp_ipcache_is_valid(ni, ipcache)) ) { ++us->stats.n_tx_cp_c_lookup; cicp_user_retrieve(ni, ipcache, &us->s.cp); old_ipcache_updated = 1; @@ -725,22 +706,22 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, TX_PKT_IPX_UDP(af, pkt, is_frag)->udp_dest_be16 = udp_rport_be16(us); } - done_hdr_update: +done_hdr_update: switch( ipcache->status ) { - case retrrc_success: - ipcache_onloadable = 1; + case retrrc_success: + ipcache_onloadable = 1; - /* Try to avoid reordering of the packets: send all nomac packets */ - if( old_ipcache_updated && (us->udpflags & CI_UDPF_LAST_SEND_NOMAC) ) { - oo_deferred_send(ni); - us->udpflags &=~ CI_UDPF_LAST_SEND_NOMAC; - } - break; - case retrrc_nomac: - ipcache_onloadable = 0; - break; - default: - goto send_pkt_via_os; + /* Try to avoid reordering of the packets: send all nomac packets */ + if( old_ipcache_updated && (us->udpflags & CI_UDPF_LAST_SEND_NOMAC) ) { + oo_deferred_send(ni); + us->udpflags &= ~CI_UDPF_LAST_SEND_NOMAC; + } + break; + case retrrc_nomac: + ipcache_onloadable = 0; + break; + default: + goto send_pkt_via_os; } #if CI_CFG_IPV6 @@ -755,7 +736,7 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, tot_len = ipx_hdr_tot_len(af, oo_tx_ipx_hdr(af, pkt)); - if(CI_UNLIKELY( tot_len > ipcache->mtu )) + if( CI_UNLIKELY(tot_len > ipcache->mtu) ) /* Oh dear -- we've fragmented the packet with too large an MTU. * Either the MTU has recently changed, or we are unconnected and * sampled the MTU from the cached value at a bad time. @@ -765,15 +746,15 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, * * For now just carry on regardless... */ - ci_log("%s: pkt mtu=%d exceeds path mtu=%d", __FUNCTION__, - tot_len, ipcache->mtu); + ci_log("%s: pkt mtu=%d exceeds path mtu=%d", __FUNCTION__, tot_len, + ipcache->mtu); ci_assert_equal(ni->state->send_may_poll, 0); ni->state->send_may_poll = ci_netif_may_poll(ni); /* Linux allows sending IPv6 packets with zero Hop Limit field */ if( ipcache_ttl(ipcache) || ipcache_is_ipv6(ipcache) ) { - if(CI_LIKELY( ipcache_onloadable )) { + if( CI_LIKELY(ipcache_onloadable) ) { /* TODO: Hit the doorbell just once. */ while( 1 ) { oo_pkt_p next = pkt->next; @@ -784,21 +765,20 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, break; pkt = PKT_CHK(ni, next); #ifdef __KERNEL__ - if(CI_UNLIKELY( i++ > ni->pkt_sets_n << CI_CFG_PKTS_PER_SET_S )) { - ci_netif_error_detected(ni, CI_NETIF_ERROR_UDP_SEND_PKTS_LIST, - __FUNCTION__); + if( CI_UNLIKELY(i++ > ni->pkt_sets_n << CI_CFG_PKTS_PER_SET_S) ) { + ci_netif_error_detected( + ni, CI_NETIF_ERROR_UDP_SEND_PKTS_LIST, __FUNCTION__); } #endif } if( flags & MSG_CONFIRM ) - oo_cp_arp_confirm(ni->cplane, &ipcache->fwd_ver, - ci_ni_fwd_table_id(ni)); + oo_cp_arp_confirm( + ni->cplane, &ipcache->fwd_ver, ci_ni_fwd_table_id(ni)); if( CI_IPX_IS_MULTICAST(ipcache_raddr(ipcache)) ) ci_udp_sendmsg_mcast(ni, us, ipcache, first_pkt); - us->udpflags &=~ CI_UDPF_LAST_SEND_NOMAC; - } - else { + us->udpflags &= ~CI_UDPF_LAST_SEND_NOMAC; + } else { /* Packet should go via an onload interface, but ipcache is not valid. * Could be that we don't have a mac, or could be that we need to drop * into the kernel to keep the mac entry alive. @@ -820,28 +800,26 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, break; pkt = PKT_CHK(ni, next); #ifdef __KERNEL__ - if(CI_UNLIKELY( i++ > ni->pkt_sets_n << CI_CFG_PKTS_PER_SET_S )) { - ci_netif_error_detected(ni, CI_NETIF_ERROR_UDP_SEND_PKTS_LIST, - __FUNCTION__); + if( CI_UNLIKELY(i++ > ni->pkt_sets_n << CI_CFG_PKTS_PER_SET_S) ) { + ci_netif_error_detected( + ni, CI_NETIF_ERROR_UDP_SEND_PKTS_LIST, __FUNCTION__); } #endif } } - } - else if( CI_IPX_IS_MULTICAST(ipcache_raddr(ipcache)) ) { + } else if( CI_IPX_IS_MULTICAST(ipcache_raddr(ipcache)) ) { fixup_pkt_not_transmitted(ni, first_pkt); ci_udp_sendmsg_mcast(ni, us, ipcache, first_pkt); - } - else { + } else { fixup_pkt_not_transmitted(ni, first_pkt); - LOG_U(ci_log("%s: do not send UDP packet because IP TTL = 0", - __FUNCTION__)); + LOG_U( + ci_log("%s: do not send UDP packet because IP TTL = 0", __FUNCTION__)); } ni->state->send_may_poll = 0; return; - send_pkt_via_os: +send_pkt_via_os: ++us->stats.n_tx_os_late; fixup_pkt_not_transmitted(ni, pkt); @@ -856,7 +834,7 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, } return; - no_longer_connected: +no_longer_connected: /* We were connected when we entered ci_udp_sendmsg(), but we're not now. * If not draining tx_async_q, return error to caller. Otherwise just * drop this datagram. @@ -876,12 +854,12 @@ static void ci_udp_sendmsg_send(ci_netif* ni, ci_udp_state* us, } -static int ci_udp_tx_datagram_level(ci_netif* ni, ci_ip_pkt_fmt* pkt, - ci_boolean_t ni_locked) +static int ci_udp_tx_datagram_level( + ci_netif* ni, ci_ip_pkt_fmt* pkt, ci_boolean_t ni_locked) { /* Sum the contributions from each IP fragment. */ int level = 0; - for( ; ; pkt = PKT_CHK_NML(ni, pkt->next, ni_locked) ) { + for( ;; pkt = PKT_CHK_NML(ni, pkt->next, ni_locked) ) { level += pkt->pf.udp.tx_length; if( OO_PP_IS_NULL(pkt->next) ) return level; @@ -898,7 +876,8 @@ void ci_udp_sendmsg_send_async_q(ci_netif* ni, ci_udp_state* us) /* Grab the contents of [tx_async_q]. */ do { OO_PP_INIT(ni, pp, us->tx_async_q); - if( OO_PP_IS_NULL(pp) ) return; + if( OO_PP_IS_NULL(pp) ) + return; } while( ci_cas32_fail(&us->tx_async_q, OO_PP_ID(pp), OO_PP_ID_NULL) ); /* Reverse the list. */ @@ -909,8 +888,7 @@ void ci_udp_sendmsg_send_async_q(ci_netif* ni, ci_udp_state* us) pp = pkt->netif.tx.dmaq_next; pkt->netif.tx.dmaq_next = send_list; send_list = OO_PKT_P(pkt); - } - while( OO_PP_NOT_NULL(pp) ); + } while( OO_PP_NOT_NULL(pp) ); oo_atomic_add(&us->tx_async_q_level, -level); @@ -924,24 +902,25 @@ void ci_udp_sendmsg_send_async_q(ci_netif* ni, ci_udp_state* us) ++us->stats.n_tx_lock_defer; ci_udp_sendmsg_send(ni, us, pkt, flags, NULL); ci_netif_pkt_release(ni, pkt); - if( OO_PP_IS_NULL(pp) ) break; + if( OO_PP_IS_NULL(pp) ) + break; pkt = PKT_CHK(ni, pp); } } -static void ci_udp_sendmsg_async_q_enqueue(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt, int flags) +static void ci_udp_sendmsg_async_q_enqueue( + ci_netif* ni, ci_udp_state* us, ci_ip_pkt_fmt* pkt, int flags) { if( flags & MSG_CONFIRM ) /* Only setting this for first IP fragment -- that should be fine. */ pkt->flags |= CI_PKT_FLAG_MSG_CONFIRM; - oo_atomic_add(&us->tx_async_q_level, - ci_udp_tx_datagram_level(ni, pkt, CI_FALSE)); + oo_atomic_add( + &us->tx_async_q_level, ci_udp_tx_datagram_level(ni, pkt, CI_FALSE)); do OO_PP_INIT(ni, pkt->netif.tx.dmaq_next, us->tx_async_q); - while( ci_cas32_fail(&us->tx_async_q, - OO_PP_ID(pkt->netif.tx.dmaq_next), OO_PKT_ID(pkt)) ); + while( ci_cas32_fail( + &us->tx_async_q, OO_PP_ID(pkt->netif.tx.dmaq_next), OO_PKT_ID(pkt)) ); if( ci_netif_lock_or_defer_work(ni, &us->s.b) ) ci_netif_unlock(ni); @@ -950,7 +929,8 @@ static void ci_udp_sendmsg_async_q_enqueue(ci_netif* ni, ci_udp_state* us, #ifndef __KERNEL__ /* Check if provided address struct/content is OK for us. */ -static int ci_udp_name_is_ok(int af, ci_udp_state* us, const struct msghdr* msg) +static int ci_udp_name_is_ok( + int af, ci_udp_state* us, const struct msghdr* msg) { ci_assert(us); ci_assert(msg != NULL); @@ -960,14 +940,14 @@ static int ci_udp_name_is_ok(int af, ci_udp_state* us, const struct msghdr* msg) if( msg->msg_name == NULL ) return 0; -#if CI_CFG_FAKE_IPV6 && !CI_CFG_IPV6 +#if CI_CFG_FAKE_IPV6 && ! CI_CFG_IPV6 if( us->s.domain == AF_INET6 ) { return msg->msg_namelen >= SIN6_LEN_RFC2133 && af == AF_INET6 && - ci_tcp_ipv6_is_ipv4((struct sockaddr*) msg->msg_name); + ci_tcp_ipv6_is_ipv4((struct sockaddr*) msg->msg_name); } #endif - if( af != AF_INET && !IS_AF_INET6(us->s.domain) ) + if( af != AF_INET && ! IS_AF_INET6(us->s.domain) ) return 0; return msg_namelen_ok(af, msg->msg_namelen); @@ -975,7 +955,7 @@ static int ci_udp_name_is_ok(int af, ci_udp_state* us, const struct msghdr* msg) #endif -#define OO_TIMEVAL_UNINITIALISED ((struct oo_timeval*) 1) +#define OO_TIMEVAL_UNINITIALISED ((struct oo_timeval*) 1) static int ci_udp_sendmsg_may_send(ci_udp_state* us, int bytes_to_send) @@ -1002,8 +982,7 @@ static int ci_udp_sendmsg_may_send(ci_udp_state* us, int bytes_to_send) static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, - unsigned bytes_to_send, int flags, - struct udp_send_info* sinf) + unsigned bytes_to_send, int flags, struct udp_send_info* sinf) { ci_uint64 start_frc = 0, now_frc = 0; ci_uint64 schedule_frc = 0; @@ -1030,11 +1009,11 @@ static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, if( si_trylock_and_inc(ni, sinf, us->stats.n_tx_lock_poll) ) ci_netif_poll(ni); - no_error: +no_error: while( 1 ) { sleep_seq = us->s.b.sleep_seq.all; ci_rmb(); - if(CI_UNLIKELY( (rc = ci_get_so_error(&us->s)) != 0 || us->s.tx_errno )) + if( CI_UNLIKELY((rc = ci_get_so_error(&us->s)) != 0 || us->s.tx_errno) ) goto so_error; if( ci_udp_sendmsg_may_send(us, bytes_to_send) ) { us->stats.n_tx_poll_avoids_full += first_time; @@ -1043,7 +1022,8 @@ static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, return 0; } if( (flags & MSG_DONTWAIT) || - (us->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK|CI_SB_AFLAG_O_NDELAY)) ) { + (us->s.b.sb_aflags & + (CI_SB_AFLAG_O_NONBLOCK | CI_SB_AFLAG_O_NDELAY)) ) { ++us->stats.n_tx_eagain; return -EAGAIN; } @@ -1073,28 +1053,24 @@ static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, if( ci_netif_need_poll_spinning(ni, now_frc) ) { if( si_trylock(ni, sinf) ) ci_netif_poll(ni); - } - else if( ! ni->state->is_spinner ) + } else if( ! ni->state->is_spinner ) ni->state->is_spinner = 1; } if( sinf->stack_locked ) { ci_netif_unlock(ni); sinf->stack_locked = 0; } - rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS(ni, now_frc, &schedule_frc, - us->s.so.sndtimeo_msec, - NULL, si); + rc = OO_SPINLOOP_PAUSE_CHECK_SIGNALS( + ni, now_frc, &schedule_frc, us->s.so.sndtimeo_msec, NULL, si); if( rc != 0 ) { ni->state->is_spinner = 0; return rc; } - } - else if( spin_limit_by_so ) { + } else if( spin_limit_by_so ) { ++us->stats.n_tx_eagain; return -EAGAIN; } - } - else { + } else { if( sinf->timeout && udp_send_spin ) { ci_uint32 spin_ms = NI_OPTS(ni).spin_usec >> 10; if( spin_ms < sinf->timeout ) @@ -1106,15 +1082,15 @@ static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, } ++us->stats.n_tx_block; rc = ci_sock_sleep(ni, &us->s.b, CI_SB_FLAG_WAKE_TX, - sinf->stack_locked ? CI_SLEEP_NETIF_LOCKED : 0, - sleep_seq, &sinf->timeout); + sinf->stack_locked ? CI_SLEEP_NETIF_LOCKED : 0, sleep_seq, + &sinf->timeout); sinf->stack_locked = 0; if( rc < 0 ) return rc; } } - so_error: +so_error: if( udp_send_spin ) ni->state->is_spinner = 0; if( rc == 0 ) @@ -1123,10 +1099,10 @@ static int ci_udp_sendmsg_wait(ci_netif* ni, ci_udp_state* us, goto no_error; return rc; } - -ci_inline ci_udp_hdr* udp_init(ci_udp_state* us, ci_ip_pkt_fmt* pkt, - unsigned payload_bytes, bool is_frag) + +ci_inline ci_udp_hdr* udp_init( + ci_udp_state* us, ci_ip_pkt_fmt* pkt, unsigned payload_bytes, bool is_frag) { int af = ipcache_af(&us->s.pkt); ci_udp_hdr* udp = TX_PKT_IPX_UDP(af, pkt, is_frag); @@ -1140,8 +1116,8 @@ ci_inline ci_udp_hdr* udp_init(ci_udp_state* us, ci_ip_pkt_fmt* pkt, /* put in the def. eth hdr, IP hdr then update the address * and IP ID fields. */ -ci_inline ci_ip4_hdr* eth_ip_init(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt) +ci_inline ci_ip4_hdr* eth_ip_init( + ci_netif* ni, ci_udp_state* us, ci_ip_pkt_fmt* pkt) { ci_ip4_hdr* ip; @@ -1158,8 +1134,8 @@ ci_inline ci_ip4_hdr* eth_ip_init(ci_netif* ni, ci_udp_state* us, } #if CI_CFG_IPV6 -ci_inline ci_ip6_hdr* eth_ip6_init(ci_netif* ni, ci_udp_state* us, - ci_ip_pkt_fmt* pkt, bool is_frag) +ci_inline ci_ip6_hdr* eth_ip6_init( + ci_netif* ni, ci_udp_state* us, ci_ip_pkt_fmt* pkt, bool is_frag) { ci_ip6_hdr* ip6 = oo_tx_ip6_hdr(pkt); ci_uint8 tclass = ci_ip6_tclass(&us->s.pkt.ipx.ip6); @@ -1176,13 +1152,9 @@ ci_inline ci_ip6_hdr* eth_ip6_init(ci_netif* ni, ci_udp_state* us, * * Returns [bytes_to_send] on success, -errno on failure. */ -static -int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, - ci_iovec_ptr* piov, int bytes_to_send, - int flags, - struct oo_pkt_filler* pf, - struct udp_send_info* sinf, - bool need_frag) +static int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, + ci_iovec_ptr* piov, int bytes_to_send, int flags, struct oo_pkt_filler* pf, + struct udp_send_info* sinf, bool need_frag) { ci_ip_pkt_fmt* first_pkt; ci_ip_pkt_fmt* new_pkt; @@ -1192,13 +1164,14 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, int pmtu = sinf->ipcache.mtu; int can_block = ! ((NI_OPTS(ni).udp_nonblock_no_pkts_mode) && ((flags & MSG_DONTWAIT) || - (us->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK|CI_SB_AFLAG_O_NDELAY)))); + (us->s.b.sb_aflags & (CI_SB_AFLAG_O_NONBLOCK | + CI_SB_AFLAG_O_NDELAY)))); int af = ipcache_af(&us->s.pkt); ci_udp_hdr* udp; ci_assert(pmtu > 0); - ci_assert_equiv( need_frag, - bytes_to_send > pmtu - CI_IPX_HDR_SIZE(af) - sizeof(ci_udp_hdr) ); + ci_assert_equiv(need_frag, + bytes_to_send > pmtu - CI_IPX_HDR_SIZE(af) - sizeof(ci_udp_hdr)); frag_off = 0; bytes_left = bytes_to_send; @@ -1210,21 +1183,22 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, ! sinf->stack_locked ) sinf->stack_locked = ci_netif_trylock(ni); - rc = ci_netif_pkt_alloc_block(ni, &us->s, &sinf->stack_locked, can_block, - &first_pkt); + rc = ci_netif_pkt_alloc_block( + ni, &us->s, &sinf->stack_locked, can_block, &first_pkt); if( rc != 0 ) return rc; oo_tx_pkt_layout_init(first_pkt); /* ID for IPv6 case should only be generated when fragmentation is really * required. */ - if( !IS_AF_INET6(af) || need_frag ) + if( ! IS_AF_INET6(af) || need_frag ) ipx_id = ci_next_ipx_id_be(af, ni); udp = udp_init(us, first_pkt, bytes_to_send, need_frag); oo_pkt_filler_init(pf, first_pkt, (uint8_t*) udp + sizeof(ci_udp_hdr)); - first_pkt->pay_len = ((char*) udp + sizeof(ci_udp_hdr) - PKT_START(first_pkt)); + first_pkt->pay_len = + ((char*) udp + sizeof(ci_udp_hdr) - PKT_START(first_pkt)); oo_pkt_af_set(first_pkt, af); @@ -1232,8 +1206,7 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, if( payload_bytes >= bytes_left ) { payload_bytes = bytes_left; bytes_left = 0; - } - else { + } else { payload_bytes = UDP_PAYLOAD1_SPACE_PMTU(af, pmtu); bytes_left -= payload_bytes; } @@ -1241,26 +1214,25 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, while( 1 ) { pf->pkt->pf.udp.tx_length = payload_bytes + sizeof(ci_udp_hdr) + - CI_IPX_HDR_SIZE(af) + sizeof(ci_ether_hdr); + CI_IPX_HDR_SIZE(af) + sizeof(ci_ether_hdr); if( need_frag ) pf->pkt->pf.udp.tx_length += CI_IPX_FRAG_HDR_SIZE(af); #if CI_CFG_IPV6 if( IS_AF_INET6(af) ) { - ci_ip6_hdr *ip6 = eth_ip6_init(ni, us, pf->pkt, need_frag); + ci_ip6_hdr* ip6 = eth_ip6_init(ni, us, pf->pkt, need_frag); ip6->payload_len = frag_bytes; if( need_frag ) { ci_ip6_frag_hdr_init(ci_ip6_data(ip6), IPPROTO_UDP, frag_off, - (bytes_left > 0) ? 1 : 0, ipx_id.ip6); + (bytes_left > 0) ? 1 : 0, ipx_id.ip6); ip6->payload_len += CI_IPX_FRAG_HDR_SIZE(af); } ip6->payload_len = CI_BSWAP_BE16(ip6->payload_len); - } - else + } else #endif { - ci_ip4_hdr *ip = eth_ip_init(ni, us, pf->pkt); + ci_ip4_hdr* ip = eth_ip_init(ni, us, pf->pkt); ip->ip_tot_len_be16 = frag_bytes + sizeof(ci_ip4_hdr); ip->ip_tot_len_be16 = CI_BSWAP_BE16(ip->ip_tot_len_be16); ip->ip_frag_off_be16 = frag_off >> 3u; @@ -1268,8 +1240,8 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, if( bytes_left > 0 ) ip->ip_frag_off_be16 |= CI_IP4_FRAG_MORE; else if( us->s.s_flags & CI_SOCK_FLAG_ALWAYS_DF || - ( us->s.s_flags & CI_SOCK_FLAG_PMTU_DO && - pf->pkt == first_pkt ) ) { + (us->s.s_flags & CI_SOCK_FLAG_PMTU_DO && + pf->pkt == first_pkt) ) { ip->ip_frag_off_be16 = CI_IP4_FRAG_DONT; } ip->ip_id_be16 = ipx_id.ip4; @@ -1280,8 +1252,8 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, ci_netif_pkt_hold(ni, pf->pkt); rc = oo_pkt_fill(ni, &us->s, &sinf->stack_locked, can_block, pf, piov, - payload_bytes CI_KERNEL_ARG(CI_ADDR_SPC_CURRENT)); - if( CI_UNLIKELY( rc != 0 ) ) + payload_bytes CI_KERNEL_ARG(CI_ADDR_SPC_CURRENT)); + if( CI_UNLIKELY(rc != 0) ) goto fill_failed; if( bytes_left == 0 ) @@ -1290,9 +1262,9 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, /* This counts the number of fragments not including the first. */ ++us->stats.n_tx_fragments; - rc = ci_netif_pkt_alloc_block(ni, &us->s, &sinf->stack_locked, - can_block, &new_pkt); - if( CI_UNLIKELY( rc != 0 )) + rc = ci_netif_pkt_alloc_block( + ni, &us->s, &sinf->stack_locked, can_block, &new_pkt); + if( CI_UNLIKELY(rc != 0) ) goto fill_failed; oo_tx_pkt_layout_init(new_pkt); @@ -1317,7 +1289,7 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, return bytes_to_send; - fill_failed: +fill_failed: if( ! sinf->stack_locked && ci_netif_lock(ni) == 0 ) sinf->stack_locked = 1; @@ -1344,27 +1316,25 @@ int ci_udp_sendmsg_fill(ci_netif* ni, ci_udp_state* us, } } } - pkt_chain_released: +pkt_chain_released: /* Free the packet chain by freeing the first fragment. */ - #ifdef __KERNEL__ - if( ! sinf->stack_locked ) - ci_netif_set_merge_atomic_flag(ni); - ci_netif_pkt_release_mnl(ni, first_pkt, &sinf->stack_locked); - #else - /* ci_netif_lock() can't fail in UL */ - ci_assert(sinf->stack_locked); - ci_netif_pkt_release(ni, first_pkt); - #endif +#ifdef __KERNEL__ + if( ! sinf->stack_locked ) + ci_netif_set_merge_atomic_flag(ni); + ci_netif_pkt_release_mnl(ni, first_pkt, &sinf->stack_locked); +#else + /* ci_netif_lock() can't fail in UL */ + ci_assert(sinf->stack_locked); + ci_netif_pkt_release(ni, first_pkt); +#endif return rc; } -static -void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, - const ci_msghdr* msg, int flags, - struct udp_send_info* sinf) +static void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, + const ci_msghdr* msg, int flags, struct udp_send_info* sinf) { int rc, i; unsigned long bytes_to_send; @@ -1390,27 +1360,26 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, goto efault; } while( --i >= 0 ); ci_iovec_ptr_init_nz(&piov, msg->msg_iov, msg->msg_iovlen); - } - else { + } else { ci_iovec_ptr_init(&piov, NULL, 0); } - if( bytes_to_send > sinf->ipcache.mtu - CI_IPX_HDR_SIZE(af) - - sizeof(ci_udp_hdr) ) + if( bytes_to_send > + sinf->ipcache.mtu - CI_IPX_HDR_SIZE(af) - sizeof(ci_udp_hdr) ) need_frag = true; /* For now we don't allocate packets in advance, so init to NULL */ pf.alloc_pkt = NULL; - if( ! UDP_HAS_SENDQ_SPACE(us, bytes_to_send) | + if( ! UDP_HAS_SENDQ_SPACE(us, bytes_to_send) | (bytes_to_send > (unsigned long) CI_UDP_MAX_PAYLOAD_BYTES(af)) ) goto no_space_or_too_big; - back_to_fast_path: +back_to_fast_path: was_locked = sinf->stack_locked; if( need_frag && is_sock_flag_always_df_set(&us->s, af) ) { /* We are trying to send too large a datagram with DontFragment bit */ - if( is_sockopt_flag_ip_recverr_set(&us->s, af ) ) { + if( is_sockopt_flag_ip_recverr_set(&us->s, af) ) { /* We have to add an error message to the error queue. * Let OS do it! */ goto send_via_os; @@ -1419,8 +1388,7 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, /* IP_PMTUDISC_DO */ sinf->rc = -EMSGSIZE; return; - } - else + } else #ifndef __KERNEL__ if( msg->msg_namelen == 0 ) #endif @@ -1442,8 +1410,8 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, } /* IP_PMTUDISC_PROBE does not do anything in non-connected case */ } - rc = ci_udp_sendmsg_fill(ni, us, &piov, bytes_to_send, flags, &pf, sinf, - need_frag); + rc = ci_udp_sendmsg_fill( + ni, us, &piov, bytes_to_send, flags, &pf, sinf, need_frag); #if CI_CFG_TIMESTAMPING if( us->s.timestamping_flags & ONLOAD_SOF_TIMESTAMPING_OPT_ID ) { pf.pkt->ts_key = us->s.ts_key; @@ -1452,7 +1420,7 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, #endif if( sinf->stack_locked && ! was_locked ) ++us->stats.n_tx_lock_pkt; - if(CI_LIKELY( rc >= 0 )) { + if( CI_LIKELY(rc >= 0) ) { sinf->rc = bytes_to_send; TX_PKT_SET_DADDR(af, pf.pkt, ipcache_raddr(&sinf->ipcache)); TX_PKT_IPX_UDP(af, pf.pkt, need_frag)->udp_dest_be16 = @@ -1463,23 +1431,21 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, ci_netif_pkt_release(ni, pf.pkt); ci_netif_unlock(ni); sinf->stack_locked = 0; - } - else { + } else { ci_udp_sendmsg_async_q_enqueue(ni, us, pf.pkt, flags); } - } - else { + } else { sinf->rc = rc; } return; /* *********************** */ - efault: +efault: sinf->rc = -EFAULT; return; - send_via_os: +send_via_os: if( sinf->stack_locked ) { ci_netif_unlock(ni); sinf->stack_locked = 0; @@ -1487,7 +1453,7 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, sinf->rc = ci_udp_sendmsg_os(ni, us, msg, flags, 1, 0); return; - no_space_or_too_big: +no_space_or_too_big: /* TODO: If we implement IP options we'll have to calculate * CI_UDP_MAX_PAYLOAD_BYTES depending on them. */ @@ -1498,19 +1464,19 @@ void ci_udp_sendmsg_onload(ci_netif* ni, ci_udp_state* us, /* There may be insufficient room in the sendq. */ rc = ci_udp_sendmsg_wait(ni, us, bytes_to_send, flags, sinf); - if(CI_UNLIKELY( rc != 0 )) { + if( CI_UNLIKELY(rc != 0) ) { sinf->rc = rc; return; } - LOG_UV(ci_log("%s: "NT_FMT"back to fast path", __FUNCTION__, - NT_PRI_ARGS(ni,us))); + LOG_UV(ci_log( + "%s: " NT_FMT "back to fast path", __FUNCTION__, NT_PRI_ARGS(ni, us))); goto back_to_fast_path; } -#if !defined(__KERNEL__) && defined(__i386__) -static int ci_udp_sendmsg_control_os(ci_fd_t fd, ci_udp_state *us, - const struct msghdr* msg, int flags) +#if ! defined(__KERNEL__) && defined(__i386__) +static int ci_udp_sendmsg_control_os( + ci_fd_t fd, ci_udp_state* us, const struct msghdr* msg, int flags) { ci_fd_t os_sock; int rc; @@ -1524,11 +1490,10 @@ static int ci_udp_sendmsg_control_os(ci_fd_t fd, ci_udp_state *us, } #endif -int ci_udp_sendmsg(ci_udp_iomsg_args *a, - const ci_msghdr* msg, int flags) +int ci_udp_sendmsg(ci_udp_iomsg_args* a, const ci_msghdr* msg, int flags) { - ci_netif *ni = a->ni; - ci_udp_state *us = a->us; + ci_netif* ni = a->ni; + ci_udp_state* us = a->us; struct udp_send_info sinf; int rc; @@ -1547,10 +1512,10 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, /* We do not want to re-pack msg_control field or to find out sys_sendmsg32() * syscall when sending from a 32-bit application. So, let the kernel to take * care of it. */ - if(CI_UNLIKELY( msg->msg_controllen != 0 )) + if( CI_UNLIKELY(msg->msg_controllen != 0) ) return ci_udp_sendmsg_control_os(a->fd, us, msg, flags); #else - if(CI_UNLIKELY( CMSG_FIRSTHDR(msg) != NULL )) { + if( CI_UNLIKELY(CMSG_FIRSTHDR(msg) != NULL) ) { void* info = NULL; if( ci_ip_cmsg_send(msg, &info) != 0 || info != NULL ) goto send_via_os; @@ -1558,29 +1523,29 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, #endif #endif - if(CI_UNLIKELY( flags & MSG_MORE )) { + if( CI_UNLIKELY(flags & MSG_MORE) ) { LOG_E(ci_log("%s: MSG_MORE not yet supported", __FUNCTION__)); CI_SET_ERROR(rc, EOPNOTSUPP); return rc; } - if(CI_UNLIKELY( flags & MSG_OOB )) + if( CI_UNLIKELY(flags & MSG_OOB) ) /* This returns an error, so very unlikely! */ goto send_via_os; - if(CI_UNLIKELY( us->s.so_error | us->s.tx_errno )) + if( CI_UNLIKELY(us->s.so_error | us->s.tx_errno) ) goto so_error; - no_error: +no_error: if( ! NI_OPTS(ni).udp_send_unlocked ) { -# ifndef __KERNEL__ +#ifndef __KERNEL__ ci_netif_lock(ni); -# else +#else if( (rc = ci_netif_lock(ni)) < 0 ) { rc = -ERESTARTSYS; goto error; } -# endif +#endif sinf.stack_locked = 1; } @@ -1613,14 +1578,13 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, /* ?? TODO: put some code here to avoid conditional branch forward on * fast path. */ - } - else { + } else { /* In the case of a control plane change and stack lock contention we * may use old info here. Worst case is that we'll send via OS when * we could have accelerated (and that can only happen if the control * plane change affected this connection). */ - if(CI_UNLIKELY( ! oo_cp_ipcache_is_valid(ni, &us->s.pkt) )) { + if( CI_UNLIKELY(! oo_cp_ipcache_is_valid(ni, &us->s.pkt)) ) { if( si_trylock_and_inc(ni, &sinf, us->stats.n_tx_lock_cp) ) { ++us->stats.n_tx_cp_c_lookup; cicp_user_retrieve(ni, &us->s.pkt, &us->s.cp); @@ -1634,11 +1598,10 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, sinf.ipcache.mtu = us->s.pkt.mtu; } #ifndef __KERNEL__ - else if(CI_UNLIKELY( msg->msg_name == NULL )) { + else if( CI_UNLIKELY(msg->msg_name == NULL) ) { rc = -EFAULT; goto error; - } - else { + } else { /********************************************************************** * Unconnected send -- dest IP and port provided. */ @@ -1649,8 +1612,7 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, if( msg->msg_name != NULL && msg_namelen_ok(af, msg->msg_namelen) && (! CI_CFG_FAKE_IPV6 || us->s.domain == AF_INET) && af == AF_INET ) { /* Fast check -- we're okay. */ - } - else if( ! ci_udp_name_is_ok(af, us, msg) ) + } else if( ! ci_udp_name_is_ok(af, us, msg) ) /* Fast check and more detailed check failed. */ goto send_via_os; @@ -1658,8 +1620,8 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, #if CI_CFG_IPV6 if( CI_IPX_IS_LINKLOCAL(pkt_daddr) && - ci_sock_set_ip6_scope_id(ni, &us->s, CI_SA(msg->msg_name), - msg->msg_namelen, 1) ) + ci_sock_set_ip6_scope_id( + ni, &us->s, CI_SA(msg->msg_name), msg->msg_namelen, 1) ) goto send_via_os; ci_udp_ipcache_convert(CI_ADDR_AF(pkt_daddr), us); sinf.ipcache.ether_type = us->s.pkt.ether_type; @@ -1672,7 +1634,7 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, goto send_via_os; #ifndef __KERNEL__ - if(CI_UNLIKELY( udp_lport_be16(us) == 0 )) { + if( CI_UNLIKELY(udp_lport_be16(us) == 0) ) { /* We haven't yet allocated a local port. Do it now. */ if( sinf.stack_locked ) ci_netif_unlock(ni); @@ -1682,14 +1644,12 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, } #endif - reuse_ipcache = (sinf.ipcache.dport_be16 == - us->ephemeral_pkt.dport_be16) && - CI_IPX_ADDR_EQ(pkt_daddr, - ipcache_raddr(&us->ephemeral_pkt)); + reuse_ipcache = + (sinf.ipcache.dport_be16 == us->ephemeral_pkt.dport_be16) && + CI_IPX_ADDR_EQ(pkt_daddr, ipcache_raddr(&us->ephemeral_pkt)); if( ! reuse_ipcache ) - us->udpflags &=~ CI_UDPF_LAST_SEND_NOMAC; - if( reuse_ipcache && - oo_cp_ipcache_is_valid(ni, &us->ephemeral_pkt) ) { + us->udpflags &= ~CI_UDPF_LAST_SEND_NOMAC; + if( reuse_ipcache && oo_cp_ipcache_is_valid(ni, &us->ephemeral_pkt) ) { /* Looks like [us->ephemeral_pkt] has up-to-date info for this * destination, so go with it. This is racey if another thread is * sending on the same socket concurrently (and happens to be @@ -1705,14 +1665,13 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, goto send_via_os; sinf.ipcache.mtu = us->ephemeral_pkt.mtu; ++us->stats.n_tx_cp_match; - } - else if( si_trylock_and_inc(ni, &sinf, us->stats.n_tx_lock_cp) ) { - if( !reuse_ipcache ) { + } else if( si_trylock_and_inc(ni, &sinf, us->stats.n_tx_lock_cp) ) { + if( ! reuse_ipcache ) { ci_ipcache_set_daddr(&us->ephemeral_pkt, ipcache_raddr(&sinf.ipcache)); us->ephemeral_pkt.dport_be16 = sinf.ipcache.dport_be16; ci_ip_cache_invalidate(&us->ephemeral_pkt); } - if(CI_UNLIKELY( ! oo_cp_ipcache_is_valid(ni, &us->ephemeral_pkt) )) { + if( CI_UNLIKELY(! oo_cp_ipcache_is_valid(ni, &us->ephemeral_pkt)) ) { ++us->stats.n_tx_cp_uc_lookup; cicp_user_retrieve(ni, &us->ephemeral_pkt, &us->s.cp); if( reuse_ipcache ) @@ -1722,8 +1681,7 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, us->ephemeral_pkt.status != retrrc_nomac ) goto send_via_os; sinf.ipcache.mtu = us->ephemeral_pkt.mtu; - } - else { + } else { /* Need control plane lookup and could not grab stack lock; so do * lookup with temporary ipcache [sinf.ipcache]. */ @@ -1744,21 +1702,21 @@ int ci_udp_sendmsg(ci_udp_iomsg_args *a, if( sinf.stack_locked ) ci_netif_unlock(ni); if( sinf.rc < 0 ) - CI_SET_ERROR(sinf.rc, -sinf.rc); + CI_SET_ERROR(sinf.rc, -sinf.rc); return sinf.rc; - so_error: +so_error: if( (rc = -ci_get_so_error(&us->s)) == 0 && (rc = -us->s.tx_errno) == 0 ) goto no_error; goto error; - error: +error: if( sinf.stack_locked ) ci_netif_unlock(ni); CI_SET_ERROR(rc, -rc); return rc; - send_via_os: +send_via_os: if( sinf.stack_locked ) ci_netif_unlock(ni); rc = ci_udp_sendmsg_os(ni, us, msg, flags, 1, 0); diff --git a/src/lib/transport/unix/dpdk.c b/src/lib/transport/unix/dpdk.c index d087c7d70..43362a10c 100644 --- a/src/lib/transport/unix/dpdk.c +++ b/src/lib/transport/unix/dpdk.c @@ -9,7 +9,6 @@ static char *__dpdk_eal_argv[] = { "-l", "1", "--proc-type=secondary", * disable verbose logging by simply changing the number of args passed to * dpdk*/ static const int __dpdk_eal_argc = 5; -static const int __dpdk_eal_verbose_argc = __dpdk_eal_argc - 2; int dpdk_cleanup(void) { @@ -21,8 +20,7 @@ int dpdk_init(void) { int ret; int argc = __dpdk_eal_argc; - Log_V(ci_log("Enabling Verbose DPDK initialization logging"); - argc = __dpdk_eal_verbose_argc); + Log_V(ci_log("Enabling Verbose DPDK initialization logging"); argc -= 2); ret = rte_eal_init(argc, __dpdk_eal_argv); if( ret < 0 ) { LOG_U(ci_log("Unable to intialize DPDK")); diff --git a/src/lib/transport/unix/fdtable.c b/src/lib/transport/unix/fdtable.c index 0cd4fd12f..a2b21d63a 100644 --- a/src/lib/transport/unix/fdtable.c +++ b/src/lib/transport/unix/fdtable.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk ** \brief Table mapping [fd]s to userlevel state. @@ -10,7 +10,7 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_unix */ #include "internal.h" @@ -32,20 +32,20 @@ #include /* FIXME Yes, it is ugly. But we do not have any appropriate header */ -#define CI_ID_POOL_ID_NONE ((unsigned)(-1)) +#define CI_ID_POOL_ID_NONE ((unsigned) (-1)) #define DEBUGPREINIT(x) -citp_fdtable_globals citp_fdtable; +citp_fdtable_globals citp_fdtable; /* Initial seqno should differ from the seqno in special fdi, such as * citp_the_closed_fd */ ci_uint64 fdtable_seq_no = 1; -static void dup2_complete(citp_fdinfo* prev_newfdi, - citp_fdinfo_p prev_newfdip, int fdt_locked); +static void dup2_complete( + citp_fdinfo* prev_newfdi, citp_fdinfo_p prev_newfdip, int fdt_locked); static void exit_with_status(int status) @@ -54,15 +54,15 @@ static void exit_with_status(int status) if( WIFEXITED(status) ) ci_sys__exit(WEXITSTATUS(status)); else if( WIFSIGNALED(status) ) - ci_sys_syscall(__NR_tgkill, getpid(), ci_sys_syscall(__NR_gettid), - WTERMSIG(status)); + ci_sys_syscall( + __NR_tgkill, getpid(), ci_sys_syscall(__NR_gettid), WTERMSIG(status)); return; } void oo_signal_terminate(int signum) { - struct sigaction act = { }; + struct sigaction act = {}; Log_CALL(ci_log("%s(%d)", __func__, signum)); @@ -78,7 +78,8 @@ void oo_signal_terminate(int signum) static void sighandler_sigonload(int sig, siginfo_t* info, void* context) { - /* The signal was sent solely in order to wake up the app, so nothing to do */ + /* The signal was sent solely in order to wake up the app, so nothing to do + */ } /* Hook to be called at gracious exit */ @@ -98,8 +99,8 @@ void oo_exit_hook(int status) do { old_status = exit_status; - } while( ci_cas32u_fail(&exit_status, old_status, - status | OO_EXIT_STATUS_SET) ); + } while( + ci_cas32u_fail(&exit_status, old_status, status | OO_EXIT_STATUS_SET) ); if( old_status != 0 ) { if( status != 0 ) { @@ -108,8 +109,7 @@ void oo_exit_hook(int status) */ exit_with_status(status); return; - } - else { + } else { /* This hook have already been called, from either _exit() or signal. * Now we are in _fini(): return. */ @@ -140,24 +140,22 @@ static citp_fdinfo_p citp_fdtable_closing_wait(unsigned fd, int fdt_locked); #ifdef __x86_64__ #if __GNUC__ >= 6 -__attribute__((force_align_arg_pointer)) -static long oo_close_nocancel_entry(long fd) +__attribute__((force_align_arg_pointer)) static long oo_close_nocancel_entry( + long fd) #else extern long oo_close_nocancel_entry(long fd); __asm__( - ".globl oo_close_nocancel_entry;" - "oo_close_nocancel_entry:" + ".globl oo_close_nocancel_entry;" + "oo_close_nocancel_entry:" "push %rbp;" "mov %rsp,%rbp;" "and $0xfffffffffffffff0,%rsp;" "call close_nocancel_entry_fixed;" "mov %rbp,%rsp;" "pop %rbp;" - "ret;" -); + "ret;"); -__attribute__((used)) -static long close_nocancel_entry_fixed(long fd) +__attribute__((used)) static long close_nocancel_entry_fixed(long fd) #endif #else static long oo_close_nocancel_entry(long fd) @@ -179,7 +177,7 @@ static long oo_close_nocancel_entry(long fd) Log_CALL(ci_log("%s: close_nocancel(%ld)", __func__, fd)); citp_enter_lib(&lib_context); - rc = citp_ep_close((int)fd); + rc = citp_ep_close((int) fd); citp_exit_lib(&lib_context, false); Log_CALL_RESULT(rc); return rc; @@ -190,7 +188,7 @@ static long oo_close_nocancel_entry(long fd) static void aarch64_write_ptr_insns(void* dst, const void* value) { unsigned* u = dst; - uintptr_t v = (uintptr_t)value; + uintptr_t v = (uintptr_t) value; u[0] |= ((v >> 0) & 0xffff) << 5; u[1] |= ((v >> 16) & 0xffff) << 5; u[2] |= ((v >> 32) & 0xffff) << 5; @@ -208,8 +206,8 @@ static int modify_glibc_code(void* dst, const void* src, size_t n) /* This patching is thread-unsafe, but happens at process startup when * there's only one thread */ patch_page_start = CI_PTR_ALIGN_BACK(dst, CI_PAGE_SIZE); - patch_page_size = (char*)CI_PTR_ALIGN_FWD((char*)dst + n, CI_PAGE_SIZE) - - (char*)patch_page_start; + patch_page_size = (char*) CI_PTR_ALIGN_FWD((char*) dst + n, CI_PAGE_SIZE) - + (char*) patch_page_start; rc = mprotect(patch_page_start, patch_page_size, PROT_READ | PROT_WRITE); if( rc != 0 ) { rc = -errno; @@ -220,23 +218,25 @@ static int modify_glibc_code(void* dst, const void* src, size_t n) rc = mprotect(patch_page_start, patch_page_size, PROT_READ | PROT_EXEC); if( rc != 0 ) { rc = -errno; - ci_log("CRITICAL: mprotect(glibc exec) = %d. " - "Process will likely crash now", errno); + ci_log( + "CRITICAL: mprotect(glibc exec) = %d. " + "Process will likely crash now", + errno); return rc; } return 0; } #ifdef __x86_64__ -static const unsigned char x64_endbr[] = {0xf3, 0x0f, 0x1e, 0xfa}; -static const unsigned char x64_nop[] = {0x90}; +static const unsigned char x64_endbr[] = { 0xf3, 0x0f, 0x1e, 0xfa }; +static const unsigned char x64_nop[] = { 0x90 }; /* Returns the length of the given instruction, if it's one of the * instructions that we expect to find in the implementation of libc's * _IO_file_close. Currently this is just some movs */ static int is_io_file_close_insn(const unsigned char* insn) { - if( insn[0] == 0x8b ) { /* mov r,r/m */ + if( insn[0] == 0x8b ) { /* mov r,r/m */ bool has_sib = (insn[1] & 7) == 4 && insn[1] < 0xc0; bool has_disp8 = (insn[1] >> 6) == 1; bool has_disp32 = (insn[1] >> 6) == 2 || (insn[1] & 0xc7) == 0x04; @@ -273,9 +273,9 @@ static void* find_close_nocancel(void) io_file_close += sizeof(x64_nop); while( (n = is_io_file_close_insn(io_file_close)) != 0 ) io_file_close += n; - if( *io_file_close != 0xe9 ) /* jmp rel32 */ + if( *io_file_close != 0xe9 ) /* jmp rel32 */ return NULL; - return io_file_close + 5 + *(uint32_t*)(io_file_close + 1); + return io_file_close + 5 + *(uint32_t*) (io_file_close + 1); } #else /* We do not do extra searching on aarch64, since we don't support old glibc @@ -296,17 +296,17 @@ static int patch_libc_close_nocancel(void) #ifdef __x86_64__ { static const unsigned char sysclose[] = { - 0xb8, 0x03, 0x00, 0x00, 0x00, /* mov $3, %eax */ - 0x0f, 0x05 /* syscall */ + 0xb8, 0x03, 0x00, 0x00, 0x00, /* mov $3, %eax */ + 0x0f, 0x05 /* syscall */ }; static const unsigned char call_rax[] = { - 0xff, 0xd0 /* call *%rax */ + 0xff, 0xd0 /* call *%rax */ }; static const unsigned char trampo_code[] = { - 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */ - 0x48, 0xb8, 0xef, 0xcd, 0xab, 0x89, 0x67, - 0x45, 0x23, 0x01, /* movabs $0x123456789abcdef,%rax */ - 0xff, 0xe0, /* jmpq *%rax */ + 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */ + 0x48, 0xb8, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, + 0x01, /* movabs $0x123456789abcdef,%rax */ + 0xff, 0xe0, /* jmpq *%rax */ }; unsigned char new_glibc_bytes[6]; unsigned char* trampoline; @@ -328,13 +328,13 @@ static int patch_libc_close_nocancel(void) return -ESRCH; } trampoline = mmap(NULL, sizeof(trampo_code), PROT_READ | PROT_WRITE, - MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if( trampoline == MAP_FAILED ) { rc = -errno; LOG_S(ci_log("__close_nocancel mmap failed: %d", errno)); return rc; } - ci_assert_le((uintptr_t)trampoline, 0xffffffff); + ci_assert_le((uintptr_t) trampoline, 0xffffffff); memcpy(trampoline, trampo_code, sizeof(trampo_code)); memcpy(trampoline + 6, &target, sizeof(void*)); rc = mprotect(trampoline, CI_PAGE_SIZE, PROT_READ | PROT_EXEC); @@ -346,35 +346,35 @@ static int patch_libc_close_nocancel(void) memcpy(new_glibc_bytes, &trampoline, 4); memcpy(new_glibc_bytes + 4, call_rax, sizeof(call_rax)); - return modify_glibc_code(close_nocancel + 1, new_glibc_bytes, - sizeof(new_glibc_bytes)); + return modify_glibc_code( + close_nocancel + 1, new_glibc_bytes, sizeof(new_glibc_bytes)); } #elif defined __aarch64__ { static const unsigned expected[] = { - 0x93407c00, /* sxtw x0, w0 */ - 0xd2800728, /* mov x8, #57 */ - 0xd4000001, /* svc #0 */ + 0x93407c00, /* sxtw x0, w0 */ + 0xd2800728, /* mov x8, #57 */ + 0xd4000001, /* svc #0 */ }; unsigned replacement[] = { - 0xd2a00008, /* mov x8, #0xnnnn0000 */ - 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ - 0xd61f0100, /* br x8 */ + 0xd2a00008, /* mov x8, #0xnnnn0000 */ + 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ + 0xd61f0100, /* br x8 */ }; static const unsigned trampo_code[] = { - 0xa9bf7bfd, /* stp x29, x30, [sp, #-16]! */ - 0x910003fd, /* mov x29, sp */ - 0xd2800008, /* mov x8, #0xnnnn */ - 0xf2a00008, /* movk x8, #0xnnnn, lsl #16 */ - 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ - 0xf2e00008, /* movk x8, #0xnnnn, lsl #48 */ - 0xd63f0100, /* blr x8 */ - 0xa8c17bfd, /* ldp x29, x30, [sp], #16 */ - 0xd2800008, /* mov x8, #0xnnnn */ - 0xf2a00008, /* movk x8, #0xnnnn, lsl #16 */ - 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ - 0xf2e00008, /* movk x8, #0xnnnn, lsl #48 */ - 0xd61f0100, /* br x8 */ + 0xa9bf7bfd, /* stp x29, x30, [sp, #-16]! */ + 0x910003fd, /* mov x29, sp */ + 0xd2800008, /* mov x8, #0xnnnn */ + 0xf2a00008, /* movk x8, #0xnnnn, lsl #16 */ + 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ + 0xf2e00008, /* movk x8, #0xnnnn, lsl #48 */ + 0xd63f0100, /* blr x8 */ + 0xa8c17bfd, /* ldp x29, x30, [sp], #16 */ + 0xd2800008, /* mov x8, #0xnnnn */ + 0xf2a00008, /* movk x8, #0xnnnn, lsl #16 */ + 0xf2c00008, /* movk x8, #0xnnnn, lsl #32 */ + 0xf2e00008, /* movk x8, #0xnnnn, lsl #48 */ + 0xd61f0100, /* br x8 */ }; void* trampo_area; unsigned* trampoline; @@ -389,22 +389,22 @@ static int patch_libc_close_nocancel(void) * and map only the useful page. AArch64 has only a 48-bit virtual address * space, so we get a pointer we can fit in to two mov instructions. */ trampo_area = mmap(NULL, 65536, PROT_NONE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); if( trampo_area == MAP_FAILED ) { rc = -errno; LOG_S(ci_log("__close_nocancel reservation failed: %d", errno)); return rc; } - trampoline = (unsigned*)CI_PTR_ALIGN_FWD(trampo_area, 65536); + trampoline = (unsigned*) CI_PTR_ALIGN_FWD(trampo_area, 65536); if( mmap(trampoline, CI_PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) != trampoline ) { + MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) != trampoline ) { rc = -errno; LOG_S(ci_log("__close_nocancel mmap failed: %d", errno)); return rc; } memcpy(trampoline, trampo_code, sizeof(trampo_code)); aarch64_write_ptr_insns(trampoline + 2, oo_close_nocancel_entry); - aarch64_write_ptr_insns(trampoline + 8, (unsigned*)close_nocancel + 3); + aarch64_write_ptr_insns(trampoline + 8, (unsigned*) close_nocancel + 3); rc = mprotect(trampoline, CI_PAGE_SIZE, PROT_READ | PROT_EXEC); if( rc != 0 ) { rc = -errno; @@ -412,10 +412,10 @@ static int patch_libc_close_nocancel(void) return rc; } - ci_assert_equal((uintptr_t)trampoline & 0xffff, 0); - ci_assert_equal((uintptr_t)trampoline >> 48, 0); - replacement[0] |= (((uintptr_t)trampoline >> 16) & 0xffff) << 5; - replacement[1] |= (((uintptr_t)trampoline >> 32) & 0xffff) << 5; + ci_assert_equal((uintptr_t) trampoline & 0xffff, 0); + ci_assert_equal((uintptr_t) trampoline >> 48, 0); + replacement[0] |= (((uintptr_t) trampoline >> 16) & 0xffff) << 5; + replacement[1] |= (((uintptr_t) trampoline >> 32) & 0xffff) << 5; return modify_glibc_code(close_nocancel, replacement, sizeof(replacement)); } #else @@ -437,11 +437,11 @@ int citp_fdtable_ctor() Log_S(log("%s:", __FUNCTION__)); - /* How big should our fdtable be by default? It's pretty arbitrary, but we have - * seen a few apps that use setrlimit to set the fdtable to 4096 entries on - * start-up (see bugs 3253 and 3373), so we choose that. (Note: we can't grow - * the table if the app later does setrlimit, and unused entries consume virtual - * space only, so it's worth allocating a table of reasonable sized.) + /* How big should our fdtable be by default? It's pretty arbitrary, but we + * have seen a few apps that use setrlimit to set the fdtable to 4096 entries + * on start-up (see bugs 3253 and 3373), so we choose that. (Note: we can't + * grow the table if the app later does setrlimit, and unused entries consume + * virtual space only, so it's worth allocating a table of reasonable sized.) */ citp_fdtable.size = 4096; @@ -449,34 +449,33 @@ int citp_fdtable_ctor() citp_fdtable.size = rlim.rlim_max; if( CITP_OPTS.fdtable_size != 0 && CITP_OPTS.fdtable_size != rlim.rlim_max ) { - Log_S(ci_log("Set the limits for the number of opened files " - "to EF_FDTABLE_SIZE=%u value.", - CITP_OPTS.fdtable_size)); + Log_S( + ci_log("Set the limits for the number of opened files " + "to EF_FDTABLE_SIZE=%u value.", + CITP_OPTS.fdtable_size)); rlim.rlim_max = CITP_OPTS.fdtable_size; if( rlim.rlim_cur > rlim.rlim_max ) rlim.rlim_cur = rlim.rlim_max; if( ci_sys_setrlimit(RLIMIT_NOFILE, &rlim) == 0 ) - citp_fdtable.size = rlim.rlim_max; + citp_fdtable.size = rlim.rlim_max; else { /* Most probably, we've got EPERM */ ci_assert_lt(citp_fdtable.size, CITP_OPTS.fdtable_size); ci_log("Can't set EF_FDTABLE_SIZE=%u; using %u", - CITP_OPTS.fdtable_size, citp_fdtable.size); + CITP_OPTS.fdtable_size, citp_fdtable.size); rlim.rlim_max = rlim.rlim_cur = citp_fdtable.size; CI_TRY(ci_sys_setrlimit(RLIMIT_NOFILE, &rlim)); } } - } - else + } else Log_S(ci_log("Assume EF_FDTABLE_SIZE=%u", citp_fdtable.size)); citp_fdtable.inited_count = 0; - citp_fdtable.table = malloc(sizeof (citp_fdtable_entry) * - citp_fdtable.size); + citp_fdtable.table = malloc(sizeof(citp_fdtable_entry) * citp_fdtable.size); if( ! citp_fdtable.table ) { Log_U(log("%s: failed to allocate fdtable (0x%x)", __FUNCTION__, - citp_fdtable.size)); + citp_fdtable.size)); return -1; } @@ -496,7 +495,8 @@ int citp_fdtable_ctor() rc = patch_libc_close_nocancel(); if( rc < 0 ) { - Log_E(log("%s: Didn't intercept libc internal close %d", __FUNCTION__, rc)); + Log_E( + log("%s: Didn't intercept libc internal close %d", __FUNCTION__, rc)); /* Which is bad, but not fatal */ } @@ -509,17 +509,17 @@ int citp_fdtable_ctor() } -#if !defined (NDEBUG) || CI_CFG_FDTABLE_CHECKS +#if ! defined(NDEBUG) || CI_CFG_FDTABLE_CHECKS /* This function does some simple tests to ensure that the fdtable makes sense. * There are many more tests we could do; feel free to add them at your * leisure! */ -void -citp_fdtable_assert_valid(void) +void citp_fdtable_assert_valid(void) { int i; - if( ! citp_fdtable.table ) return; + if( ! citp_fdtable.table ) + return; CITP_FDTABLE_LOCK_RD(); @@ -527,26 +527,26 @@ citp_fdtable_assert_valid(void) citp_fdinfo_p fdip = citp_fdtable.table[i].fdip; if( fdip_is_normal(fdip) ) { - citp_fdinfo * fdi = fdip_to_fdi(fdip); + citp_fdinfo* fdi = fdip_to_fdi(fdip); ci_assert(fdi); ci_assert(fdi->protocol); - if( ( fdi->protocol->type == CITP_TCP_SOCKET || - fdi->protocol->type == CITP_UDP_SOCKET ) - && fdi_to_socket(fdi)->s ) - ci_assert(! (fdi_to_socket(fdi)->s->b.sb_aflags & CI_SB_AFLAG_ORPHAN)); + if( (fdi->protocol->type == CITP_TCP_SOCKET || + fdi->protocol->type == CITP_UDP_SOCKET) && + fdi_to_socket(fdi)->s ) + ci_assert(! (fdi_to_socket(fdi)->s->b.sb_aflags & CI_SB_AFLAG_ORPHAN)); - if (!fdi->is_special) { + if( ! fdi->is_special ) { /* Ensure the "back pointer" makes sense */ - ci_assert (fdi->fd == i); + ci_assert(fdi->fd == i); /* Ensure that the reference count is in a vaguely sensible range */ - ci_assert ((oo_atomic_read (&fdi->ref_count) > 0) && - (oo_atomic_read (&fdi->ref_count) < 10000)); + ci_assert((oo_atomic_read(&fdi->ref_count) > 0) && + (oo_atomic_read(&fdi->ref_count) < 10000)); /* 10,000 threads is a bit mad, warn if more than 20 */ - if (oo_atomic_read (&fdi->ref_count) > 20) { - Log_U (log ("Warning: fd %d's ref-count suspiciously large (%d)\n", - i, oo_atomic_read (&fdi->ref_count))); + if( oo_atomic_read(&fdi->ref_count) > 20 ) { + Log_U(log("Warning: fd %d's ref-count suspiciously large (%d)\n", i, + oo_atomic_read(&fdi->ref_count))); } } } @@ -557,19 +557,21 @@ citp_fdtable_assert_valid(void) #endif -static void fdtable_swap(unsigned fd, citp_fdinfo_p from, - citp_fdinfo_p to, int fdt_locked) +static void fdtable_swap( + unsigned fd, citp_fdinfo_p from, citp_fdinfo_p to, int fdt_locked) { volatile citp_fdinfo_p* p_fdip; citp_fdinfo_p fdip; p_fdip = &citp_fdtable.table[fd].fdip; - again: +again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, fdt_locked); + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, fdt_locked); ci_assert_equal(fdip, from); - if( fdip_cas_fail(p_fdip, from, to) ) goto again; + if( fdip_cas_fail(p_fdip, from, to) ) + goto again; } /* If this is called with OO_IOC_TCP_HANDOVER the stack lock must be held */ @@ -597,9 +599,8 @@ static int fdtable_fd_move(ci_fd_t sock_fd, int op) return rc; } -static int -citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, - citp_fdinfo_p* fdip_out) +static int citp_fdtable_probe_restore( + int fd, ci_ep_info_t* info, int print_banner, citp_fdinfo_p* fdip_out) { citp_protocol_impl* proto = 0; citp_fdinfo* fdi = 0; @@ -613,25 +614,30 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, /* Will need to review this function if the following assert fires */ switch( info->fd_flags & OO_FDFLAG_EP_MASK ) { - case OO_FDFLAG_EP_TCP: proto = &citp_tcp_protocol_impl; break; - case OO_FDFLAG_EP_UDP: proto = &citp_udp_protocol_impl; break; - case OO_FDFLAG_EP_PASSTHROUGH: - proto = &citp_passthrough_protocol_impl; - c_sock_fdi = 0; - break; - case OO_FDFLAG_EP_ALIEN: - proto = NULL; - c_sock_fdi = 0; - break; - case OO_FDFLAG_EP_PIPE_READ: - proto = &citp_pipe_read_protocol_impl; - c_sock_fdi = 0; - break; - case OO_FDFLAG_EP_PIPE_WRITE: - proto = &citp_pipe_write_protocol_impl; - c_sock_fdi = 0; - break; - default: ci_assert(0); + case OO_FDFLAG_EP_TCP: + proto = &citp_tcp_protocol_impl; + break; + case OO_FDFLAG_EP_UDP: + proto = &citp_udp_protocol_impl; + break; + case OO_FDFLAG_EP_PASSTHROUGH: + proto = &citp_passthrough_protocol_impl; + c_sock_fdi = 0; + break; + case OO_FDFLAG_EP_ALIEN: + proto = NULL; + c_sock_fdi = 0; + break; + case OO_FDFLAG_EP_PIPE_READ: + proto = &citp_pipe_read_protocol_impl; + c_sock_fdi = 0; + break; + case OO_FDFLAG_EP_PIPE_WRITE: + proto = &citp_pipe_write_protocol_impl; + c_sock_fdi = 0; + break; + default: + ci_assert(0); } /* Attempt to find the user-level netif for this endpoint */ @@ -641,17 +647,16 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, /* Not found, rebuild/restore the netif for this endpoint */ rc = citp_netif_recreate_probed(fd, &netif_fd, &ni); - if ( rc < 0 ) { - Log_E(log("%s: citp_netif_recreate_probed failed! (%d)", - __FUNCTION__, rc)); + if( rc < 0 ) { + Log_E(log( + "%s: citp_netif_recreate_probed failed! (%d)", __FUNCTION__, rc)); goto fail; } if( print_banner ) { ci_netif_log_startup_banner(ni, "Importing"); } - } - else + } else citp_netif_add_ref(ni); /* There is a race condition where the fd can have been created, but it has @@ -667,7 +672,7 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, return rc; } - if (c_sock_fdi) { + if( c_sock_fdi ) { citp_sock_fdi* sock_fdi; sock_fdi = CI_ALLOC_OBJ(citp_sock_fdi); @@ -680,14 +685,13 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, sock_fdi->sock.s = SP_TO_SOCK_CMN(ni, info->sock_id); sock_fdi->sock.netif = ni; - } - else if( info->fd_flags & OO_FDFLAG_EP_PASSTHROUGH ) { + } else if( info->fd_flags & OO_FDFLAG_EP_PASSTHROUGH ) { citp_waitable* w = SP_TO_WAITABLE(ni, info->sock_id); citp_alien_fdi* alien_fdi; if( ~w->sb_aflags & CI_SB_AFLAG_MOVED_AWAY_IN_EPOLL && fdtable_fd_move(fd, OO_IOC_FILE_MOVED) == 0 ) { citp_netif_release_ref(ni, 1); - *fdip_out = fdip_passthru; + *fdip_out = fdip_passthru; return rc; } @@ -756,11 +760,12 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, /* We're returning a reference to the caller. */ citp_fdinfo_ref(fdi); citp_fdtable_insert(fdi, fd, 1); - *fdip_out = fdi_to_fdip(fdi); + *fdip_out = fdi_to_fdip(fdi); return rc; - - fail: - if( ni ) citp_netif_release_ref(ni, 1); + +fail: + if( ni ) + citp_netif_release_ref(ni, 1); *fdip_out = fdip_unknown; return rc; } @@ -769,9 +774,8 @@ citp_fdtable_probe_restore(int fd, ci_ep_info_t * info, int print_banner, /* Find out what sort of thing [fd] is, and if it is a user-level socket * then map in the user-level state. */ -static int -citp_fdtable_probe_locked(unsigned fd, int print_banner, - int fdip_is_already_busy, citp_fdinfo** fdi_out) +static int citp_fdtable_probe_locked(unsigned fd, int print_banner, + int fdip_is_already_busy, citp_fdinfo** fdi_out) { citp_fdinfo* fdi = NULL; struct stat64 st; @@ -785,14 +789,17 @@ citp_fdtable_probe_locked(unsigned fd, int print_banner, ** this keeps it cleaner. May optimise down the line when I understand ** what other code needs to call this. */ - + p_fdip = &citp_fdtable.table[fd].fdip; - again: + again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, 1); - if( ! fdip_is_unknown(fdip) && ! fdip_is_normal(fdip) ) goto exit; - if( fdip_cas_fail(p_fdip, fdip, fdip_busy) ) goto again; - + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, 1); + if( ! fdip_is_unknown(fdip) && ! fdip_is_normal(fdip) ) + goto exit; + if( fdip_cas_fail(p_fdip, fdip, fdip_busy) ) + goto again; + if( fdip_is_normal(fdip) ) { fdi = fdip_to_fdi(fdip); citp_fdinfo_ref(fdi); @@ -814,61 +821,62 @@ citp_fdtable_probe_locked(unsigned fd, int print_banner, /* oo_get_st_rdev() and oo_onloadfs_dev_t() open-and-close fd, so * fdtable should be locked if strict mode requested. */ - if( fdtable_strict() ) { CITP_FDTABLE_ASSERT_LOCKED(1); } + if( fdtable_strict() ) { + CITP_FDTABLE_ASSERT_LOCKED(1); + } - if( st.st_dev == oo_onloadfs_dev_t() ) { + if( st.st_dev == oo_onloadfs_dev_t() ) { /* Retrieve user-level endpoint info */ if( oo_ep_info(fd, &info) < 0 ) { - Log_V(log("%s: fd=%d unknown type "OO_FDFLAG_FMT, - __FUNCTION__, fd, OO_FDFLAG_ARG(info.fd_flags))); + Log_V(log("%s: fd=%d unknown type " OO_FDFLAG_FMT, __FUNCTION__, fd, + OO_FDFLAG_ARG(info.fd_flags))); citp_fdtable_busy_clear(fd, fdip_passthru, 1); goto exit; } switch( info.fd_flags & (OO_FDFLAG_EP_MASK | OO_FDFLAG_STACK) ) { - case OO_FDFLAG_EP_TCP: - case OO_FDFLAG_EP_UDP: - case OO_FDFLAG_EP_PASSTHROUGH: - case OO_FDFLAG_EP_ALIEN: - case OO_FDFLAG_EP_PIPE_READ: - case OO_FDFLAG_EP_PIPE_WRITE: - { - citp_fdinfo_p fdip; - - Log_V(log("%s: fd=%d restore type "OO_FDFLAG_FMT, __FUNCTION__, fd, - OO_FDFLAG_ARG(info.fd_flags))); - rc = citp_fdtable_probe_restore(fd, &info, print_banner, &fdip); - if( fdip_is_normal(fdip) ) - fdi = fdip_to_fdi(fdip); - else - citp_fdtable_busy_clear(fd, fdip, 1); - goto exit; - } - - case OO_FDFLAG_STACK: - /* This should never happen, because netif fds are close-on-exec. - ** But let's leave this code here just in case my reasoning is bad. - */ - Log_U(log("%s: fd=%d NETIF reserved", __FUNCTION__, fd)); - citp_fdtable_busy_clear(fd, fdip_reserved, 1); - fdi = &citp_the_reserved_fd; - citp_fdinfo_ref(fdi); - goto exit; + case OO_FDFLAG_EP_TCP: + case OO_FDFLAG_EP_UDP: + case OO_FDFLAG_EP_PASSTHROUGH: + case OO_FDFLAG_EP_ALIEN: + case OO_FDFLAG_EP_PIPE_READ: + case OO_FDFLAG_EP_PIPE_WRITE: { + citp_fdinfo_p fdip; + + Log_V(log("%s: fd=%d restore type " OO_FDFLAG_FMT, __FUNCTION__, fd, + OO_FDFLAG_ARG(info.fd_flags))); + rc = citp_fdtable_probe_restore(fd, &info, print_banner, &fdip); + if( fdip_is_normal(fdip) ) + fdi = fdip_to_fdi(fdip); + else + citp_fdtable_busy_clear(fd, fdip, 1); + goto exit; + } - default: - /* This happens if a thread gets at an onload driver fd that has just - * been created, but not yet specialised. On Linux I think this - * means it will shortly be a new netif internal fd. (fds associated - * with sockets and pipes are never unspecialised). - */ - Log_V(log("%s: fd=%d TYPE_NONE", __FUNCTION__, fd)); - citp_fdtable_busy_clear(fd, fdip_passthru, 1); - goto exit; + case OO_FDFLAG_STACK: + /* This should never happen, because netif fds are close-on-exec. + ** But let's leave this code here just in case my reasoning is bad. + */ + Log_U(log("%s: fd=%d NETIF reserved", __FUNCTION__, fd)); + citp_fdtable_busy_clear(fd, fdip_reserved, 1); + fdi = &citp_the_reserved_fd; + citp_fdinfo_ref(fdi); + goto exit; + + default: + /* This happens if a thread gets at an onload driver fd that has just + * been created, but not yet specialised. On Linux I think this + * means it will shortly be a new netif internal fd. (fds associated + * with sockets and pipes are never unspecialised). + */ + Log_V(log("%s: fd=%d TYPE_NONE", __FUNCTION__, fd)); + citp_fdtable_busy_clear(fd, fdip_passthru, 1); + goto exit; } } #if CI_CFG_EPOLL2 else if( ci_major(st.st_rdev) == ci_major(oo_get_st_rdev(OO_EPOLL_DEV)) ) { - citp_epollb_fdi *epi = CI_ALLOC_OBJ(citp_epollb_fdi); + citp_epollb_fdi* epi = CI_ALLOC_OBJ(citp_epollb_fdi); if( ! epi ) { Log_E(log("%s: out of memory (epoll_fdi)", __FUNCTION__)); citp_fdtable_busy_clear(fd, fdip_passthru, 1); @@ -894,13 +902,12 @@ citp_fdtable_probe_locked(unsigned fd, int print_banner, Log_V(log("%s: fd=%u non-efab", __FUNCTION__, fd)); citp_fdtable_busy_clear(fd, fdip_passthru, 1); - exit: +exit: *fdi_out = fdi; return rc; } -static citp_fdinfo * -citp_fdtable_probe(unsigned fd) +static citp_fdinfo* citp_fdtable_probe(unsigned fd) { citp_fdinfo* fdi; int saved_errno; @@ -919,19 +926,18 @@ citp_fdtable_probe(unsigned fd) return fdi; } -static int -citp_fdinfo_is_consistent(citp_fdinfo* fdi) +static int citp_fdinfo_is_consistent(citp_fdinfo* fdi) { switch( fdi->protocol->type ) { - case CITP_TCP_SOCKET: - case CITP_UDP_SOCKET: - return ~fdi_to_sock_fdi(fdi)->sock.s->b.sb_aflags & CI_SB_AFLAG_MOVED_AWAY; + case CITP_TCP_SOCKET: + case CITP_UDP_SOCKET: + return ~fdi_to_sock_fdi(fdi)->sock.s->b.sb_aflags & + CI_SB_AFLAG_MOVED_AWAY; } return CI_TRUE; } -citp_fdinfo * -citp_fdtable_lookup(unsigned fd) +citp_fdinfo* citp_fdtable_lookup(unsigned fd) { /* Note that if we haven't yet initialised this module, then ** [inited_count] will be zero, and the following test will fail. So the @@ -946,7 +952,6 @@ citp_fdtable_lookup(unsigned fd) ci_assert(oo_per_thread_get()->sig.c.inside_lib); if( fd < citp_fdtable.inited_count ) { - volatile citp_fdinfo_p* p_fdip = &citp_fdtable.table[fd].fdip; citp_fdinfo_p fdip; @@ -956,49 +961,48 @@ citp_fdtable_lookup(unsigned fd) if( fdip_is_normal(fdip) ) { if( citp_fdtable_not_mt_safe() ) { - if( fdip_cas_succeed(p_fdip, fdip, fdip_busy) ) { - fdi = fdip_to_fdi(fdip); - ci_assert(fdi); - ci_assert_gt(oo_atomic_read(&fdi->ref_count), 0); - ci_assert(fdip_is_closing(fdip) || fdip_is_reserved(fdip) || - fdi->fd == fd); - /* Bump the reference count. */ - citp_fdinfo_ref(fdi); + if( fdip_cas_succeed(p_fdip, fdip, fdip_busy) ) { + fdi = fdip_to_fdi(fdip); + ci_assert(fdi); + ci_assert_gt(oo_atomic_read(&fdi->ref_count), 0); + ci_assert(fdip_is_closing(fdip) || fdip_is_reserved(fdip) || + fdi->fd == fd); + /* Bump the reference count. */ + citp_fdinfo_ref(fdi); if( ! citp_fdinfo_is_consistent(fdi) ) { /* Something is wrong. Re-probe. */ fdi = citp_reprobe_moved(fdi, CI_FALSE, CI_TRUE); - } - else { + } else { /* Swap the busy marker out again. */ citp_fdtable_busy_clear(fd, fdip, 0); } - return fdi; - } - goto again; - } - else { - /* No need to use atomic ops when single-threaded. The definition + return fdi; + } + goto again; + } else { + /* No need to use atomic ops when single-threaded. The definition * of "fds_mt_safe" is that the app does not change the meaning of * a file descriptor in one thread when it is being used in another * thread. In that case I'm hoping this should be safe, but at * time of writing I'm really not confident. (FIXME). */ - fdi = fdip_to_fdi(fdip); + fdi = fdip_to_fdi(fdip); if( ci_is_multithreaded() ) - citp_fdinfo_ref(fdi); + citp_fdinfo_ref(fdi); else ++fdi->ref_count.n; if( ! citp_fdinfo_is_consistent(fdi) ) fdi = citp_reprobe_moved(fdi, CI_FALSE, CI_FALSE); - return fdi; + return fdi; } } /* Not normal! */ - if( fdip_is_passthru(fdip) ) return NULL; + if( fdip_is_passthru(fdip) ) + return NULL; if( fdip_is_busy(fdip) ) { citp_fdtable_busy_wait(fd, 0); @@ -1009,24 +1013,24 @@ citp_fdtable_lookup(unsigned fd) goto probe; } - if (citp.init_level < CITP_INIT_FDTABLE) { - if (_citp_do_init_inprogress == 0) + if( citp.init_level < CITP_INIT_FDTABLE ) { + if( _citp_do_init_inprogress == 0 ) CI_TRY(citp_do_init(CITP_INIT_MAX)); else CI_TRY(citp_do_init(CITP_INIT_FDTABLE)); /* get what we need */ } - if( fd >= citp_fdtable.size ) return NULL; + if( fd >= citp_fdtable.size ) + return NULL; - probe: +probe: fdi = citp_fdtable_probe(fd); return fdi; } -citp_fdinfo* -citp_fdtable_lookup_fast(citp_lib_context_t* ctx, unsigned fd) +citp_fdinfo* citp_fdtable_lookup_fast(citp_lib_context_t* ctx, unsigned fd) { /* Note that if we haven't yet initialised this module, then ** [inited_count] will be zero, and the following test will fail. So the @@ -1040,38 +1044,36 @@ citp_fdtable_lookup_fast(citp_lib_context_t* ctx, unsigned fd) /* Try to avoid entering lib. */ ctx->thread = NULL; - if(CI_LIKELY( fd < citp_fdtable.inited_count )) { + if( CI_LIKELY(fd < citp_fdtable.inited_count) ) { volatile citp_fdinfo_p* p_fdip = &citp_fdtable.table[fd].fdip; citp_fdinfo_p fdip; again: fdip = *p_fdip; - if(CI_LIKELY( fdip_is_normal(fdip) )) { - + if( CI_LIKELY(fdip_is_normal(fdip)) ) { citp_enter_lib_if(ctx); if( citp_fdtable_is_mt_safe() ) { - /* No need to use atomic ops or add a ref to the fdi when MT-safe. + /* No need to use atomic ops or add a ref to the fdi when MT-safe. * The definition of "fds_mt_safe" is that the app does not change * the meaning of a file descriptor in one thread when it is being * used in another thread. */ fdi = fdip_to_fdi(fdip); - if(CI_UNLIKELY( ! citp_fdinfo_is_consistent(fdi) )) + if( CI_UNLIKELY(! citp_fdinfo_is_consistent(fdi)) ) fdi = citp_reprobe_moved(fdi, CI_TRUE, CI_FALSE); - return fdi; - } - else { + return fdi; + } else { /* Swap in the busy marker. */ - if( fdip_cas_succeed(p_fdip, fdip, fdip_busy) ) { - fdi = fdip_to_fdi(fdip); + if( fdip_cas_succeed(p_fdip, fdip, fdip_busy) ) { + fdi = fdip_to_fdi(fdip); - ci_assert(fdi); - ci_assert_gt(oo_atomic_read(&fdi->ref_count), 0); - ci_assert(fdip_is_closing(fdip) || fdip_is_reserved(fdip) || - fdi->fd == fd); - /* Bump the reference count. */ - citp_fdinfo_ref(fdi); + ci_assert(fdi); + ci_assert_gt(oo_atomic_read(&fdi->ref_count), 0); + ci_assert(fdip_is_closing(fdip) || fdip_is_reserved(fdip) || + fdi->fd == fd); + /* Bump the reference count. */ + citp_fdinfo_ref(fdi); if( ! citp_fdinfo_is_consistent(fdi) ) fdi = citp_reprobe_moved(fdi, CI_FALSE, CI_TRUE); @@ -1079,9 +1081,9 @@ citp_fdtable_lookup_fast(citp_lib_context_t* ctx, unsigned fd) /* Swap the busy marker out again. */ citp_fdtable_busy_clear(fd, fdip, 0); } - return fdi; - } - goto again; + return fdi; + } + goto again; } } @@ -1109,7 +1111,7 @@ citp_fdtable_lookup_fast(citp_lib_context_t* ctx, unsigned fd) if( fd >= citp_fdtable.size ) return NULL; - probe: +probe: citp_enter_lib_if(ctx); fdi = citp_fdtable_probe(fd); if( fdi && citp_fdtable_is_mt_safe() ) @@ -1132,7 +1134,7 @@ citp_fdinfo* citp_fdtable_lookup_noprobe(unsigned fd, int fdt_locked) ** fdtable lock, and on fail see if we need to initialise it. */ if( CI_UNLIKELY(citp.init_level < CITP_INIT_FDTABLE) ) { - if (_citp_do_init_inprogress == 0) + if( _citp_do_init_inprogress == 0 ) CI_TRY(citp_do_init(CITP_INIT_MAX)); else CI_TRY(citp_do_init(CITP_INIT_FDTABLE)); /* get what we need */ @@ -1141,7 +1143,6 @@ citp_fdinfo* citp_fdtable_lookup_noprobe(unsigned fd, int fdt_locked) } if( fd < citp_fdtable.inited_count ) { - volatile citp_fdinfo_p* p_fdip = &citp_fdtable.table[fd].fdip; citp_fdinfo_p fdip; @@ -1150,11 +1151,11 @@ citp_fdinfo* citp_fdtable_lookup_noprobe(unsigned fd, int fdt_locked) fdip = *p_fdip; if( fdip_is_normal(fdip) ) { if( fdip_cas_succeed(p_fdip, fdip, fdip_busy) ) { - /* Bump the reference count. */ - citp_fdinfo* fdi = fdip_to_fdi(fdip); - citp_fdinfo_ref(fdi); - /* Swap the busy marker out again. */ - citp_fdtable_busy_clear(fd, fdip, fdt_locked); + /* Bump the reference count. */ + citp_fdinfo* fdi = fdip_to_fdi(fdip); + citp_fdinfo_ref(fdi); + /* Swap the busy marker out again. */ + citp_fdtable_busy_clear(fd, fdip, fdt_locked); return fdi; } goto again; @@ -1164,7 +1165,6 @@ citp_fdinfo* citp_fdtable_lookup_noprobe(unsigned fd, int fdt_locked) citp_fdtable_busy_wait(fd, fdt_locked); goto again; } - } return NULL; @@ -1177,8 +1177,7 @@ static ci_netif* fd_to_netif(int fd, int fdt_locked) if( oo_ep_info(fd, &info) < 0 ) { Log_V(log("%s: fd=%d unknown", __FUNCTION__, fd)); - } - else { + } else { ni = citp_find_ul_netif(info.resource_id, fdt_locked); } @@ -1201,13 +1200,13 @@ static void citp_fdinfo_do_handover(citp_fdinfo* fdi, int fdt_locked) Log_V(ci_log("%s: fd=%d nonb_switch=%d", __FUNCTION__, fdi->fd, - fdi->on_rcz.handover_nonb_switch)); + fdi->on_rcz.handover_nonb_switch)); epoll_fdi = citp_epoll_fdi_from_member(fdi, fdt_locked); #if CI_CFG_EPOLL2 if( fdi->epoll_fd >= 0 && epoll_fdi != NULL && epoll_fdi->protocol->type == CITP_EPOLLB_FD ) { - citp_epollb_on_handover(epoll_fdi, fdi); + citp_epollb_on_handover(epoll_fdi, fdi); } #endif @@ -1223,7 +1222,7 @@ static void citp_fdinfo_do_handover(citp_fdinfo* fdi, int fdt_locked) ci_assert(ni); ci_netif_lock(ni); /* Remove SO_LINGER flag from the old ep: we want to close it silently */ - sock->s_flags &=~ CI_SOCK_FLAG_LINGER; + sock->s_flags &= ~CI_SOCK_FLAG_LINGER; citp_waitable_cleanup(ni, SOCK_TO_WAITABLE_OBJ(sock), 0); rc = fdtable_fd_move(fdi->fd, OO_IOC_TCP_HANDOVER); ci_netif_unlock(ni); @@ -1238,15 +1237,17 @@ static void citp_fdinfo_do_handover(citp_fdinfo* fdi, int fdt_locked) } if( rc != 0 ) { citp_fdinfo* new_fdi; - if( ! fdt_locked ) CITP_FDTABLE_LOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_LOCK(); citp_fdtable_probe_locked(fdi->fd, CI_TRUE, CI_TRUE, &new_fdi); citp_fdinfo_release_ref(new_fdi, 1); - if( ! fdt_locked ) CITP_FDTABLE_UNLOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_UNLOCK(); ci_assert_equal(citp_fdinfo_get_type(new_fdi), CITP_PASSTHROUGH_FD); os_fd = fdi_to_alien_fdi(new_fdi)->os_socket; } if( fdi->on_rcz.handover_nonb_switch >= 0 ) { - int on_off = !! fdi->on_rcz.handover_nonb_switch; + int on_off = ! ! fdi->on_rcz.handover_nonb_switch; int rc = ci_sys_ioctl(os_fd, FIONBIO, &on_off); if( rc < 0 ) Log_E(ci_log("%s: ioctl failed on_off=%d", __FUNCTION__, on_off)); @@ -1258,8 +1259,7 @@ static void citp_fdinfo_do_handover(citp_fdinfo* fdi, int fdt_locked) citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked); if( epoll_fdi != NULL && epoll_fdi->protocol->type == CITP_EPOLL_FD ) { citp_epoll_on_handover(epoll_fdi, fdi, fdt_locked); - } - else { + } else { if( epoll_fdi != NULL ) citp_fdinfo_release_ref(epoll_fdi, fdt_locked); citp_fdinfo_free(fdi); @@ -1268,23 +1268,23 @@ static void citp_fdinfo_do_handover(citp_fdinfo* fdi, int fdt_locked) #if CI_CFG_FD_CACHING /* Closes a cached fd. In the typical case, this boils down to sys_close. */ -static int uncache_fd_ul(ci_netif* ni, ci_tcp_state* ts, int cur_tgid, int quiet) +static int uncache_fd_ul( + ci_netif* ni, ci_tcp_state* ts, int cur_tgid, int quiet) { - int fd = ts->cached_on_fd; + int fd = ts->cached_on_fd; int pid = ts->cached_on_pid; - Log_V(ci_log("Uncaching fd %d on pid %d running pid %d", fd, - pid, cur_tgid)); + Log_V(ci_log("Uncaching fd %d on pid %d running pid %d", fd, pid, cur_tgid)); /* No tasklets or other bottom-halves - we always have "current" */ if( ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE && - !(ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) ) { + ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) ) { if( pid != cur_tgid ) { if( quiet ) return -1; Log_V(ci_log("%s: file cached on unexpected PID %d , expected %d", - __FUNCTION__, pid, cur_tgid)); + __FUNCTION__, pid, cur_tgid)); return -1; } - S_TO_EPS(ni,ts)->fd = CI_FD_BAD; + S_TO_EPS(ni, ts)->fd = CI_FD_BAD; /* simply close kernel FD, it should not affect endpoint at all */ ci_tcp_helper_close_no_trampoline(fd); CITP_STATS_NETIF_INC(ni, epoll_fd_uncache); @@ -1293,8 +1293,8 @@ static int uncache_fd_ul(ci_netif* ni, ci_tcp_state* ts, int cur_tgid, int quiet } -static void -__citp_uncache_fds_ul(ci_netif* netif, struct oo_p_dllink_state list) +static void __citp_uncache_fds_ul( + ci_netif* netif, struct oo_p_dllink_state list) { int cur_tgid = getpid(); ci_tcp_state** eps; @@ -1307,7 +1307,8 @@ __citp_uncache_fds_ul(ci_netif* netif, struct oo_p_dllink_state list) struct oo_p_dllink_state l; eps = malloc(sizeof(ci_tcp_state*) * n_ep_bufs); - oo_p_dllink_for_each(netif, l, list) { + oo_p_dllink_for_each(netif, l, list) + { if( n >= n_ep_bufs ) { ci_log("%s: ep %d with n_ep_bufs %d", __FUNCTION__, n, n_ep_bufs); break; @@ -1316,7 +1317,7 @@ __citp_uncache_fds_ul(ci_netif* netif, struct oo_p_dllink_state list) ci_assert(ts); ci_assert(ci_tcp_is_cached(ts)); if( ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE && - !(ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && + ! (ts->s.b.sb_aflags & CI_SB_AFLAG_IN_CACHE_NO_FD) && ts->cached_on_pid == cur_tgid ) eps[n++] = ts; } @@ -1325,18 +1326,17 @@ __citp_uncache_fds_ul(ci_netif* netif, struct oo_p_dllink_state list) { int i; for( i = 0; i < n; ++i ) - uncache_fd_ul(netif, eps[i], cur_tgid, 1/*quiet*/); + uncache_fd_ul(netif, eps[i], cur_tgid, 1 /*quiet*/); } free(eps); } -void -citp_uncache_fds_ul(ci_netif* netif) +void citp_uncache_fds_ul(ci_netif* netif) { { int i; - for( i = 0; i < netif->state->n_ep_bufs; ++i) { + for( i = 0; i < netif->state->n_ep_bufs; ++i ) { int fd = netif->eps[i].fd; if( fd != CI_FD_BAD ) ci_tcp_helper_close_no_trampoline(fd); @@ -1345,17 +1345,17 @@ citp_uncache_fds_ul(ci_netif* netif) return; if( netif->cached_count == 0 ) return; - Log_V(ci_log("%s: %d: %s: cached_count %d", __func__, - getpid(), netif->state->pretty_name, netif->cached_count)); + Log_V(ci_log("%s: %d: %s: cached_count %d", __func__, getpid(), + netif->state->pretty_name, netif->cached_count)); /* Remove all fds from the cache that belong to the current process */ - __citp_uncache_fds_ul(netif, oo_p_dllink_ptr(netif, - &netif->state->passive_scalable_cache.cache)); - __citp_uncache_fds_ul(netif, oo_p_dllink_ptr(netif, - &netif->state->passive_scalable_cache.pending)); - __citp_uncache_fds_ul(netif, oo_p_dllink_ptr(netif, - &netif->state->active_cache.cache)); - __citp_uncache_fds_ul(netif, oo_p_dllink_ptr(netif, - &netif->state->active_cache.pending)); + __citp_uncache_fds_ul(netif, + oo_p_dllink_ptr(netif, &netif->state->passive_scalable_cache.cache)); + __citp_uncache_fds_ul(netif, + oo_p_dllink_ptr(netif, &netif->state->passive_scalable_cache.pending)); + __citp_uncache_fds_ul( + netif, oo_p_dllink_ptr(netif, &netif->state->active_cache.cache)); + __citp_uncache_fds_ul( + netif, oo_p_dllink_ptr(netif, &netif->state->active_cache.pending)); } #endif @@ -1380,8 +1380,8 @@ void __citp_fdinfo_ref_count_zero(citp_fdinfo* fdi, int fdt_locked) #if CI_CFG_FD_CACHING int cached; #endif - Log_V(log("%s: fd=%d on_rcz=%d", __FUNCTION__, fdi->fd, - fdi->on_ref_count_zero)); + Log_V(log( + "%s: fd=%d on_rcz=%d", __FUNCTION__, fdi->fd, fdi->on_ref_count_zero)); citp_fdinfo_assert_valid(fdi); ci_assert(oo_atomic_read(&fdi->ref_count) == 0); @@ -1390,80 +1390,85 @@ void __citp_fdinfo_ref_count_zero(citp_fdinfo* fdi, int fdt_locked) ci_assert_nequal(fdi_to_fdip(fdi), citp_fdtable.table[fdi->fd].fdip); switch( fdi->on_ref_count_zero ) { - case FDI_ON_RCZ_CLOSE: + case FDI_ON_RCZ_CLOSE: #if CI_CFG_FD_CACHING - cached = citp_fdinfo_get_ops(fdi)->cache(fdi); - if( cached == 1 ) { - if( ! fdt_locked && fdtable_strict() ) CITP_FDTABLE_LOCK(); - fdi_to_socket(fdi)->netif->cached_count++; - fdtable_swap(fdi->fd, fdip_closing, fdip_unknown, - fdt_locked | fdtable_strict()); - citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked | fdtable_strict()); - if( ! fdt_locked && fdtable_strict() ) CITP_FDTABLE_UNLOCK(); - citp_fdinfo_free(fdi); - break; - } + cached = citp_fdinfo_get_ops(fdi)->cache(fdi); + if( cached == 1 ) { + if( ! fdt_locked && fdtable_strict() ) + CITP_FDTABLE_LOCK(); + fdi_to_socket(fdi)->netif->cached_count++; + fdtable_swap(fdi->fd, fdip_closing, fdip_unknown, + fdt_locked | fdtable_strict()); + citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked | fdtable_strict()); + if( ! fdt_locked && fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); + citp_fdinfo_free(fdi); + break; + } #endif - { + { #if CI_CFG_UL_INTERRUPT_HELPER - ci_netif* netif = fdi_to_stack(fdi); + ci_netif* netif = fdi_to_stack(fdi); #endif - /* We mark the fd as busy before closing it to avoid races. This means - * that if this fd is looked up during this phase of the close the looker - * upper will have to wait. - * - * There are problems if we try and keep this safe just by swapping - * the unknown and closing fdi entries. If we set to unknown before - * close that could result in things being re-probed in the gap between - * setting to uknown and actually closing the fd. If we close before - * setting to unknown then the fd could be re-used by the kernel - * without onload seeing it, and lookups would still return the closing - * fdi until the unknown entry had been swapped in. - */ - if( ! fdt_locked && fdtable_strict() ) CITP_FDTABLE_LOCK(); + /* We mark the fd as busy before closing it to avoid races. This means + * that if this fd is looked up during this phase of the close the + * looker upper will have to wait. + * + * There are problems if we try and keep this safe just by swapping + * the unknown and closing fdi entries. If we set to unknown before + * close that could result in things being re-probed in the gap between + * setting to uknown and actually closing the fd. If we close before + * setting to unknown then the fd could be re-used by the kernel + * without onload seeing it, and lookups would still return the closing + * fdi until the unknown entry had been swapped in. + */ + if( ! fdt_locked && fdtable_strict() ) + CITP_FDTABLE_LOCK(); - fdtable_swap(fdi->fd, fdip_closing, fdip_busy, - fdt_locked | fdtable_strict()); - if( fdi->protocol->type == CITP_TCP_SOCKET ) - SC_TO_EPS(fdi_to_socket(fdi)->netif,fdi_to_socket(fdi)->s)->fd = CI_FD_BAD; + fdtable_swap( + fdi->fd, fdip_closing, fdip_busy, fdt_locked | fdtable_strict()); + if( fdi->protocol->type == CITP_TCP_SOCKET ) + SC_TO_EPS(fdi_to_socket(fdi)->netif, fdi_to_socket(fdi)->s)->fd = + CI_FD_BAD; - if( fdi->on_ref_count_zero == FDI_ON_RCZ_CLOSE ) - ci_tcp_helper_close_no_trampoline(fdi->fd); + if( fdi->on_ref_count_zero == FDI_ON_RCZ_CLOSE ) + ci_tcp_helper_close_no_trampoline(fdi->fd); #if CI_CFG_UL_INTERRUPT_HELPER - /* If it was the last fd for this socket, then we should proceed with - * the real closing right now. - * Todo: In case of SO_LINGER it is really important to handle it all - * here. - */ - if( netif != NULL && ci_netif_trylock(netif) ) { - ci_netif_handle_actions(netif); - ci_netif_unlock(netif); - } + /* If it was the last fd for this socket, then we should proceed with + * the real closing right now. + * Todo: In case of SO_LINGER it is really important to handle it all + * here. + */ + if( netif != NULL && ci_netif_trylock(netif) ) { + ci_netif_handle_actions(netif); + ci_netif_unlock(netif); + } #endif - citp_fdtable_busy_clear(fdi->fd, fdip_unknown, - fdt_locked | fdtable_strict()); - citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked | fdtable_strict()); - if( ! fdt_locked && fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + citp_fdtable_busy_clear( + fdi->fd, fdip_unknown, fdt_locked | fdtable_strict()); + citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked | fdtable_strict()); + if( ! fdt_locked && fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); + citp_fdinfo_free(fdi); + break; + } + case FDI_ON_RCZ_DUP2: + dup2_complete(fdi, fdi_to_fdip(fdi), fdt_locked); + break; + case FDI_ON_RCZ_HANDOVER: + citp_fdinfo_do_handover(fdi, fdt_locked); + break; + case FDI_ON_RCZ_MOVED: + citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked); citp_fdinfo_free(fdi); break; - } - case FDI_ON_RCZ_DUP2: - dup2_complete(fdi, fdi_to_fdip(fdi), fdt_locked); - break; - case FDI_ON_RCZ_HANDOVER: - citp_fdinfo_do_handover(fdi, fdt_locked); - break; - case FDI_ON_RCZ_MOVED: - citp_fdinfo_get_ops(fdi)->dtor(fdi, fdt_locked); - citp_fdinfo_free(fdi); - break; - default: - CI_DEBUG(ci_log("%s: fd=%d on_ref_count_zero=%d", __FUNCTION__, - fdi->fd, fdi->on_ref_count_zero)); - ci_assert(0); + default: + CI_DEBUG(ci_log("%s: fd=%d on_ref_count_zero=%d", __FUNCTION__, fdi->fd, + fdi->on_ref_count_zero)); + ci_assert(0); } } @@ -1483,21 +1488,23 @@ void citp_fdinfo_handover(citp_fdinfo* fdi, int nonb_switch) citp_fdinfo_p fdip; unsigned fd = fdi->fd; + LOG_U(ci_log("handing FD over: %d", fdi->fd)); + /* We're about to free some user-level state, so we need to interlock ** against select and poll. */ CITP_FDTABLE_LOCK(); p_fdip = &citp_fdtable.table[fd].fdip; - again: +again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, 1); + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, 1); if( fdip == fdi_to_fdip(fdi) ) { if( fdip_cas_fail(p_fdip, fdip, fdip_busy) ) goto again; - } - else { + } else { /* [fd] must have changed meaning under our feet. It must be closing, ** so do nothing except drop the ref passed in. */ @@ -1531,14 +1538,14 @@ void citp_fdtable_fork_hook(void) { unsigned fd; - for (fd = 0; fd < citp_fdtable.inited_count; fd++) { + for( fd = 0; fd < citp_fdtable.inited_count; fd++ ) { citp_fdinfo_p fdip = citp_fdtable.table[fd].fdip; /* Parent has forked when one of its threads had made an fdtable * entry busy. Here in the child no-one will clear the busy state. * We can't do any better than just clearing back to the unknown * state. */ - if (fdip_is_busy(fdip)) { + if( fdip_is_busy(fdip) ) { citp_fdtable.table[fd].fdip = fdip_unknown; continue; } @@ -1546,17 +1553,19 @@ void citp_fdtable_fork_hook(void) } -citp_fdinfo_p -citp_fdtable_new_fd_set(unsigned fd, citp_fdinfo_p new_fdip, int fdt_locked) +citp_fdinfo_p citp_fdtable_new_fd_set( + unsigned fd, citp_fdinfo_p new_fdip, int fdt_locked) { volatile citp_fdinfo_p* p_fdip; citp_fdinfo_p prev; if( fd >= citp_fdtable.inited_count ) { ci_assert_lt(fd, citp_fdtable.size); - if( ! fdt_locked ) CITP_FDTABLE_LOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_LOCK(); __citp_fdtable_extend(fd); - if( ! fdt_locked ) CITP_FDTABLE_UNLOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_UNLOCK(); } p_fdip = &citp_fdtable.table[fd].fdip; @@ -1575,17 +1584,16 @@ citp_fdtable_new_fd_set(unsigned fd, citp_fdinfo_p new_fdip, int fdt_locked) /* Reserved? Perhaps it was a netif fd that has just been closed. So it ** should be about to be unreserved. */ - } while (fdip_is_reserved(prev) || fdip_cas_fail(p_fdip, prev, new_fdip) ); + } while( fdip_is_reserved(prev) || fdip_cas_fail(p_fdip, prev, new_fdip) ); if( fdip_is_normal(prev) ) { /* We can get here is close-trampolining fails. So for release ** builds we accept that the user-level state got out-of-sync, and ** leak [fdi] since it seems like a suitably cautious thing to do. */ - ci_log("%s: ERROR: Orphaned entry %d in user-level fd-table", - __FUNCTION__, fd); - } - else + ci_log("%s: ERROR: Orphaned entry %d in user-level fd-table", __FUNCTION__, + fd); + } else /* We (at time of writing) only register a trampoline handler when we ** create a netif, so we can miss the closing of pass-through ** descriptors. @@ -1610,8 +1618,8 @@ void citp_fdtable_insert(citp_fdinfo* fdi, unsigned fd, int fdt_locked) } -void __citp_fdtable_busy_clear_slow(unsigned fd, citp_fdinfo_p new_fdip, - int fdt_locked) +void __citp_fdtable_busy_clear_slow( + unsigned fd, citp_fdinfo_p new_fdip, int fdt_locked) { volatile citp_fdinfo_p* p_fdip = &citp_fdtable.table[fd].fdip; citp_fdinfo_p fdip, next; @@ -1623,24 +1631,28 @@ void __citp_fdtable_busy_clear_slow(unsigned fd, citp_fdinfo_p new_fdip, /* We need to write-lock citp_ul_lock to avoid races between * this oo_rwlock_cond_broadcast() and oo_rwlock_cond_wait() below. */ - if( !fdt_locked ) + if( ! fdt_locked ) CITP_FDTABLE_LOCK(); - again: +again: fdip = *p_fdip; ci_assert(fdip_is_busy(fdip)); waiter = fdip_to_waiter(fdip); ci_assert(waiter); ci_assert(fdip_is_busy(waiter->next)); - if( waiter->next == fdip_busy ) next = new_fdip; - else next = waiter->next; - if( fdip_cas_fail(p_fdip, fdip, next) ) goto again; + if( waiter->next == fdip_busy ) + next = new_fdip; + else + next = waiter->next; + if( fdip_cas_fail(p_fdip, fdip, next) ) + goto again; oo_rwlock_cond_broadcast(&waiter->cond); - if( next != new_fdip ) goto again; + if( next != new_fdip ) + goto again; - if( !fdt_locked ) + if( ! fdt_locked ) CITP_FDTABLE_UNLOCK(); } @@ -1659,10 +1671,10 @@ citp_fdinfo_p citp_fdtable_busy_wait(unsigned fd, int fdt_locked) /* We should lock citp_ul_lock before checking the condition which can * lead to oo_rwlock_cond_wait() call. */ - if( !fdt_locked ) + if( ! fdt_locked ) CITP_FDTABLE_LOCK(); - again: +again: waiter.next = *p_fdip; if( fdip_is_busy(waiter.next) ) { /* we can replace one "busy" fdip by another without fdtable lock */ @@ -1671,7 +1683,7 @@ citp_fdinfo_p citp_fdtable_busy_wait(unsigned fd, int fdt_locked) goto again; } - if( !fdt_locked ) + if( ! fdt_locked ) CITP_FDTABLE_UNLOCK(); oo_rwlock_cond_destroy(&waiter.cond); @@ -1692,9 +1704,10 @@ static citp_fdinfo_p citp_fdtable_closing_wait(unsigned fd, int fdt_locked) Log_V(ci_log("%s: fd=%u", __FUNCTION__, fd)); - again: +again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, fdt_locked); + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, fdt_locked); if( fdip_is_closing(fdip) ) { if( fdt_locked ) { /* Need to drop the lock to avoid deadlock with the other thread @@ -1714,8 +1727,10 @@ void __citp_fdtable_reserve(int fd, int protect) CITP_FDTABLE_ASSERT_LOCKED(1); ci_assert_lt((unsigned) fd, citp_fdtable.size); - if( protect ) citp_fdtable_new_fd_set(fd, fdip_reserved, 1); - else fdtable_swap(fd, fdip_reserved, fdip_unknown, 1); + if( protect ) + citp_fdtable_new_fd_set(fd, fdip_reserved, 1); + else + fdtable_swap(fd, fdip_reserved, fdip_unknown, 1); } @@ -1743,8 +1758,7 @@ int citp_ep_dup_fcntl_dup_cloexec(int oldfd, long arg) ** Why do these live here? Because they need to hack into the low-level ** dirty nastiness of the fdtable. */ -int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), - long arg) +int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), long arg) { /* This implements dup(oldfd) and fcntl(oldfd, F_DUPFD, arg). */ @@ -1756,8 +1770,8 @@ int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), Log_V(log("%s(%d)", __FUNCTION__, oldfd)); - if(CI_UNLIKELY( citp.init_level < CITP_INIT_FDTABLE || - oo_per_thread_get()->in_vfork_child )) + if( CI_UNLIKELY(citp.init_level < CITP_INIT_FDTABLE || + oo_per_thread_get()->in_vfork_child) ) /* Lib not initialised, so no U/L state, and therefore system dup() ** will do just fine. */ return syscall(oldfd, arg); @@ -1773,7 +1787,7 @@ int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), } p_oldfdip = &citp_fdtable.table[oldfd].fdip; - again: +again: oldfdip = *p_oldfdip; if( fdip_is_busy(oldfdip) ) oldfdip = citp_fdtable_busy_wait(oldfd, 0); @@ -1814,18 +1828,20 @@ int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), return -1; } - if( fdtable_strict() ) CITP_FDTABLE_LOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_LOCK(); newfd = syscall(oldfd, arg); if( newfd >= 0 ) citp_fdtable_new_fd_set(newfd, fdip_busy, fdtable_strict()); - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); if( newfd >= 0 ) { citp_fdtable_insert(newfdi, newfd, 0); newfdi = 0; } - } - else { - if( fdtable_strict() ) CITP_FDTABLE_LOCK(); + } else { + if( fdtable_strict() ) + CITP_FDTABLE_LOCK(); newfd = syscall(oldfd, arg); if( newfd >= 0 && newfd < citp_fdtable.inited_count ) { /* Mark newfd as unknown. When used, it'll get probed. @@ -1838,19 +1854,21 @@ int citp_ep_dup(unsigned oldfd, int (*syscall)(int oldfd, long arg), */ citp_fdtable_new_fd_set(newfd, fdip_unknown, fdtable_strict()); } - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); } citp_fdtable_busy_clear(oldfd, oldfdip, 0); - if( newfdi ) citp_fdinfo_free(newfdi); + if( newfdi ) + citp_fdinfo_free(newfdi); return newfd; } -static void dup2_complete(citp_fdinfo* prev_tofdi, - citp_fdinfo_p prev_tofdip, int fdt_locked) +static void dup2_complete( + citp_fdinfo* prev_tofdi, citp_fdinfo_p prev_tofdip, int fdt_locked) { - volatile citp_fdinfo_p *p_fromfdip; + volatile citp_fdinfo_p* p_fromfdip; unsigned fromfd = prev_tofdi->on_rcz.dup3_args.fd; unsigned tofd = prev_tofdi->fd; citp_fdinfo_p fromfdip; @@ -1865,7 +1883,7 @@ static void dup2_complete(citp_fdinfo* prev_tofdi, citp_fdinfo* fromfdi; p_fromfdip = &citp_fdtable.table[fromfd].fdip; - lock_fromfdip_again: +lock_fromfdip_again: fromfdip = *p_fromfdip; if( fdip_is_busy(fromfdip) ) fromfdip = citp_fdtable_busy_wait(fromfd, fdt_locked); @@ -1878,9 +1896,11 @@ static void dup2_complete(citp_fdinfo* prev_tofdi, #if CI_CFG_FD_CACHING /* Need to check in case this sucker's cached */ if( fdip_is_unknown(fromfdip) ) { - if( !fdt_locked ) CITP_FDTABLE_LOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_LOCK(); citp_fdtable_probe_locked(fromfd, CI_FALSE, CI_FALSE, &fromfdi); - if( !fdt_locked ) CITP_FDTABLE_UNLOCK(); + if( ! fdt_locked ) + CITP_FDTABLE_UNLOCK(); if( fromfdi == &citp_the_closed_fd ) { prev_tofdi->on_rcz.dup2_result = -EBADF; ci_wmb(); @@ -1907,16 +1927,16 @@ static void dup2_complete(citp_fdinfo* prev_tofdi, } ci_assert(fdip_is_normal(fromfdip) | fdip_is_passthru(fromfdip) | - fdip_is_unknown(fromfdip)); + fdip_is_unknown(fromfdip)); if( fdip_is_normal(fromfdip) && - (((fromfdi = fdip_to_fdi(fromfdip))->protocol->type) == CITP_EPOLL_FD) ) { + (((fromfdi = fdip_to_fdi(fromfdip))->protocol->type) == + CITP_EPOLL_FD) ) { citp_fdinfo* newfdi = citp_fdinfo_get_ops(fromfdi)->dup(fromfdi); if( newfdi ) { citp_fdinfo_init(newfdi, fdip_to_fdi(fromfdip)->protocol); citp_fdtable_insert(newfdi, tofd, fdt_locked); - } - else { + } else { /* Out of memory. Can't probe epoll1 fd later on, so fail. */ citp_fdtable_busy_clear(fromfd, fromfdip, fdt_locked); prev_tofdi->on_rcz.dup2_result = -ENOMEM; @@ -1924,8 +1944,7 @@ static void dup2_complete(citp_fdinfo* prev_tofdi, prev_tofdi->on_ref_count_zero = FDI_ON_RCZ_DONE; return; } - } - else { + } else { /* Mark newfd as unknown. When used, it'll get probed. * * We are not just being lazy here: Setting to unknown rather than @@ -2001,7 +2020,7 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) pthread_mutex_lock(&citp_dup_lock); CITP_FDTABLE_LOCK(); p_tofdip = &citp_fdtable.table[tofd].fdip; - lock_tofdip_again: +lock_tofdip_again: tofdip = *p_tofdip; if( fdip_is_busy(tofdip) ) tofdip = citp_fdtable_busy_wait(tofd, 1); @@ -2011,7 +2030,7 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) /* ?? FIXME: we can't cope with this at the moment */ CITP_FDTABLE_UNLOCK(); Log_U(log("%s(%d, %d): target is reserved, see EF_ONLOAD_FD_BASE", - __FUNCTION__, fromfd, tofd)); + __FUNCTION__, fromfd, tofd)); errno = EBUSY; tofd = -1; goto out; @@ -2020,7 +2039,7 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) goto lock_tofdip_again; CITP_FDTABLE_UNLOCK(); ci_assert(fdip_is_normal(tofdip) | fdip_is_passthru(tofdip) | - fdip_is_unknown(tofdip)); + fdip_is_unknown(tofdip)); if( fdip_is_normal(tofdip) ) { /* We're duping onto a user-level socket. */ @@ -2055,7 +2074,7 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) while( tofdi->on_ref_count_zero != FDI_ON_RCZ_DONE ) { if( ci_is_multithreaded() && i % 10000 == 9999 ) { pthread_t pth = tofdi->thread_id; - if( pth != pthread_self() && pth != PTHREAD_NULL ) { + if( pth != pthread_self() && pth != PTHREAD_NULL ) { pthread_kill(pth, SIGONLOAD); sleep(1); } @@ -2073,8 +2092,7 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) CI_DEBUG(tofdi->on_ref_count_zero = FDI_ON_RCZ_NONE); citp_fdtable_busy_clear(tofd, tofdip, 0); tofd = -1; - } - else { + } else { ci_assert(tofdi->on_rcz.dup2_result == tofd); citp_fdinfo_get_ops(tofdi)->dtor(tofdi, 0); citp_fdinfo_free(tofdi); @@ -2096,12 +2114,11 @@ int citp_ep_dup3(unsigned fromfd, unsigned tofd, int flags) errno = -fdi.on_rcz.dup2_result; citp_fdtable_busy_clear(tofd, tofdip, 0); tofd = -1; - } - else + } else ci_assert(fdi.on_rcz.dup2_result == tofd); } - out: +out: pthread_mutex_unlock(&citp_dup_lock); return tofd; } @@ -2153,14 +2170,15 @@ int citp_ep_close(unsigned fd) got_lock = 1; p_fdip = &citp_fdtable.table[fd].fdip; - again: +again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, 1); + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, 1); if( fdip_is_closing(fdip) | fdip_is_reserved(fdip) ) { /* Concurrent close or attempt to close reserved. */ Log_V(ci_log("%s: fd=%d closing=%d reserved=%d", __FUNCTION__, fd, - fdip_is_closing(fdip), fdip_is_reserved(fdip))); + fdip_is_closing(fdip), fdip_is_reserved(fdip))); errno = EBADF; rc = -1; goto done; @@ -2181,8 +2199,8 @@ int citp_ep_close(unsigned fd) } #endif - ci_assert(fdip_is_normal(fdip) | fdip_is_passthru(fdip) | - fdip_is_unknown(fdip)); + ci_assert( + fdip_is_normal(fdip) | fdip_is_passthru(fdip) | fdip_is_unknown(fdip)); /* Swap in the "closed" pseudo-fdinfo. This lets any other thread know ** that we're in the middle of closing this fd. @@ -2227,22 +2245,21 @@ int citp_ep_close(unsigned fd) citp_fdinfo_release_ref(fdi, 0); rc = 0; - } - else { - ci_assert(fdip_is_passthru(fdip) || - fdip_is_unknown(fdip)); + } else { + ci_assert(fdip_is_passthru(fdip) || fdip_is_unknown(fdip)); if( ! fdtable_strict() ) { CITP_FDTABLE_UNLOCK(); got_lock = 0; } Log_V(ci_log("%s: fd=%d passthru=%d unknown=%d", __FUNCTION__, fd, - fdip_is_passthru(fdip), fdip_is_unknown(fdip))); + fdip_is_passthru(fdip), fdip_is_unknown(fdip))); fdtable_swap(fd, fdip_closing, fdip_unknown, fdtable_strict()); rc = ci_tcp_helper_close_no_trampoline(fd); } - done: - if( got_lock ) CITP_FDTABLE_UNLOCK(); +done: + if( got_lock ) + CITP_FDTABLE_UNLOCK(); FDTABLE_ASSERT_VALID(); return rc; } @@ -2252,8 +2269,7 @@ int citp_ep_close(unsigned fd) * or from citp_fdtable_lookup_fast(). The _fast() variant is used by * read/write/recvmsg/sendto/... socket call interceptors. */ int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, - int fdip_is_already_busy, - citp_fdinfo** fdinfo_out) + int fdip_is_already_busy, citp_fdinfo** fdinfo_out) { int fd = fdinfo->fd; citp_fdinfo* new_fdinfo = NULL; @@ -2264,14 +2280,16 @@ int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, if( ! fdip_is_already_busy ) { volatile citp_fdinfo_p* p_fdip; citp_fdinfo_p fdip; - + p_fdip = &citp_fdtable.table[fd].fdip; - again: + again: fdip = *p_fdip; - if( fdip_is_busy(fdip) ) fdip = citp_fdtable_busy_wait(fd, 1); - ci_assert( fdip_is_normal(fdip) || fdip_is_passthru(fdip) ); - if( fdip_cas_fail(p_fdip, fdip, fdip_busy) ) goto again; - + if( fdip_is_busy(fdip) ) + fdip = citp_fdtable_busy_wait(fd, 1); + ci_assert(fdip_is_normal(fdip) || fdip_is_passthru(fdip)); + if( fdip_cas_fail(p_fdip, fdip, fdip_busy) ) + goto again; + /* Possibly, a parrallel thread have already called * citp_reprobe_moved() for us. */ if( fdip_is_passthru(fdip) ) { @@ -2280,16 +2298,15 @@ int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, citp_fdinfo_ref(new_fdinfo); goto done; } - ci_assert( fdip_is_normal(fdip) ); + ci_assert(fdip_is_normal(fdip)); new_fdinfo = fdip_to_fdi(fdip); - if( new_fdinfo != fdinfo) { + if( new_fdinfo != fdinfo ) { citp_fdtable_busy_clear(fd, fdip, 1); if( new_fdinfo != NULL ) citp_fdinfo_ref(new_fdinfo); goto done; } - } - else + } else ci_assert(fdip_is_busy(citp_fdtable.table[fd].fdip)); /* re-probe new fd */ @@ -2301,8 +2318,7 @@ int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, if( epoll_fdi->protocol->type == CITP_EPOLLB_FD ) { citp_epollb_on_handover(epoll_fdi, fdinfo); citp_fdinfo_release_ref(epoll_fdi, 1); - } - else + } else #endif { citp_epoll_on_move(epoll_fdi, fdinfo, new_fdinfo, 1); @@ -2313,7 +2329,7 @@ int citp_reprobe_moved_common(citp_fdinfo* fdinfo, int from_fast_lookup, fdinfo->on_ref_count_zero = FDI_ON_RCZ_MOVED; citp_fdinfo_release_ref(fdinfo, 1); - done: +done: /* One refcount from the caller */ if( from_fast_lookup ) citp_fdinfo_release_ref_fast(fdinfo); @@ -2340,7 +2356,8 @@ void __oo_service_fd(bool fdtable_locked) int fd; ci_assert_equal(citp.onload_fd, -1); - if( ef_onload_driver_open(&fd, OO_STACK_DEV, 1) ) return; + if( ef_onload_driver_open(&fd, OO_STACK_DEV, 1) ) + return; if( ci_cas32_succeed(&citp.onload_fd, -1, fd) ) { if( fdtable_locked ) { /* __citp_fdtable_extend() handles citp.onload_fd, so there is no @@ -2349,8 +2366,7 @@ void __oo_service_fd(bool fdtable_locked) __citp_fdtable_extend(fd); else __citp_fdtable_reserve(fd, 0); - } - else { + } else { /* We do not know the current context, so we can't lock fdtable, * or leverage the already-taken lock. * Let's hope that logging happens at start of day, so our fd is @@ -2360,11 +2376,10 @@ void __oo_service_fd(bool fdtable_locked) if( citp_fdtable.table ) { ci_assert_lt(fd, citp_fdtable.size); citp_fdtable.table[citp.onload_fd].fdip = - fdi_to_fdip(&citp_the_reserved_fd); + fdi_to_fdip(&citp_the_reserved_fd); } } - } - else { + } else { /* Unspecialised /dev/onload does not trampoline, * so simple close is OK. */ ci_sys_close(fd); diff --git a/src/lib/transport/unix/mmake.mk b/src/lib/transport/unix/mmake.mk index 88cc4d2f9..88759a40e 100644 --- a/src/lib/transport/unix/mmake.mk +++ b/src/lib/transport/unix/mmake.mk @@ -8,8 +8,12 @@ ifeq ($(ISA),i386) BUILD_TREE_COPY := mapfile.ilp32 endif -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu +ifeq ($(RTE_SDK),) +$(error "Please define RTE_SDK environment variable") +endif + +MMAKE_DPDK := $(DEFAULT_DPDK) +MMAKE_INCLUDE += -I$(RTE_SDK)/build/install/include TARGET := libcitransport0.so MMAKE_TYPE := DLL @@ -18,7 +22,7 @@ LDEP := $(CITPCOMMON_LIB_DEPEND) $(CIIP_LIB_DEPEND) $(CPLANE_LIB_DEPEND) \ $(CITOOLS_LIB_DEPEND) $(CIUL_LIB_DEPEND) LLNK := $(LINK_CITPCOMMON_LIB) $(LINK_CIIP_LIB) $(LINK_CPLANE_LIB) \ - $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) $(MMAKE_DPDK_LIBS) + $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) $(MMAKE_DPDK) LIB_SRCS := \ startup.c \ diff --git a/src/lib/transport/unix/startup.c b/src/lib/transport/unix/startup.c index 8384190cf..d5e0d3185 100644 --- a/src/lib/transport/unix/startup.c +++ b/src/lib/transport/unix/startup.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2003-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk ** \brief Sockets interface to user level TCP @@ -10,15 +10,15 @@ ** *//* \**************************************************************************/ - + /*! \cidoxg_lib_transport_unix */ #include #include #include -#include /* for getpid() */ -#include /* for mkdir() */ -#include /* for mkdir() */ +#include /* for getpid() */ +#include /* for mkdir() */ +#include /* for mkdir() */ #include #include @@ -43,9 +43,9 @@ static int citp_setup_logging_early(void) return 0; } -static void citp_setup_logging_change(void *new_log_fn) +static void citp_setup_logging_change(void* new_log_fn) { - if( ci_log_fn != new_log_fn && citp.log_fd >= 0) { + if( ci_log_fn != new_log_fn && citp.log_fd >= 0 ) { ci_sys_close(citp.log_fd); citp.log_fd = -1; } @@ -55,7 +55,8 @@ static void citp_setup_logging_change(void *new_log_fn) void citp_setup_logging_prefix(void) { static char s0[64]; - snprintf(s0, sizeof(s0), "oo:%.16s[%d]: ", citp.process_name, (int) getpid()); + snprintf( + s0, sizeof(s0), "oo:%.16s[%d]: ", citp.process_name, (int) getpid()); ci_set_log_prefix(s0); } @@ -117,8 +118,6 @@ static void __oo_per_thread_init_thread(struct oo_per_thread* pt) } - - static void citp_dump_config(void) { char buf[80]; @@ -130,89 +129,88 @@ static void citp_dump_config(void) log("ci_is_multithreaded = %d", ci_is_multithreaded()); } -static void citp_dump_opts(citp_opts_t *o) +static void citp_dump_opts(citp_opts_t* o) { /* ?? TODO: should be using opts_cittp_def.h here */ -# define DUMP_OPT_INT(envstr, name) \ - ci_log("%s=%d", (envstr), (int) o->name) -# define DUMP_OPT_HEX(envstr, name) \ +#define DUMP_OPT_INT(envstr, name) ci_log("%s=%d", (envstr), (int) o->name) +#define DUMP_OPT_HEX(envstr, name) \ ci_log("%s=%x", (envstr), (unsigned) o->name) - DUMP_OPT_HEX("EF_UNIX_LOG", log_level); - DUMP_OPT_INT("EF_PROBE", probe); - DUMP_OPT_INT("EF_TCP", ul_tcp); - DUMP_OPT_INT("EF_UDP", ul_udp); - DUMP_OPT_INT("EF_UL_SELECT", ul_select); - DUMP_OPT_INT("EF_SELECT_SPIN", ul_select_spin); - DUMP_OPT_INT("EF_SELECT_FAST", ul_select_fast); - DUMP_OPT_INT("EF_UL_POLL", ul_poll); - DUMP_OPT_INT("EF_POLL_SPIN", ul_poll_spin); - DUMP_OPT_INT("EF_POLL_FAST", ul_poll_fast); - DUMP_OPT_INT("EF_POLL_FAST_USEC", ul_poll_fast_usec); + DUMP_OPT_HEX("EF_UNIX_LOG", log_level); + DUMP_OPT_INT("EF_PROBE", probe); + DUMP_OPT_INT("EF_TCP", ul_tcp); + DUMP_OPT_INT("EF_UDP", ul_udp); + DUMP_OPT_INT("EF_UL_SELECT", ul_select); + DUMP_OPT_INT("EF_SELECT_SPIN", ul_select_spin); + DUMP_OPT_INT("EF_SELECT_FAST", ul_select_fast); + DUMP_OPT_INT("EF_UL_POLL", ul_poll); + DUMP_OPT_INT("EF_POLL_SPIN", ul_poll_spin); + DUMP_OPT_INT("EF_POLL_FAST", ul_poll_fast); + DUMP_OPT_INT("EF_POLL_FAST_USEC", ul_poll_fast_usec); DUMP_OPT_INT("EF_POLL_NONBLOCK_FAST_USEC", ul_poll_nonblock_fast_usec); - DUMP_OPT_INT("EF_SELECT_FAST_USEC", ul_select_fast_usec); + DUMP_OPT_INT("EF_SELECT_FAST_USEC", ul_select_fast_usec); DUMP_OPT_INT("EF_SELECT_NONBLOCK_FAST_USEC", ul_select_nonblock_fast_usec); - DUMP_OPT_INT("EF_UDP_RECV_SPIN", udp_recv_spin); - DUMP_OPT_INT("EF_UDP_SEND_SPIN", udp_send_spin); - DUMP_OPT_INT("EF_TCP_RECV_SPIN", tcp_recv_spin); - DUMP_OPT_INT("EF_TCP_SEND_SPIN", tcp_send_spin); - DUMP_OPT_INT("EF_TCP_ACCEPT_SPIN", tcp_accept_spin); - DUMP_OPT_INT("EF_TCP_CONNECT_SPIN", tcp_connect_spin); - DUMP_OPT_INT("EF_PKT_WAIT_SPIN", pkt_wait_spin); - DUMP_OPT_INT("EF_PIPE_RECV_SPIN", pipe_recv_spin); - DUMP_OPT_INT("EF_PIPE_SEND_SPIN", pipe_send_spin); - DUMP_OPT_INT("EF_PIPE_SIZE", pipe_size); - DUMP_OPT_INT("EF_SOCK_LOCK_BUZZ", sock_lock_buzz); - DUMP_OPT_INT("EF_STACK_LOCK_BUZZ", stack_lock_buzz); - DUMP_OPT_INT("EF_SO_BUSY_POLL_SPIN", so_busy_poll_spin); - DUMP_OPT_INT("EF_UL_EPOLL", ul_epoll); - DUMP_OPT_INT("EF_EPOLL_SPIN", ul_epoll_spin); - DUMP_OPT_INT("EF_EPOLL_CTL_FAST", ul_epoll_ctl_fast); - DUMP_OPT_INT("EF_EPOLL_CTL_HANDOFF", ul_epoll_ctl_handoff); - DUMP_OPT_INT("EF_EPOLL_MT_SAFE", ul_epoll_mt_safe); - DUMP_OPT_INT("EF_FDTABLE_SIZE", fdtable_size); - DUMP_OPT_INT("EF_SPIN_USEC", ul_spin_usec); - DUMP_OPT_INT("EF_SLEEP_SPIN_USEC", sleep_spin_usec); - DUMP_OPT_INT("EF_STACK_PER_THREAD", stack_per_thread); - DUMP_OPT_INT("EF_DONT_ACCELERATE", dont_accelerate); - DUMP_OPT_INT("EF_FDTABLE_STRICT", fdtable_strict); - DUMP_OPT_INT("EF_FDS_MT_SAFE", fds_mt_safe); - DUMP_OPT_INT("EF_FORK_NETIF", fork_netif); - DUMP_OPT_INT("EF_NETIF_DTOR", netif_dtor); - DUMP_OPT_INT("EF_NO_FAIL", no_fail); - DUMP_OPT_INT("EF_SA_ONSTACK_INTERCEPT", sa_onstack_intercept); + DUMP_OPT_INT("EF_UDP_RECV_SPIN", udp_recv_spin); + DUMP_OPT_INT("EF_UDP_SEND_SPIN", udp_send_spin); + DUMP_OPT_INT("EF_TCP_RECV_SPIN", tcp_recv_spin); + DUMP_OPT_INT("EF_TCP_SEND_SPIN", tcp_send_spin); + DUMP_OPT_INT("EF_TCP_ACCEPT_SPIN", tcp_accept_spin); + DUMP_OPT_INT("EF_TCP_CONNECT_SPIN", tcp_connect_spin); + DUMP_OPT_INT("EF_PKT_WAIT_SPIN", pkt_wait_spin); + DUMP_OPT_INT("EF_PIPE_RECV_SPIN", pipe_recv_spin); + DUMP_OPT_INT("EF_PIPE_SEND_SPIN", pipe_send_spin); + DUMP_OPT_INT("EF_PIPE_SIZE", pipe_size); + DUMP_OPT_INT("EF_SOCK_LOCK_BUZZ", sock_lock_buzz); + DUMP_OPT_INT("EF_STACK_LOCK_BUZZ", stack_lock_buzz); + DUMP_OPT_INT("EF_SO_BUSY_POLL_SPIN", so_busy_poll_spin); + DUMP_OPT_INT("EF_UL_EPOLL", ul_epoll); + DUMP_OPT_INT("EF_EPOLL_SPIN", ul_epoll_spin); + DUMP_OPT_INT("EF_EPOLL_CTL_FAST", ul_epoll_ctl_fast); + DUMP_OPT_INT("EF_EPOLL_CTL_HANDOFF", ul_epoll_ctl_handoff); + DUMP_OPT_INT("EF_EPOLL_MT_SAFE", ul_epoll_mt_safe); + DUMP_OPT_INT("EF_FDTABLE_SIZE", fdtable_size); + DUMP_OPT_INT("EF_SPIN_USEC", ul_spin_usec); + DUMP_OPT_INT("EF_SLEEP_SPIN_USEC", sleep_spin_usec); + DUMP_OPT_INT("EF_STACK_PER_THREAD", stack_per_thread); + DUMP_OPT_INT("EF_DONT_ACCELERATE", dont_accelerate); + DUMP_OPT_INT("EF_FDTABLE_STRICT", fdtable_strict); + DUMP_OPT_INT("EF_FDS_MT_SAFE", fds_mt_safe); + DUMP_OPT_INT("EF_FORK_NETIF", fork_netif); + DUMP_OPT_INT("EF_NETIF_DTOR", netif_dtor); + DUMP_OPT_INT("EF_NO_FAIL", no_fail); + DUMP_OPT_INT("EF_SA_ONSTACK_INTERCEPT", sa_onstack_intercept); DUMP_OPT_INT("EF_ACCEPT_INHERIT_NONBLOCK", accept_force_inherit_nonblock); DUMP_OPT_INT("EF_PIPE", ul_pipe); DUMP_OPT_HEX("EF_SIGNALS_NOPOSTPONE", signals_no_postpone); DUMP_OPT_HEX("EF_SYNC_CPLANE_AT_CREATE", sync_cplane); - DUMP_OPT_INT("EF_CLUSTER_SIZE", cluster_size); - DUMP_OPT_INT("EF_CLUSTER_RESTART", cluster_restart_opt); + DUMP_OPT_INT("EF_CLUSTER_SIZE", cluster_size); + DUMP_OPT_INT("EF_CLUSTER_RESTART", cluster_restart_opt); DUMP_OPT_INT("EF_CLUSTER_HOT_RESTART", cluster_hot_restart_opt); ci_log("EF_CLUSTER_NAME=%s", o->cluster_name); if( o->tcp_reuseports == 0 ) { DUMP_OPT_INT("EF_TCP_FORCE_REUSEPORT", tcp_reuseports); } else { - struct ci_port_list *force_reuseport; + struct ci_port_list* force_reuseport; CI_DLLIST_FOR_EACH2(struct ci_port_list, force_reuseport, link, - (ci_dllist*)(ci_uintptr_t)o->tcp_reuseports) - ci_log("%s=%d", "EF_TCP_FORCE_REUSEPORT", ntohs(force_reuseport->port)); + (ci_dllist*) (ci_uintptr_t) o->tcp_reuseports) + ci_log("%s=%d", "EF_TCP_FORCE_REUSEPORT", ntohs(force_reuseport->port)); } if( o->udp_reuseports == 0 ) { DUMP_OPT_INT("EF_UDP_FORCE_REUSEPORT", udp_reuseports); } else { - struct ci_port_list *force_reuseport; + struct ci_port_list* force_reuseport; CI_DLLIST_FOR_EACH2(struct ci_port_list, force_reuseport, link, - (ci_dllist*)(ci_uintptr_t)o->udp_reuseports) - ci_log("%s=%d", "EF_UDP_FORCE_REUSEPORT", ntohs(force_reuseport->port)); + (ci_dllist*) (ci_uintptr_t) o->udp_reuseports) + ci_log("%s=%d", "EF_UDP_FORCE_REUSEPORT", ntohs(force_reuseport->port)); } } -static void citp_log_to_file(const char *s) +static void citp_log_to_file(const char* s) { int fd; - ci_assert(!CITP_OPTS.log_via_ioctl); + ci_assert(! CITP_OPTS.log_via_ioctl); fd = open(s, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); if( fd >= 0 ) { if( citp.log_fd >= 0 ) @@ -233,39 +231,43 @@ static void citp_get_process_name(void) ci_snprintf(citp.process_path, sizeof(citp.process_path), ""); - n = readlink("/proc/self/exe", citp.process_path, - sizeof(citp.process_path)); - if (n < 0) + n = readlink("/proc/self/exe", citp.process_path, sizeof(citp.process_path)); + if( n < 0 ) return; n = CI_MIN(n + 1, sizeof(citp.process_path)); citp.process_path[n - 1] = '\0'; citp.process_name = citp.process_path + n - 2; - while (citp.process_name > citp.process_path && - citp.process_name[-1] != '/') + while( + citp.process_name > citp.process_path && citp.process_name[-1] != '/' ) --citp.process_name; } static int get_env_opt_int(const char* name, int old_val, int hex) -{ const char* s; +{ + const char* s; int new_val; char dummy; if( (s = getenv(name)) ) { if( sscanf(s, hex ? "%x %c" : "%d %c", &new_val, &dummy) == 1 ) /*! TODO: should use option value range checking here */ return new_val; - else if (s[0] != '\0') + else if( s[0] != '\0' ) ci_log("citp: bad option '%s=%s'", name, s); } return old_val; } -#define GET_ENV_OPT_INT(envstr, var) \ - do{ opts->var = get_env_opt_int((envstr), opts->var, 0); }while(0) +#define GET_ENV_OPT_INT(envstr, var) \ + do { \ + opts->var = get_env_opt_int((envstr), opts->var, 0); \ + } while( 0 ) -#define GET_ENV_OPT_HEX(envstr, var) \ - do{ opts->var = get_env_opt_int((envstr), opts->var, 1); }while(0) +#define GET_ENV_OPT_HEX(envstr, var) \ + do { \ + opts->var = get_env_opt_int((envstr), opts->var, 1); \ + } while( 0 ) /* This function assumes an option of the same form and types as @@ -273,18 +275,19 @@ static int get_env_opt_int(const char* name, int old_val, int hex) */ static void get_env_opt_port_list(ci_uint64* opt, const char* name) { - char *s; + char* s; unsigned v; if( (s = getenv(name)) ) { + ci_log("GETTING LIST %s", name); /* The memory used for this list is never freed, as we need it - * persist until the process terminates + * persist until the process terminates */ - *opt = (ci_uint64)(ci_uintptr_t)malloc(sizeof(ci_dllist)); + *opt = (ci_uint64) (ci_uintptr_t) malloc(sizeof(ci_dllist)); if( ! *opt ) log("Could not allocate memory for %s list", name); else { - struct ci_port_list *curr; - ci_dllist *opt_list = (ci_dllist*)(ci_uintptr_t)*opt; + struct ci_port_list* curr; + ci_dllist* opt_list = (ci_dllist*) (ci_uintptr_t) *opt; ci_dllist_init(opt_list); while( sscanf(s, "%u", &v) == 1 ) { @@ -297,8 +300,7 @@ static void get_env_opt_port_list(ci_uint64* opt, const char* name) if( curr->port != v ) { log("ERROR: %s contains value that is too large: %u", name, v); free(curr); - } - else { + } else { curr->port = htons(curr->port); ci_dllist_push(opt_list, &curr->link); } @@ -311,8 +313,8 @@ static void get_env_opt_port_list(ci_uint64* opt, const char* name) } } -static void citp_update_and_crosscheck(ci_netif_config_opts* netif_opts, - citp_opts_t* citp_opts) +static void citp_update_and_crosscheck( + ci_netif_config_opts* netif_opts, citp_opts_t* citp_opts) { /* * ci_netif_config_opts_getenv() is called before @@ -321,14 +323,15 @@ static void citp_update_and_crosscheck(ci_netif_config_opts* netif_opts, * making netifs to inherit flags if the O/S is * being forced to do so */ - if (citp_opts->accept_force_inherit_nonblock) + if( citp_opts->accept_force_inherit_nonblock ) netif_opts->accept_inherit_nonblock = 1; if( citp_opts->ul_epoll == 0 && netif_opts->int_driven == 0 ) { - ci_log("EF_INT_DRIVEN=0 and EF_UL_EPOLL=0 are not compatible. " - "EF_INT_DRIVEN can be set to 0 implicitly, because of non-zero " - "EF_POLL_USEC. If you need both spinning and EF_UL_EPOLL=0, " - "please set EF_INT_DRIVEN=1 explicitly."); + ci_log( + "EF_INT_DRIVEN=0 and EF_UL_EPOLL=0 are not compatible. " + "EF_INT_DRIVEN can be set to 0 implicitly, because of non-zero " + "EF_POLL_USEC. If you need both spinning and EF_UL_EPOLL=0, " + "please set EF_INT_DRIVEN=1 explicitly."); } return; } @@ -341,9 +344,9 @@ static void citp_opts_getenv(citp_opts_t* opts) unsigned v; opts->log_via_ioctl = 3; - GET_ENV_OPT_INT("EF_LOG_VIA_IOCTL", log_via_ioctl); + GET_ENV_OPT_INT("EF_LOG_VIA_IOCTL", log_via_ioctl); - if( (s = getenv("EF_LOG_FILE")) && opts->log_via_ioctl == 3) { + if( (s = getenv("EF_LOG_FILE")) && opts->log_via_ioctl == 3 ) { opts->log_via_ioctl = 0; citp_log_to_file(s); } else if( opts->log_via_ioctl == 3 ) { @@ -356,7 +359,7 @@ static void citp_opts_getenv(citp_opts_t* opts) } if( opts->log_via_ioctl ) { - ci_log_options &=~ CI_LOG_PID; + ci_log_options &= ~CI_LOG_PID; citp_setup_logging_change(citp_log_fn_drv); } else { GET_ENV_OPT_INT("EF_LOG_TIMESTAMPS", log_timestamps); @@ -401,52 +404,53 @@ static void citp_opts_getenv(citp_opts_t* opts) opts->stack_lock_buzz = 1; } - GET_ENV_OPT_HEX("EF_UNIX_LOG", log_level); - GET_ENV_OPT_INT("EF_PROBE", probe); - GET_ENV_OPT_INT("EF_TCP", ul_tcp); - GET_ENV_OPT_INT("EF_UDP", ul_udp); - GET_ENV_OPT_INT("EF_UL_SELECT", ul_select); - GET_ENV_OPT_INT("EF_SELECT_SPIN", ul_select_spin); - GET_ENV_OPT_INT("EF_SELECT_FAST", ul_select_fast); - GET_ENV_OPT_INT("EF_UL_POLL", ul_poll); - GET_ENV_OPT_INT("EF_POLL_SPIN", ul_poll_spin); - GET_ENV_OPT_INT("EF_POLL_FAST", ul_poll_fast); - GET_ENV_OPT_INT("EF_POLL_FAST_USEC", ul_poll_fast_usec); + GET_ENV_OPT_HEX("EF_UNIX_LOG", log_level); + GET_ENV_OPT_INT("EF_PROBE", probe); + GET_ENV_OPT_INT("EF_TCP", ul_tcp); + GET_ENV_OPT_INT("EF_UDP", ul_udp); + GET_ENV_OPT_INT("EF_UL_SELECT", ul_select); + GET_ENV_OPT_INT("EF_SELECT_SPIN", ul_select_spin); + GET_ENV_OPT_INT("EF_SELECT_FAST", ul_select_fast); + GET_ENV_OPT_INT("EF_UL_POLL", ul_poll); + GET_ENV_OPT_INT("EF_POLL_SPIN", ul_poll_spin); + GET_ENV_OPT_INT("EF_POLL_FAST", ul_poll_fast); + GET_ENV_OPT_INT("EF_POLL_FAST_USEC", ul_poll_fast_usec); GET_ENV_OPT_INT("EF_POLL_NONBLOCK_FAST_USEC", ul_poll_nonblock_fast_usec); - GET_ENV_OPT_INT("EF_SELECT_FAST_USEC", ul_select_fast_usec); - GET_ENV_OPT_INT("EF_SELECT_NONBLOCK_FAST_USEC", ul_select_nonblock_fast_usec); - GET_ENV_OPT_INT("EF_UDP_RECV_SPIN", udp_recv_spin); - GET_ENV_OPT_INT("EF_UDP_SEND_SPIN", udp_send_spin); - GET_ENV_OPT_INT("EF_TCP_RECV_SPIN", tcp_recv_spin); - GET_ENV_OPT_INT("EF_TCP_SEND_SPIN", tcp_send_spin); + GET_ENV_OPT_INT("EF_SELECT_FAST_USEC", ul_select_fast_usec); + GET_ENV_OPT_INT( + "EF_SELECT_NONBLOCK_FAST_USEC", ul_select_nonblock_fast_usec); + GET_ENV_OPT_INT("EF_UDP_RECV_SPIN", udp_recv_spin); + GET_ENV_OPT_INT("EF_UDP_SEND_SPIN", udp_send_spin); + GET_ENV_OPT_INT("EF_TCP_RECV_SPIN", tcp_recv_spin); + GET_ENV_OPT_INT("EF_TCP_SEND_SPIN", tcp_send_spin); GET_ENV_OPT_INT("EF_TCP_ACCEPT_SPIN", tcp_accept_spin); - GET_ENV_OPT_INT("EF_TCP_CONNECT_SPIN",tcp_connect_spin); - GET_ENV_OPT_INT("EF_PKT_WAIT_SPIN", pkt_wait_spin); - GET_ENV_OPT_INT("EF_PIPE_RECV_SPIN", pipe_recv_spin); - GET_ENV_OPT_INT("EF_PIPE_SEND_SPIN", pipe_send_spin); - GET_ENV_OPT_INT("EF_PIPE_SIZE", pipe_size); - GET_ENV_OPT_INT("EF_SOCK_LOCK_BUZZ", sock_lock_buzz); + GET_ENV_OPT_INT("EF_TCP_CONNECT_SPIN", tcp_connect_spin); + GET_ENV_OPT_INT("EF_PKT_WAIT_SPIN", pkt_wait_spin); + GET_ENV_OPT_INT("EF_PIPE_RECV_SPIN", pipe_recv_spin); + GET_ENV_OPT_INT("EF_PIPE_SEND_SPIN", pipe_send_spin); + GET_ENV_OPT_INT("EF_PIPE_SIZE", pipe_size); + GET_ENV_OPT_INT("EF_SOCK_LOCK_BUZZ", sock_lock_buzz); GET_ENV_OPT_INT("EF_STACK_LOCK_BUZZ", stack_lock_buzz); GET_ENV_OPT_INT("EF_SO_BUSY_POLL_SPIN", so_busy_poll_spin); - GET_ENV_OPT_INT("EF_UL_EPOLL", ul_epoll); - GET_ENV_OPT_INT("EF_EPOLL_SPIN", ul_epoll_spin); - GET_ENV_OPT_INT("EF_EPOLL_CTL_FAST", ul_epoll_ctl_fast); - GET_ENV_OPT_INT("EF_EPOLL_CTL_HANDOFF",ul_epoll_ctl_handoff); - GET_ENV_OPT_INT("EF_EPOLL_MT_SAFE", ul_epoll_mt_safe); + GET_ENV_OPT_INT("EF_UL_EPOLL", ul_epoll); + GET_ENV_OPT_INT("EF_EPOLL_SPIN", ul_epoll_spin); + GET_ENV_OPT_INT("EF_EPOLL_CTL_FAST", ul_epoll_ctl_fast); + GET_ENV_OPT_INT("EF_EPOLL_CTL_HANDOFF", ul_epoll_ctl_handoff); + GET_ENV_OPT_INT("EF_EPOLL_MT_SAFE", ul_epoll_mt_safe); GET_ENV_OPT_INT("EF_WODA_SINGLE_INTERFACE", woda_single_if); - GET_ENV_OPT_INT("EF_FDTABLE_SIZE", fdtable_size); - GET_ENV_OPT_INT("EF_SPIN_USEC", ul_spin_usec); - GET_ENV_OPT_INT("EF_SLEEP_SPIN_USEC", sleep_spin_usec); - GET_ENV_OPT_INT("EF_STACK_PER_THREAD",stack_per_thread); - GET_ENV_OPT_INT("EF_DONT_ACCELERATE", dont_accelerate); - GET_ENV_OPT_INT("EF_FDTABLE_STRICT", fdtable_strict); - GET_ENV_OPT_INT("EF_FDS_MT_SAFE", fds_mt_safe); - GET_ENV_OPT_INT("EF_NO_FAIL", no_fail); - GET_ENV_OPT_INT("EF_SA_ONSTACK_INTERCEPT", sa_onstack_intercept); - GET_ENV_OPT_INT("EF_ACCEPT_INHERIT_NONBLOCK", accept_force_inherit_nonblock); - GET_ENV_OPT_INT("EF_VFORK_MODE", vfork_mode); - GET_ENV_OPT_INT("EF_PIPE", ul_pipe); - GET_ENV_OPT_INT("EF_SYNC_CPLANE_AT_CREATE", sync_cplane); + GET_ENV_OPT_INT("EF_FDTABLE_SIZE", fdtable_size); + GET_ENV_OPT_INT("EF_SPIN_USEC", ul_spin_usec); + GET_ENV_OPT_INT("EF_SLEEP_SPIN_USEC", sleep_spin_usec); + GET_ENV_OPT_INT("EF_STACK_PER_THREAD", stack_per_thread); + GET_ENV_OPT_INT("EF_DONT_ACCELERATE", dont_accelerate); + GET_ENV_OPT_INT("EF_FDTABLE_STRICT", fdtable_strict); + GET_ENV_OPT_INT("EF_FDS_MT_SAFE", fds_mt_safe); + GET_ENV_OPT_INT("EF_NO_FAIL", no_fail); + GET_ENV_OPT_INT("EF_SA_ONSTACK_INTERCEPT", sa_onstack_intercept); + GET_ENV_OPT_INT("EF_ACCEPT_INHERIT_NONBLOCK", accept_force_inherit_nonblock); + GET_ENV_OPT_INT("EF_VFORK_MODE", vfork_mode); + GET_ENV_OPT_INT("EF_PIPE", ul_pipe); + GET_ENV_OPT_INT("EF_SYNC_CPLANE_AT_CREATE", sync_cplane); if( (s = getenv("EF_FORK_NETIF")) && sscanf(s, "%x", &v) == 1 ) { opts->fork_netif = CI_MIN(v, CI_UNIX_FORK_NETIF_BOTH); @@ -458,7 +462,7 @@ static void citp_opts_getenv(citp_opts_t* opts) if( (s = getenv("EF_SIGNALS_NOPOSTPONE")) ) { opts->signals_no_postpone = 0; while( sscanf(s, "%u", &v) == 1 ) { - opts->signals_no_postpone |= (1ULL << (v-1)); + opts->signals_no_postpone |= (1ULL << (v - 1)); s = strchr(s, ','); if( s == NULL ) break; @@ -466,19 +470,19 @@ static void citp_opts_getenv(citp_opts_t* opts) } } /* SIGONLOAD is used internally, and should not be postponed. */ - opts->signals_no_postpone |= (1ULL << (SIGONLOAD-1)); + opts->signals_no_postpone |= (1ULL << (SIGONLOAD - 1)); if( (s = getenv("EF_CLUSTER_NAME")) ) { strncpy(opts->cluster_name, s, CI_CFG_CLUSTER_NAME_LEN); opts->cluster_name[CI_CFG_CLUSTER_NAME_LEN] = '\0'; - } - else { + } else { opts->cluster_name[0] = '\0'; } - GET_ENV_OPT_INT("EF_CLUSTER_SIZE", cluster_size); + GET_ENV_OPT_INT("EF_CLUSTER_SIZE", cluster_size); if( opts->cluster_size < 0 ) - log("ERROR: invalid cluster_size. cluster_size needs to be 0 or a positive number"); - GET_ENV_OPT_INT("EF_CLUSTER_RESTART", cluster_restart_opt); + log("ERROR: invalid cluster_size. cluster_size needs to be 0 or a " + "positive number"); + GET_ENV_OPT_INT("EF_CLUSTER_RESTART", cluster_restart_opt); GET_ENV_OPT_INT("EF_CLUSTER_HOT_RESTART", cluster_hot_restart_opt); get_env_opt_port_list(&opts->tcp_reuseports, "EF_TCP_FORCE_REUSEPORT"); get_env_opt_port_list(&opts->udp_reuseports, "EF_UDP_FORCE_REUSEPORT"); @@ -487,7 +491,7 @@ static void citp_opts_getenv(citp_opts_t* opts) get_env_opt_port_list(&opts->sock_cache_ports, "EF_SOCKET_CACHE_PORTS"); #endif - GET_ENV_OPT_INT("EF_ONLOAD_FD_BASE", fd_base); + GET_ENV_OPT_INT("EF_ONLOAD_FD_BASE", fd_base); } @@ -498,59 +502,47 @@ static void citp_opts_validate_env(void) #undef CI_CFG_OPTGROUP #undef CI_CFG_OPT -#define CI_CFG_OPT(env, name, type, doc, bits, group, default, minimum, maximum, pres) env, +#define CI_CFG_OPT( \ + env, name, type, doc, bits, group, default, minimum, maximum, pres) \ + env, char* ef_names[] = { #include #include #include - "EF_NAME", - "EF_USERBUILD", - "EF_NO_PRELOAD_RESTORE", - "EF_LD_PRELOAD", - "EF_CLUSTER_NAME", - "EF_LOG_THREAD", - "EF_LOG_FILE", - "EF_VI_TXQ_SIZE", - "EF_VI_RXQ_SIZE", - "EF_VI_EVQ_SIZE", - "EF_VI_CTPIO_WB_TICKS", - "EF_VI_CTPIO_MODE", - "EF_VI_CLUSTER_SOCKET", - "EF_VI_PD_FLAGS", - "EF_VI_LOG_LEVEL", - "EF_VI_EVQ_CLEAR_STRIDE", - "EF_BUILDTREE_UL", - NULL + "EF_NAME", "EF_USERBUILD", "EF_NO_PRELOAD_RESTORE", "EF_LD_PRELOAD", + "EF_CLUSTER_NAME", "EF_LOG_THREAD", "EF_LOG_FILE", "EF_VI_TXQ_SIZE", + "EF_VI_RXQ_SIZE", "EF_VI_EVQ_SIZE", "EF_VI_CTPIO_WB_TICKS", + "EF_VI_CTPIO_MODE", "EF_VI_CLUSTER_SOCKET", "EF_VI_PD_FLAGS", + "EF_VI_LOG_LEVEL", "EF_VI_EVQ_CLEAR_STRIDE", "EF_BUILDTREE_UL", NULL }; char** env_name; int i; int len; char* s; - + s = getenv("EF_VALIDATE_ENV"); if( s ) { char* s_end; long v; v = strtol(s, &s_end, 0); - + if( ! s_end ) ci_log("Invalid option for EF_VALIDATE_ENV: \"%s\"", s); else if( ! v ) return; } - + env_name = environ; while( *env_name != NULL ) { - if( ! strncmp(*env_name, "EF_", 3) ) { - len = strchrnul(*env_name, '=') - *env_name; - for( i = 0; ef_names[i]; ++i ) { + len = strchrnul(*env_name, '=') - *env_name; + for( i = 0; ef_names[i]; ++i ) { if( strlen(ef_names[i]) == len && ! strncmp(ef_names[i], *env_name, len) ) break; } - + if( ! ef_names[i] ) ci_log("Unknown option \"%s\" identified", *env_name); } @@ -559,16 +551,14 @@ static void citp_opts_validate_env(void) } -static int -citp_cfg_init(void) +static int citp_cfg_init(void) { ci_cfg_query(); return 0; } -static int -citp_transport_init(void) +static int citp_transport_init(void) { const char* s; @@ -591,14 +581,13 @@ citp_transport_init(void) citp_oo_get_cpu_khz(&citp.cpu_khz); citp.spin_cycles = citp_usec_to_cycles64(CITP_OPTS.ul_spin_usec); - citp.poll_nonblock_fast_cycles = - citp_usec_to_cycles64(CITP_OPTS.ul_poll_nonblock_fast_usec); - citp.poll_fast_cycles = - citp_usec_to_cycles64(CITP_OPTS.ul_poll_fast_usec); - citp.select_nonblock_fast_cycles = - citp_usec_to_cycles64(CITP_OPTS.ul_select_nonblock_fast_usec); - citp.select_fast_cycles = - citp_usec_to_cycles64(CITP_OPTS.ul_select_fast_usec); + citp.poll_nonblock_fast_cycles = + citp_usec_to_cycles64(CITP_OPTS.ul_poll_nonblock_fast_usec); + citp.poll_fast_cycles = citp_usec_to_cycles64(CITP_OPTS.ul_poll_fast_usec); + citp.select_nonblock_fast_cycles = + citp_usec_to_cycles64(CITP_OPTS.ul_select_nonblock_fast_usec); + citp.select_fast_cycles = + citp_usec_to_cycles64(CITP_OPTS.ul_select_fast_usec); ci_tp_init(__oo_per_thread_init_thread, oo_signal_terminate); citp_update_and_crosscheck(&ci_cfg_opts.netif_opts, &CITP_OPTS); @@ -619,8 +608,7 @@ static int citp_transport_register(void) int _citp_do_init_inprogress = 0; typedef int (*cipt_init_func_t)(void); -cipt_init_func_t cipt_init_funcs[] = -{ +cipt_init_func_t cipt_init_funcs[] = { #define STARTUP_ITEM(level, func) func, #include "startup_order.h" #undef STARTUP_ITEM @@ -633,21 +621,20 @@ int citp_do_init(int max_init_level) int saved_errno = errno; if( citp.init_level < max_init_level ) { - /* If threads are launched very early in program startup, then there could be - * a race here as multiple threads attempt to initialise on first access. - * The guard must be recursive, since this function might be re-entered during - * initialisation. + /* If threads are launched very early in program startup, then there could + * be a race here as multiple threads attempt to initialise on first + * access. The guard must be recursive, since this function might be + * re-entered during initialisation. */ static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; pthread_mutex_lock(&mutex); _citp_do_init_inprogress++; - for (level = citp.init_level; - level < CI_MIN(max_init_level, CITP_INIT_MAX); - level++) { + for( level = citp.init_level; + level < CI_MIN(max_init_level, CITP_INIT_MAX); level++ ) { rc = cipt_init_funcs[level](); - if (rc < 0) + if( rc < 0 ) break; citp.init_level = level + 1; } @@ -663,14 +650,15 @@ int citp_do_init(int max_init_level) void _init(void) { - if (getpagesize() != CI_PAGE_SIZE) - ci_fail(("Page size mismatch, expected %u, " - "but the current value is %u", - CI_PAGE_SIZE, getpagesize())); + if( getpagesize() != CI_PAGE_SIZE ) + ci_fail( + ("Page size mismatch, expected %u, " + "but the current value is %u", + CI_PAGE_SIZE, getpagesize())); /* must not do any logging yet... */ if( citp_do_init(CITP_INIT_MAX) < 0 ) ci_fail(("EtherFabric transport library: failed to initialise (%d)", - citp.init_level)); + citp.init_level)); Log_S(log("citp: initialisation done.")); } @@ -683,7 +671,6 @@ void _fini(void) } - /* We can't use variables from onload_version_msg(), because strlen() * is not available when the library is run as an executable. * And even a simple function like `local_strlen()` results in calling @@ -694,15 +681,18 @@ void _fini(void) Ensure that no libc() functions are used */ void onload_version_msg(void) { - const char *msg = ONLOAD_PRODUCT" "ONLOAD_VERSION"\n"ONLOAD_COPYRIGHT"\n" - "Built: "__DATE__" "__TIME__" " + const char* msg = ONLOAD_PRODUCT + " " ONLOAD_VERSION "\n" ONLOAD_COPYRIGHT + "\n" + "Built: "__DATE__ + " "__TIME__ + " " #ifdef NDEBUG - "(release)" + "(release)" #else - "(debug)" + "(debug)" #endif - "\nBuild profile header: " - OO_STRINGIFY(TRANSPORT_CONFIG_OPT_HDR) "\n"; + "\nBuild profile header: " OO_STRINGIFY(TRANSPORT_CONFIG_OPT_HDR) "\n"; my_syscall3(write, STDOUT_FILENO, (long) msg, strlen(msg)); my_syscall3(exit, 0, 0, 0); diff --git a/src/lib/transport/unix/udp_fd.c b/src/lib/transport/unix/udp_fd.c index a69c82ad7..25785e3a9 100644 --- a/src/lib/transport/unix/udp_fd.c +++ b/src/lib/transport/unix/udp_fd.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* X-SPDX-Copyright-Text: (c) Copyright 2004-2020 Xilinx, Inc. */ /**************************************************************************\ -*//*! \file + *//*! \file ** ** \author djr/ctk/stg ** \brief Sockets interface to user level UDP @@ -25,10 +25,10 @@ #define VERB(x) Log_VTC(x) -#define LPF "citp_udp_" +#define LPF "citp_udp_" #ifndef MSG_CONFIRM -#define MSG_CONFIRM 0 /* so we never see it in our flags */ +#define MSG_CONFIRM 0 /* so we never see it in our flags */ #endif @@ -37,35 +37,35 @@ */ #ifndef NDEBUG -ci_inline char * __decode_flags(int fl) +ci_inline char* __decode_flags(int fl) { static char buf[32]; - char * t = buf; + char* t = buf; size_t n = sizeof(buf); *buf = 0; - if( fl & MSG_OOB) { + if( fl & MSG_OOB ) { t += snprintf(t, n, "OOB "); n = t - buf; } - if( fl & MSG_PEEK) { + if( fl & MSG_PEEK ) { t += snprintf(t, n, "PEEK "); n = t - buf; } - if( fl & MSG_NOSIGNAL) { + if( fl & MSG_NOSIGNAL ) { t += snprintf(t, n, "NSIG "); n = t - buf; } - if( fl & MSG_TRUNC) { + if( fl & MSG_TRUNC ) { t += snprintf(t, n, "TRNC "); n = t - buf; } - if( fl & MSG_DONTWAIT) { + if( fl & MSG_DONTWAIT ) { t += snprintf(t, n, "NWT "); n = t - buf; } - if( fl & MSG_WAITALL) { + if( fl & MSG_WAITALL ) { t += snprintf(t, n, "WALL "); n = t - buf; } @@ -86,7 +86,7 @@ static int citp_udp_socket(int domain, int type, int protocol) ci_netif* ni; int /*bool*/ orderly_handover = CI_FALSE; - Log_V(log(LPF "socket(%d, %d, %d)", domain, type, protocol)); + LOG_UC(log(LPF "socket(%d, %d, %d)", domain, type, protocol)); epi = CI_ALLOC_OBJ(citp_sock_fdi); if( ! epi ) { @@ -108,17 +108,20 @@ static int citp_udp_socket(int domain, int type, int protocol) } /* Protect the fdtable entry until we're done initialising. */ - if( fdtable_strict() ) CITP_FDTABLE_LOCK(); - if((fd = ci_udp_ep_ctor(&epi->sock, ni, domain, type)) < 0) { + if( fdtable_strict() ) + CITP_FDTABLE_LOCK(); + if( (fd = ci_udp_ep_ctor(&epi->sock, ni, domain, type)) < 0 ) { /*! ?? \TODO unpick the ci_udp_ep_ctor according to how failed */ - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); Log_U(ci_log(LPF "socket: udp_ep_ctor failed")); errno = -fd; goto fail3; } citp_fdtable_new_fd_set(fd, fdip_busy, fdtable_strict()); - if( fdtable_strict() ) CITP_FDTABLE_UNLOCK(); + if( fdtable_strict() ) + CITP_FDTABLE_UNLOCK(); CI_DEBUG(epi->sock.s->pid = getpid()); @@ -127,23 +130,23 @@ static int citp_udp_socket(int domain, int type, int protocol) ci_atomic32_and(&epi->sock.s->b.sb_aflags, ~CI_SB_AFLAG_NOT_READY); citp_fdtable_insert(fdi, fd, 0); - Log_VSS(log(LPF "socket(%d, %d, %d) = "EF_FMT, domain, type, protocol, - EF_PRI_ARGS(epi,fd))); + Log_VSS(log(LPF "socket(%d, %d, %d) = " EF_FMT, domain, type, protocol, + EF_PRI_ARGS(epi, fd))); return fd; - fail3: +fail3: if( (CITP_OPTS.no_fail || orderly_handover) && errno != ELIBACC ) CITP_STATS_NETIF(++ni->state->stats.udp_handover_socket); citp_netif_release_ref(ni, 0); - fail2: +fail2: CI_FREE_OBJ(epi); - fail1: +fail1: /* BUG1408: Graceful failure. We'll only fail outright if there's a * driver/library mismatch */ if( (CITP_OPTS.no_fail || orderly_handover) && errno != ELIBACC ) { if( ! orderly_handover ) - Log_U(ci_log("%s: failed (errno:%d) - PASSING TO OS", __FUNCTION__, - errno)); + Log_U(ci_log( + "%s: failed (errno:%d) - PASSING TO OS", __FUNCTION__, errno)); return CI_SOCKET_HANDOVER; } return -1; @@ -156,10 +159,10 @@ static void citp_udp_dtor(citp_fdinfo* fdinfo, int fdt_locked) } -static int citp_udp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, - socklen_t sa_len) +static int citp_udp_bind( + citp_fdinfo* fdinfo, const struct sockaddr* sa, socklen_t sa_len) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); citp_socket* ep = &epi->sock; ci_sock_cmn* s = ep->s; ci_uint16 lport; @@ -169,11 +172,11 @@ static int citp_udp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, if( sa != NULL ) Log_V(log("%s: Bind to port = %d", __FUNCTION__, - ntohs(((struct sockaddr_in*)sa)->sin_port))); + ntohs(((struct sockaddr_in*) sa)->sin_port))); /* There should be address length check before address family validation to * match Linux errno value set in inet6_bind(). */ - if (s->domain == PF_INET6 && sa_len < SIN6_LEN_RFC2133) { + if( s->domain == PF_INET6 && sa_len < SIN6_LEN_RFC2133 ) { CI_SET_ERROR(rc, EINVAL); goto done; } @@ -204,16 +207,15 @@ static int citp_udp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, #if CI_CFG_ENDPOINT_MOVE /* multicast sockets do not do clustering */ - if( (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0 && - CI_SOCK_NOT_BOUND(s) && + if( (s->s_flags & CI_SOCK_FLAG_REUSEPORT) != 0 && CI_SOCK_NOT_BOUND(s) && ! CI_IPX_IS_MULTICAST(ci_get_addr(sa)) ) { - if( (rc = ci_udp_reuseport_bind(ep, fdinfo->fd, sa, sa_len, lport)) == 0 ) { + if( (rc = ci_udp_reuseport_bind(ep, fdinfo->fd, sa, sa_len, lport)) == + 0 ) { /* The socket has moved so need to reprobe the fd. This will also * map the the new stack into user space of the executing process. */ - fdinfo = citp_reprobe_moved(fdinfo, - CI_FALSE/* ! from_fast_lookup */, - CI_FALSE/* ! fdip_is_busy */); + fdinfo = citp_reprobe_moved(fdinfo, CI_FALSE /* ! from_fast_lookup */, + CI_FALSE /* ! fdip_is_busy */); /* We want to prefault the packets for the new clustered stack. This * is only needed if we successfully reprobed a valid fd. This might * not happen if the fd has been closed or re-used under our feet. @@ -227,13 +229,11 @@ static int citp_udp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, ep = &epi->sock; UDP_SET_FLAG(SOCK_TO_UDP(ep->s), CI_UDPF_FILTERED); ci_netif_cluster_prefault(ep->netif); - } - else { + } else { CI_SET_ERROR(rc, EBADF); goto done; } - } - else { + } else { goto done; } } @@ -243,27 +243,35 @@ static int citp_udp_bind(citp_fdinfo* fdinfo, const struct sockaddr* sa, rc = ci_udp_bind_conclude(ep, sa, sa_len, lport); ci_netif_unlock_fdi(epi); - done: + // This will happen when we try to set userland filters that have already + // been set We currently don't support that so we have to return that the + // Address is in use regardless of any flags set on the socket + if( rc == CI_SOCKET_ERROR ) { + errno = EADDRINUSE; + } + +done: if( rc == CI_SOCKET_HANDOVER ) { CITP_STATS_NETIF(++epi->sock.netif->state->stats.udp_handover_bind); citp_fdinfo_handover(fdinfo, -1); return 0; } - if( fdinfo ) - citp_fdinfo_release_ref( fdinfo, 0 ); + if( fdinfo ) { + citp_fdinfo_release_ref(fdinfo, 0); + } + return rc; } -static int citp_udp_connect(citp_fdinfo* fdinfo, - const struct sockaddr* sa, socklen_t sa_len, - citp_lib_context_t* lib_context) +static int citp_udp_connect(citp_fdinfo* fdinfo, const struct sockaddr* sa, + socklen_t sa_len, citp_lib_context_t* lib_context) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); int rc; - Log_V(log(LPF "connect(%d, sa, %d)", fdinfo->fd, sa_len)); + LOG_UC(log(LPF "connect(%d, sa, %d)", fdinfo->fd, sa_len)); ci_netif_lock_fdi(epi); rc = ci_udp_connect(&epi->sock, fdinfo->fd, sa, sa_len); @@ -275,45 +283,46 @@ static int citp_udp_connect(citp_fdinfo* fdinfo, return 0; } - citp_fdinfo_release_ref( fdinfo, 0 ); + citp_fdinfo_release_ref(fdinfo, 0); return rc; } static int citp_udp_shutdown(citp_fdinfo* fdinfo, int how) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); int rc; - Log_V(ci_log("%s("EF_FMT", %d)", __FUNCTION__, EF_PRI_ARGS(epi,fdinfo->fd), how)); + LOG_UC(ci_log( + "%s(" EF_FMT ", %d)", __FUNCTION__, EF_PRI_ARGS(epi, fdinfo->fd), how)); ci_netif_lock_fdi(epi); rc = ci_udp_shutdown(&epi->sock, fdinfo->fd, how); ci_netif_unlock_fdi(epi); - Log_V(log(LPF "shutdown: fd=%d rc=%d", fdinfo->fd, rc)); + LOG_UC(log(LPF "shutdown: fd=%d rc=%d", fdinfo->fd, rc)); return rc; } -static int citp_udp_getsockname(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len) +static int citp_udp_getsockname( + citp_fdinfo* fdinfo, struct sockaddr* sa, socklen_t* p_sa_len) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); - Log_VSC(log(LPF "getsockname("EF_FMT")", EF_PRI_ARGS(epi, fdinfo->fd))); + Log_VSC(log(LPF "getsockname(" EF_FMT ")", EF_PRI_ARGS(epi, fdinfo->fd))); __citp_getsockname(epi->sock.s, sa, p_sa_len); return 0; } -static int citp_udp_getpeername(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len) +static int citp_udp_getpeername( + citp_fdinfo* fdinfo, struct sockaddr* sa, socklen_t* p_sa_len) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); int rc; - Log_V(log("%s("EF_FMT")", __FUNCTION__, EF_PRI_ARGS(epi,fdinfo->fd))); + Log_V(log("%s(" EF_FMT ")", __FUNCTION__, EF_PRI_ARGS(epi, fdinfo->fd))); ci_netif_lock_fdi(epi); rc = ci_udp_getpeername(&epi->sock, sa, p_sa_len); @@ -322,33 +331,33 @@ static int citp_udp_getpeername(citp_fdinfo* fdinfo, } -static int citp_udp_getsockopt(citp_fdinfo* fdinfo, int level, - int optname, void* optval, socklen_t* optlen) +static int citp_udp_getsockopt(citp_fdinfo* fdinfo, int level, int optname, + void* optval, socklen_t* optlen) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); int rc; - Log_V(log("%s("EF_FMT", %d, %d)", __FUNCTION__, EF_PRI_ARGS(epi,fdinfo->fd), - level, optname )); + LOG_UC(log("%s(" EF_FMT ", %d, %d)", __FUNCTION__, + EF_PRI_ARGS(epi, fdinfo->fd), level, optname)); ci_netif_lock_fdi(epi); - rc = ci_udp_getsockopt(&epi->sock, fdinfo->fd, - level, optname, optval, optlen); + rc = ci_udp_getsockopt( + &epi->sock, fdinfo->fd, level, optname, optval, optlen); ci_netif_unlock_fdi(epi); return rc; } -static int citp_udp_setsockopt(citp_fdinfo* fdinfo, int level, - int optname, const void* optval, socklen_t optlen) +static int citp_udp_setsockopt(citp_fdinfo* fdinfo, int level, int optname, + const void* optval, socklen_t optlen) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); - citp_socket* ep = &epi->sock; - ci_sock_cmn* s = ep->s; + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); + citp_socket* ep = &epi->sock; + ci_sock_cmn* s = ep->s; int rc; - Log_VSC(log("%s("EF_FMT", %d, %d)", __FUNCTION__, - EF_PRI_ARGS(epi, fdinfo->fd), level, optname)); + LOG_UC(log("%s(" EF_FMT ", %d, %d)", __FUNCTION__, + EF_PRI_ARGS(epi, fdinfo->fd), level, optname)); if( ci_opt_is_setting_reuseport(level, optname, optval, optlen) != 0 && ! CI_SOCK_NOT_BOUND(s) ) { @@ -356,15 +365,15 @@ static int citp_udp_setsockopt(citp_fdinfo* fdinfo, int level, CITP_STATS_NETIF(++epi->sock.netif->state->stats.udp_handover_setsockopt); citp_fdinfo_handover(fdinfo, -1); NI_LOG(epi->sock.netif, USAGE_WARNINGS, - "%s: setting reuseport after binding on udp not supported", - __FUNCTION__); + "%s: setting reuseport after binding on udp not supported", + __FUNCTION__); return ci_sys_setsockopt(fd, level, optname, optval, optlen); } - rc = ci_udp_setsockopt(&epi->sock, fdinfo->fd, - level, optname, optval, optlen); + rc = ci_udp_setsockopt( + &epi->sock, fdinfo->fd, level, optname, optval, optlen); - Log_V(log(LPF "setsockopt: fd=%d rc=%d", fdinfo->fd, rc)); + LOG_UC(log(LPF "setsockopt: fd=%d rc=%d", fdinfo->fd, rc)); if( rc == CI_SOCKET_HANDOVER ) { CITP_STATS_NETIF(++epi->sock.netif->state->stats.udp_handover_setsockopt); @@ -376,15 +385,14 @@ static int citp_udp_setsockopt(citp_fdinfo* fdinfo, int level, return rc; } -static int citp_udp_recvmmsg(citp_fdinfo* fdinfo, struct mmsghdr* msg, - unsigned vlen, int flags, - ci_recvmmsg_timespec* timeout) +static int citp_udp_recvmmsg(citp_fdinfo* fdinfo, struct mmsghdr* msg, + unsigned vlen, int flags, ci_recvmmsg_timespec* timeout) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); ci_udp_iomsg_args a; - Log_V(log(LPF "recvmmsg(%d, msg, %u, %#x)", fdinfo->fd, vlen, - (unsigned) flags)); + Log_V(log( + LPF "recvmmsg(%d, msg, %u, %#x)", fdinfo->fd, vlen, (unsigned) flags)); a.fd = fdinfo->fd; a.ep = &epi->sock; @@ -406,14 +414,14 @@ static int citp_udp_recv(citp_fdinfo* fdinfo, struct msghdr* msg, int flags) a.ni = epi->sock.netif; a.us = SOCK_TO_UDP(epi->sock.s); - return ci_udp_recvmsg( &a, msg, flags); + return ci_udp_recvmsg(&a, msg, flags); } -static int citp_udp_send(citp_fdinfo* fdinfo, const struct msghdr * msg, - int flags) +static int citp_udp_send( + citp_fdinfo* fdinfo, const struct msghdr* msg, int flags) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); ci_udp_iomsg_args a; int rc; @@ -425,10 +433,9 @@ static int citp_udp_send(citp_fdinfo* fdinfo, const struct msghdr * msg, a.us = SOCK_TO_UDP(epi->sock.s); /* NB. msg_name[len] validated in ci_udp_sendmsg(). */ - if(CI_LIKELY( msg->msg_iov != NULL || msg->msg_iovlen == 0 )) { - rc = ci_udp_sendmsg( &a, msg, flags); - } - else { + if( CI_LIKELY(msg->msg_iov != NULL || msg->msg_iovlen == 0) ) { + rc = ci_udp_sendmsg(&a, msg, flags); + } else { rc = -1; errno = EFAULT; } @@ -436,17 +443,17 @@ static int citp_udp_send(citp_fdinfo* fdinfo, const struct msghdr * msg, } -static int citp_udp_sendmmsg(citp_fdinfo* fdinfo, struct mmsghdr* mmsg, - unsigned vlen, int flags) +static int citp_udp_sendmmsg( + citp_fdinfo* fdinfo, struct mmsghdr* mmsg, unsigned vlen, int flags) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); ci_udp_iomsg_args a; int i, rc; - Log_V(log(LPF "sendmmsg(%d, msg, %u, %#x)", fdinfo->fd, vlen, - (unsigned) flags)); + Log_V(log( + LPF "sendmmsg(%d, msg, %u, %#x)", fdinfo->fd, vlen, (unsigned) flags)); - if( vlen == 0 ) + if( vlen == 0 ) return 0; a.ep = &epi->sock; @@ -458,31 +465,30 @@ static int citp_udp_sendmmsg(citp_fdinfo* fdinfo, struct mmsghdr* mmsg, do { rc = ci_udp_sendmsg(&a, &mmsg[i].msg_hdr, flags); - if(CI_LIKELY( rc >= 0 ) ) + if( CI_LIKELY(rc >= 0) ) mmsg[i].msg_len = rc; ++i; } while( rc >= 0 && i < vlen ); - return (rc>=0) ? i : rc; + return (rc >= 0) ? i : rc; } static int citp_udp_fcntl(citp_fdinfo* fdinfo, int cmd, long arg) { - return citp_sock_fcntl(fdi_to_sock_fdi(fdinfo), - fdinfo->fd, cmd, arg); + return citp_sock_fcntl(fdi_to_sock_fdi(fdinfo), fdinfo->fd, cmd, arg); } static int citp_udp_ioctl(citp_fdinfo* fdinfo, int request, void* arg) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdinfo); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdinfo); int rc; - Log_V(log("%s("EF_FMT", %d, 0x%lx)", __FUNCTION__, - EF_PRI_ARGS(epi, fdinfo->fd), request, (long) arg)); + Log_U(log("%s(" EF_FMT ", %d, 0x%lx)", __FUNCTION__, + EF_PRI_ARGS(epi, fdinfo->fd), request, (long) arg)); rc = ci_udp_ioctl(&epi->sock, fdinfo->fd, request, arg); - Log_V(log(LPF "ioctl()=%d", rc)); + Log_U(log(LPF "ioctl()=%d", rc)); if( rc < 0 ) CI_SET_ERROR(rc, -rc); return rc; @@ -490,7 +496,7 @@ static int citp_udp_ioctl(citp_fdinfo* fdinfo, int request, void* arg) static int citp_udp_select(citp_fdinfo* fdi, int* n, int rd, int wr, int ex, - struct oo_ul_select_state*__restrict__ ss) + struct oo_ul_select_state* __restrict__ ss) { citp_sock_fdi* epi; ci_udp_state* us; @@ -530,11 +536,10 @@ static int citp_udp_select(citp_fdinfo* fdi, int* n, int rd, int wr, int ex, } -static int citp_udp_poll(citp_fdinfo*__restrict__ fdi, - struct pollfd*__restrict__ pfd, - struct oo_ul_poll_state*__restrict__ ps) +static int citp_udp_poll(citp_fdinfo* __restrict__ fdi, + struct pollfd* __restrict__ pfd, struct oo_ul_poll_state* __restrict__ ps) { - citp_sock_fdi *epi = fdi_to_sock_fdi(fdi); + citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); ci_udp_state* us = SOCK_TO_UDP(epi->sock.s); ci_netif* ni = epi->sock.netif; unsigned mask; @@ -555,13 +560,11 @@ static int citp_udp_poll(citp_fdinfo*__restrict__ fdi, } - #include "ul_epoll.h" /* More-or-less copy of citp_udp_poll */ -static int citp_udp_epoll(citp_fdinfo*__restrict__ fdi, - struct citp_epoll_member*__restrict__ eitem, - struct oo_ul_epoll_state*__restrict__ eps, - int* stored_event) +static int citp_udp_epoll(citp_fdinfo* __restrict__ fdi, + struct citp_epoll_member* __restrict__ eitem, + struct oo_ul_epoll_state* __restrict__ eps, int* stored_event) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); ci_udp_state* us = SOCK_TO_UDP(epi->sock.s); @@ -580,21 +583,19 @@ static int citp_udp_epoll(citp_fdinfo*__restrict__ fdi, /* Try to return a result without polling if we can. */ sleep_seq = us->s.b.sleep_seq.all; mask = ci_udp_poll_events(ni, us); - *stored_event = citp_ul_epoll_set_ul_events(eps, eitem, mask, sleep_seq, - &us->s.b.sleep_seq.all, - &seq_mismatch); - if( (*stored_event == 0) && !eps->ordering_info ) + *stored_event = citp_ul_epoll_set_ul_events( + eps, eitem, mask, sleep_seq, &us->s.b.sleep_seq.all, &seq_mismatch); + if( (*stored_event == 0) && ! eps->ordering_info ) if( citp_poll_if_needed(ni, eps->this_poll_frc, eps->ul_epoll_spin) ) { sleep_seq = us->s.b.sleep_seq.all; mask = ci_udp_poll_events(ni, us); seq_mismatch = 0; - *stored_event = citp_ul_epoll_set_ul_events(eps, eitem, mask, sleep_seq, - &us->s.b.sleep_seq.all, - &seq_mismatch); + *stored_event = citp_ul_epoll_set_ul_events( + eps, eitem, mask, sleep_seq, &us->s.b.sleep_seq.all, &seq_mismatch); } /* We shouldn't have stored an event if there was a mismatch */ - ci_assert( !(seq_mismatch == 1 && *stored_event == 1) ); + ci_assert(! (seq_mismatch == 1 && *stored_event == 1)); return seq_mismatch; } @@ -602,22 +603,20 @@ static int citp_udp_epoll(citp_fdinfo*__restrict__ fdi, static int citp_udp_listen(citp_fdinfo* fdinfo, int backlog) { Log_V(log(LPF "listen: not supported by dg protocol")); - citp_fdinfo_release_ref( fdinfo, 0 ); - RET_WITH_ERRNO( EOPNOTSUPP ); + citp_fdinfo_release_ref(fdinfo, 0); + RET_WITH_ERRNO(EOPNOTSUPP); } -static int citp_udp_accept(citp_fdinfo* fdinfo, - struct sockaddr* sa, socklen_t* p_sa_len, - int flags, - citp_lib_context_t* lib_context) +static int citp_udp_accept(citp_fdinfo* fdinfo, struct sockaddr* sa, + socklen_t* p_sa_len, int flags, citp_lib_context_t* lib_context) { Log_V(log(LPF "accept: not supported by dg protocol")); - RET_WITH_ERRNO( EOPNOTSUPP ); + RET_WITH_ERRNO(EOPNOTSUPP); } -static int citp_udp_zc_send(citp_fdinfo* fdi, struct onload_zc_mmsg* msg, - int flags) +static int citp_udp_zc_send( + citp_fdinfo* fdi, struct onload_zc_mmsg* msg, int flags) { msg->rc = -EOPNOTSUPP; return 1; @@ -629,7 +628,7 @@ static int citp_udp_zc_recv(citp_fdinfo* fdi, struct onload_zc_recv_args* args) citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); ci_udp_iomsg_args a; - if( args->flags & ~ONLOAD_ZC_RECV_FLAGS_MASK ) + if( args->flags & ~ONLOAD_ZC_RECV_FLAGS_MASK ) return -EINVAL; a.fd = fdi->fd; @@ -642,8 +641,7 @@ static int citp_udp_zc_recv(citp_fdinfo* fdi, struct onload_zc_recv_args* args) static int citp_udp_zc_recv_filter(citp_fdinfo* fdi, - onload_zc_recv_filter_callback filter, - void* cb_arg, int flags) + onload_zc_recv_filter_callback filter, void* cb_arg, int flags) { #if CI_CFG_ZC_RECV_FILTER citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); @@ -652,8 +650,8 @@ static int citp_udp_zc_recv_filter(citp_fdinfo* fdi, /* flags not yet used */ ci_assert_equal(flags, 0); - us->recv_q_filter = (ci_uintptr_t)filter; - us->recv_q_filter_arg = (ci_uintptr_t)cb_arg; + us->recv_q_filter = (ci_uintptr_t) filter; + us->recv_q_filter_arg = (ci_uintptr_t) cb_arg; return 0; #else return -ENOSYS; @@ -661,28 +659,26 @@ static int citp_udp_zc_recv_filter(citp_fdinfo* fdi, } -static int citp_udp_recvmsg_kernel(citp_fdinfo* fdi, struct msghdr* msg, - int flags) +static int citp_udp_recvmsg_kernel( + citp_fdinfo* fdi, struct msghdr* msg, int flags) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); - return ci_udp_recvmsg_kernel(fdi->fd, epi->sock.netif, - SOCK_TO_UDP(epi->sock.s), - msg, flags); + return ci_udp_recvmsg_kernel( + fdi->fd, epi->sock.netif, SOCK_TO_UDP(epi->sock.s), msg, flags); } int citp_udp_tmpl_alloc(citp_fdinfo* fdi, const struct iovec* initial_msg, - int mlen, struct oo_msg_template** omt_pp, - unsigned flags) + int mlen, struct oo_msg_template** omt_pp, unsigned flags) { return -EOPNOTSUPP; } int citp_udp_tmpl_update(citp_fdinfo* fdi, struct oo_msg_template* omt, - const struct onload_template_msg_update_iovec* updates, - int ulen, unsigned flags) + const struct onload_template_msg_update_iovec* updates, int ulen, + unsigned flags) { return -EOPNOTSUPP; } @@ -695,9 +691,8 @@ int citp_udp_tmpl_abort(citp_fdinfo* fdi, struct oo_msg_template* omt) #if CI_CFG_TIMESTAMPING -static int -citp_udp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, - struct timespec* next_out, int* bytes_out) +static int citp_udp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, + struct timespec* next_out, int* bytes_out) { citp_sock_fdi* epi = fdi_to_sock_fdi(fdi); ci_udp_state* us = SOCK_TO_UDP(epi->sock.s); @@ -710,72 +705,68 @@ citp_udp_ordered_data(citp_fdinfo* fdi, struct timespec* limit, if( (pkt = ci_udp_recv_q_get(epi->sock.netif, &us->recv_q)) == NULL ) { ci_sock_unlock(epi->sock.netif, &us->s.b); return 0; - } + } do { struct timespec stamp; - ci_rx_pkt_timespec(pkt, &stamp, - NI_OPTS(epi->sock.netif).rx_timestamping_ordering); + ci_rx_pkt_timespec( + pkt, &stamp, NI_OPTS(epi->sock.netif).rx_timestamping_ordering); if( citp_timespec_compare(&stamp, limit) < 1 ) { /* We have data before the limit, add on the number of readable bytes. */ *bytes_out += pkt->pf.udp.pay_len; - } - else { + } else { /* We have more data, but it's after the limit. Set the next data * limit here, and stop. */ *next_out = stamp; break; } - } - while( (pkt = ci_udp_recv_q_next(epi->sock.netif, pkt)) != NULL ); + } while( (pkt = ci_udp_recv_q_next(epi->sock.netif, pkt)) != NULL ); ci_sock_unlock(epi->sock.netif, &us->s.b); return 1; } #endif -citp_protocol_impl citp_udp_protocol_impl = { - .type = CITP_UDP_SOCKET, - .ops = { - .socket = citp_udp_socket, - .dtor = citp_udp_dtor, - .dup = citp_tcp_dup, - .bind = citp_udp_bind, - .listen = citp_udp_listen, - .accept = citp_udp_accept, - .connect = citp_udp_connect, - .shutdown = citp_udp_shutdown, - .getsockname = citp_udp_getsockname, - .getpeername = citp_udp_getpeername, - .getsockopt = citp_udp_getsockopt, - .setsockopt = citp_udp_setsockopt, - .recv = citp_udp_recv, - .recvmmsg = citp_udp_recvmmsg, - .send = citp_udp_send, - .sendmmsg = citp_udp_sendmmsg, - .fcntl = citp_udp_fcntl, - .ioctl = citp_udp_ioctl, - .select = citp_udp_select, - .poll = citp_udp_poll, - .epoll = citp_udp_epoll, - .sleep_seq = citp_sock_sleep_seq, - .zc_send = citp_udp_zc_send, - .zc_recv = citp_udp_zc_recv, - .zc_recv_filter = citp_udp_zc_recv_filter, - .recvmsg_kernel = citp_udp_recvmsg_kernel, - .tmpl_alloc = citp_udp_tmpl_alloc, - .tmpl_update = citp_udp_tmpl_update, - .tmpl_abort = citp_udp_tmpl_abort, +citp_protocol_impl citp_udp_protocol_impl = { .type = CITP_UDP_SOCKET, + .ops = { + .socket = citp_udp_socket, + .dtor = citp_udp_dtor, + .dup = citp_tcp_dup, + .bind = citp_udp_bind, + .listen = citp_udp_listen, + .accept = citp_udp_accept, + .connect = citp_udp_connect, + .shutdown = citp_udp_shutdown, + .getsockname = citp_udp_getsockname, + .getpeername = citp_udp_getpeername, + .getsockopt = citp_udp_getsockopt, + .setsockopt = citp_udp_setsockopt, + .recv = citp_udp_recv, + .recvmmsg = citp_udp_recvmmsg, + .send = citp_udp_send, + .sendmmsg = citp_udp_sendmmsg, + .fcntl = citp_udp_fcntl, + .ioctl = citp_udp_ioctl, + .select = citp_udp_select, + .poll = citp_udp_poll, + .epoll = citp_udp_epoll, + .sleep_seq = citp_sock_sleep_seq, + .zc_send = citp_udp_zc_send, + .zc_recv = citp_udp_zc_recv, + .zc_recv_filter = citp_udp_zc_recv_filter, + .recvmsg_kernel = citp_udp_recvmsg_kernel, + .tmpl_alloc = citp_udp_tmpl_alloc, + .tmpl_update = citp_udp_tmpl_update, + .tmpl_abort = citp_udp_tmpl_abort, #if CI_CFG_TIMESTAMPING - .ordered_data = citp_udp_ordered_data, + .ordered_data = citp_udp_ordered_data, #endif - .is_spinning = citp_sock_is_spinning, + .is_spinning = citp_sock_is_spinning, #if CI_CFG_FD_CACHING - .cache = citp_nonsock_cache, + .cache = citp_nonsock_cache, #endif - } -}; + } }; /*! \cidoxg_end */ diff --git a/src/tests/ef_vi/mmake.mk b/src/tests/ef_vi/mmake.mk index 17f3d6e37..abb228d09 100644 --- a/src/tests/ef_vi/mmake.mk +++ b/src/tests/ef_vi/mmake.mk @@ -13,12 +13,10 @@ endif TARGETS := $(TEST_APPS:%=$(AppPattern)) -MMAKE_LIBS := $(LINK_CIUL_LIB) $(LINK_CIAPP_LIB) +MMAKE_LIBS := $(LINK_CIUL_LIB) $(LINK_CIAPP_LIB) $(DEFAULT_DPDK) MMAKE_LIB_DEPS := $(CIUL_LIB_DEPEND) $(CIAPP_LIB_DEPEND) -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs - +MMAKE_INCLUDE += -I$(RTE_SDK)/build/install/include all: $(TARGETS) diff --git a/src/tests/rtt/mmake.mk b/src/tests/rtt/mmake.mk index 1ff2de062..82c805310 100644 --- a/src/tests/rtt/mmake.mk +++ b/src/tests/rtt/mmake.mk @@ -11,11 +11,7 @@ clean: @$(MakeClean) -MMAKE_LIBS := $(LINK_CIAPP_LIB) $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) +MMAKE_LIBS := $(LINK_CIAPP_LIB) $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) $(DEFAULT_DPDK) MMAKE_LIB_DEPS := $(CIAPP_LIB_DEPEND) $(CITOOLS_LIB_DEPEND) $(CIUL_LIB_DEPEND) -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs - - rtt: rtt.o rtt_socket.o rtt_efvi.o diff --git a/src/tests/trade_sim/mmake.mk b/src/tests/trade_sim/mmake.mk index 31121eef6..5f42ee654 100644 --- a/src/tests/trade_sim/mmake.mk +++ b/src/tests/trade_sim/mmake.mk @@ -12,16 +12,12 @@ all: $(TARGETS) clean: @$(MakeClean) -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs - - exchange: exchange.o utils.o -exchange: MMAKE_LIBS += $(LINK_ONLOAD_EXT_LIB) +exchange: MMAKE_LIBS += $(LINK_ONLOAD_EXT_LIB) $(DEFAULT_DPDK) exchange: MMAKE_LIB_DEPS += $(ONLOAD_EXT_LIB_DEPEND) trader_onload_ds_efvi: trader_onload_ds_efvi.o utils.o trader_onload_ds_efvi: \ - MMAKE_LIBS += $(LINK_ONLOAD_EXT_LIB) $(LINK_CIUL_LIB) + MMAKE_LIBS += $(LINK_ONLOAD_EXT_LIB) $(LINK_CIUL_LIB) $(DEFAULT_DPDK) trader_onload_ds_efvi: \ MMAKE_LIB_DEPS += $(ONLOAD_EXT_LIB_DEPEND) $(CIUL_LIB_DEPEND) diff --git a/src/tests/unit/mmake.mk b/src/tests/unit/mmake.mk index 16175dadb..7398fb18c 100644 --- a/src/tests/unit/mmake.mk +++ b/src/tests/unit/mmake.mk @@ -19,8 +19,6 @@ TARGETS := $(TESTS:%=$(AppPattern)) OBJECTS := $(TESTS:%=%.o) PASSED := $(TESTS:%=%.passed) -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs # Library objects names are mangled with a prefix. Deal with that madness here. LIB_PREFIXES := transport/common/ci_tp_common_ transport/ip/ci_ip_ diff --git a/src/tools/ip/mmake.mk b/src/tools/ip/mmake.mk index 5fd2537dd..46a757ba5 100644 --- a/src/tools/ip/mmake.mk +++ b/src/tools/ip/mmake.mk @@ -26,7 +26,7 @@ endif MMAKE_LIBS := $(LINK_CIIP_LIB) $(LINK_CIAPP_LIB) \ $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) \ - $(LINK_CPLANE_LIB) $(MMAKE_LIBS_LIBPCAP) + $(LINK_CPLANE_LIB) $(MMAKE_LIBS_LIBPCAP) $(DEFAULT_DPDK) MMAKE_LIB_DEPS := $(CIIP_LIB_DEPEND) $(CIAPP_LIB_DEPEND) \ $(CITOOLS_LIB_DEPEND) $(CIUL_LIB_DEPEND) \ $(CPLANE_LIB_DEPEND) @@ -34,9 +34,6 @@ MMAKE_LIB_DEPS := $(CIIP_LIB_DEPEND) $(CIAPP_LIB_DEPEND) \ MMAKE_STACKDUMP_LIBS := $(LINK_ONLOAD_EXT_LIB) MMAKE_STACKDUMP_DEPS := $(ONLOAD_EXT_LIB_DEPEND) -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs - all: $(TARGETS) $(onload_stackdump): stackdump.o libstack.o onload.config.o $(MMAKE_LIB_DEPS) $(MMAKE_STACKDUMP_DEPS) diff --git a/src/tools/onload_remote_monitor/mmake.mk b/src/tools/onload_remote_monitor/mmake.mk index 201d9d749..ec4452c3d 100644 --- a/src/tools/onload_remote_monitor/mmake.mk +++ b/src/tools/onload_remote_monitor/mmake.mk @@ -26,12 +26,9 @@ endif MMAKE_LIBS := $(LINK_CIIP_LIB) $(LINK_CIAPP_LIB) $(MMAKE_LIBS_LIBPCAP) \ $(LINK_CITOOLS_LIB) $(LINK_CIUL_LIB) \ - -lpthread $(LINK_CPLANE_LIB) + -lpthread $(LINK_CPLANE_LIB) $(DEFAULT_DPDK) MMAKE_INCLUDE += -I$(TOPPATH)/src/tools/ip -MMAKE_DPDK := -L/usr/local/lib/x86_64-linux-gnu -MMAKE_DPDK_LIBS :=-lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs - LIBS += $(MMAKE_LIBS) $(ZMQ_LIBS) INCS += $(MMAKE_INCLUDE) $(ZMQ_INCS) DEPS += $(OBJS) $(MMAKE_LIB_DEPS) diff --git a/test_programs/bin/sockperf b/test_programs/bin/sockperf new file mode 100755 index 0000000000000000000000000000000000000000..670ff5b81a5e2b4d1e79ae75ab28ce9138ad511e GIT binary patch literal 48920096 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

hKiNNv7uZ$z&!0PQAt-2`S*nvM(zdv5isB8JKlY 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�S;`wUrd6MgSc#e$uCu8#b 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

T@z<|5<%*{Nlv=T=Ml&Azj~gq}Jye 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

#~ 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%0Ag(h_%3I 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,|Uxa$W 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 z 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

aWcipo=fG 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

=F#*4kvL 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

QT~2?|pM^Dnr)m)oIJU^N;BL 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%0AbtYrYeSF*8s;9nlzD z(V?lz(F11;JUd1tj-^gCuj8Rj0$wqNbi3w3r2INWO$xHmyn>8JlW~e)$2VAeRr!Aj z;zhhpOyBYAsFb2=zYfXx|3klywv@#8>zJ0_pW{&K9xF)k=Xe_nbNo3Dx)j}`t8iWG zpUh*ez0YdJsI&TWG?(h2PSg5xWN!)Mzu^0G^xj`Yo_I;L?jnZnPKgUBWQsq>r~8Rv zg#0-qlYIR-8c79Me~#mR+p)-dwiX8dg%T8cs{vQ-;^@0n28q(qDqlKORr$mG$o~D7(}yQxT_|& z!-#0DWn>=bC!EJ@^3U$1?HRx2vQw z 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 j@mdk!sD%j(_nuobJ`-QrW@cgvzmOZYgc!-SVB> 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 %&fc=M5FJ%=P+O2 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 z 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%0AnBmdFIT>j&W!++CMF110u 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

MbuZ~uZ;4l9d%38^p-THw!jFXjD3<{>;fr_pq% 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%0AO^f+q$n?+g?JHDk=c@@Hm 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�tl2I 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

#5&WytnF47*l`t0QFlB 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�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%0A_5Hn@F#gD9?FA)h z+z;radT34%#xC=VsNe-B9K|b)OgC(dgeQosUHEtyFi-Pt!Y>gjx-DTvDENhfb6)wV zfd!%?Vltv*z-47$@CSJfFF~qji-=_RgqUPRzdYP6z$9NW;C3`Hz

UWjjq2wO~H! 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 z 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

Jw8vsu%SEqW|opKE9YojiR0<`iYX%#}@Xe zS=8r?e%woaQ~{4#Mm;S0kwVlTOZKSE)OU)0&_jKw@~C~(b4A~$sSoi3^@t4`Fri~ezx zdbiVV)t`D$^v!3eclinTKcYTW^bbx^?{v(q=26cUef^Kr?>OvMtEg`feQhrFb_d*Q z2la^Ps}50bvlsV2qJB#B75k~T+T&K2sOO2k>|5&1cez!OfzW-}#n$1q2=&IFxm7jl ze$f|yNxi{#-2aGrd(mIsNxkk?x9UbcQ}lV;sMp-&RzsF?Bead^(ORsdR-PHGsJ~2!^?Jc)DK|Lz^_;;umUyA!5 zQTGfo^BudKdXXh=l?F+ti$3ZN>M4udsxI}WqCb{R-L=52+EEXPK6D{hneKgOSR2X{uW-qaGH$7e*@Ig=cX8FX}r*zaJx& z?_8E!?W3M6dN+(zzMr2${ZqdzdKZjTz7wNS|BpiVVi)_mcfv^JJN`K8pL%uC@4!f0 z|AVN1>KUT9!$@5J2c!O}cNe`4M&kNE0QFBjD0(Z5#Pz=~>Yw^l(VJr=uK$^+f9lzy zH^xX@{~tvCQ{NzZ1B}G=zdP!mdPMZP7>Vouy{Lccr$n!bk+}W`Q2*5PM6ZUCxc=XT z`X3D4hh6^lA0u)7Z;$$??iam0M&kN^8|t5Wd(lf{B(DD%sDJ92qNiabuKz7i|I|l| zUK}HF{cno;rydf$2u9-i-w^dreYxl<7>Vn@AN5Z?M|2lP;`(13^-q1j=oUue`d=OO zPdzI7wOZ8YR6+ey_Y5)fy>cVMNIG5gOO>flFN^x8-c>$RFN`b0 z=%zk2&!zTJ&lP=N67@k>UFsb5%c6h%j|+PL%P!>_3f+rc{`LPa>V1C4=igGVF8b$x zQ12CWsm9bZMBnin_507bR43})MgRC$>fKJcRDbG0(Kr7>y~~gI{9Ec%MgQO=^-j4i zHII6>=<9!=e#aq~T19<>=xdKsZ@1s2c2JLqzUq7GZNA0l-%>v%`ik$Uw~DybCF*&i zFZ+gi^DkYh$S~+W?DDVwUr}$o)1|6W_lv&x3+fHF;qz~)w-^28PpQ|S@be>IC(u=;Pm}Ui=Mw{w;M+(9C!2o79VByHpw^oi6&Q*Quv0bg8=3 zn~MI}tJGcdU8)`RfapVCp>Dm1&wr*qK=eT`QNQ-QOO2wQC3^oCs9%}kQnRSf7rhTg z;`;xrOD&@w7QGin;`%=cpZ`pKr|9=%B(DEYqyDMqirx()as7W1^-uk>=v^=p*Z(I_ z|HGksvCF^yVH# zLH$!dC3;Pa#P$Df)Iaq+(W_x3uK#zU{vU(x!!G~&kCC|k-;VmH?iam0M&kN^E9#$m zd(lf{B(DFrp#G_6ik^m%xc=Xa`lmix^x_za>wgo}KlPC4MKBWA|C><%)R&8%f|0oX z*F*hN&k@~)k+}ZXLj6=1xc=XW`llWh{aQ`xb1I|$se4A4`Ch3;eO3k3KO~(l z`lU+Lrf?)|{;6k)exf+_u?128 z)aQ$Sya@GCZqz^Zu;@ops6Up3`lr5A^n)(yL;p!u`>5xNzR#jQ=&xjTj{0TMzrL0X zz5gG{%Jn#OFLwFY|0~q{{D#jzp}ADp1x>1eW=M?G8g^~b5-@qMydMSX+lYmZQG_g%8u zK|Lb+s)N+qe1p$Fp?*sA75k{S`YKsnqMj%EvahK({~}ox842BoUH@w;_UQJeMkaW7}qh6z)@=CI*OTDS+k1eL|dMR18qaF}_=*!ft7x4K% z)CY(@Xdd-zvy#;)>RF=qpF{o1^kg-Q`h3y*U?i^pQS57)VI;2q6Y=>!)OU)0 zKStvEKOXf@Jy-N@7>VouSkyoD%c6I|NL>F%q5hwM?!_+u`j3&g{y&ELr(Rw3J1`R0 z|DmXV>KUT9!$@5J2ciC{cNe`4M&kP4AN5Z?D0(Z5#Pz=q>Yw^l(VJr=uK&GI|J1WZ zZ;X++{@;)Kr@le-1{jI!e>c=W^@!+oF%sARE~tO%r$n!bk+}YMLj6VGtJA9nfIe~iTSza8qIx?lA27>VnD8`MAb_M(@@NL>G0q5i37ik^m%xc)as{Zk(; zdU1@z^}jLdpL$62A{dG5e*@G%_2r_cU?i^pby5G+b3}JxB(DE8QUBEUi*8{guK(3g z|J0+RU#mfVP9@Yob^wOw*>P%YPG}J%!favE+ zQJ+{G^-q0(=s%}YA72FZPd!WY6UC^HO+o!rpD+6H!qi8(Q2*4!q8}+h{V@ymPkpE8 z2a~A}y{6SZ>bautQ`84t(dr!a%c6h%w}#&Tl2)#<(7o8@U;qE4-sb{-|Al&W(LcXP zz1KOd8dJ{@eaCs~_y4R_C+gir|M)ERZYQ+rPdzC5=F`->9LMj!P@gLL2R~8obVRFp z)U!oje~kJa2en#7eS_$04^wZqPpci&BciW5K)ub^`282^r$k?|mwKz+T3w=^C;GBI z)SG{@Nu{_mpRc!yTisQX1<{2BEIALI95sJ9pW$MSpA& zb=N$t+EEXPK6C+fYYu+@i~0c32hF8^ZKhVEsAq}Ze>U|i)3lmJeZJ^@FcR1Q$yzO= z9u~b9M&kNE0l)u6eW&R6VVF(`FLwFY ze~iTSe>m!&dUet7z(`#GhoJtcXNcYoBXRv7i2A4AUGz2>iR*tq)Ias0=&djk*Z`*_cKO$TjKuZ7E$W}TU-a@AiR*uB)Iat1qL;=o35 z{;6k*o`#XQ{x?JYQy(pQag4VnDebhho<)WuxB(DE;Q2*3(M0a5% zuKzVq|J3)3Zeb*@|5Z`{)T5$bt4@7RMbtla&(mhUSE^8-RSxwJNvDf`DV_TCQmB9G zO+~*@mim-b)Iarr=;wUYCl*8fQy(Du&n2mkFO2%9o+bJTFZHnnQ2*5Di+;Qi^-;;F zf9he;k9ep*rcnRXcZz;cQy=In7QK1)(XCP4RL7h8vSzNFrIdy=X~-7orEJE^zYiuXTI zZ!h|?ZPahxl%%>*&lLUj9O_LsCaIy+M~j~Q5%osvlGGIHA<-9Ypx$5&-v2;-x#%yy zN4?(4B(ohN$sY-U-TE>p>D*Ei@)T=GQ`+ul=CYt%qdV_l9 zMM)|Rl1>+WMmF{I1xczd^`@dvT}Zv$+$7bGdO-Ba^Qo7fjradhA0Ya~7pdPcGf9o2 zo+bLzA?hWkC8=4|=ZpT-bJUAXPEyOLheaPVm3om0c>fReouZF=hI+wqsDJ9YqL0X; z?iqvnr+!)V;8WC-N22~GLHA-8`??PqP2C!f`lnu9^g)kP|7S4jpL&Mqj|8b-9f10$ z-d*&*7^!@J_C@_u4~pI!Bhl9~QUBDZirxz&mG8F)QUBDlMSlPzl`q;I^-q0+=-n|= z`Oe;p`llWdy(>nd-vvUpByjgiXtV| Gthn5#n$02j8wj3 zx1s*2`$g}7k?4aNsDJA1MQ?|Z%J+Q>)Iar1(Qm~_<=fvB^-q1Y=ouKPe0v+B{;7vV zZ;6rUkABoY_2r^B$4KS-sy6DMdXDH#FjD!xtd9DpzF+i)7^!@pRYCnzkBVL&Bhfe0 zQUBCElg)hVVx;nYQWo_ONvDfm3nP^;$A|i--cYsX+=oK(h`QG!O{;AIwy(~s5-x`hjrydr)6h@-Y=HdMh)OU)WhLOtm z_Ek&mqn;~z35-;}<(DmWj{0TMy%?!{OMkbNYYKEPcCoK}VT?rojpF@3)T@i0f|1Ji z>KRKlrk)|X8zYr(;VDaXqTXF}jgiW?;73dKrydktVI=x;F5dq`eX8i!exUxsAxq7p zo-O)cN2!PQTWS^c4WeKEp8CvhEwzJsMD&Z_QUA3r-v2|r(6eSym zRd}}SH%(LV_?G5Msj{s;NW$a0W@3!0*Kedp`AXHZRCS!ImtdD#cvcxjIkrMEr%ip+ zRK=#XXrJ%ev@KoJA0G7x^d32-@pwr8VR+n!38kKH;87Ku7d^HgkN+&JRK=T%P_I-f zysm_*cx&<4pcqDn*yBnygM(GYzzsYBf9mxf4ydkx+C-?vQwIXtS7&0qGISz`*34yBG2v7$AH5xqnyg*TogCcT5peoh}RO(HZDm)udQ?QHmKFV=W zL{11)xjKOA45-%#Rc4NXq8tZB`4De_@*FaH@gCcT5ppsJowGmM1;L!^NigFwjkrM)?iUH~(pw#h&k7XfI4B|~1nPXATlszhRDt<`nuuMj_fd|6B632Y&Rzvn#m4xxCqmt@z(7%s zgCcT5piW-~R8K(N1Rnj4Kv9l^B632Ye)=6y3jno~P_17!D@8dDipU9pIu-@gUO@E( zkKQLxl;fa?oDitPX8={KiKQ+O>d{xsN>Pr3B632Y4x9p1M?gIb9-Svpl;fa?oDitJ zKLTnRpvo=;)LiUhmjudjP()4$)Sg^GZ3omELe*SkpeV;d5ji1HyAAj90x_@gg|YL0BRke zl3xYXc09I4B|~1ZwGffa(D#-|K*yja}@LKsgSI$O(a3 z5(d;QHwKohD|%vZISz`*34xlq5KvnI zHIGn5-!xE^McT5dfPxzj)Nj{LZF5` z1*j!}Y6TwszCclqgCcT5pazZx)L}q8gGYZZP?Y1Kh@23p zjt>HA0-#P1>Y=b%DavtBL{11)hwgyd1gIy$qkk7D%5hLcP6$-ndja()puB4UH4VF1 z@1qeknI4B|~1gcbZ zK+Ocy6X4NNfubA-MdXA)rB(sdXMifS0Z@~%i}gOraZp4~2vo6jKqcR5sU?Iez0p8X zj)Nj{LZAwl1ypN5H3pAfEl`x>pop9hr~*DfjRVvdgu3kmvr?4fpop9hsN|A>+6bsj z@aO{qML7djikn;@zR0Z(p`2s~b4vNSLfx3uKuk*bHsP_m}XOmee%5hLcP6*Wbe_VL~6rehQ zM}I6(l;fa?oDit9e*vmuTm0G^q3+vkR*G^Q6p<4Gb@~rL^#s%i@aQuFML7wT2tpop9hsAInZYA>J`5h^XmKv9l^B632Y4*vqEV(l!|06h9_ zfubA-MdXA)9XJW7j)3}Pr3B632Y_Wl5;L)!O6y-Q5A}0iD%(H+x3#cuGYWkH~DavtBL{13Q$Vq^zahIj;1&`h( zP?Y1Kh@23p;ZFmqAD~VXs!znM6y-Q5A}0iD$diCt0;uue(SHaONf&Vr8-(_IiV_kZJ;Q}K@mA2P`!r%sw<#cf=90xD9UkA zL{11)&qo0@8&F>p>dtS>N>Pr3B632YdOQNCU4VK7JUUmPD91q&IU!J89|lx`PL{e# zsFB~Am7*L6MdXA)b$$p?Z2>hKJUV5sfubA-MdXA)b$kF&6982WJo;6Eq8tZB)g1XKV#`ZIx|90x_@gg~{v8&Hkzw$x9A>h+yj zDavtBL{11)%R2!z98hDyqkj`9%5hLcP6$-9+X1x_P(}9xYASZI-bXnOipU9pYIG~0 zP6O%%5hLcP6$-hn*enHP?rfc{Cl%fl;fa?oDisr^#GOH*-|sX zqg{s#6y-Q5A}0i@TrEI#22>^R=vM@aavT(q69QH0MnKI3)cb_;A2usRISz`*34uzj z45-flbr*Q_c7dWC2SwzBKozS1sN^n|I!37bkC>IB90x_@gg_N81E|)38U-Hxt3XkX zgCcT5pbFdosBwTQcob02U>ECsl;fa?oDitw5`fwWsBA)&$~91wDAfeD&|K)aQh{^_W>H%5hLcP6*VWxB;7Q2%sJUkKQj(l;fa? zoDissxci&$EkONFs3FJAN>Pr3B632Y&Rex9z?FH0fLUsGetQ6%qC?Y2W>hRBiD%RCfkAX-3B2bj$pop9hr~@Ye)e%tc6M)LX zF4p@f$3YP}Ay9jd18N$e77{A;q=BLw2SwzBKgHd~N>Pr3B632Y7Ayl) z;U1Q{4?H>|P?Y1Kh@23pxvv4L1E9_js$bNs)c@n{Y{Rsg_CLO6uW3y+^fc)%p$J7N zLM0TT7)KE*p$J8eA{3z#ick!S=)s^EM=_2f6oXVDvVN>Do{CFQJ0O?eopKaqM)Qf;=UrPPi|NjWQ0cRYYpmw`E^J3e+vkWxD) zCFQJ0O}G!K>yi3YQvdiR{iM{6Nl7^?Qn%cV)FPy=#K(RUq|}Z{NjWQ0WA8-jN2LCi z)R>y|lTte-CFQJ0T|W`2b{FKBB7E!~zow=_jRjOiIdGks5vjQePr<4nDR#NU0r@l5$q0F1r?~=7Vy~CP@wX zJ^iHAj!8*5D^f%LiPX7B-GYz(El8;ylag{)q%OP?sp&{H-htFT!2jB(c1%jjS&IV)0U4n%4KQkUanzYbDr$E2j36{+6mA@w>^e@JTdAL%Ehc1%jjS&=&BY@~J~ zH4PtIw>B-Mc1%jjS&{1T52TL1D90R#k9{IYsU4G&a#o~{KOL!2NWChlqy9`kDYau# zQqGE0ms62?9;vhNu`7a<+A%39XGQAhlaShsRF$MI{44#W)Q(9>IV(~fPeAIxi*w9a zeC+lhrFKk8%2|;*tSeGOklOQar0xR#*FLplQc})}RJ&u4dK{@ICDn3wT1xGhl$5g~ zb>NXmtwX9aK6X)%QadIk<*Z1xJ{+m0gLBM>k~-DY|NsB{)Q(9>IV)289D-C|q%Oh7 zei5Y9j!8*5D^kr5Lh4?mewWn9ob;1YJ0>ONtVlK8AE}i{O~uFNMrkRvV^UJiid3V0 zk;)yCV_M^59}QA!$E2j36{$U1Ak_n@e@p5Jn|@Mi$E2j36{)&=A$1Emt?hk{na7 z4pO%R|7)MxF)1l$MQUd*Qdc82TT&^PmQp(=CFQJ0{c4a}fK(@Z?DIiN?U6aVJu(FU>I*;bYeXDYau#QqGFh=3kMz5UF1zHKK0% zNvR!^l5$q0zTJk@Or$2`V@m$PfG2Wl$5g~weDM_&P3`oeC)CyrFKk8%2|>6bOTaTkgAl_x%ufQrFKk8 z%2|jz{V- zNfqpwmQp(=CFQJ0y|Wsru}F2m$1Vs`YR9CcoE53%A0qWKQtwFWga+v+rFKk8%2|uOsyoQq3D7^#JfcC8!;fl5$q0o?n902BiKase>D*rPPi|NjWQ03tmQQ zpDS|A$@ti%K}zkIl$5g~_0%Gy1|YRoQhl4GpOo4$DJf?~YVPw$J%rTN_}K4)l-e;V zDQ89M@dZe&Mk=QOshffSLRUK`CFQJ0&3p=}J%;6&MfV`1El27+eC$U-O6{1Gl(Ql= zG~ZNl7^?QbVpr>RhB= zm((%)q@R@9F)1l$Me4%gNKHrTY<%noK}zkIl$5g~HQ+L&K1Aw!Ne$jN{iM{6Nl7^? zQs)jqs_uv!GY%j7YmibqCMD&pNcFuCsZ)?@v>#G;1OIEE+A%39XGQAF0Z2_i>S;;s z*D5Wgc1%jjS&`~}E>f=}bsRpnG)So(lag{)q)zFJ)J~*UNve12^pjFMCMD&pNcA`q zsiUvXF_+ONtVne^1*zwex*s2#cR*T7 z?Uw`XV(?QhOhqmQp(=CFQJ0H9rukdyzU8 zAG&{sb7(LSyG1|ntoDh$E2j36{$b-km@)p$DEFjeLG009g~uBR-|@Xq^?Hl zYf1HQpMFwm$E2j36{%l$N4!6U)M$L{k3mZ9n3R;WBDJj+sc(_0dl*s^f&aBn?U>*fz1e)IK-lnA`EOwLwbln3R;WBK7h@ zqy`|B>WtKM;D1U`J0>ONtVq3Bg49DuJuj()x}>Glj!8*5D^f4aM`|@vC*fmX3sP#w zq@>W2dUmjjljo#8>G~ZNl7^?Qcur9>JFsL zaY)?+{1>{~F)1l$Me4~JNG(U|VM#UUmX=aGCMD&pNX;oi>QAH&#m5#0DYau#QqGFh zXFGvEkbIGq%J)n z{iM{6Nl7^?Qbm)H`Vpzy@Uc6Bl-e;VDQ87$`go+;jmO$GYlWQAxNnmlag{)q$Z9)>RhD$l++C;rJt1AF)1l$Me4R;NKHrT z0eo!zlhaaa$E2j36{&GUk@^s+gYmI*f|S}ZDJf?~YV2U7>fW4VmP+dAp6Ms0c1%jj zS&_P75K^Zg)fXT8evnc-CMD&pNL|+-sR>AZC#j21Nk1vIV^UJiiqyz{NWG5K&G^`w zAfONtVs3mgw*3m z9e|IW6{OUTNl7^?Qs;I+Y8_IGCDrka^pjFMCMD&pNS)mtsiwE)m^1OQ?*=KgV^UJi ziqu(ck?M=oMoC>zn0``f$E2j36{*5DNZpInjriEDK}zkIl$5g~)w>l^E0M}S6RA6Z z|Fuu;n3R;WB6Vs@q;hY|F>@u=;vZ=#wPR9J&WhB@DWrNJbqqfCg&?JNOiIdGk?LN6 z)GbJTAgP{brJt1AF)1l$Me6v5NG(BXFg|u&kWxD)CFQJ0bexJ_I*!jVcjIHDzG*47V^UJiic}|y)YVAshmV~Rq|}Z{NjWQ09e49>nFUCd zO6st)(@#q6n3R;WB6WBzQr{xg8z1{tkWxD)CFQJ09l8Ul))R8fSCTsaob;1YJ0>ON ztVp%3LFz)JuEWPx2Pw54da=(8bcL6~JrtLV|CqEV=gj-(ji?53Emy3lX+{ei(5A` zjfrW`atd{;gi2wPPy_fL?vOmwl@Z%BY}p+NliK?Z{{2t&M*;8Mm&us-uikq$w{BxD zS`tEzAtZRWr%vXrz22yC=6$YJET>R6Stt_b2ql1H$qVz$b}Cy7yjC|POsW^&O)jM0 z4tVb~nT&bgeYc+XW86BHxo8ydGe;5j3W$)ZYNScW)+R-uvAn??<@xGjmb9i_#&76B4}JP$%=&UN0ZL zm+4AOKbBLd+aXx}u%XZr@bcZcdFB!-I|6vEPDq&4JiKpLeJ|!1g%v^t;QPsa^GpjyY#ZRUIv`}$(5ONS9!Mi1OGH>lQepG>ZmTMWyDbx)UMhoMGsemKW zGxN;HRJIa$t@cQmR4v}Ws9$$*+WUAWW8PnR?|XEMxu`GjGy4+~yi?T4ytUVsX^qV# zT*tATLR~ANz0g_c3HV)q?>uuil`R5(%eF}HTE?CH`*-Ru2mX0?VKU}@-MxC=cX8_@ z=Aybo(jog261)qjlX+{ezZ|!yFWd-IWVg|9CLfvj5Uq4I5^xzq_U%d*GeJ5&og-6 zqyAjrz1uMv^M22J-^i^On2R=tkUa?r-j+Ike(qs!9Xt(lB@Z}Z;QaBDy2 zq5;6q)FC8z*LF(kt-ZeZtAV+a>m-&_sB0^961oe8fTQEX^2`HNb{6nk<|AQJL-Bq| z{guE!?|qnzdEYr*&-*HFtzj-|ba^@?hmhdCqeD_}?X|Oif!Uv!ZY-xzw_d0gb_kXm z{B4qUdFFH~+YflHJS2Fr2k)!Yp8&jfb0%Zndp{uWE4Xz(bJ5BW@>l!+de=}V`})>i z!{2OdKIdA)atd`bgkoW#uoUouQWB(}@|%atd{MstSZw zLVLh5_C9&$S}HpZc&*x2@=i_W^Uu^@0KE4eOvb!F_udz9>lNmrZ6RbkA;EhSbuw@5 zb?$4{v;TA>Q?H(Q$LnL`+{oq*Tc(Nf;0;C+VrLxA_L%Vf;^nj$^# z^SN~mbJ2nj@)IG!yNWuQxAr=yG}pY!wSwgo>c$9@glWPoz{{FV^UOvnTMfKcO-kO^ z;vHQ{zd7*UxlG2q?L+cDhg%0T7YzY^W(y&~dp&hBZ|yaqd1S8TI+f)V>N*JBgkC~F z!21V{^30=Dwix&=w-(5IHr}tPzZ!UN!(_~RruROJTVFF5HNPqy@*N?;yOKJYxAywJ zSqpOrF+EvMp>C52-lq|A7IV>*5b_lv!MlPwnYZ@(v7o>_%C(f`6zcj5LxqvTIKZzj zxq0R-Dq9Y`cNKmnb?C1g7*sQWZv3qJD;HR7S~FaQ>Ys+OciDb z#el!@v(uR^RJI0q@3r{x>nPs!uc6->c<;?SGI%$eDeq$mIfA)pIPf9=AtZR0Q77}( zUSG_sXKvzJ#BvICorRu4A7K#SCDvb^nMY+yfZwtLKa=_#@3+-o2fX*U9Dwyhb@_X!E!%czriYp=imookLHrjX?n>b45CLY{gBfcG-CIWv&T4h3Fo z6@Dh=?&kbk{prAaZ`hi_yT_w?-bWBJo4IIR2zi%~;JuVOnYZ@ZzNC)X!qtw#QK4?W zP%11F$^m~>`$uOQGh$l;?_G|cNp-^eDD`^-@BL+U2Jg?j_o0NG&s;P;guF#a@Lo)v z%v*asTf`Rt*QG3{P&Zf@A&e0w0nPz8bNoqVD}eW2fgdjy;{AjA=GwIPx=k6puX;?+ z`(Q#EFclQ_~rsLkn3ocQ>aS`ZG;X&H^2+E-#Rmq%1#A-%QE~- z>OQ=mRDTKZ&->G=4BorF_W^{w$6REtONYElNbp`roy=Q%J^o@7)0mj{ET>SnN~jbz z2{pi^uHN8GS4M2lu;nuROzJhfFHnCJ@ZPJ}XYhV#mY(;1gxtnlv?PT5n~>mLLY>T8 zd!2Uqp5}e7RV=4aH(4kW<_IN#zc&7*Gux?bE%48KDSjrk3GXJO>9+&k`@_l%-iJIc z@4X2*mbqvY@F6b}61?YAC-c@`?_RW*naFh(%PG`#7Yc>`!cf59gj(m!vsAVe_$?RX z$J>|paQ?0S2H?F{uFc^6ruS|}$j{70?XFLU{ELv_T}++KTYH^#y)j*h>Bn*kbvp#B zA2t+P0{;8^)R{}D>{h7dfzf+OHyWbOf-c1O3hPh}%2zi!};5~;r znYZ?;Zl7zmbIrd2M}@kD!ct*{Pyu*fWwkRc7_n`D_g;vfNnL~Yaq9O4-h26~4Bnf) zcLPE$W-gi;LY^ihc+a9v=B>SYOy!f{xt6hesz7?frUr2Jc&E>v`8Fq#1KjU*JRL5fZ#-P$%=&UR!rHF_&;1$8rjFt%UYM zXQ3zHZ)L4?=58um1pJos@#DM`@8{HC4*c_8vLb_blR5HsgnYzYRCi1|C~EC2SRH0WTWA`PXHp07 zWwtjh+Yxy0MawdHA3s;m`)_WY$Xqlwggi`0@SaMY%v*aEf4rx;TUVA-sOu&469x+- z0DqnSb!T3rvP*&gI+=xpN%g_|6ZJO(@BRGJ4Bj7m??1TpJ9AOTo6;c<5E8s6Qz!G* zUYok^VNN1u5X&jl?H2O&!<5hla89zsnJcO6XyCnPAi?hw@xDj>xxjlbSe(K83Vye2 zQonQS1?Hm7A>=+ng7+lqWZv5AdXE2gaV@wRM}@k@LYc5is06(9{IWCqGh*8V?_Gq1 zNj;1A$?6XP-utQ24BoZg`xkCq!CW*qgxpO?@E%W{%v*bPzP_$`k!v~2Db$S=#tD;! zBEWk*i=6qK%2omIJq-zyT7&l=>Ngsf_MW>igZK0&^}K)P)_%-I1Aq^?laSy&jyjpQ z_WJP7X68z+lUPonuC35X=q?lj{%Zg8&OAV6X92(ER3uEw-pl#7`YVBd-jA1L@II(m z-al|_4RcYWThbvD2?^d~sFQhXuhZA;Y4#_k8_Oxwtrx0=9fIWse_L&VGpAG8e!zQA zMuHcd@xDs^3BY^LoS(t_HShgBx9(>yS{XuaB_w!{rcUOqz4|}c(0tCdhUFCMW(dW? zLSZSu?cT_0hPFiaQ?_)Mm`&b&%x%YgSDkAz9xgZCHeZv);9cy! zKjGHF%tb?h54n<%;60c+nYZ>TKdzp+mg`iOQ>g18bQ5|B{Q#d2HQkv9HT72m?>%8!2JbHO^}Ijg*4NBM%_pWqE+-^-528-yt-bpESkD|nOiz|msM{pe z2)l)RZt#%@_d0Vnl^q1U_Xs3RY6RZbsXqmH?^~v3@cxhY{(xJLFc+;3A(s#my!%rp z^VVMLTBOWIuC*+uP&Y>?5f%$&fIml0ai-qw_!R)}Jq!uX^YK1Z{T{%3kDZ*s`_ct^ z-tTeiEasvqA><-Lf_FdaWZv3qzgEUP%C(f`6zcj5LxqvTIKYePcR2GFl`RL}dnghn z^)BAusJ|0<@9QUJ@ZRCQ-{zK^gm(|%Lk1EOy!%im^VVL+wrFC`CT0Z7DbzI-S_*B2 zPJqv%aK2Jd^H)$@LnTW>NK?F=F35fZ!$sgrqY zuP1)YH}&q|{F~(z>Q)F9!g`?^@bL?`aQ@AR?FPK}AS6tx)%~1*t3Mog@2kgU@ZSG9 zdB4W38<~q1g^;re3EsV^lX+{ejV+s*x42faoI>4rVX81gC7;@0=fMXm2jhn!AG@a|5X z%v*cSd%2!Dl9)o4Q>fc2)Czg(6#(A<9?AJPl^qJacON87>KVLmR)0G1-b0x51OIz& zzrlOIz^&QLMe9Pyse}aYZq&)Vwbx#sH!)kd+Q~R7)Xf)4g=IoH&_AWa`8OlBCGc8> zNSIUw-bbn58+h*vnT&bg@VuV)bKE+gxoCO_If;xAr=9Apa5s*QG3{P&Zf@ zA&e0w0p9-}#`!mutpHxD7ZQB^Oym4peKRHPJ%GuWcm03K`x$OEU@qzn{LBf21n*AN z$-K4KZ8xSW&9Yt%H(zlmwjatd{;gi2wPPy=}XdobtUjM$!G%kD^+ z)CG87p#CV}z56m5^FI0oJ@47vx{bMLNeDTHkl@{(I+?fj+HgEy09>nBPN8nHP$bL| zN&xSF590ir%GLs})eQ-gnv8dod+4_V-up}@W8Uw3@5i`xEOXH);Af5`BzU)_PUfw> zX3WVo6S>Y}Ifc6JLZQ%K7z+4(c7M*lscb3mTXsf*_pb2%K>ZECd-rBC=6&%(J?}@j z^)qu(yQ%4r!wCuAZK#uZYp*p!>YJ{_^kX@Nx*dYm4;u}$(5ONS9!Mi1OGH>lw zIk~QRmTMWyDbx)UMhoMGset#t3pxL$vX#JVwMW9Fy5aqc`gQM1dmqna%zNJ#<$aHC zF&Fg(erA6{f_I8KnYZ>jZFN&~3D2?^c>)XBWH*Il3Gm=?rzVmXDnwL+D!Rj38L z|J{@GZ$@lk*s={0CiO7hm#RM&c<-Z`jCuEZNzeOsZr#OPv^<2gAS8GaqC3p zqOl=lFG7NMK6Ns0?KSVLTyrm~FP1`8tq-w)}=`8Sna3cOZJBur{6-k+$y z8F=r*n2dQ}TdL=MGq-+cF6uZv9nzSP;GIXE%v*c?{Z1ou5;22VPN8nMkgp%6gf@Wp zzdLjOO=U*|ua!cAKj%Nd`M3IWf%k65WX#*~yH1n3ky|e?7i|t9dlC}7Ep;+)?RDzO z4a_dC1rOk;P`6kp6IKb8fcL*UasJJSZ4bOw0TL#4I^HL%KLB{|1DT9@&+^{aaq9}^ zqPZcY9wEVd_pwR6wb$?8H8L-9EoV7}x{<;-VX{yJc>lWt=igMe3V5xCNbm^p{zLsn z52n3aGa2*l_-{S$Yq+%^bI}0cXX+3Vylan2>aD$29GGLSjS* z_MCrH*;&AEnU91?732Mq`YVBd-uo~a^M2QRU&XC8%teig(jhs71n(V3B=y!__n*|l z>`zQLmQ$!(FH{RV1j`M6AJUfdZz|glc&$7n`1ujy zS{XwAI`qHZHPp$zzO~ovpYzSBpyEG!h30^a{_!}<3^_~iqyWsxwczwkal z{Vu?JH)S&Bz14eP%B|CwizbAST?hZydn&gF+*8Sp)OBVfzV254|xB(CFkE%b{z0pwfo7tKi&_jzW{jeJ(!Gnw^$PcWRe<-uQ=ES@Vmkq^wPSC2-+}iT z>JI_lyDpP4?-#uH`P{mOxoANM`H7I=T}7SDTYH^8+nQIoRlYA z^KU9!4ZK!OGkL#=cQk{3bKt#mnT&b&d{xi;9Bv)VTr>punJt6_@AcHlytUU)f7UVA za-GU@3UwWXZbC1iAK?A(hMa#>*<#?g+}cFmU*r9n`m2HWHcZC6*Lm-=xb-!2QS+JU zknacy-j&qJytUW&4>vZ45Yv<86zVn!HNtKopBtPP=X3r|Wd{MTRoy_|`9++6t3L&J z??3Bj@c!p(dfsOc@(6R$>JYM#kl?+RI+?fjI&M8*09E)&-+9|-efM?8A3iIBzTuoC-c@`|J>5l)SJcmH_Iv1tq>}N^+Gk^{qNd3 z=14|tH{iW1@iVDqc%P&GaNxav{3C<+Ti*LPLT+R(S`=%>pxDvHSpe>f6w53{u_GU#}aY`bJ1|% zL;gcZ@GhfH=B>RBUzlTV;#$OV3U!@@oMT`f2+R^ zc<*n2$>3e>y^kW~d*-6nPozWMCnR_;qfX|ny>?!oXO1MMkmVHWwhFaEo_Ym<_jDM-VcbxoBMod6$sjy_7ncxAvN_fiD2A zb~cU*b@PQ%VVO`4c>lY)j%mz@Z3(=0IesQJ8t4<+P$=A!8# zkM=P0xGrTmg}TAQ2w{vc3Gn{+raI<*Dq8`(_X_;@^&jsa)Hid| z-s`^4;QgHUKA4aO%tgI{4|#)-;9W|c%v*as`J6QaxsGNzg}Ri`M(7}P1HAuTRmV)E zvQvTIvJ5|y`VZbus=oyI=l$t78N9nM*YiGrkoTC2%-nRytAqsah1AKswb%Jq)HRKX zY0q*Bb*qF*VUth;OzP_Obxc=AY|pUeGW<;H54e-!ZEtG~|R{i*lfkC5A#ioTpXRG25wZE%48KDSjr^_F>My=h1Hm zy!VG+WbnT7Ej{nO2|1RzXcX`vFA@^G=Tj&1)?Tli+}up$I*a8L>beVsLVsZ>;QjBl zb;9X3e%v*aMT-?xf zC8i(CDb(!{tbW)~XbE`#yP}S{gvyQp-n$e(lbVS4?ds12-us@i@kY|{S zHiVF82?^eFsFQhXuPc5iFx$E27vrcW80q^6~ z?+d*5@{cljw=0u(141rlE}9uao+c!C&!SG|t-U^Z!lY+ zj`^6%Rs!!`f}crM;{A*Ib)QOmzy3i6?>D@6eL|Ws7xe``WF8^Gdj@qfZ|zmSA;(<8 zbsWnn)U^`Y3!R0YfUn~fbg<;EL{7mW?yf0OM zEb!hhzn#H*llP7Yxr@1Ic?fxwkl;OyI+?fjTK)kafWx(#tq%ZCN&N3Pt@NGy!Z33W$dyt7sl-3TCe~|g}TK;nXpQz1ib%U zTF30qh;0wNcM%dMwFU2!)gJ)7_fs!r@b0!k&-)i{UBO&5H-y|xNbnv{oy=Q%O&(fc zUgTQNatd`Lg>k}Up$PE)_rf~nb1GW}y!SLDOsd%o&cD@f^laLD?h6^bS9|ZDxwRj2 z(E#8>?j$65kE2fJt-TI!$`=6FNi3&O*H-8xbQcN%=M5zse^S|5z;8Jf36tuH_e<)p z1pawH{#*v{%U9}o|G=#^%tei!ONUG(BzTXZPUfw>=Dy80K#1waatd|pg=%4kV7bBj z-}CF3)2VDf;Jqg!!S8SJzDoTGz!Yp zizbASn+OTsBdL>lYp)+SM&<#oB`l{<*GCv63=>8J-v6Fc$Gl2q%YgSDkAz8mfcF>b zZv)e>RRUoty+5_JI zp2hJel^qAX_c$a>Y6spAs=oku?|UE1;Qgxi{(@VtFc)nLA=eTTyoXUI^VVL)gE{~H z7w6wBr%<;{C>PcWRe<-uXVfu=Fk(9a?>zl)^w z1tH|0gaq%Q)XBWH*Wsp~d6jDg%PG{25he-Kgjs<1zl-Xaja0T8c<<3jnAF*LM=#KC z4!rjr4`%SL^4_0t>tN=hA;5=RNl5S>Or6YId-X5OH`j8V%5n;I9fWQ|FQFgc`@+-e zm`AB>G4NZCM8c$Q!}~S$R|D@o;r3up+?v(Sk^MT7+Je$>glwb!Lb^Zqy2QkGMw>n{uyMhfEq?|)CK zW8R{&<-mInMZ%=&Jj(gE`a6O5zW(+M-km?v^M0FK?nS(N03R}tkl@{iI+?fjDp(wu zvxynOatd_~g_c5Fp%dW!@9~^}Q`t$tZ#ftVlR66T$JAd0y!WWvGI)RJz2D^4o6JQ! zL&$lA1n)xXWZv5A>75Nsy_Y!uW;unr6+(ruUZ@8Ad2Af#-;CI9zFz)?U{f*Vw$pwUXr&>c$IGg&9II;QjA0 z9Dh>T8sNSABf<9}@UCASW&9t1EA2Z{ceHjiW-{e4$iWCX@r- z|GtXzZ$@lO;I#^oFsXvaIR93^H}KvUG8yy!xA%UITjw(uO%EX_5fZ#RQz!G*UVZZG znt5E8vYbNQU}1zXMwkS6|N9Egzo~2m@LIi);LmS(|De8kCG9tC) zMZJNaIf0Pi-HAGxxAwaB+`48U*U>DeP?r+g2pxoOfcL*I<@}qW2Jn5e zi#h*h#P$qZc1MDb#>V>s^+y5k-IvLj_w^Ne-m|%N8*|Z;5ONG5!MinGqL}k< zu2n3jP&Zj966OdcfcL*I;QX7))&j594GEK4fp?Q7^xFaNeI}DJ?|Prg`!Q}E%Um=H z_?aUK3Epj~lX+{ed_L!FBG*|gr%=~jC=~h&Ljmu9pU?R>l`RE+%g#vfb&vN4>Tdwv zyEl_D@7dn_5pMm=T-5H>bjaa^1n)M~$-K4K^;>dHS7Q3HoI>3W!Rm(%g_eN#zt7?P zo63#=UaJ!lCbj=8&cD^43B30yOvb!BeWvIAAh(`jF4_=64k09Xx1vtwt-WTSXU%r5 z`LE%qP`6N6Dy$GH0PlaF#rZcQwhi!F9gr}ov+zDn{l36^_h2&Sz0!N%&#jA@i)Mz9 zg9r)UEvb`vYp)w_ZD^k5TE=n;b;E?w!gygS;Pn=@u zAJ1gW`=T{^-uLJhb5UR5XZ9x~c&Dh7d26pWukrccT*tATLR~ANz0g_c33&heG|s=N zY!UEVwnc*X#qfSk{pG+v?=DQnynpfDcX8_@=AycmPnXX2fRN~e>3pjhcOxRe$jj1%&p&TnII6xmiI_nw zr%<j8$#+461;aGlhj*#?YVR>^CH)BmQ$!3DU1^)3q^qMD;&Z3H#?8iv|EcQ-_e?U3+9wZ|!y7)_Ueju9H|! zp{}jaN$4&V0^a{Vl=E*YI}7+N^N}#AD!gA(e^8Czb67yjC6(oKHN#`M3HLfcI|B zWX$_9?|lWg?q@Dq8AAR#-qc>t|h7! z>iP(Sgki#H!293(asEwZ%YfI~y}!J#!ut#Lw*l|nh{>4uJKp!g}GnYZ>T=O5BOotU94r%;!tsz7KZv(4| zc@O+b&-(&yy~13yEre_*BzSM4PUfw>TE1S_5WeLlCYVJ=z_LVhA7cvn#;^VVL+9Gqib8E-uLud=71YVR zwby=Ug=%{F};_1MgjhpGiH9_c!YA1m64CoDAM;z4yt4 zxRrSK06ye%LW1`y>SW&9>wZ3H<7{F^u$)3&L!qV6R_Fvccl|rp+(cz30l(#X{7mW- zydP745%AvI{>uITf&V=pyn3Ua_lbnO$y~HEgnULw@GhrL=B>S6ACP0}z0aT5SWcmC zg-{`^7pej8fB(VpCnL5S@ZOd9nbdB)&ryFk@ZLY}%HW;zjl7Q|SW&9YvqGY%v)S5Sx%vDyf9UmAru4N|NcGKY@xC>zs5X=-lbTEub+b)AKtLLXre;QjAka?Ly{TLS!+ z75JIdK)l~pe;x4N-)_&~-M&iC`zS)bXD(`8o(_4Rkl?+HI+?fjdZmhQfDlv2atd`@ zg<2s`y#m1d-#_P?fmC)V@ZPKN%w{fH7ed}8BzP~S zPUfw>T2|CGTe#W}aa5?AFO&+)gmS>ocR%Es#*EmOzQX`*p@Yy3@P5oUeEbEKoeKPxW%!xYo^v_>R(}cb&->Gj8NA1Tr{{eDA@4C4nUB&T zuM!fx7g8tl)?Q7%$}x?JY0q*Bb*qF*VUth;OzP^dIsRnC_6%Dt!;hcZ@V-F(QNVkz z{wjla)9>ZIA0f9f7cB`P|0X1Omry73)?PafY;4}=TE%h-b(4i6VUAD&c>ntgKK_}? z)&l>$m*Qtq!|-mhiheuby+8asgZH!Edv8LHWiA>8e8`K01n>FO$-K2!gJ})TM6R<~ zPNA;5P$={lh63LIUXyE{rLv{KZ@Cyhe&2%k2kLJC-h1U|8N5&2r03m?ke`{0+O1B9 z{ELv_T}++KTYFvbNCVTAn0_p$P`5*{`e8$%CE)$W@TytUWQk2N&gx#oY2qe9(6VX3e}r~sTxeUxij zFk;&P@4XN|J`xu15_sulq^b`}OxTc>m?S>l4z9xu`Gj zA@c|c-ZQ9^d26rAUyQkg>o}HEsB0y(7di_)0q=jm$H!k#*&^V#oR1&x`{Mna`pbcT z-b>!i;QinhJ#RlwvS)pBH`ij8Q>g1D^b-aPBLH6yujQH-sq9kVzfNW$VN$E`{zU!F zzfc5W?UGV zU0e&+;HXfySSS-#36+5N2VTlG`!izO1Mgjggh?IpBM#C-c@`zfI>KK;>G_atd`Lg>k}Up$PE)_Y1k^b1GW}y!SLD_$TP_ z{zLsnYt!Cy|CPbJ(NFUJnOplY7YzVDe>pOgziEi z;QjCCa?Jx&b{6nkPDR3`CgJ^(`YVBd-j6?sx#gXs=oku?|UE3;JwRx zf5EL+n2WZBkZTDE-ovPqd228C#vUf8l0P4_oI>3)pXYjs%o1XU?Ze7D%v>=51laSy&lscKW_8RzE6Z0z93YJr-8zW2- zrU|nE?|(m-Yc^8ZYT&&`BVkex;2nKQzd7*UcRY~6yUliaf5NSUnTv)1A95uj!Fw=u zGH>l=PHt?j*tZ4Bkt; z_eb3Nnz^X?SLu+;2?^eVsFQhXuew9_G=~t=ljRiZHVHMtZXur=y#IYqt~r~^4g%hL z1QI4yjrVoxPXXThmb)`}|Kk@u?+>{32y@Zu5ON72!Mi_oGH>m5VI-nzyKIIq=>?kua%K@%~2roxpovKQV*% zm>NCrx4Grk^MYytUV6-o!bZm=P?eP}fjsDYO+j0p9<MsJ`d(^ENy!ZH3-fwd2P3EGVA>=$lf_EWxGH>m*^Rs5A-UfaiXE}ws z6+(ruUZ@7V|9vy(-;CI9z^^bm3qA;G&dbuw@5wdT-zW**n2ET>R6SQsIU5helNgT0*dZz@{> zyjCwH`2GprKd5iMO?wYuGUk2H4n6N@xYdBUs5kI4ClC_6J5eX|)?O3N;q$+_j%GQ9 zx|GmH=pb|hy#IX(=igLzD)3wOM8c&0h4+){F9H5}pUY&-yVXv4Kgq54n2XGJ>5#63 z1n&;i$-K4KC$IAUH!Qrp#CV}z56m5 z^M2WT&*s)`%tcE=$T5Tj@AlNmytP;JqnnxcxmK~9LfvGcNSGs(0N(!|$oV&wtp#4I z8xkg!_YCLX-_vggy!V+*#=KA8rRV(^w~l2l8U_5!k%R>Aw$#bIwby=Uv@jF7&SE)* zy6!@u&|eq|c>nu6&cCT_Dezl%MnZq?H- z-G(}uxAywAG-bLH(~sp8>UIcLKWr$p1bqMLY|g)_>betv==%HJpu23pUU|+l`R5(%eF}H-z(nFslOcf=iPUrPAt&fi&=p*_V*uT|k}8TYH^yU=!1Vm`*IGP`6g761EDpfcL*o;{2NtTNt)% zgM>-#HJ|fu^~VD5eKeCX?-kzrc5dCpT(mrdv>+sSH>6JHt-bz!ysr6}Yc-$8<UP8CVgvmk?;QjBzIsc}zRlsXCM1p@p6z@OOZ}fB8yET(B??vAG z8gA{!Tr>dqnL307@7j(@y|vey{W<^UI*H{J>e>pOgziEi;QjAIIRB=yvw+_+9|@Cc zvw-t&^;ZJ_y!T-;=6$MB$W`20!(7y8YdR!{kl?-Ju%zDFYmdvCnf;0B#&QaE>xF7z zhhVwE``-s~{!L~30k4&Z1m7RT`zrM(0Po$L$(Z*S-unt}-OpUKGKBoq?!VqO)XBcS zwb#@)nwrnK*07vH-3*~vSSTz7oX_vi`S&*b@`2Z~NSM^EcpspC7vQ~{G8yw8nWK

$T?&f;=zmL+~FJ#0#epJfnhm;r|GJM#=Mq;q*8+MXmL3 zaM@xlot zj7Q1yg~7=4g;^=a3#VXx0VU5D22-JXhn~X=-&4=U3*W->1`5v?1|QEChA0_4{`tb+ z$jRV^=HU6l;I&UM<$jeXp*ws!HL;a4lXT=Vg>UUl>w&zA!|VV%OyZtnVSNv46fW*qpmmN3^<1 zbG56lze_QFCS&q^Ves*MVOGQBTwpnC@R#}=|9s&ByMDPLvd+K@UssNJ;s5Y&M9K4o z!N|Wsr91X~Vd2qyqd@doSD|KX_YU>>tDS1;wx=u67*lQJuf!mNYgN#dSU@mK1zm|+ z$MCBa@>k+N1gE1SHRi9xSW071fv&_Xf@vsuzA)^W=L=&WG_pJ|e0mc{BwkqiSkM(p zo-d3?l${cJ;XZhqAUl?rp-WGXb zv)D_EGI-%}|Fh={V;9Yp%?od3Ker&y3r7=-M9fnEd|{Y%&Ml#b#tW|qThnfpw!#ZH z^8fO@&^&pr@JY`L8|m2eeBo0xKOQB|7luz`o-Yhh1~1&fQkGy}gsN@|Ch@}ma)^N! z7Jr-!#!Ox~D0K24c;Se63>Mj9tntEC>~JMYe)8%=g*t?jnd9nkP~wFL7ce?cqUtZ4 z8&IkPg*F}e7dj}_lEMIjt5w*C!kYxsQIQ%bIEyVCDE)xy^`zi=VPAs7sJ4BAL4_}djP3A3v+#Uj+);Am@WQ;UG%sG* zoz~7l$@7K5$n%9+DUlamf%kIx{qu#v#q)(({>Te&!Fw|*I~~u$BJ#ZOP=bR{@_b>)N&B40 z3wu)ELkZ%AqX>qhA~oxI;Veq8qQYe%eY?ESOgvv0>>0f9=D+Eqc;PzQTZ@wC3uCvk zQw){-fpv@QT5dEG&lhIx!ImDYoWL1C$@7K5#Pfw&cCA>i`->iF8L}b%1}J&HFgSU> zFhuqd$&zG!rD*lK74{ZN(UPPYdA=|^rL^SdKS|N@*acddOhl8I4m(gA?lssP;j67eMm12`%0M>r8 zYZ91==L@s!HVN*=dM8SrFAOH0FU+!Q68w^)N16nW_A=L@$?2Nnl2vFU(FUE&1J%qDk-(_W3B81a*Rw=L_^~;2WIGbe#< zyC#8|c)l>pZj)dY)|DvvsZ>9V?hIZyH+*=f+{>C1qx0U(<)Fn2|0Hh{N}ewawzOM< z%?9Bfop{s|CC?WI3&cPtpMlp&O=;kD!E+Mw5XknJ>vnt!-}>Skaw^M&yM4)(r;7cQlKi9F%?!eDZ)lT3jZRy&#RCddz@_5`hw zA4n@=qdnyhu;)6eFOpw((+>$|tDu4OBS9%jo-Yi^X{Y4K3mcxoubIdXqN@omS3!g5 zeu7b`(k~%XW2n-~@Qb)FoFA@S7+vA{!r03Z>ZRRRXVcUhD0#jxcE)?cFxo`*ud-+u z*Syd10uG!g9B48Y*Vn!F?-RY01s9X{bDg zWdcg>MeV|FQ_iB~=*m8jU&1?0{^VYCVn}e#qU?LohnU|*eh7U-@HO&7$TCvyS9K~3 zp^a4kBEN=Et@<=L@s!HlQBIIuZGw z!X9B<{wrQsJ+4ruo@V613(wQg(}Kw>v^ZU@CeIfJBQI?W##x26GI-&~I2Rz#3-h}0 z1x5w&!e$g2qar1GUU&kf<52Q^VQ4tV9Y{UAFpqXUFYJk>2lBk|4uYYmaL4ckZX3L? zT|AhwC^;$B+cs#U?nYiXiKd=I;rYUt*fB)50$Pq2zD~kxsEijbqVy3e52D=4&#n(o-nL8*llE+^=%!fXmR6ZBVM28EFXcd76Kh4BRA z5YHEeRgizh3!8`2lX4f)iNFiD2GEvrcZgTP3t#iR3NZK*yLb^LyzpUhC-K6M*|Y$8 zUicfq&&Y-63u9~ZLX=$g3|?5+l@<~EpFwNwqwhTJAL3C3(3c;cFAT#XdA=~*Fv{`5 zanp0%NhCC%o~#y>@xty+126m)URa+UmY{OHup=9e(#A|)crhD#Xk#WXe2fkEq1tcV zSL}AB;d0LxuBB#$YPV4PaFZ-v*!Xm6P*L%iY+k4bSEsy`blkc9s24B1jTTZbQ`M8K zvruXhh35z+pxmmEJWEO?N$|q`*!msSpUdBb!X9U^B!!C9Y(ZV&r+DHIb^&nDN5ZSie`U zc;QBZ4TxJrv(I*PtzJ(0$zT4_37*p|t#NQXHO1Zdq(G?-6wV_!9pw%Lkys9Y@P{1n z!Z~bxnd&Fye}zJgv)KbmJx}3gf@@TGl)@Z>*HpNlLiKYv2vnqo3Kp^DVoGPAg0Coi zKrj{6T|?nfEXx{0Y1UF`b}oPP0u}t1!qo)lBF_t7c*REcViMqmd+x*mi5Gs3WdZWM zaF6a>XXJTdZ-Vnx5HEa@;3?#J;lOZu__zFOt$%~wRcTGU@GmSIm7~8$xuaIKA@Di*SAOZ&&3O`$8s%7c;Te5|CF;R8Ht`3Hl!yRywDtZ(QBVz#tVnh?ohSO@DeY4 zDYjmhUcd_<)v<{ej>Rf{6y`F7cL}W zfs*|5g~z^Xqv3e%Kk&j;)PIHiwJSQ0bqbWQ-fdmGCe$`U{M1eTw1Yc`rbcQcrYUrw zq7BNu8#4G?Jlx^h9lUTHTYFM{mMm3)M`lSoS;PyEW9w|HXP{IY3JuO@=?SF{pwNq; zy9!MxyiD+{3Uw)@{=?&>6pGYPL07i4Vaq|N_954sn3f=aC0bv=enBZL%bR~AZkYBD*ks9+?qBEsVs6bcZMuOhR z^FrHmDx(h?S)Laztxhk*3zuMDggh^_lyrrZ$O}vHu0oy{ZY0=%I9BmOOXs{lz_D(v zIecgKB3@Y3lUqFUywGg<-WGY`@$pPql)(#ctWnGPzej3yX=hP3FFcI>9Ev*jtsMo`9%+n7uwde+fQ5Jh3)x&d0uFqJlB~zo-gd8V-qjzLGx!I&kL)(kqpt4 zvnYcX9%3oCV;_#HmIS+aVPk3oFFYV@&g6v?L)ZU-7d{)R)6ODWj5S_3jvYRPlApZ0 zp+e_}Q=a24;}o_L$eFJ5T=oEX_IA}>4?@4={y z7g|zog`~&}k0aq&C6(iaQ)b%8vM7TWj@1E)7oJ7l8OZZOGp3zImJ)ekZ@iZxc;R}k z%p+W;;$L*(#0%dKyL9eF4UeIX&#J|zbmWBt$m@qZFT9uFF64QkC8jc(NY0ITVNF`` zyl^`HsVL!vE8^bDqL|eB2<R$urR-XsG*eED%x=q*o3U;}$&crSC&iY(q4+lR9n$TV&UQ<>bYjIHK1Vcd1K?CP829S13i3 zz*6#K6jMq|c2|lf!EM-wpkxvp8ox(aWEaXN!NYjR%AZVvV?u&+7G_v>?#S|+2`?N){q6E3yzuY%9c`>kffs&=;Vt9`(iVaZ$PXm*^N+OT z53r~C<@}=)4mGDBdr`)INrQKKi(bTob^Fs5a6HgdMQ>cDc77Zh_ zomEtSjr@=2g*M#s+>h*zq0(00u{Bg`Tp<_{hKkwp-5=O&s5GIv5%NRDEId&()_1)6 z^9{pLIT%k%qtuOv&w=h(W!*Z-_8Y*Vn!R;+uX~|^SG*r&Uau!PNMLoi# zN;!*?qbuWum*ed%e{wInEY3oUvhPKMFb_a}2t7z}Kk`G!GE(j^bt(*@$y7fhzwSkg z2^OlLA@mKw*T~WOn}ERaWyhpw7YC4f&tKfni4eD_(eD zT%kOHb17apN<&WzCRftpWop&)!ZyK}a@~XR*G7EZzCaJmoxy+Zz&R9oUic=#D=LT= zt|Isv6)Dm4!o0o=FR2Ra$JQ{1M?Ji-1?_rXSRYGmSbiB^Qf3!ftA3FQ?&817sD%nOHyGbLWwn+CSU3nyfFw#N&1 z3AapM#v3AAZ8csvlU}`wJTII}@PP{Ag{1_m5T6+0g@4DBJ(3G@K4xzC|p;)Oq`YkI!$a&~bkN_gRFsy#2fgH1z`=Y`J^JcV4s z3)cl~$9wBT6fe9zUpNc*TRy|{!txwcsM*RKjDSHgkj-%;m~lyD8~yQoRaGX zkkI`8WVN7-7v6nD;Dv5zfm_NB7ol>zFnu+Tl4xTlFWildwNW`NX-MPZ7{Id&F_%K3%{mj2`W06+VamA&aTZ@rw5XbgQuw%FPuROsV}Lje+_?u z1Em&IxPag+lsg!bXGy6f310X(TOX!+r2G$2_?F;vRHSALrm&^tTE3s7daqOPyzm1b zzzaViIFYI&Q1Leu3V!52cT&0mCA={7Gsg{7KWFSec2Bw~URdWk7S)mGg+~w^u7Y^s z;R2}oX>Z3^Dxa)))s7aZs6-9%H0`6VmUcJN4)S% zw)UaAJ4&5MVFAIbDzv9?@Qsz-z9`j#LVtp*RM?xse1dmSk#=5iAzOC4iPxB*f-5Q9 zLeLA>3v+dq#S4d#FjPqiFMQZW z!lBUAq<3E=T;-9m9CLm8RZq&q%zV!d5Caq1>m$3*+HV z*6!eiFR``$&D>E@ZXe*0S<+4x@xo`>+K=ihQ0fs1Ul1%%VKjwC16hSbsi7455d24l z{uEv#cmWlup@Ns$vWe19sQ4WU2``K%*7j@PtKo$g?;EbgUbpbL5K4GqNP!oI$WrXO z9E$Z|#5MN3aIBrQS)3GupyfFCSRw1&6$(dt0XW>7?=XhQi+isMd zv%cZ3`>`MK!b|aAj1pcLjA{21-7#KxBh}ZdS(l@$&@#6Br~3TWPSM)9uJ# zi46p6RM3@ZJBS4UTKv&{Gg2pJ}g<;R|!q^9m zEYAxIo6`&N!rQSAM+q;CN0glsdEt1x_xor zeN3}Z!V7~f-`mP~VeIAcAZ4u;S}b$+c_xl z!Ux)NRQujp=&r!o6Qvqbm_qQR3N z9A0?gfiy2(xR}-!qJ$R)BkUk6CGx_Rc)yX~^TOZ)7i9S(FZ>@xoA*a;w$jAzd1_U|-^ex3Zu9$n(PI37$j=FAOm?s;Lb!wW-Xd$6U)o3Zvs2`>yLcwv@ZE7r%WM_RGI7yoFK@WSAP7lz0_ zR#}p~xg{xDy?zG!Q%do?Fc{&5*(s$ZCn-hClW$^w9R*$(exZREhA0^YWy_Nv<6SI& z;Ds@vT8OfF;Tp`P$S+TBBKR*#cwxv$yG>kKTb?W$#%V%+d9n#XBNenf*@ECel<>lk zoa2+VJlR?&PRo-g;5k-FTAsXs;CvN?O0FWf62S{Ydgk(Ev#>4YEQ$wj%ag-M9*PoP z82ewrAC@P_VSPw;&kJLZv+cG#ITh;^l>8*TFeEvCtz}XTtKIZqj#9kveT?s-!n1>A z`@ArIHXaZn`-ox^tm4DLPl6S+w;UzBFc{&5St&LNe!=>)?4B0}6TC3XZj&H2oQET@ zC%iD2;DuRsO@fovBTa&u5XEs2o-aHNZ)f=fFO0ThLX^Em-y8GA$WMY>32s3NFN`}Y;R4$v zc$n%j@@tL$O@h}|&?HzuFb^fXFeIm)k~In1>BMOgl;ZhDNty(OBltu^eiD=r?2O=r zAw6>v*fw}!sEr42lVER>_d*FTj9sYU50juh*0!>HUKs4~!mQ?P5_HAd1tmX~+J@1c z$qU1Wcgi)@oEV)~?{E%U5U3A%m!O0f23y)4fz1ZtSgP+u2`>zm9M@eZpMf{|Fq+c9 zdk@dsDB*>{m+NklZ+-C>t+8pa{f6a7**q@{wmdglw$hU6vT1k@`Pb@3Dy6R#q+{o;S(2&4V`gR-;exH!VAM7 zMC4mvTun9&m7KdccPQb7!N#k5WGgLMp)stXvNM+IDDcAIgBOMV))@@WPmPbBIEk=Y?IhA|zhegPe1f zSNLGKZ*7MchBGBz_%ID@lNV-qw#y5{EfZcCqHJDxHNEPKJTJVJ;1(6c3&#_TLwsU* zUKo$>WiGh!!f6;LdlM@~)mZYkg?;Bf(14rWp$Esvd=%2&!sB;qcJ^f5!{M=}Ebzbi#OHgdBgu!o&;fz{5N*Y|1WnM+q;i zB9Nfx3y)$`TjY7+1q3~i3%oF3J9uG;;)OR}cq8uXeMZ6yqi>1!4==oo{pSZ>7=}f{ z3&Rbg951}@`CRvc0N%~XYC#z_2PxA zX(9C&RZGd5k5d1oQ1>1_qEPN;NS-C}sxu|Q3u`}L$(=@ZN0h2YVJyK&R3t}1W40`! z^d73WKLyVV5BCAQup>eKy}T-!>f+NV6r9I@j%LdN$n(NyLO*ldvD)Q~{pTJpB+4=io^c-H;RjrB_{(xl-N_gS8(36z2C>cEd`NBcuWbi_B@V2m! zWuIWi3%Ahj|I{|aOT6%j*m|YDoWH?UoUVp=VdaPUB7!_GG+T~qh|RcE6RH~`dfJkV zX`wBb5hZ2f%yMq@lVCzz<=gYDXcx0BelSRC6#|AsN z7UNjSK&ij5j3yYW!fzCo6D(Gtl)@g5aCbtfl>bMJo^zZ+#UaJ$n!!orrk?)$9Um^ zRPV25xl3^Fn#6YBRiD4w>1nQ~zY-^7IuiLSF^OP;3c3>iBluATU5O(e8ZO^HUK4@flUU={c^g_Jw$O)h;%x3Z56f5HGhy8N6`L zNpwTJ@HATLj65&Al;8qXI4k6ChZmY9qPV7g(GNf81lT(j67%-`<5g{ zUic8+2jv$pG*?cHY!{IiK9BcVRK^P}DYrsW%zvClkmrS#n967(IXB{k*V2mTg-!4`Qr?cORxEc5RAR<-g%m?2O|dqXUCWJT&xw)k z!ImBm#@Z5jRATnr3U)0+-qe{MX~p_P{Kq4YN-QTY=GaFhOOlgMB}Ge;=VR}o6s=xc zN`8!DN@>XerD%EbI_%e=WO?%UcnvMGX=RUA-GO(6{K@iUm3Yr}A zKSe;%#k`6U zF#Pv(x=!uvE-#n=Ue}|ix}H;A-Cfl)Q#aF7Gzku(dO!I!2?h}iR6&zqIKd^zCV?mC zEm@ObfKHqy!R>f%Qj#XY3k1)pph+-`;4Ks?caQxpo&>%v2Xgm!<=NpUxbr2+3y@6$ zcjX)V<0M#u^$*!K3Ea+7PlM)t5;VJ?ONX+*%8laaF5-nB$9D+1P^&p{P3gXea?pZ6 z>yg(U83b}0j|)Dt4g&S0dLLvE$SsAiE*1^EdA(>#1MdPn=OBYX?kfp9$yZz5L^ch! zhp^lun+BWPO2c8Y)wKFT6H5c^LoDy0j2C{M4&XHNWxTNP0KYFUPsR&t)BB*2GDTk4 z71Jij2GYp{eUS|$_vgax@<-Tn7uDCuuYvRn!4E2EAhmjsk6_4np(p1pIq|}MsNW9R zAiAC4CKWV@UL=@`Dnnd}(HN>+6hDYt;q-Xr;^@kFq1$s|x_asN)gNf;D`dRTJ^9QN zhf({7_*9IH7rLcj79TnXQ{4mEpYcK;WToL_cE?b;UGK3qREFcbM9t~m<+if$4K}}D z-AMHf$cBnr%EOYZ<1JQHQyMA{;<+E$P;p;HSYaRsSX;gQVR5KT#WF=U4HdUF39HFg z)2f+l8Y*vLc@t&#q8@RUU-o~D&Y4ev$2VEz%=5UPBbiHU3o zc?LH=bt(>_wWwYl*$~=^UY`j2C*tg>W+U@WSi=O9#XYuf}p2GF~{D;Bi#3T72)f z3|`nH9ZX%6os<^c+r34zb-eH+n)(1`yztPJ=#j60*5ic>N%#`g@xrB)7Na^|cuYD^ z9yQInP@fmB@F<6Z^k=-Vf6DVHrWr3Bt`#Bi!q()pQeMTVc;EWpyzrcOro;>1q=9Ae z!mEos%j1QWam9dNeUFi^w)*!AyU?r7$avwl1ly<}Uf7G^V8knicwuci*+aPC&I?b* zaDtgwDSE941_ZtU#>kxB@maxu!bdBFOR(v-~OV4{CNsRo_ut|NDiNs{!aw@^^eqj^+5_ zg{^2I*Pg1Y$r^@ottos!@Fprb6_V#kxnN1~!YkQY^*H}91LcNM=t-~#s*Us^er-8xJT?K4=PkYCvURkXu2t0c=-et z)sgYSCke)@AYM41;3F0E{lcn=+$2zy@{JenN@*Kpyl@D?St^JZP9%5;t z?|I?Cm}R{1gwwJUyi8u`M-@U{l#N(;;jm*kLh-^+>B=X_cwsHU_bP}N{!Q>FGG6FS z~uaHpcDL3=W7PD`!lH74%24JI*G#N1Q(-{ z?jRD+DOiqp;ZU}IM)f=L52DchN$zAQ*N?)31b3)#B!yanFI700Lbpj!P*kOzmtVz} zYbgyy<+o7ync!2@<~|C8vGk*J<@ZxKcrp*YK;=(RxSe1WGG5s26d&0SkpM4z`Zx|q zyfFV1cMxpG3wu)74H+*SLvV!(;)QbvW+UT;EA{i%-dAhqxBK&0S`#nq^faIIkTIv8 z1p6UlPP0zUa_aHIe$<|bA}`!1wp$WB@>ffE;TL__hj`&I5{4qEcsl;XVbI;__q zsyl}W$6)zlzUiNisz0&Dj2HGy*P<@U`U)@Xqjtp$ zmyqy>l8hIAltx1b8g^dTYziX>*|po6U<+i|?y+TEyZx!%5AoOLdB)q8YDy#V1q!E7 zaUv@D5HfgiI^1LBffs(s)~l%=Cd)>^Be&#(EaHVHvGoV4KS#MEDD3qNOHU|w0EHU} zE>&Sy3ZD_Yuflc|HkiuSNl}#=DnE-YCsH~RRbNcOc%kpDkoN0ueBp(!^^Mo!R&s7e z#tS{Av{8!l!iTXwh`7e$h1aI*a+Qu~VbdSguHODm#WY1m`+lMON>WDZ%fhDX93OMu z#Q%onh!;MQ+V&{r)V4oQIpT$L@PCYq7rHSY?xZ`;3%{fK8#NmWx(ctPb{|)t=QRK5 z9NN;AXfln@<{0ft^rdhZvMcd8!96PIO8iOiqYAnbyFJUVg`g@mW>;berNO9NSK=Om zG01qK?>Sf02aPP_g(sXqFT@M~!oCz4FZ7grqm;x8n?DEULdFZ%B3Kh~tm1{9UJ^dl zu`X@d`Xu%uUbr=;&5-dzx0RVK@xo8inewQJ7p`z(`#U}K?-%;kd}wl9#tT>H|MhvHdrCtW>fnW6&?Do8m(l!CWV~=}d^P4D zMZ~Cx7ryQ(ldwO5n%x&o;)PFA8+qZ2adR;*+%$ImfAGR>Vs$=v> z@WSp~nX|b})!XaBi5DIccND^98Xm(te8X<)c;N%&-G_`9K1c90GG6G3xuPbrb0c1O zuR5#WFPw+}Qpx8k@3Q| zFEXBy@j}nZ2jwJQxF_{HBjbew2~I&(vKTMChtgP7aar8ua(SVfa={~~d7Rbm1L&i8 z;oGz~6B#OTW4=*}qmubp=gO|-Mz`}-;n*SHgD*Y)gtZnKDsfXuBfD0tAL>t!vRO3{*}r0_dJb8;woR%k_#WO`oTAuuX;5`+zJozQT0u(AI#oiV#Pd<~5 z#iMlazC5{v+$oJrr;0&y%A)5qlFKJ}gBzWv}dZbA(68~^ylfZLIQ%)MuwbfsoMv5lESnRhb zMU%i&%2Je4YFbTHiYCDX?2n;r61{8KFG^gTfOy}*fiMsU^zlI4K}xxhFxW=X|=L! z8epTbT#7PYcyT&_!_AlR!l~3xk|*PZSEcu8XUY_L;V&4zK{k*&yvj!aWCO|lyv)fT zVNY+W_d+(19wE3-1r4NG1aBbYg`Ug{9?6Lpmc7Qm&{u*6Q7;MyAR9#I5)4F@cf@XL z3{_qeKUiC#y8h_Oc%j>KVZ3_jL+U=7x)T{MbPxZCNS-*1KB4-3Su~8?QZS1Too25y z%8>mTFZAJ78eX9(hRWM|kFBB79p84yhKk$D!Ux!VsO(Sme#nN3TgpRC*6|kGswoYX zWAPk~Y^b=eBK#&_ZS{b&;!qigj%*n1M6iPjx)&Wl&;y0as?)Q#*v0oE-+0+C_5=Fy0`nA zX6tz2)iiY#%6Q@8l<1MKfY#%McaU%!s^f)EP?~`1cws&+^5ud@O|vf4=Y`WrdI9Or zcww`Y=TS^EUN}iBLgIz9$(g0RicWC`{cm2_I=&`}7yd~D%i@Kb6nU1%3m=NN%v|uu zS6iJI*3hdjknzG_34T^Vys-J3EMp*EF~ke6O3R=palxGzcEGTfnOG^hum}c(aGnO- z^o~CW20TN}PS|!px$zVZAn2jOI10xS9Ie6_3TG0WuELcRh7w$aLPhI1e*P6NoFC1( za5)PTrq(=4 z7v6c{ceuZ?4C94AMbH<*aP1#nIFtRCWxVjhI4q18wv0E7dc5$8yGugVd8>xU_RS7s zQj=_lxm!=aDe}TD@WR4OR{hv%Jzm&_jh#?EUbr_KcGkvXUO0jc=b+Z>_oxmV(QrLp zIFp*`sy&X{@i#W$g-zaK*^}C;^Qo=R3pZMA#jtUYtm7fvOucyF&9so)m8w0-?1pmN zQMig=7%Eu+$@8RKmIN;>JW?56rTQ89mta}(ZQvoQQnTgFsNRv%R;caj6pRT!f_UL%f+vyjLT`dsm2^?F#+(<yoAcA3qJI4XG$MB+IG%MmYJ zwYEvPnd(bXZbb^e5qzOSpwR1GzRrbmzmPnZ;93>FrSKiW=cr0MFJA}m4)4MBQTfIc z?j*Pjwb_q0ki>FT9lCLS(!!?C-7hRcq(B+u%Z46EFM_%iGG)^GI_aGTSH^ zbNcbXETlH8io9^m*ltPi$X_ktg)6Ja;)R=$un96==*F@}Db5Rb#JW8)Ug&mK z8|gW`aFTj1UbsJ&{ZPgWyTqR4f=AilvF{gtPEHXobO)>RG0R`UoEIKVyGN>RhL?EZ z7OC}-I)9fmJxa$WUU&ws{>XTt+X~@!bv8ba^a`p+S!2cvcZzNC)WQ^HeT5fZr*_2) z?M0V{K5-dO&>s{8h`-j@U5PxkBV!XXZQ{yxe52mpC zM_gD`QVSV8Jss{Z+8w;`FSd54dNWzB0v@>~A7l|Pe1omGQau{wo~5vu;CmG&P}uqZ zxPPMDy%eq@7^=cp3Lg`^g{st0`3G!i^)YK9sQPmX#tVIKg|uIP;|nkRS{4W(VZ{XGfO2{IZlbYDrzNPSt@^gz!U zjQ?!Q5ih(uwe3;LscrwTa>NTS#Xk}mFLWah%c48Z3vZ_SMl~A>x(bt0yF04SbDH<& zdfJtkjOig{S7PN)c(;t~N*qbhQw3d#2MKOdL095eg0E4P8nY|0!5p6Oipq5*dJ^n{ zj2HTzb47j7$TD7d<0bS$yzn9H4MtgL>#Mlp{JLGQ+2FM zTkbKOy@(es#Pk_5Ug)+mvn5_QBb_Oaig@8R!y+&AI+mxRzacMNE zOT`PfKgjR0Bk7^@Lf^`F^R$)k7e37Y>+?eQl!j-igBPx>W7GEwx2E|`knzIr1v@UU2&4<7kasq@0K*x{Kd z`zzfKD)f0gg@rJSgAy-X?>f3TgsRavhoju-6lM{;qC#H^E6wFCGs+!Kp$EaPs7ei# zU&@x@l+HtKZ=hhj@GgQyR1duhUO0||@xpEg_@(fuh!?Iif^LWxPNk(O$avv91T#>@ z{xNqsywEMV;88qq@xou#ym;YHv{s9Z7rHUuC?)a2{5;MdGG6HZLL-0Tg)Q(lM|Hf= zlS&#TC0@8T32P~-9xohyaCW|O!J{Hxc-Tk|NW5?}@-{)n3*DG+l#+PiE_ioB@WSz2 znI=8;qNoceUU*;JWe97qokjiCM)4}0zF&9u(?DUHlexS~Z z7hZw?GL-Sc=hEKlqLkFNpj~IY(5sih3qMFFX#@3m*ntyBGhR53{ftG%3*RJo1sN~& zoP1DD;)Q=uzeoxCe&O2lS#3g9vKTMyNog-s@k!j}a(SVfSYD2Hr+J*!{+H87@xt?I z?_6Z4#EtyJhz2Q+O0L9ux$HtEZYre6_uxy9w__cP43)UOq>)`K)}LHPkF*T=1pW!g zP>JW1rW}8XWJ$7_QnY&gI`&tUq9sXBDN9jGscAL$Qc|=$IT!mJlr2v#NY~IKpSjKp zf5!Wh{Be0QCHxqphP<%iGiDRA<;hkAtDtOoGG_3LM_gH7p4^b?_2t*{=Oylh+bljY4Hvy!jU|PgbVa50BEp z`|{-dB;Si{dD2~cfhlGte_WoNhV>cQwLIyjLW~la3haV!!`QLF^@zx z3C0oJiEI*hMlSrfXcA1NdXoH_1ak@IsGv#kJ;ArgCV?mCEm@Obmd=7ELD>Sjhinq8 zN6=9PO@b{6wm_kBtJvG(N#NUZ!J~BWJ_+_Fc~4}Mz+L&q{x}Ja#(Jdengnhyq{y51 zNpKd{Gg0;QMZEB&_zol&PS%{bru5OPIcPzktH>LL3<9|=A4X#HK{$o#Cy+rP zw-mzNI{6H|?rKT{uLjS2WDv-GCE=T=Lxc~; z57t&VCSJKXx-wqqcK+p+dg(*zAe!0_8837X|I|vJIE+S7JyaGABexXH;zMT|)svC^ z887tVRvHeWDTc~F*T$jpJ-%<%oL<1)Ru+!O=0oKls{cYZRNPV?24x*@ak84yP-(u9 zPZP+7iu?H4aQSMh@3~C7bR`Zfg?8$X3&;zib*RTVUA?W%r`()4j-}?C9!v z;cj?$kw3c^?UU|B9yPod^~QV%vLSRj!2o1K$TN8Bs7}QpG?MCz<<}5;kl=n5bT4|E zU^23MktgRZSwrZ*IzhS@y^ZH}C21J_L{O`O?nU7%ezuE3s61jB_afhx3m&DLw-20Z z8dwS0y~thp#{M{n*1_6db`2u87gFTS`+)in*3FUq@kp5LQ^3FCg%79cJDGDSUbw$L z-f6*PcUs(4tr{96#) z%jbsjv^W?J;zCsC)-PcdsB9ipW#96joT33_oQ!hXGJ;^33Lj9oiQszF^g;^WRz5|o zV;@%kvHgM@Xm%W~vN8J4mGY10Ka>o}g8hme)MzIa=fszS)M_Yd z^*Jw`rK9Krrcua+P~u$A9%KR||H*CptH zco7zYy+59u5Lz*K9Km+Qu%($;eA}vsuY}M^V{CfI)5KTKpyp6)hoIc?6iy)Mt3q!I z=MW51VLu9&5{y(~R|+=~j6tDd>v%Q(6@uM3o*obpornnbmi>I?Vn>l55bR&-nh@-G zcJUC(5bObBGkV19Og6oW48eX!@D&Ofg6)@D^N1SzTg?${{#)EqFa-NqWT%`!?H>f& z1H@UDA=p`QSQvus8(#qGA=puOl<LJ*j*w9@Y zi@&mY3>yy9#$p6JmJL^-)(`De9VXClJp{Xen*UR64Yiw6Tkk8IYktRyC#w3J+WH8# z=V~C>u35)JSbb-X9|YTm7IG(1bre|#qTJCG?jg7ZmGlCRdJ@klRuTyIY_@(%^*i$S zr_la;{?#?AlB4_*w)CR3FKRoQf+5&jEdasZPjDqwm!Rq=D3m|Xf8L@r1!V{}_OlRn z)h;J*^2jZ8QwX;A54`>$L$H?+3{gP{c09p-DhR=TO7J17QobSBRce`6$Pny41iPr9 zuWVjSFc_`TJMMJ^JNy4YurVt`usdcac-aUxo&Bv-6vykNmRsG*5emUROjjO6hG3s1 zn5u#h>`a0gC_}KZ3FcRW#vH+ZhIO8DgQsmKs)t6%t#fDFO*CfHvEeP#0wf*VkVV7K+w7OJ)L+l?Pf zYeKN!WBF1!La?oVWwxOV!FJDb>LJ*TsO^Fr!Nzt$urcyCARyQ=x3Lc)*gZ(t4P^*6 z8bPoPQXIkd!g?^u5NtG6gvIn61iQ6b6@on;%W)_o*ysbn#wZ(!hG35)rx?LT2M9Jr zncETUAlev%lbYgwK{#gP9 zd+r_aS{y~r5hz2jF$Dx0BTw<`G63tTh-+*JHrhhCQ%AJ0={U8kPZSqo8X{wcV51KN z+n`}`KJ=W?_^-4aL$ImsyBp@zw%_PZ_9Fy)2maeohG3&HA12ZrN3f4k{ivD^1zm+n zsom-7^PJ{$pP(&WiJ6#QKz1e8U(5>^vMVu=;6xR4C7vgELIquk$|d}w5rrx>W>;cI zwsb?~x)LW6^hOzije7>craow78G>E?E_xvZ`vUgoP=;XB5j9Ln2=;xv?;=C6UlJ@p z9IGMNm|hZUb*xKUzB!J)2*Lh^>35VN*k~&=TOEQ;y_^xFA_O~){@Np6y$%E$T@4Xz z=cWA1Gh_&M8-lG6v(ymm_I{UbvTG57jazw6p0m2E zzP{}U_HuT3Da!szp98dg9#0_IbUs#d#~reNLf>lLp zhB5>jjUdUO$thG1h>2xB!ohIbfyFR#)G!Ja~1KV%4Y zD8czCL$EQCb+pt(cJhT_52Y1Du;cLGi6Vkc*5^``lDZDpt|Nkt)yqP#v5KFaR*#1r zxW#?!OJCW1n*B^fhG0J@n1eC|8*}oOlMrmx-wZTl2zG0NO;DAZH3WMirK3^BCoz5b z2sZW0?G8vetBW3>k3z85(%#i5L$Ik^4O5&x-Hr7w*$u%)I|w#Lz6W2;eG=L)03j!RW9+j{{_y+#hP=;Wm69gM0f4ydv_nP}j5fGS%{ZpkFf{jKHY{QhAR!1vE zE55&AUxXrpjm}(H5Tk4q)UEh7`G>nZiYvZZx72hrdosq5hdTu^U z~)M{pv_5NzCC!IHJ&yRS~1R(vnUGek*R@x7VgMisQ; z`vAdx2m~8%{>AjEGQECyln&lke4izGD#{RS^n+kyl>BkU_g$>-$ZiNWnn17(?7rgr z71kP*{bdL?S!ZfejcmQmgB+z0>|Yp{qKa*!W%&p;zN&#>W8^PUOoHDZrcF(PRYKFy z0%Zs`8bPoPQhXA0#JY~`ngnhF!8Wk_B-j$`7AQlo(FB5RVAmu#Rz1=r*c<pwn6hg2`~-C_}K(QV1QeXyCp0C{1bL{fXx{lp)yYD+xQuS6lrZZ>Maqt(R{a z+M^7?Mq6pjn5LL&)=BO5}Vkqhgo zQ*j90M)i&I>t6Ic!Lur82)#`(6J-cC?k;c18bb4Qpp2NI*7>S`w^` zK(H~r_+I4OK(Mhk-S2(itVeQ3lp)yEg+~53h_=DHmF$LKqa6g>pm`rqdt==b*Za$H>+X=y*hO-|s1UrsktO`P~ zFB3e6s+4F5wuaIdC_}Jmj+{h22=?p=bU+9;ls64auo;4FPhkyIv1I!$cAU#Xu<2m_ zFGbl&Y0!6t8u7&%rIg6*Y!*CE*G0Kqo! zI)eR{E_{ucce!5^PkmP=1Qk(kxdBpZ+7sfc2aRpd?`q+ zHb$^Jbg?#sVDqfH8e$!}pbr23CsbTi?8zO}q|mEgz4DtZW_VAJuR1^T z=Z{wi{jr^ba%)l;LU5i6Eht_5If2?g2=-m}UltK;92OaZjrZVs2zJ=5C1K^stA+s`v%{!E zuxGy)5$s+d*p1lXx~Lw4J(LXxX=5>hJ(~>!w6Pe$PGrM9sP%4JRfjETxE_LCOiit7 zFQ)d%cN-wsEmmk6I-#nYsjZJ-2d%~f|JKbq9>Qemg<$WXh1``?okiA3C^wA4GX#&L zl9|9!PvTd4lmvqPo~=Jqy-@xyC~Q^PG;D~f~61t8cq1b0() zGpg=Hp?nMe^97|@$Pnz}*iU{XPP?4E$;MC9O(EFRR^;^u8G^l;;5rqAU|%Mfrh*Xc z&jjD2D&-r3?c9`kg$%(SOVC>dA=n!UMx!-WUoSg5E3mVFk6=5*EJLtoZC(kKZju7mQKSDUEo+ST& zD70_JoebsHr*H|uU=`X@c%9%m6;`3J>PlQ0Njop!mo2AIIvkZBMqwtwWYnfFh4rxf zG8^!9JcW&$^AR7FpF!aqf@6^(*jAl=WFJZb2)1@A2P6bL2g__^2)0Xg)36pY1bZ66 z@hS+xP9k_18G?O2o}Lhfs&CK1DUM)I#dX{nvF%Cn)?+wMF`d%rOE3r_Ksk$pxw*VHp5E@_Se+H&?!3n}bI#ZIVXOeKLg6+cAepDYR%YN`Ux8%(t1bZo4U!!^|$_=5=VHNJ`D0e!A0R(+i=u6=l zg7GRGPNA$NZle#qF@Nt_f|;z^^Ynb*uSU6YjGAiXCgzeo>JN< z#jne7td}4zgb?gb>1u38N5H8apQT-WqPPLmbut=)bss-S6Ejj@7B)T1bMD1|x8(@I z_DOAflyYj@Pf(5!>?Hh8AVaWj%!mExjw9GtsD4S!hJvobS*hJ4)#o|QkLG&Xl~{o3 zLu6NC`&LcE=E$zZWds+fpeykK!5b>*O02aiuiU6gjoFpxMd?6Pt}Af?!D+}4tnWEj z)CY|$L$J3!M=yk6Kg9k%G6d@>`9>)T!G4SPYh(y^DZygIu?oR@I*(%1u`X@7-wW(T z2)0FQI)x0ux{XIEVoM12vUH|ADnhW^KOYgS*YRwv=x>N%cVIu=ks;U~1p6XpsSs@F z(nTkLzk9UnuXZe%P_#84CTlAQ_I3VWAHjMi{DC?U>}onTA=u++{%~Xn_K}UU9l(HM zRD@vv;UFw!H1;b|v&qpU1p6(u5y8%mn~M=_b?o~8K(MRD>OAjpvo84hwj35ar=u!0 zP<|3yCQ!N`wLOc1eGB$tf@WQ-!>BhvutO;rg8e&PZjXu(?D{X#4I$XCXsHGng8hr& zcT~}Q{p=8zgJ9jl4KkYJf$LkaOVzv(Y@5}ahSiZFST}ORY><)=?1p$ZkY5PaU4<0+ zE)s(6j(0m$hhROaq)}2ru=|m)kCN&k*d81D$nwZPD}!K< zPe};&G`#&02=*$jOh+zL^=MrEiHxXQm48eM0 zuBeIZ+z7$WQD^ln*r)MNMj3*=AnmO#N=aRtXxABn_3C9H*c;MG+Cx1acHmQ_8G?PA z{k)D0!Tv$82pNL)oP1DDLa^(s!5Bt{VD}@~4OPiv2=)R>gHXjSahJh%%M6$}eic+-7`z!XJm7-N%Pbo`LO5yk4UM58=zALohJfdvH zcU-!L9{IHLF95EIw~hSSitn_P@K}r*BG}C_Z;EWicPD}!kgfQ7Zay5!mGu?h!>B%3 zey#YPPB1_Pt@vI`AY0< z@rv(^bSxgFgZCBR_eh?NY{l1I{EMWRnf!6Z_iL;RW!H+Yn+hp%yRZ2EjrC8I{TYJ& zA+>y>Ce_H+(==d(U|Y0p8k(buKci*22-aWKa={~iiDD8A=EcD#L1)_QglrPHG2bY~ zC&9K@w~<|w!0m+;`5t@{?1ObLWRt+{C5`Nw1U0YIBTa&1@E?V25_nE&%1I--wt6+C zXc7#g(4?(ImJW`=uzG1RtmO5gz%4@=0(f-rMERCc(m(5Q0Yy zvBy)GpFlPV-X@rdY!Y}zE}T;|3BIEGbNMw1R#=m(jBFCLCTN9h5_odnk~IlF&{@zV z*c8tOO41}akl+9nGzpF+I2wh@KVrX&CxLIv1&`9f`y@D<#KHP)N z2Vo7>^O12iw?OiA@)>x$s3{G+>UO-4BjalB<0mQPtF7)o1Dgh0H!NGprora6((sFH zHLdoPO#|#CEPYUhU^h(%P`Ryq8G^lm`qA=a2)28AAJkr^h+yBs@Dj3t^bf&eWCO|l z{3Ct&BR|_>E$|?+fi!~PA{BHueURX8WC+%i^Ol?t?0o8HDM5p1)Ao!gWP|7+g8fis zkJwF(p~{ou2Wu;|uRppn1nc%(I9$E-A$1W=or?^?x+kA`;xKxW>hZE@7`dfj79Toa zQ@sG$pCMQuZl&Q&cE?aD)q89WmDX!BkB|)&x0QuUu=!BwOm!z@L&YuS;kvBjElz(c z4wdcjbVW8)+*c9qman$@-kEWz?1yC^*)&w#)+9V3TTQEhvT3Lsjpay`-HXD;UF>Lb z!K3Wx>JaQ1cu$i*yB9T$349!nQNw%D2+Tu~4WZizZbdePJR=ugQm5h&dV=al<=4IF z1A_Nd&=C5PU;(mwktgRZSwrX;ogm$dmg4zUNg76N*5PeGvSG9V!TKmvwvD|lz8Cqn zT<|E}ynWzwBY9h7_ab-Y8~fuR>Vb7%*)@pVUPzHQ?*r->tVbdHt9U+sYWi0Q_T)5u z-{V{g!5*Tarv;NUY4LQmY6x~nx*05t#>umIyPXj12%HxoL$FU1OjJP#_7j5lQI!%6 z!Tw2U2{Huh4HrV$c7|Y=sslo>Ejuvnks;Wv2sT9(Q{rdWWgys_(!tb4*-2^9z1`;O zZu%DNp)_>}$`I@WDbXWe0j-B%PavT$szb2nQ5uZu5bT6>o;-@zr9OhajHFRWe}-UR zO4fmNUe2=-PoZbXJ)ClWlaf)MP>1TP>%u-;ZacvOU7zkY{imw{jxko_4l z1iOgfM>Qt|J0l&ENB$WR1Up2{)gjn-lh-3(l@)^hMCOEG-BAc0xz`bFu4B{i58Ytm z&5sRd2=?SS2ofw^7J_vXkD-WmJKg+82)4Tx*@R$MW+&AMlo($MQmc&+Y^V4#F9bV` z29||jcPR2${r^C)L*uJZE_mc4#S!d!^r|B=1iK}{7AgqA_9WOJ@ggh)dqP@S-kibX z2=;gk$C`=7xBH9uN(j4Zj7{%2NPJ}hHN&tCMY#_tTt{$?3Nt9&LoiN-=O|1fctV9q z6kaBnjzY!acqIP{!TuPpMJ^mnCm8)gu)WvqV%H`Yjucu0!4^P_hG0Ko7ayVw!S)w9 z)3;z3v*~AK2zJ$V`6n_cWC*tNy55>c);Rx32zEo<8(4-R*gHFB86j-0{exf+X8&aw zf*l=)g(29E@dcnBg1zX*k}!sZ=PR>j>JaSGpCW=i3GzpscHC2{zED3OJQeJ zB}e(GY`KKeVAOUn1^X84a0@`N*APsh>M>M(8-?-*`OgwcH7NVx(%8>J7^Hqq-elqj zbW;d+#QMDcAVaW^5j?1Z5bP%e@2VgK+oUrsp(^DYg581A7RV6nIRvMvAO!m;!M$jW zesQl?u(N-UUwN(CX< z#RR{j?1xKZW4X|9e>zU@bL-;?%MtsCa;@9O?tT!XB zvHfsqw1qHRN3^i%18P^FC?3Z2pp1rKuZ=!_xU@mT`L58aJ>q;65kQbS3y@|%l|YDol%t)bv}6HtIv*LpJIoTQ1(}P zJD_b*JcUeJ4oV32@$WdQx2T$p^EH%vkwW!Wd^|?ENfZts*j=^z@{if_ z8l`7Z+ZqanU>6bGP4$Xjfna~8ko|CJGrtu3#;6FvJ~EGP2*LhMOMfCmur0RcETf8} zW5#k2tXp!yqj=y#utVn4yb$bWw6+P#ez-KY$`6;OzGX=X!S0NANBQlCOQVY)E^XjX z2=*YnJy9Kkbt^wy+8`+**yBhzR!Q{`>>Vw9WO?MDl|irzbU;F|1IarB8G?0VK6vCQ z3BiuQI}Cwf|KZ9!!)2-tqa%Wy9CsPQTN)n2JB<5`SLuXcZz69DG6XxG-~nU^))VkPqq^)e7_O*%<))#G6YcKw`v>07X0 zvY&a#5Ny>p3?gI*)^qYfISIjTL;dE+5bSXThodT448dMc=?YZwZQSK@5v-eX!6OHx zoYg*DpJriwOLoyGw--|6d+^oV&#=xzMxWeX(#S3d&__KI z1o#dAFUaVV=ai-#e~Dz3_r?XJ2nbYmrANrXYTyitk8* z;VNjwcMQSxC|mK3$puT+itm9saa!?x6wiZ7(u(gZ1TU!|`t&}*yC_t)jOoQIzN^P= zJpU<1>EM0E_ZyPGLbl@TE*{{}&>vTP|H1l~>{{`4Qz1p(ys!AKye;qQQ1)jCwp(iX zZ%wL^t+)S@qZESegmGO|v3ImA7s2|gS}u6xFHuZ_zZTM_CczH0*B#j;aAUqvicf+A zu=bE$lfdnT6!{)}5*&;5Xk?SX?In%ungl1RN16m@<39`8B=DTllv6Yb#@3LcNpJ=B z%akJ2;VES)N+~t1PF9L0!ClzzK-nZ%KfVLV1&{nfIW3!v_euG)Nw8&12*IO<*yAnC zZy=ilUlJ@pHVHg~ALm=IZW8=W^&j$U613ZnDT-_oY(&rn*(C5}eyNXSO@c#p;xq|% z$Frl7Gzm^3I6(zXf^!H4p-{Pd?04}b@NK!^Q95{^1Xq%LIkHLMu6$#EoCM>r-YL5# zf!hly^5%UKJcV@<%Kj=hile&-!48fu-jErN8m_kGHypIM+B@XUK*rVF#?Q%P^FjD0 z)xRO*YHlfngLU#5c&~j;QyO^db>r);$heyOO2X;#)mAU!?UW6+1F`HYn+BWPO2a7G zYFf>dO#|#gEQ3+};nH*fcbG3jun$vzuRIxoy(+y$nJiO8uwP*K7}-Etr8{q9kqspG z=fYd^M}D>!)m@Pdq_G5JRM6e@d4ee@`{B~Kv%DoI1p6EHHA>JR+I@RQ6tY3okKi~| zc}L7N>N+KUu(rbK@yf-~l_6NS^IbOe(udR-nz|ZgKU|tRW1cvSW>EdIEE-1MOu?G* zq4N*bi;?{qg7x86$^xbhm63Xnt)a5f4$LEDL&a@np*1!iDmzf!9obNEOL^#oMMLG+ zZ{twuiD!RgL&bd+VQcwnt2@c2`_ge(j+ISA#ce!oOSYO;e`pMAs0_j~5M}qG9_e1> zQFe57FUX_tj*vgQ7agANMIJT07mdYy6S5)n1i=JkL&!67;ZSud4xu-weo21ai@qcH zMgJV&xr7pHhez-J7@w(JUuy>Ml zJJO#a*jCXU!UUaP5bPDK0yRLe6UcZJ8G?PC;8hibU_T-F5E+8?w(`NFA_RM~nq3Bh zT}<}x$PjGB&KxDOwa(SkA$jDV5kasyHCKmV*G^uKd{tHm_6V61f^|nBc;sG3u&wCA zDu{`^B*DD7wL;3*!9`LdfG|FsQ6NlT5W`2&xwOi z2)2S%*JUBttBX9#L$L40SD{?+$VZAJ*lzS{TVx1!AA-G95Q06C;CRG~un_E1Y4E(x z;Bf?dK8AD5#NyjgMSLZMPc+7+cU&UAatk%LV7m$BuA=ZD!Tl->rSJ^F(<%(2@Fu|< zDx6B;6N3Lkp<<7CHU1TX-9CMG`<6~b1pCm6T?hle75NKzQ3!Up5TL#V`xCqP9%Tr& zL~KR~w%IP+9+4r~4GGpqAw#g|rq(>N#`#Y|ush@4(K52%g00NoD_ySN5!JdCzNmy;ss$u)zHn2U_A=n|!T89q5_iP_d1i|)Zhdog}1Urlk z7inWLg1ws!w`yZCf}O{PcTnpIt*S#;8m@<6JM7B88A7eUr}mku*7XtW(bOD-s!CUF zh+v-stv>&I*6|S9Q!fO2FD>Lgpz1ENZa}%26c!SEib^H}M?HxTYf1vae#q7}cjKWP zDEAhHJ_LuMDmls*u;pe-qfy&h3Wi{pS^$DAA72?}QS}O{Zb6}ZP5!ge?kw-I#SrZ4 zv7d#ok9IkElmGm}FcE?si){=t1p5lX^C}3z{zUM#3PP}J?!g&CRmwL6dkCeykRjNs z2u7$N1p5-fRJ6voajz?}vwx3Ze~np&V0Zr~JHg9DuzpmGzH}Y35etHSK}RSA`vYD1 z4jFb zS{etHb5;oZV%k|*c?x3*u0Jmw<>g}u=C!KR8*y%m!Hj+n<$M!<(E)cOt1j88BO6@EK8cU4&_%<`0qY^#7E_0 zDcnPF6*2_7aEXuXmq-A?{`x!TQwX+VUrr%5L$HTZ*asPc9ZPVn3PP}-6MTdW!H$ln zCxjo=+WGCa`i<6vU^m*2bq-`0?@)q+kYT(F|IB(&596IiZGRLI?D*JjN$|+ufPi4z zsmDUFmys|E8G?0VS)&w3us3795gCGYJMSG^8-jgNJr{y~0Ly(SL$K3gPjbPdY$O_j z{ehe!1nZ8{%K8d|y+iHV+maq!WhEJcy>O|IhHlz_M6j#iX^QOHbtmYG?Ajf* ztZR1&wFe>o+C0E`>p@fFH4-1Ba0V6qQOSP5*8JjZcf4uV?m)1IvvmyBm&wu$9_N<4 zS%hHsWa}?fe}!`0DD1y~)36K5ZA#%*g3&5;q_B|S6BXJ}*z^E8jjFV-@`KsZpVD!t z`WOoKEm+@MA??>cOMqZY7RPIG7ddwzL$IDw+9<`Z%LJ^CA+E6yY>Rl%A>2<#z^NOk zU45c>5!3TB8iI9SNysQyvShJvobuBqKO)aNoqFq zO6)^n2UMlT>`Gih=|WVlEAbG)SY!y+_na&0gGQDi*t?f-L_)BIgJ>EVg7uVqqm+bT zTj5+->)h6wf)_R|j;f<2F5Fk+Sp!On`aE`*g{@h-epr{fR@22==bHxfsEI9=rZO z5bQUxIv+gp)n`YrZ?VHSQTA8b4A6FZJmrPZi-Qt^-FyW`XE&<8!Z{b^Hl?uM!Mv?P zxsDW0AUHyWHWcnBxD8dQf$}}sGMCbOsO`ZN48a~lFqrDAN?V8OV<{MdeJfpVkBSiN z#(!~gg^i*|pU4ob=j4NO5`yhP{hr7W?70MIpek7m!9GN39IEIS zcez{y>!w`r$N?#5_1rvjPW0)0+ItrneR3o3m*XBh#pzQG)-PlieR30Tl^fW7HTQR{ zzapbgZYpVH*UIj~96b^QSn*K&$mo;jl%^biiDZ>`b){&PcP;E|Dn+Zjo>G>glv2~` zn?QqE0=JhmvTG82S3-|839iI{IkHLM zIi)Eljp*9yc1qDC7>E5%rDzg(N?D3hN=>WU0x6mVPhp>gvPtk@dLQ9Yx~}mHi!<@g zkUyIQlVbu;8;emx?C}NW`N$^0Qi8?ECV^+k1U*-5Xx{DC(lK2jUWkt=2Yf7h-bI{^y z3(5No8CP>#KCHBQ9apRVFE7x@xSCrEJYIu45Cd;7HKl>q4bN7{xSIP)!tV0bRu3%0 zrona+mOip+u(_?22V!8WY1KnE4X_)qj7AxP&BxUXo{?j|48gug{Zx4}1luevaabgyQBW#65@yf-~l_6NSGrZJGA5xFd)P2Yhta}(z z^2A~E8P%W2qG99~h7lGYI;$MX+j?YwhG2cTm4 zesu`d2O%3OZYdA{s8bA;vzx@Baw4ANkqs61@$i{7@YPm7ToH%LxmeDTO+&?PO~RV8 z)wDWSHVu_4uv~_+d(o_PFY+imx;g}VJKnMKXZNB{)4j-}hWDb0n8zac2hz3 zqFw|Cqfq(7GVVpbEf+jWH*X&}Cy{&tvU`!c_%~g#wd9Y3=sc{0W!E5b6aR{@Kn{EaNMB}u|)ld>~$nugX$3M{gm!SbqMz2 zbe=ql*QGv!olMe`NPmW4$D}Td)cFO$uEZ)(0|fgT880D2u=5B$RY3^$CxY*hAy{uK zA3Q2Tu(d1F>@pB+vt!6chG5$gtf3A17VItQkUa9wh#=TY)Lb2c9hbZw`KqiC>}N73 z1nZ7M@W{Q6V7t(T&WMTkSZp{$u-nE#kYMSu5UiVW!6Q4}{6`3O7cH{sTd>=+gKpYM zMUyzcQmdiiZ^15(`xSz{j0Tp4V4KGm6nj|lavnt7GrkJtf=5159Kjw)uMR+lV2>p@ zS_L843kc3fya)@yZk1M+Z)fm0g1r{QRc2!GZB@XDvyu=V*BG1L@qF=>p42>!Z9K~D zM&WsaXI1D*;T?jvRoIBa=LGXr=t$uwf?5@f7C53v?nP*v=6>@k`SH zL?PHFAVx#5<;QZPKpBGlm}*0?9oV!cG6cIb!S*O*2zF^Cp}F7@HTIVf>|wZjS%x9l z(_%&lw`>0(*#ENsvJAl<6^Df(*xzEI9)dk*bV(RX!hp}Sds7{P&2@y1lzR_|7Hla{*Bsh)YkhJ>>z6T zp{lAC8zR^Rpw%B2WE~HoGxb8SooFGqgsP{=dKl$?qVN~N&!}Vr;HW3%vLq1f-fZ3C zI3CJ@aywBNOfUddsoC;gY`lc$^0O(EEcSRO%!VCN8gpn?!=`SE-sNChF-Ehub+s+4aC_7qA-BSWzF z5R6qp2=-%w*=UW`zsSzcwe0NQBiIfxD|-;}w^_Nn_F&;#mn#~$>1iLlXEtRVW5${g0E8-S0j!8Wzb~+!< z)Cqp6^WB}<{d8*jU^+}$Qz%R%cmS15gF1Om!E%IPbBiFHC-Tp8<^L5+9|{Mc+}9Ld zA(*PdrxYqrB9Pvra2P=kRHdDlH>H*Flx|1mttm9?$0t$>Z8}i670dZ_uDm0K)2Zo; z$~UF(48c7pdl2zLAK5cW0KuNU3I`+v+xBEmAu|@3F749@ImyBd8sQB7&V4+vP#TG4eMc zAlPv$vkxKIJ4v`5We*~bMjk}mAjJ{vV^|+W*@K9qsUkFKY6x~0wJHSr9F}P)K8QH_ zco1=nvcY2r_B3*e5Ue|R5OMUT7x0K+-=^J}YMbF@4_Ps!7ioxcWcbvmK479D_a+3eFed;t*flJB`r_oDx(a+K9)wqZrXoDu$`%2 z8`-rxh+uzY*KYK(uH7lr_Cx%&>Be|Fl%_V-NbF8w6cxiz$??F}O=A~xVVHIYf*r`# zN2tD2mj3WKx8%(t1p6RcSLn|I9+uo~6pp9R8|AK{FoED+6^2vzi{K{}&Zn^Z0NyU6 zD($O$5?h8*Iu}*HNFjR=aqJKeB94)N^Z>z*Xc@1?Q{+rS*@K9qkp~esNb&3P8rD}3 z*VrCJ9BsVIpd%pI@oHC}C_cjUfsEOMh@+1O5jSXr?Xyz>`EL%|bB1`InMwTJi zbyuYqLa?pR;9*!Odk}FtqJ}96!FIvh85x4zj-V^zSnWZ?F})=Gqhnp#@}t)5MF{pF zO#7kiLB!EkX10W2FH61js0hKnPJiuNuwKW5h@-zDf*s0!E<%Q2uOS$Xn5Fh0;;(&X zx2~!~upw^EhtApxg58e)*GI7KDGmEk2Z9}^V-teCkLGVj*@KAVt1%BEj!_YU9qB2v zvCl%yCP$MH?3vU?1Uox!E=I7`v6KG;!LF8$!6RRNb_DwcJNz7Ff29`y+U|;{kneGF zP(rYi*X5`lrRr~-zo6V*6uO}-OeR9CMJf_;}l_8{VPx&Mw)5rUn#8r=|rU4I}%02zYqPOvqqXkL?D#^oSbx9}k1 zXpRRi1bfNqG%o~uB&{8evIh}IBM%~OkdhGW0KBKlZx14lE*?bOz@HH8MR+ejbqLn2 zJczhKQbMp-lW>)i>LJ)3-(<&}3m*ArWf1JwIv^p~JIT8pWe*~bDLjZcMxK%o>_ohe zBM|I7uFTE4O!IZ&>_NmaD}+ZhJcf68U=3cS6M}u2yy?gg>?Z{8qwGP%sjtVUCbH8n z1bZB<7=m4je=&*=B2Lx|Qk0UqUZY*d2NB2WWgyraVio_)OFbTT;0|rrm%att{4CaL zks;V^2sTIAgNS1eKL<)qLa=?QKS~LQZwZ8+j0M!<3pnpyu zQhlTRTJe2?V1f#Q2Ga>%K(^xR$puT+itk}Maa!^H7|#bv(u(gQf*)1Tif`_0J~UF` zLBz4Q#q?=LIu?)8!TXADOBz@i*@~~bco1>SO#Zmy+Zk&o*|p;9CLToG!0s!)+hgs9 zvcK#>#L4=pCe_H+ySC#fgPvXgNWnno4-Uc2@1S8*d#cG_WB{4 z1a9O(#0^q>5)8q5p6r?gZsI}24eUM%uEKf+vPs}39z@*0u1V0pJw4JSxEudn$R>e1 zc@S~TDVhZ1)*?ld;A!lWm7+=DMjk}mFr}u|=}OTgcnkZRD4PTyM`td0l&)(;unX{h zCVw^w7RCe~L>!}r*kcLi-;hm$=I8M41KA|-3_h6^O@j5QUI*DE*qdNa6*LKY6C8?c z5_odnk~ImA)QQt1I1|sQO41~_f#5n7Gzsn@7>9TeaqMmJB=BuKh&UZpcKBSER=H7g zKMhkzehS$na2F3EZs?Db;BBlkW!EHd6AvP8VE0Mz1=i0|_E$MCj_x7^yMBD}=4mII z6W5e(*MWl;SNn^+-;r@Ox8+0YW_4U`y}^9D6&Y7^OCfB5MFa1xb!bWh??62JBI9cA z<45G>tF8V+Ge(2$LM(%2(_nL3X*fZ)npW@1rUCXamU~fr5OF$y3(S`x*pH~6El+$9 zae9k#gG>>@u5>Q%O^^+w9SFK28%W(#qmRfR`Pm?+*iTxZ{e%0-bgkLm8-E_ zC7Xtd+xY1%*=kz-tud^jG7ig~D7zPh@BE#oN7>QUA=oGJPLw~p7d4Fud>oHa!+X)| zm|sRVgys{>MK**ygWrKxr{WO$jp`re*AQBD2tW0QYzVDO&;i-K$dmJytReKRj$HSm z?eJ`=B;AXSBsg3J4Wm;DPDY`!ZR~CFy~wxmb@y1C?)N@$E+lyfvU`!cco1D zU>z;H29cY15OD*$52(Ab-i7S1;`#Vl>0cq(lj9%`VRz1@5bS&nJuR3_qQxiFYW5)F zG$VRP5a3-pl53PD+dJ?WWOe9fG}urfx#y3|LoGfA3(^p`z|ICbG_onH{_wX6a)K(KSk z_!t?2{gvQn6@*~RFXVKh>_Nn_EgnQ1qap-*x|&@Eg6%-|+Q<;><^-FnIU(2?>5x3~ z&xjz{ay3_nVBbw%k9<{D2)2*R3BkI92NB0C_d0^zi7xDbn0WJ}B|eBa4uS+rmxW+Y zjwT*N93wm3{6`4(HTq%*_F#5!pmtKRb-WFyRvRJMPVr@4c(saE*JUBt9f~|w|GyqY z9AAZa5OIurq&R{-iC&$648fj5Fh~U<*y{w_w|_i`FPZunVX*1lyHOTOdQQhY=i%LVOT$ zYOQkv3Y8G-0NkfqM)n}$$WHm@j`k0NoyY#m;)96eu*e=n9Ph#P5bVIqd8!|SP(1|uI2#_(#$p6Jiw&=7V=;oQyqJd-v9a}n-_D zVE3nXH`KcA@6E#tdo)0>S5R{is`?ML^&doBzWRz`rPs2KhtQLHA=rm$A=j3wx5#=C z}l8_`W6*w?X4M}}Y*5qzhD z5Nw-aoJV8`b}xcmP?hox!49P~2pNKXhG3!!La;v)e1+EN8u!|go&9?RyGzV61bgG# z*$G}Ig7u@~3ySGFFqZk_Td=R{2!&u*8_tihB15nn5Uj6)5Nub1t&t&EZz9*IF-Nfb zVckc$La;{={1@I-SDn1ka(81E5ZxQ?MK% z*c;f|b_8b`ubcoO|T#?A!Zs_Fgz>zs2Z-ESw|C{an2 zc?=Q>G06_vhK`S@+!G+uwP; zK0MD}pJ%PL_j=ae=d4fbZj)f0h(yvL#3k70q0R&*!8)lbY)sGjL&Ptr=aOLGgfb6g z5^VF?S#NW}E#;v;ybJaxVoD@fXOt&ydVog>_A~1JM0Jy1l3-U%wQr~EH@x|2IyXtM zzrgwtm;~!I_I;_dQG#uGC0|GYJ=NEe)ni?u#8N}NOa0$F-J^Q-wPZa4)=`k{f}NYP z;bgTRCD`pK-xAo^9gi^xWb%1aV|Ov77Xd!)=aFw0QPrcnl8JBN+(yAopzK1#*1qX< zA5e2huvc+(2E|iFnS&nZ6n@e|kp$ap_2ojxt60DTxxb(c!8ldU4>&JiJRxThPOE>D z@*uYW=Map(ps0!}TT{zTc-MfMPBmlWhLVR34 zfcidQj3vPiOye?NXSBHaCaPDzD87aCwTLFcIy-U^S_gkLGc-lyGhqNKEk+>e? zN;w*dPcYt=qmkHP6zes>M&cZd6G2gx*+@*ryB}0)B;LlD4NQXdmUAV2P-d9~J7F_= zAqjTFYxrYWz$91?$u|l~66_9ew*w}@_QU7{I9Exq9$psK{Ec&6+WNq5v?2-ict}S9 zlVF`zVYDQ{PE1$Itr7`#&&{I*>t*@iRznH)2HF`1OoF`+;~u~)l?2=I6~AY1M-TlE z5&O}6=%=Gdut)L#`Vy>j%EMWdA;EUhxk-Y3lIkA?Cc(ZEpT@c1R*3{#?IE8-Uj$mb z9qE!_f8i9P1p7lgTq?nC61)CCB-pKDF@N$dTE4#R6726Z_$$ah<+TWH&&Eq$2$yqG zl3=&miL>f(4ckvgvrY|iH8}k-c9&Cub1lY5Ie${a8yGKwqAI9dhvH^qXaaQD9LFTs z?J*`&d|gi@*d1_8g6;644~1JL671$%&<#njJ*jD1U=r*;7`;K&#xZso60B2l!L4}W zl3**hqW@#i{I@a^>%@F;%R`a`I~(pSfCSr{k$IM3s@You zCkgh_*klNADm_MYUT-U&(n*4SkGT23B-rmUz5*t}dSI@kitO4*g8f{b)h^hU*D?h_ zCc)m8TC1~CQ1=zpbSA-iaT5~klys3kQ;#p{Ka((%VArIb)qqK`dt>YlOoH{8d{9i1 zV9%#~umU8(-ivV?D2ied?Av&AK-IL^XXw8jp)9byE@d>fT>STFKa}X2=L9;^hhGW7VtL*rapO0d5ZBzB&)ou zDMYKhy`b-*5UuihNJX+z$f7pibtgnCzDGbm3}h?5GtwBk<O ztDyvYCFGI7R(x;5xB=LT?}8YS4@($XU-5mI;s?doitmdUFUXN-FdyS>kZrn&!37J} zithql1+Dmg2j^=AX~nl{ERz}7if0xiN+<6tzUvXZ4zLwp zXYn1RAwRD8ZU?o8=vwi05`V6`0o_-82SDu)vX4oy#rQO0Mdf!U)n#pGD`6$U9uM(Y zP}MF{mMOvdQ;k0W8tMLs;?^>Phl5Rmi>dD-V3WX!`9>i=39f}YT69UUPUmlfHfX^o z!QD{r0yYVpRMv>DN$^7tdZbD4U-*v!n*<(Ho?=o)*Vc4Vh$g`t=&vY5lfXkNl9fUh zwOO()A({lALjM?Kli>H*|6Fh@KMw;IYG%a7x+0BjPhiP0I@ zB=Cq_SdjttNzjwxt;E+PI0EA^Ihq8gVw?Y6X7zt;%f;0*4$Cw~T zvd1)x$3duGDfYW`68N!Pa4Vg>PlCAwzY1&;I4j?nA1A?QP(Kk}lfdbPWO?;I34VwA zE66_8f5*8}BEjw+zk%dJXU&Px z>f)1leN>ea?>IO|0@Kx;R~F6@ueRpA?Vu^y#zGk-nv%_F?CMA{dl53odXelENze$>ydqIih- zN~DDt^W`X!@;CAm496r`56)X~l3=%hvlg%<8i_Gnj*{pBjC(=#DY2WTx{i!Ltj*az zPNSGznFQ-}wi2k9o>KFvY925N);al%6Vs^qP5i6?Cc!$TU=&ZC?I`XJ>|+wFr(1bg zeyOEOOMS;ys+qXyhBWtd!gJdno`AS{IxC77PYxZG^NVpP^N!*8>TMh3;3n9M;EQNl?_z74Fc|v1{mwfQ3`E?(H+>m$b<71 ztQ0y)7fAP_esFpzNcW;MF;17GG#ZXE420@!o46PGv0QK~-Ml?<#u9ujuzQiS@{Rd1 ziSC1XkLbD=IlYi9uig{tzfd0o_Nn?X{$l$_66}>}`kunIlmt6asiy^#m#OhZ)oK## zt?6cPaU{;znXlVPf?Wu6J}?QkD5$8{grE+e=Dc;8SLy#Mb(;j0L5USe7(fCIa?DFyQ z@D-m4aoa!d=8V0VrWfO-<_sh5?7y9l^_ zQg#}35^Uu$QGy+d1bYh&UI*$)u(LQYLkCMG*hL)pKnF`D*wt?5j}?Ko>wn%d%pBA} zf*nN3!74q5(j6(Sw+r?zO2&cWP)h4dum9bB-QP@jf88KF&QDH-n-WmD_XVeZ1E}hrMu2f<3?tB-o=d zYVPC~4{A=ssl0&y^u^m2m;}3a>?eO#ME#t)@$^0ErX<*fQ04=ZV5{zG9`e8>*sd7s z%F!;^!!Zs7Ma7#0djsB8z$Dn$FlNh<1Y7YRwxZ#*+atDm1C9N233i_tWfJUtk7XCQ zNeR}^Dug;K=IfN!yZ7P@CBbe)cQybf!ETSyQ;sCqJ{Y}$Nw8i;u2E$!!5#&5pkgJ# zo`G>1;1<#9gJ$90*y(&&qzgQA-3dq2d{;_FK^mc`b#NA9ya~z{qdIv^!D1xAuKObj z=iU7CT##E8XB5T-a$4d1fbqGUN}O)@@a+KP{-UN480Ukc8n5g|@q2hLfyy0ly5Gw$ zQqaCPPVtMD;bJ;hxi`+O932fR55ifD@ft7*c9;M2%>A^FSuQXM_Pcm_cyEJh8`ANay{JtR?5R+W1t#O&gfR}7jQ8QA zSr6(-u#Zss5I~MPnn!GlhcixDviu7O672Ziv>^%h6#`xYCc%10MWYaxVBd%OE-(q! z=~dx8dX5CUhia7s`xTTgKqkSqk3Go+x3Ww$3HB^vN+eiklqYU_fJX^-DfRxQx=Ald zu$@!wSLpf;Z@xsmkObR&0_O!xf^{0-3Dwys!LCX1>VTf=Yf0BwS17Tvz9PY{tx?w3 zlI;oTsUVYJKTO&1xY~~r?7o!u1~zsVVGIE_c274ob~jKu4)AGz4EgpFRc)b6JQn9s z3LXMw;}BbqNT>UYnnQxUo1^n7enpfG(c_$w528qdJ&vQBPhxzBnIX zye?;FoVD*~GJxDRIA>rS1B$Asaxh08!n+sL48t)A)>|v2cKx>m66{rd;#ho2%*Vha zSPv<06yoFZ6Vx97V=M{w^fWH3f5{mwZvLq1)h~*&2e>VROoDY@S&B$~S={^!k68hJ zjm1cUy*AbDR*I?Zv|V4?kp#O2{7%3mSSRMgW^~6T*i9+kMAe3ZM&X`R?@sFT`z^ma zin=rseIV@wY$P7UxKoZs;x~+MJqh%4{T_$9oo3Y9zkFSO`pl z^_FubeNbkZ1iOAedLapRr%C)VEMO9>hw%E~)a@)JNwE9F-4~bydo0Evz`06-^`NqF zs?K$3>ks9DhYO@DSpqsf*!gA>qqn979B-`oy7m^OR&x<56@7B1Up{mCJA;P)xQKxf?W`w z#<}2Di3Iy^5BUrFAE3qJNS6eAE~Qa|%|D)Xvs8lJK6d?oNU*!d;(Tz+*SB4QU4Alo z1F}!~p$KiS$4kgRRpq24!9IBeXZ3H2)`8g(Rf|3M#Gu#`+mjvsqLbAMx zB*8uacOs~hU_Gd;QBaa#pCn+Kg6c`IL#JlfD;M1I-^xg^wK^e5u&)sJ5-nm<#Pix>L!H$bfhOjEf(Mcxl%Tqc@u-_9`3rvEod>8|m1nYsh zk}9%mBMJ6+YB33RP57NbCc#cht<_m6sQdM5I+I|%xCsgN`E-#sRF5y|zsr8KrCqSw z&`vjC6710!hXIpdJ%+ztM@*7nM^k>K0wlpciSZ~XieeJ%H+Y|cs+VGu%amZ9lnZW^ zNU&uG(nm?KZ64uw88G$9iR^ETEqI8lPisN#BDz*^oy7je26SJ|-4bdyVCs{T${NwN zvU|z_^hhGWUhww>rapO0d5ZBzB&)pt*`E*z0t2BRt`M#AdPqgGQpln{W2D5IzRt=Aw-P_D`0fjJAJMhq>!d=mobD^WCqO+8WFM1Y zJH&@n2)#9_E^E7|5>^uIMG!9pRqI8{G9_4ls_`bZ_ z%IMmf@dpv2N$?r;PZXj_;KYh#rI1B!&Q^#f!SB$21=%EM7AwyMw|t;{60~@f>Oq_Y zZDK$OZZ(uWx;dr`LN1)FIWf9?hr>8&>1t~ew>mIg z&1wA27HFP?{VCoHn6BoOLbz8KpTv9PP^wbm4TWgT@;TIUx~B?qgIX*X{E>b2?k7p_29e(E0HXT_M&`SU`cd4 z#*K26L^Cj+1l2=hH%)cDG5)YNr*9m&m|d9!>-1dMLA~^ps->zgfJv~<$!DCHMyo&0 zuVP>ltWyd`@zmLu;y%DWCc%2Tm4^dpj#Rl;-?5b{m%_V5)#={lw2E*XG*6WqC>{qa zRh+_ag{M@ZTiMywNw6QmT_}F`K;9FIocmdtfQ_um5sC29`n|kqZ;lshC2Y zC~gNVg?7Z)UXD_zA4VTw_aYC@Td-2-d!3T*MaRM!s36^ouE4llj?(BxjO#(D-m8gw zksr$ix6;kq6X$+{Cjh$_IV<0oACu@Qs85Kldy&%%$@1zwq2@w;71*chyZDRkA4#w` zr|J7&uB9Z{MamZ~n0!o)AF5W9U>{63gI6MP=Og*Log~;LFl&KHuxn1^pYj2dV0XjV z0TdNz66|q!#{iRHz2ZXnnsOxAkpt;~cEJvZase<2_8yGeLDiS>S8Nj!?Cf+hbyjv! zTJ`8SgKFy}*jZHd9LOZt`61CwA^!&p_0cENVV*btZm>vgfL7i%q%V9!>y zO-QhPi0%zcf;|l55LKtO&ZX&;-1485NU+USU7ZA5h-;j=;Fhn-N`gI3bQdU^}LtFI&@zD8XJa*;g)hlJbKDJ6c`SF4)~@VkeME zu=_}xkpw%4Lx%&CU`JpK10j=O4@|YWMTvcq1bZ{=8!f^l*w>+OOaLdoeWy_?cm!y8Djk5lphC_YJPeF?TV((2PU z`AXZnluLqrm>P0NQ}jDg--6u1I6bDb_ZXC2fjH_x{23kvA;C`M=vfpW4{~?nJc02r zD2h=zl_NjkeGWRzz%dDSju}X>?_sR>yLV9&xh6%-Y366_?ryMRfsi!m0;kp$cBS+=5q zc3;I-+tJuRmtdE~sO(*^cV!p2NeOm#y83li%-1QcU(p##g58;}>t{Z!t_wVK-Sw3RUr}-o zq?;A>G0qZv!?_3JS~>UORL$fUgq)jkdg1H< za$|6A#uyEXs;Kg1j(m^z5vY6zr_XczA_eU~#n}T&1)Zz>4CntidLO9#9_LSt#UOhZ z?5&>J=M#Vgn>&dUk_3C$^ISq;66`}5cgv9ky9DDaIg((vn#Idf)RSOmQ#uPo33gJfmv_NN%fEmi!LD~AZAgOs zgn*Ag_Ab~+bWG?+zagLfEM2c8+rVZz-VR3 zV-oD|#FR*|&fs0Jk?Rlpnkd1xr0y0#>1FSNO|`$E>o>gl**Z5#u&cvb6=d&%jkH2o zsLnNmqqP)& zBFfe1aZbq_MH1|b9Nlv^3wR*+6wY{zTjV^9^ApDBa_+(D@nZAP736Ng8HsTLD5|Z> zw>UBj?@3VeF;4a_*w`UfzoO;8C6Hj3KRJ%Y@5KBHvUkBoBCA;qLVR4By`(j6U61Tt zu#v`_VCV=E>=vq5zbICQw33L~yI>=acfmHOn3xkhW*zuzS&SsuO;g=&rT*7;nyDB` zuv@|30%Y%kjUoAP8r^XTc6W+*Rkfj@QP?@vJ4}6kzvbzSr;WrQNCyHNiJ2IW$f6kg$P1mR@wf{iWnF4)uuWtK^>lTV=+ zl3))cWPgyo3pSlm!;mDwo(%UyU=r+w7()Q(YVU%L;bq}Lo$J!pho43(l3>R{x&~zL zf{nBaqa_LUz|>2(N+j66r$!0Z%Xk-Tc84~PzIyXtMUr_x=AbS^Vd>ZG%kZ6@iuq{1gg;$w6 zpv9$;BnkFUPBBWbcgDk|670vZlmA14{W6_{TfV;S5^NV5TmxjE@;L}?r^QQH2+J>E zz?$dQ>N%9N`ir8TFgFLeA8>|Z43@J9=V^>7au(o(IsEk+oT4hIY&NX*o5Mn&O?G-9VdGiY#Q!Yqg5ioZhbo4kOX@IH5~^`g1rdiJW%yfj97*Q>lEGv zn;Oc_90|7h8B{L`_6};h4P@_vjYQrB+aM%Kun)tXEWW)9HnMmZYy*ChU}wO62GmKg zPUT&&4T6#cJCA_Z6jV=w?Rcl(@!j&@%1E%M>4YS~enQ+wAbS^V4B=g{(ejWa!7hRO zBS3=PkdfJqVXE0k1847ojZq;Sr1Tikd6P4FN+$`naxN=hz$DoA7;QlIF4)x9ZmEjw z;!A@4R-M%@*lpl<2k~97iP}3^DX9A@YC66PHWoJ_!5$rp`14fi@g@CVB+Mk(ezemI zm;`%1#$b@W3pU2&Ehb5@_fdYQ0wlrC!*~f4Rjo;|h1d88#2l$QK87z-f^`z_f{k?7 zQ@N^_o=qPm!LCo8>jG1soXERi8-%#}v@O)FMb`?hlXw?w1G=x~_J-OEnEK=--UZu$ zE)n3zv*?jlc8`RA1Tgi1#89k6I}(Z__l+y60jBDO))l+qZQvB zFt!7{3pVz)RDHTBor_!PhcU9b)4ngqX|OOG@O7Qz1% z*d%Z!?}CjnC6i!1g=i8ih5nmDGzpx@yI>oJENZj#96~e+mY>J%1!R+8LS&*uL@SMJ z+y&bi?&{)alVED1xz$ki*c$Q{z$QUIj6T37fk&{MSuzPup!jIEQ{YTikYtZ{Fy4}*Nw65>Gr+rGW4}u$fgj^#o$0Ky(@%QY z9|ZpnY!Wz&7k4(~$4Sug4Zdsvn*>hcU)wjJ`y}WBbq$bxswc(lE|Fk=j}Px$xLJ&4;9n6BnDdIrst@HmQ(1g5Jwr4T;V#V7IhRaHv7v2aEK)76~EBm4t+ zwKW%=4^7GTER-iiQ?fa&JhTyQQJaHAQ-Xa9<#Uipu=%)pkqa9bFOy(bev^eM0IBAs z1))V+;@C-~D8crHuq&`cx)@^!utaixE*vC&)XyHLc)a*Zr0TagZ(xbE0mfP&dlzhM zEN{U{f<2P*{t8eMO~IHfM@cjvV;-pP7$Z$}-70<&Hs^;paxuH&yI|9)4^=PyzFPh^ zs})q2y$d#V#yByJwuI6ZWbcBFltK{2Q|CmA2LbzJ?}Cjx9t}SPFSWE-Y53VhU|R@h0Lcg$}^jPmbtWr-4CcjeS&#KiV*uBz> zXtppT&c2AR+ew10p3emaCc$ol(M^v25b>cH`-7qaO@bYYcLB)W1)Ju`+LR-~Hm6>b zU~hzSEiei835+SAYUCZ+kDMkX*kjYl)LGd@Y1O0S&gyR31-pQ%-UFEgdrk^;%U3|_ zNw8lN@Fl2|V8gqtCUc}tf*qEwlUs3I>PxUK2y71Y$=(HDK5d@Pp>8blVGP|JT6BP?AsV`0v^KlF4(lPyf4Y)66{wH78{Ahw_i*2 z74~o`$7Xc7T>47ah0XYC%)o=(nm8+Aw3f39&e|Aj%4vbK6~-2FDsXng*ah$|*x3Jn zB*8u%FJUg6Lnp|7?Sfr5=|;n(<{`nZh{R|T?4dMqAjl-x(US5c!4BcjS->RNn=!5j zA(LR2MkSPY!A6S``y>hWVc3%`!X(&J6K`L&j|6)R?N`Ki!N#=6-US<-dJ^ohL(9T= z0_G0M?oD+PZ1cOK1p9wTu(N6K8BkAx{gDH;I#?>f*1XT}4^U5n?Ztr}pzW_STZR|! zY#_moq2zLvc73j8*qzdPyI|)~G6NL%ptQaOdpgqU-WO&a58)WfCBbe+4Y`pNEx&-r zF34Skvk%4|IuIVJPC>aW2nn_$N3WvzBJtbcypHh#D5~1Z^*B=X0e4J}bl3vNB-kCz zK!V*HV_S+h1vLlZR35{BF2Fkum;}3j>}Mg2Q9q|{{M@Boz91cbb)8CJNXWpzl)M5AU&+88*!>X!T@D0f8wiQ8WhDy zg58Ishf%z@XuIJ&fiXeOHaHzV<`)FWZHzMzV}Cho;XI6SA1JD#%ELKQ`3e72i6fOK z;tay+1KOX1Gat(3bguGToEJIz6sR15)9O?HU^k9QuxAbP%x?BPx5nL89)1NUBnfsf zv=e|yu(L3x$&mzG{TYTJ33hLcoqPvP?7yb_g*g609@I6E{7;qXfGq^>$X>q?aVv zeNycMbp3`mU#eb6g546THx?`%&E6DzmR81JhX4Sy^9^U^mn#>ubqL z1e~BClVF#>*vD_U+K&?K#gv~1Z0sJu7!PdhzKi^NWA_}TGXS6Vqsh0iRJE-#aSYB! z6f6K`vk+THr_+5_%^|_Q$liyr5cd=Nzv>^f_(Hx|kOkn4am9pe!>H8{;a z=l&_D0%sqb-9YY7YPuccT2NF)m77z%0B;_s*&fFvSZ}S6+V!6*NU&qBjAOC<7t{hw zg7uK{Mj<{f9iesrjInmX-j&AXTboGmy zZ)-74Sz3S608&RAe5IIfpjXck$4y5RXG}o&R_Dd1vV0=U>qq&BQXtQ5-6%N8;KwAz6F&UiMC&{AOTE* z^_FubeNbkZ1l#rB^gEZ#9g7(fqQg7u^MaEy*3!Jfr1fCDGygth6FoF=OzjEZ>s+Vm;~GW((E?C zUt5n>i3EGChph88OHZIhn@ExbJCxEW!EO={mrAgw#jgJk3HIDroDXjK`nF53ThriH zAp4Z}KxoTfl=Zd{ZsnvT!OpmavpR{Q0WkLjxg&7KVq7U_0M1(&FU#qL)A}1y2NYF7 z<+&W$6K{LaVFZpzu%j`a)&;!*33d#QNw9~+wnK2MM1q|@if%}P9Y#${M!d6qp3-#C)TWB*DG__j&Op!8*T?EN>!7u=C-* z4eBIV4`Qcyx&T>Nl3>3eV6lSgNwAYI@yv3|e=8%wF3|}|g8hxSUw}!lPRs|lJS0i5 z)!%Y621u~CF*0v6Of|P_;3UD$icN;_rP5aSRa@K>w&qF zDzcN51bZsAm;~DoejkuYunSXbbyf=Meyf_!Bv>zQLW2D{U8LXD<4gMY8be#!1$!** z3fnWm;~!F`Jk92!9GR#V+xQ2`vt~FpeTw-ux)Gk2gIOiX>4+t60DQ>-5BX5 z5^S@v^idM*4%D|DF!jla>~Cxk;_6d>sC`A(3a*pb-`IfetGP!(9SBT)a#C3%xCIqI7MY!Wyz z-zdZ4ju@3qA=JL;VccByf6JBf2KRdDqh;O@cq*{|;;tcuaYUNf}*R zGie+lnglJs=iv@)5_m{OMUjK^N$2fNT=FY) zaI2y0(HHVwz$U@57=wUK0*}arbxJ0|FpAF?Uz6ZJ77`aGqC?Cc(EDU(3-X_!DC(2-W+=ewR)HKb8w_rIYtbQ1b(KZ(x(aS^38NI0@E- z+F5i>0;lsbnsm{!27D514RtG!eX4uJ>@JaDN5+SDE^MVaF}i%Wn>cCdYWon^8Qk4?#emM64)76|;7XB?>ZB3bIO15{Pye^vV zxK1k%cZ;^D%|cBqC0N;y{Jw*hNwA~S2|QuEOoH7A&N={+B-q>1SCn}oMG5v82!{Ym zq#H2C081q2=faobNBwLL#nZ)CBCYllUmAcV(vBG00+V1pIB&s8f<2e=;}oDIdKu$+ zIZC2hj4wd-gA9$|P8)=R$Edz4Vk?WeKYlz$94bRe3m5MUpZU_HsoLuZ;JRc_RGY^BO0@E%fix_3FPB5VfD?^n-JJOfy& zIHfY|ly$sSrK(b@ybb3~V5#D~s<4lEwKd&uj;Znml*OVcRh+h5I7+ldZJLRuR9On; zH;~)Zc-9syfD0|3?z+ z%W3*v!nKqH`?c~#3ns;1_>BNE3HF0X%!TVCanIZMx}7B0)nKjyOoHu)(Mygb*fTLs z21Ny$1UnY*T3`~aS6m2FDMx}Gbt@gvF4)OXCIFLQU&nYERIMDpyEY-g{+3Rr&dM%I zs~#O^Q*E6D`y*9-4>AdMxwKB}mal-;lVJ0|5&-HX*w%O}fI11bCRUZ>&%b5A#^Sit zmtZ>+v^vnoB-k}m7hcu%MS{JJRiFkE?B+yl0!)JKg|UYmNw9}v90*K;^}6!Gtr7|L z0#)0D1UrQ2^MFaPS7MA*b&_D$O{e6R|3*ZDZKdk!B-pNr>z1#|N`gH_NXzL*62APwBFMyhUzkAhTd zBMJ8Mn0%5~S7z1KB-YD5+21P8=lbV14^?-RaIE})ybJb|_!P(o^f_;`=Jq=8P zeGOxd97(X>V0;C52up%}AtldeB#%q5x!;f?jKt#G_e{Z22o6+T8(%HVEWL2o` zL2e<=1{mwfnTOK@V;ecMaQ4R7OU_d`hhiKI_yf*yH2#qUyLY@ixls9Hl3=G@;42r) zOZh>9y1p{syNun%KA2tp>oUXf~Z%f^TQBnkEf*w0&p zNwB#X5yEH4o04F^qWy|Yg8eS0g-Ng@;yt*Y1bfu^Wnn$U)}BXar%@-tj(R#uurrWg z7t-L{pq>P~-0wV@Ks^a|Ee>?l!O~r@139n{XgmGUmZ29F*V_d`}cTCXX0UVQHA2$OD_Bo9H6zvXbUc;$ez<;jA z8w#>ru(6+oaDe(bb>m&{rkj#rSNoIa4=@RKcZ?n7NP;~R<3u@IPBg}hF2Cld^RF#qwwGNq`TUA}u5Y1P=$X&$S9Zj0!1}m`7=k_=Zc{@sLU@x4#5}%+81$dhw?8vSJ?vRLyo>7+A26}=Zm2g$acXV z=b8N)0Z6cw<2fNouvbDE226rofbp6fNwBLGilGfK3HE4=gFv1FXvc4k0KCF86wPZK}!xWV5f<4}|VGp$*CDh-thrpcT+JcDe#6mK%8Q`|DC>vsV*)6ut;(?+`4R66P;)0v zwhK0Ph+VMJ^4}6ju&pP=vFK7+3~PXF7i=W53${UskIUvzHwBEbB-mDw7Q&-+1POLq z)vI3=J44!0#B3LAnU(bVP9-tLTurnY%39?;{J*{g z>zwk?k1{0KO>}OOU{|Dx=E55|L*mnzU9izAkzm_+NKfe7f)9e4qc|x^uscuVtUjRV1eiyF z-0L{^W85j{d7Q5?K9=(&&U)3w&c&#YKcT7QoE#PFk zVAF8F8m$rucKZkEh9ubQsc9@Q3HAYudqLGlF=81KtW($pn;Oc_90|77B&wGL`wF$a z1hQSQk;pFC1|dm;{Q&O!;@d9R$YK|41AdZVYvFza>LggFvJ19BP?BK(Cg4v6)stX5 zp5%9YxBRy<671PJAxW?;{zW2!Y!_?{VHa$)JS0i5tHE6rAi=g^WNu}cYL>^ycEQG| z5FS!`jOe_@WS-JVg6&G&#=s=l-7t0l*)G`B*KVnb?BYv;{YjnGF4$w?4+3!)Y@+r~ zRtoCAnwpNgU}JF;6712jC>Nelk1y#zmoSrHFQlDwfJw0TVcZF_U9d4GZ!t-NeS`8> z6(9-rZ;W3+QPr9RyJ7QUSQAtoAH$a^!8(auu#sLO!Cv(UeUt>dKlSYkvR$yLTMa{8 zeL4>6F`{b)*GcSxZP0?R=AH-j9FXmTjU;x#HlRxc`0ZhOq?O%K@c#|6U9geKF4$=K zBc4^>^%WvP;BM%5DMYKhPGlEs!;nR7{&I`ePtl@jX2<*##S|EDP#ZeCNP@ zMf^;Cx+(<>jaEYm_EX3o16%R^5#xJcE506^53ez@zT(@g$m|2Q;@b(Mqa3aHZj7-Z zuoYhqE?BTue813D(2DP_aCTIXR(ub`I7E(Cd{4$W5wHt3_O?`gx+$HDTj}I|#dkQt z!+@>$I*VPfF*5Pviti0j$BC{LUnj8(wgKH&d>@2*Kgd4WF4#os z_zb9eIZ~D>!TM8;U9j=_=8q_DEu(oj*d%z5`sRad7i=W53${UsPlB(Zekr;pfs@z; z+kozq;7_PaLADDvlGp{?fUZgK*Q4}Elc1&rcM6d0f{jde!A7fO5^SOnO@cL{cUFid zffLyU+c0ENo18*43ATp5704#RgvewUY_!t2#$B*|;Pw_jn*>u6&8>#A$1#wP1U3mS z#25l>5_m)|d|xsNuBUjk_>w*Ti}9EoO@i4Nvw%$k56)Y#Cc(ElB~5~l;k>UPO@gxJ ziy;qe612i-3D^Z2`&~K-{204n(^+MwpY*b|2<`%G5;%*!rVaUV5^MvtyXcw(PGT2q z1G-OwzEJlD*{6C^%L`Hc|>@$kr6kmzdt%ffRz!K>IjQ$|o1sj9;H~Iu833e3aLlvMT`WWMVIl7aUwo@k5OTqT-PrR56z zHUZhaXl|^IU9i#0&aUo(ygJ;~#LwEfYzW+f?W@99Z)C14vQ7!f?HbN z)~D4@D^;w;^~kNtf4UR2CD13^1)I8XovtquY$sNM8c48v60s{V33edH;c_Iwo{4cP z$acZTy4VF9tr7_~r)ry!V8;-B4KNAzPK?`Co$Z26r*u=a{5K*J?ARx%u1&|B$hTM!EPN%+$W-Cmz)1cg56h( zY}y4olLnquBUQ`A`ITyIB*Fd`E0P3z3l%ga!M2PKl>hH8*!UD;7i_dVQ(S_5hhDt} zOoCmE@tGV+u!S}lfQPW{f=w&S_mey>!M1_W%1A7}9aEyOgz%JdY(|%>rLWvY$!5^H zg4{Tq9Wl0-a|O;m82#j2h;uZ?k#Yv(oQZKdU>9uc|38vopH8FlDxDzvZ5M3PjowB; zlmxp95~E45SJ1?zAd_GhQ*09Kcn;kKOoDv@VC~KvvDrMI17}0i8$&(xhx0?w%Nng z;c2O{K%x+SP5=_@$mcmBNw9Z9xgMAV`y<9;Ig((zt;X2_lVH!sI1QKt zdwaY*A$+3RhID*oCbda|oekv~#Ylqv5u+BEj5lgP)`NNyY;`Aw3q%QadaSoBxaD6! zkYFEujy5F0b|zqT1rDYSCsriOLtKL06zV3xBv_~O!asV>F4%olt0dSRplk;+3HFuP zlU#5s%S4l4FD9l$f^|lD;-&|9lwkW&Zy(i7dP#zPGu2)`p6fTfc}}At3HB&hhXa#f zomL3#pt;m{A;sreW%jk?le)1;R@PS}*v(Y0zLwlb!1W3;33k*zo()~qew1J*QGPG5 zv73+aCa|$PrKz#|p3+*tr~MP;+fG!qqcZVHoaU=DKA`NEGnWfB{j%oRFbURM&Xx2*nPn2}mb2-F zB-mS^-vms8^$`Bie(H7>k|fxN;7$T2!9IgA9dNFaU_Gdew?K2QOIv^WBCSY*oeyaq zFbURa6-G-E?D45dw@M_~_vo+fg7q@~K4;`Nlwd2@;s-e}3AQ!H3V>NE3HHM{>-cgw zp-zJJqxsNAN0DIH=Ku92Sm%_7?vx?HKB{w*1iLQPuMSLty(&J9bHS|=3HC-0834UM zXfZC*CBcrMG)k}!$HS!(><_W)|3iZPJr=WB2 zQj%b2zr$JWr6QPTgWUEw&tg0#XLFqV+Qsmzob_?G$JqiDRYBze961~BB+%h#9Ft&A z!#J7ZHQqpiJsrm+*bmZhyHz5=KKByckOcc6HQf(Pf}Mf!B&hm6#x6sGbqdSMsiEx5 zkzmKZO!bmrKcTjdfJv}UWHGrxNRnWGg8PH`l3<-xNLIYIAxW_1>+p~SbrP%xl{E@V z66}fuv{Fz#33j9X{EqLI|5iqVU8)n31lyUo)qzQ{PRs|lJS0i5-QaEpkYF!lWJWMd zHA6LU+6B8yY%+u!lpZ5GPkV)@bdq3qBW@R966~QE`va3;Jup{NMRsi@!Jb7eCc$0^ ze+bAV*h5ombyf=M{vS1+Nw8krgakV{U8M2q@g@EHy-Hi!1$!OsTn$WueG20-U=pmy zN^pb z`sBoXqYzi0hC;nSbgkezy^t(#!B=yyfqFGC^~vdFjpz~q&Yw$-GgZ{Wew94xt70F5=i`rbM5Uu#mh5jnYR(vl`W9XJoE8hV48Qf3A z&sKbINdcpx)lh={9rCZhR(zLRk7on06>}~0a@5FR2Zl#m=72g{P zz8=_$ue0*Ot;CNjzLTInAi7q3om5Dc(|yHvCe&v^_Av?e)!3&HW@}Pi)^??=iqC0Ku|<$_!Oh~n0=A`b_f1m9C%EwD-8#C)R=p9J~!=_{~F;PgTxx=(^u zP+J0<1Wqq&MAsy^XdXS%Bv=c67hsdXW6D!Z%IMmfM_(sIlVBU@-4&uq;2{;sN+FBd z3|ELIL0{;5gKQG~H+_$A%LmFQ!63LtiJwh^SuudW$P%rFvd0CG&jmIKuEQ7uY!Y|` zKkQ2;!GjdvC%$Blxfrj?(Ii-iu>ja4@Zh`!YZ9EQ3#Uo&E1Vw`q)D*y2F0)vut~5s z#+o2hzY}{~Itlz(F1VFW-Y3Df1aA#&5;!a0m>(xWKd5~~*CcRyAz5C%Pl98h9u2Zj z_4JtCB@%42_~SnpzR;W)UEcdGPFlL!MZ}#4OjmPSK9o$_#R-ono|m4H7H8F z58tFJCEh!5UI(VDIj<~iBVKJyGtrc6WgDXDh^Az7T6yR%+M+g}X<{kCHiEVe$RyaB zbOOg4FOy&oqI`fjnFPCPTH+WcQj}n?g)kCWB0YyO9athcKNoHgKk8>oDgH`)B~q`A z_|gC@kxs!l4wwY%!FdZ#66`&ck5zz@=vRy%ix_Z_pg6 za=X4`D^(W4TcGOn0C!qN_!OGoufC_a7Fen{r84}Kb-Yz`Ri#uZY{EqWmMYGx3T5|m zg0(fr*^xv+w0i`pzNno?y=D4jueFZwWE#9VMIJG(jwc1yV3#LwIHc>U@3GY#u30$$Rl!L4RtD}(76<<+)&*D7|OoH`_3*l(W zkzmKprvusr`#zMnfJv}_Vf+fJZrnHfk<)|(drmr;IxD*@4lVCR>U_DSL!ETS&6VyqtqtkVA%Z0Ui5^NuWdINn-g1t9&VTi6T671cq z0yU6ek09a@U=r*(7-z|m1bYR>rNAUuuPYziDv@A^tJ)?c*zrW)3rvE23}cF_lLR|4 zoswJr8xaY%t*Wb&U>`|bw|rGr66|1+lLYIGLU7BuF2T;C3(o;2-qW$-OoH7rCP5NQ zo04FilnZXz<>o(u1}4G&iLq3UB-pl_u}=%|5S9eHYg$>pmgI2>c6|tI8;QlY zjtD2Nm4tAQa%@JI8tH5YQnClM-9WB4&H)(v$=Lztc#LD^bi+9x<6Jo#;9P-mIS5tr z>V_53&!X(&>qIMd>wQ3&;_Iui|$RyZPVp^C4TX8^k`>7|v z9()FWB?qzfyRKPbodi2}X_R0;LV~T{oO>RqC&6yUfsJ*r^bZmD=fIviSSrC@&4G(R z+XbUrhJI9BZx`&Fl)R+UmBzFT^L}q2!M5zi^A8j^qO`sQyAWyhl+Ch^htP|1Nw7~* zL+)pa`VzG>$bEw|4&y3Nb|~Vg2k|#c6@&zPAxGy>JVX4!I4f+y?qELJ3AWdkJb!>m zu!Av9ks}HA4vZV*NP?Y%F&h*WZxU?fR?I7om;~DcryDQ{_6&>@K)ah_t8391Gx{Iy zg1tLNnFRam*4YJaQiAof3Zc%5`8uWbe4U{r*jwq!&A=qs$rumHkpw#(<4Ir=tXIJw z`c8wIRpt`xJgBcJRub&T7#{*|5fhozzr>h)7^@3BbKNbK2QN|b7o?vQ^(;=W?(C)j zWph!TJf>hVl3-W(8HJPL(I8ia^B2a~a{hpS*w*}l0J-mQ?#8%D&SIROFunvuHD1|~ zz}>dtpDKaM^>D^xi~;Spz9j>fnQm;~E%bFZ!KwbVAG^$$I{{k)lVF`#(I~_v z*xjM-3QU4^dR17Lo+H7&tDZ}O-5<)nAd_HEj6KN(x3c6h3ATcslt{47C{Nt<0FM&v zvD7W7wmNuUt^Wo*OH6VSkzfr zUy)!RQ@#3HGMRt}6=V|ZMqB#$9jo@E1p6H2PXZgeT8yuNjotE1ja}t-j4t5Qz7P3! z9#zfyjZEx|vpNNx5nyM?3(|U zK!R=eSsaVL#Ow`Bf^{ORSq(ybT#kTx7+{Pg!OlqIGEZl;xcQE%SHCDugLI0BCc!$d zEJdWgEN*_b#|(o%)M6yTewylbE5+1ynyVN|u%qFR0w%#aF&{poJ1)WAN%8HfHWXTL zaehwqE>WM~Z+Ri(X(KTm(j&k|qTP-xL;xF!K^ORa>n-O>`k>4*3HFIa^gp0h?txx=%RwTjJLiz%j1naa4qa_Kpx|`1+w@M_~Ll#E~*30t2t%ee8 z`Xc699e|BzsBjK%rj zmalKS1bYDuo)5B5`PB$*o#G`ggo`;TNw9nV%vn7}(e*I@4RR0Tyo2$ooO^Iq+J*cB zxm$4d!`Mp)R6*s79QiliaM0l`9Ft%_#<-i}d%s75{RGD(*bCBdyHz5=?)nAYkOVuE znw|wF!Oq8+2db`#vCEKPostV~#S_;bB5wO7)k}i?joN+zCc!!}-zX$Wu+4U*bzl;# z^9zmmNrGJkZd*_%!Fo_xqo5?gu1mn$3aTf;&h74*<(B_eMuNRSCnO2BJ8@eAlVF{g z4{mu#l3;tm-2))O)-p0rFibVyY2YNmE{;v|#$Tn!h|b%7#Zx*-u!jhe~ ze~U1aU?;h27Qh~w94xt70F5=i`wKBq7~mo z&_4y)itp-a4BhgX>*~`|xW9>?t@v(}0yc_PLkV{I-5EMyE555@v#_Mz%gFkQ z@8%S5BED99_rlmyj#hjR#yAkzimwM3ELbbPwK^rO_?`jh6a{I;_ezYBarb^@aLXT2OoHoqIM^hp+=HtNY!Wyz z-zdZ^uFbiUokC#bjJlVEMAYXX}DPAY3e*CZ%Yk2DFkg}*hhN#HT%DJErf zZOs~+2dNsqkv6Y6!#=GfK7spFgB2*Nzemh8xX3`j{Pp31b!?R+)5|!lb}DreSu8^XYmKN(pAVJ zs^TO#7V03;H3^)=QcnZAPl5}eo)5B5^`SAlOC;C{@f%1ktjZ-rS9|?OPFlL!IO47W zrmHzEAG$;HBz%_QCxGc{PAPFE9z#Ir)qe)94zCuMkCP z87OHo#KFc~xO6@oH;k{uEPXT_|gdru&l9*t#IvqBdhhQ>ttOr8~&( zMML8($pyEvv#XO}d&BJ|es(XqDorc58s3WrLOv8&3Z08_Hn0@(h+H^8or)bX6^?xM6 zex0W8aa>DDuxBduv|zF~HSVQaO@jR^68YOrk@)5>eBDkG>_C_Y1CwB{!?;?GB-p7K z4}qcrO@e&~?=4^wtXEtJH&c!T+m?Dwg8c!?*T5v$75Y*GsM;$2253TpZJU-`>#Xde zwCd5ZuezId!EQ!XT|p+nuAKti@)gi}66}ryY!B)r*!}PZfI10wlUNn6QizrdYxN}9 zK?EHI^f3u`m(+zvbbXOv*J2f@fdqRt5oZ9CV6VowN{%GhJ1}kmCc%1L`QTQG1Y44lcTqu866`Z2oMlO{g?J9UO(j~MDK5d5_2VCI0Fz)_VYHMZ33fw_^#KoI zNwA-%gFC{)F)z2$=*sG1cZ4CH6@YY_tB{N&xLorMA^#L_X)eF^p}NFzy0nZy=6(P%aBXg8hl3 zpHVzt{I77<8Ni>10!39@86K$)hv5wX9sY%566{K5Ai=JIF_xk$LCr=um0RoZv5Jxq=_Whf&23O0Vcs-i7`TsB-p7KljKN({S0FvC@S70*!KG| zuYgIg`(X5vqj$lM#25zJb&su1q_KZ4!R{2JOoF|>b9RB7lwkd=La4K1zD{X<&|jRP zB-sC>D-Q#cV4ugBDMu3Qn;7$eNw8i;u2E$!!F~aCv0^2`{)+K4;1)5Exj!y;n!k#t z3p{h(C)$t)7gMsr{`@2cxpQ#_V(bsfjzV?vn1aPff*sG%$0)u}{9ABVIDk7D$X$ao z7~=#vm*7mpcu3CqIL!{EBcQ0pD<9>^p?JMP1H5Guz$yT%Ys|} z1q2CpTA;_0VEYiz8<+&^#EM2CF2NoK^$=hZtkbK)qx2jJ_F&a23HD?tCxT3ZZN6&O zTV9hGtt=Bwg1wxW5((BB<%ydf;8B9Tka~xxZqiEXhH zSf>@j`|50zU?)<1uT^GWOIA<)tFyAcBEfc7z4}`6JOMKmWD@M$lnp|^)9G#uM-uF296gxg zKBAnA9_N&N5JeK~1djff;s-(QR-876@dFm*M&lfTF+k1;oCh%OkTV45SB$SgQ598A z;mBr(^XnJXJd0xzthdJMSL~YqmOz5NEg#3?7-EhFCc!$9)vN{~J}zfN9Sj&_Nw5Rc zxE!oATHJh=>eVlb%OH&q(Ii;sm8FQ(m&MJOdd&6k$6Aae*x{*ew^B@Pr+x+6kpz1m z{Cj{&uujZ}lj)92u#ZtZMb(CaMqzBK_d@mg{g!#%_B0Z2LYfV1BsMvMyZ|;5LoiO2 zqmg(4;|Vz$iB>Cvys>xZ)Y9VNSul>5SRq(E$2%5pv*D}wnrJgkOVs$`Yd1) ztcUQ=WKy@YkR-t_fcqXW3HBR|uK?#N3D$$k!bF|x($?RV(~2b6@*~+b4bdc6r&Sm& zNw5=BlWvtrupiN1+Xd@oZ2O7)h7xR7+S(YH1iL*(Prxjd1lw_Szh^&34_$)wqxtZ* zjv~Q+!T;+^u+HH{h?F70PSd$bg58(udjpeTUx`m+w)#h_M1sBDLxw>g3R=7!Ns?f% zq%=yfKg7eO66_|i>;FT7-6|I6gIm7(>=Nv?G&mY$pYp#E+MbPk8fSx}_+#QA*Bs|0j3Yr&6;y7;k^kV`2s-SHV-jp%j14JX zr^U+bcgHaawnIlB3b#rm*q18kh9uZ`sp%bH5^OET7ock67`qG!)+xE*Ry=V@us2sy zy(HKcM>B4~Bv>bM!%Th4f|3N=5pDZ~N#iSWmROoF{F zwN_`PpzagYbSA-iaT5~klys4fRgW*}zyETyrCqSk(9Seq66}{4p8}I$JtiL%lO)*I zgD3|k!ET4KB`Atw66~pX$AYS9vB_mhuujSaw_G6QsxEMR(w6UV8L4P zJxv!*E50M)j8KqPeDB1#U5-|KAHtXfLiM89+tL-^uhO}=l}_GQe4i(HCa@J>XYp$E z7@7ES#rHj^^F`N+uagSNa=Neheh2kikbO*oEykx&2$yS8UDoyxC9EXa@?-f80IJ$W z$}%Nbf2!qzTmFb*60E|*!6rd_>RScaByeKBQHW214WON z;PkRabWMUwi}Xm7pg;V+z$Ssml&6@K(X}r}Q|{AEw?~OehB9PmFo!ax!eb^PWDX%yC^RWk$vj4+$dIX!xy&Lm z%ghZ?;W35B|NZ&y^6D?X~w_YoBx0yK^@Rm8-^n7f%A;mJ1$b zht7haPlDq~J{H*|a96&eKTd-4unv=5lfdnT6nXPL39iIC5oNE+zvI*@La=?}Cxl$M zQ*&Zs>3+>QXmPcB$eW6ctGO*7p2OyY@I9*EM8?(J!s85d@)>wFE7Oz)UdbSS-ipt- zn)^z^U-B)jURgE`w$9i#K*rVFRvP|27F$iL#hO?eVEwV|k1_2uHyGDQUYG=`bT2GS1%i;)c^_vb=C`6EAD_XO}DvVk;|V2BDDNH-E(jSRth za^8{?f_;8G?0BKJ&z3G?nUGWzjHlOTjEYbUvi|ZDcP)us+;M!l^lV{52Xp2Ubm zHdNeJ7H-GpL!~X%t0NmKZYd8BWgTzPLQQF?Y=UPaWJAS${0m0;mR9$wjzeX8EInk? zeaUT2!dtS{v}!4vhRQxz_CndcsC}HGx!_TDbhQZfD7*vZ&+bJVrF)S__3uSPF`tfX z2u&ck4A~I!j9mCqor*)~4ytdFU-zOH37%I$L+D+Cw~^h8JUMU48bSq~Al-|;$FoRD z8b-|qb8AL6jM@>jL7{THM(#zvEf+jWH*X&}ok`vp*}ceJ`G)>Dh<3o*Q+5p^w--|6 z&HI4b7wg{0UKO9lZ*2bv!CsQ4?|(U$La@K-bZEikXj(i{tr~*8Io%A($7RL?SK;G! zLa;+|4nc-srxQ$3K?rsp!3(HLiH2a8Q2GuTg7tcX}@0!@ks(-bE6?9n%--^g5bQ;2wh;vTHrWf1A=oboK38)>u#3|ndF0;_L9lD6 zxmpDKQ}TM`tFl6{=gOQAtULGzDlyBwj$nVH3qK$xUWkjQ8G^ke4uS+r8$+;e$_0Rl3Fy?BPY86(QK$;=52Tc;q9+ z5$tO8YE@(ic71|%RS<&RnP5l6o3Ie<*tD{|FN4PsY(EV9nTf@>2}OJ*grhaa=5$)$~{G448bTB9#js&RVqxSFpc026>g?5i{N3zuZQE+_(uqK<#>8>;S4&# z=-01c&uQx`7v~89f?#h~*YqpcdFPSN30)A=nvlSQvucCB6aFL9qLsP!hHTw$3lh4r69Q zus3cV5$xX}*e%%MCa4aAJ)8}PXk#&gJ)aF{X=5>hoy~@OQ0v^8%|kyLuJbF{+z|fF zkZQM~_WjN3A=quH?SiWIrM51DT^F>vXN7+?IE8v4*txWj+m5Q?WSxp~n^BlU@F*(j z4IK3({>-M5K(NQL^$)6-%6}Mzo~QBWp-`0^<)^dd3`!@Ub{9}E1be9kAlT~&?xt!o zs-8lj{C@uP9i{h>A=rMgpZt3r?Q&L^eOITOLa;+m=lus6f}KooqY6T>^9Y_(K?wE_ zf}c^9@(sauJA-+J48aZ}7^s2}>@5V>qBiHmy>86T{yBmj9kUFy~Z5D{*Co7L<-l zVS}@{lc8Kk3YQR!P+>I+ZxFnoLURi3heA?Om3CgA?D144( zRXSHbkiwQ{^A#VJ52kPd!60M^_RLBj*)7iE*4TTs7He=oLa<+A`2ZP$-RvCx;UO{v zJCtCs3PP|?5a1=5G>&CJMDUM*zz{(g8fuI7lIv) zWhBZF?C!BA{IoqCYc>|Edw2X7Jt;!4?kG*(^adUg>{YaTh1zC#3Bm4{S|6bEH>&AH zIyNELskm-KhG5-R2xq9X5y3t~^%K^ZeJmN6`d1reJq5u&sdn|TWFZM3D9I4)%K!4~ zcd7Ot5$q4te}nAWtv-yeqR6h@vgogK?YdFh1@UTo4&!YSP0ibsk$5hJ|4`8vmGl6% zPE3dUigpKr-JPvNs6IxP*Wqz)$p=}4U{~tcB+RFJF3SB6%SOZb>*y%=BZadFPEetS z!W@EGDtttt>O4L!qbfC2-jY`OQraF>uSLNStnaOm_UqpzK(K4IkJn;2Ip-onu%1%d zAjPlCWmqpkTw@{F+tPLURY$a_X&<$#ZxlCUx=}_$uSfF2T8bC$-xe69{%R*VC@VVoaYP zyAr#e&%bp=b|tPLxKIUMiH`~1R6$o_{R_B9p(-_ISK=^A{ZYBD#DxSyks(;$bFQcl z8d-*5pIwt)2*G}W{Uc-u)>HBgQWApw3GWZc5Nu%t0peJNU_HGg?5tz`qvepb*^3bD z>X=qRhG5-RX10W27pF7jQ4xYYa;=D9y^b~K=&z4pd$XTj$Pny-1p6aqsSxa8@s1h7 z0D9;M*0=H}yR{VrJCgs`MX>HE4OdYIg56HXCIovT%^!sf!8TnvyAAN~Okz}oVAuAP zYq4LAnzf21A=qZrMg-e6ZZ1Z!r^c@T9|-pBSe*|Z`RcPH*t^)_G?cwc2LsyjD`mYc zgsB{q5bWMvII5eenv3%>l$%JQWF!l)DvY796NRl&ZWx781ZSfvHBf#RTOOk{1GSq; z!4T}T1TRs2&xRn_ITQ@R9vb%@f=5LNc8_)Fh7jyBT3Uh(!Iq8!41b_k0I|UWC+%c`QVYKBm_GY@0kb$`#M+V zQ!Z2Wd|fyp*cak1L- zeFpziC_}KHq`lQfDXIHL+I5Cty}A(u`%5}Wg|q4L=zSMzUqZ0&vY$7QA=ogQ@l3%G ztmou|auR~w5Kl*B2=)Mi|DY;a48dMV={!{NN8IHK5v-edfK9YJAmyxHw?2Iog1w*i z?n6eO+?a2W;`HfRtWV1>`sDUPihK{gn!5n&8_4LB+e;eQ1p!LcBdzRyjlTvNeexXs z6-qn^e~V<5cdPYC5fJzb`yWctDz6*MQj}6^T2&}TE56lZxD+T`@h!wJH2eed82Pkv z`m`?I4)SL!zHL*&$}y^sV7I}%HL?}oz68CIt@wIwKD6M<`ik!nR39q8R(#JUI7LpE5ZQ{aCl@SPE51MLkhJ1^3!WR5q!r&s2xh7v`t$<9b0}1HjJ++UPo2`Sc$5y_ zS9}+e`~k8RUw7q$N68;oe1E{YRCcZSx~Y&NxBH53*@c`Ll)VhW?h*SG!rGctV_Scw z;UNUOI>y$hqJOlk5W)Jp8owcl?{EGV#U!|yHwT*p-Ds~1vPs~^e1jC91Uq5fL3T|7 zw--|6d+KpAn*{DGO*v^qFRk9L6DgVm=V2eF z6iot8DN9jGscF?zDVhXVVxNezNw9V7P%e1n7s@BWop`6ppG|^ZF(Cwx>SK?mF+YxM z61+?BHnK_J8M)A{Xc8==`dj%m39833MUhQ{H3`;0HVHgAZ^@bj%XLVa1Y6_TR7siy z{Rs|IL6cw*!Eq>59vJ&wJPCYTE_jp<-Y3ENBo9Y63EY)$=#P`&Dy&z?u1VnbLW;b3 zp9FVdorbbkWsf+zixBKZ@e@KW?5H_0vGl!-IcRaUIpjTojH|gV9|mCaLAZqKuaR*z zx9}I_b@CZ_$Ehg|yw%3>^HyYB&3z@|8u^x1U$GH34Ypmd^ps75&26ROUfF6|og|wE z*r`}fKpBFam=54M^JNJ3X6mn%CquB4(&wOsGDQUY4u)5e4W#mm2#^gV_w)Nw`6EBu zmgEpom=T3+5FJ8r0IHl3yJ^(* z<@m+g3M1l`i=!(;ux{ruXXnsMA5!CJY9ulQ>mHs>B2OGfPf$He77Zh}6wKm7=Lf16 zBYPQw_2E_;Hl`_t%KG|@t)a5!CCnpaL&a@nVLNO-RJu{!1=&z>OL^EM>v)T+JIA52 zGoBrh4HfrQghS<9TK)1Sai|=CWk1<8RNU4ioFrRKtLtRbP&p3EF(|ti9hUAz9%V;Y zi(t>eJ5>JcUUXu*7kO0wUNj!_#mI)x9R#-{8$zCu3&Yi^ID{UjdZzpuLLU<>R6#@N zdxFKt?nR!Qw`2{WF*-rI7ZomLX;MiVMja@ujcgcgO3)RB%HfUNi+mgXiM8qG?E_~Q zl6OLOFLD=MsPB)1=s>Ld%dSD>CLWer&+Y^2c&x`FdsVcLL;W8i*jLl^y^M1y1bdE# zo)%2brNy(=sv+2qqcIn5jm8hV@^L#M*zq{WAw#gw5X@FV2=)ttk5H8o4Z)UN#$pjN z1nUhK!qe1)VAr5sL$K|ztcnc5_9WOERjd|2ST=%Se@_Qf8)YY@MUVCes=Mh|u!qys z0F)uvCTX44BVPfngJ4f4;UrXxU`J6Jfoc(Kb!;jZJaVvB2fDnhVL)oddOb}`xCAVaXr34T*^ zLa?3EA$jEA5kat%yU|=Ng6)>P9{H-Q5bWPFCj{$`Lh#7Fj$oUNr$2~^*E2SpA=p>r zQbvNMjUiY!<$_0cy7`X~>_9ED=~u9A*uiSrNyT;Xtsu490KtxngHH(dP8w(o!QNWr zSrLN$BEAddf=5159Km*`R~sWkussO2RY3^$V1j;#H(?>z7t`Qb!r*ZPI~cDK1ZwvS1w*j; zhZKNds|cQ@>Je1E8in$X{3m|}%X@6e5NzxxUryD}SzX@Ul5PsYj>k3*8G?O;-~knc zV80;vPz52_=2!Az5LGGP5NvNs+ag1-7Z40pK?rsx!M&)>IdQM|v$OvX1RJw51p8xl zf*VJ$>FoDQQ5>%`TOP3$M<@jQDP8#(8G`+hV3`U+u(_*P^rVm>*w_RJwq9e7U{}H3 z0vUo`hhQzlEn)$a`rVk5550AQ=XQE_Z+8C^H9awHuB>ky}xL%G=$CKFt%!hIAL5qzY=9TYad29k=ZwDa;$*m5zYb5QwW3X2Ke zMs0tka0-?i=v?`46!y55ulT6EoThp2l?3&jz^^jq_z68BchG3UvIdw4J zKxz+1j$mWEAlMlB2M`eKGu_#T5bQ7#&OsT1jYbe`y%a~VmtegJWe7H!D#FL~90WU1 ztqQ^3faN+A5p48hL<7O)cO*gzfnz_ z>S_qVK7s2|lp)w?D}>U4wFvfIsux&e8G?JgU7C27YZAp48cZ!oom;d+FpoP+m#t_8`IRD8i~y*97V<9sN?`4*mSrD zX?Gylqu4r*>S3~M0*`YGf0YM|5bW`6t)cn@lslBdjyLkx(NS)13YQU#P+=De?-R^Z zVOt98+{DLaRHcT>&tS{plny}EBPe7DHl0}CuYXkm!A{vWUW+TqnTRq38&g2AG4d2g zu(xBKjJU>zV52RBF*>3}P3NgyeWQ2?(*rVQ2sZjau=N@yC%0Y9nT!8f%P|C-+MZiK zXX#q~lp_TD7XCL;hG3&HAFic4{wvross3EehJvobJE`4i>hr?p6}s)|O5|?l-|S$t zD{&}=y^&psI|*)5L096x1YfJ5E74;Tzu-YtYRs<08I(>%<+>6#5sXI}f{l9y!KOZF zWEq0pxd*)vg8do$PbfpM>4@s5Bm~>!7WRb*^3Zt z7fhW{hG3(u%xtv?HuZ9GjEWHKBKm8;g7rEOY;;xHF@=zuvR!!-)`bVKpF@x#*pmoO zK+IA@uf#!u^yVKfMC_}K(2!gGbk`U}}c>Bn22sXMvu=V`uSFnfRJs1@s z*k}d8)=NqV_Cyi}DXA`k{lQ1pj2QWMWe{xnjvSB>>@f1qK^cOLMi6Yhl!Rc%<-j#gABo*NN^OYQnQ9&Z=!S+s`w+OuNc9me!1NNDQC4!FZw71 z`vUDfhcX14x>Y~L>C<~y-;v!AY_x-5W8{1A)!c8eEXlp)xdT(D%V_@1Q`rxo9scpgxaR(xM0cvS__r;i9eL?GChUQC}l#cjFZ zQ95{E@%@qHWhg_iss9c9amBZM3cW=cf=xZHZ}%17Hdt3f*(*b^F)4%xG^xh6K2if# z2(}BxO;APuXjw6WP4A6eW8`m9OoBCebFfL!oA!F448cYt2)15|PlAK69w@sZ*k}U5 z*0cL07=-mWlp)w?0>Rd^YZ6@An;vNroR5Dv$`EXHf?#7*Gzp&Bl@v{atFT|86hpAl z2!gGjQqyXJQZxzf!afZ}1RI?o*chd8P?OQJr|>=@e?+j!)+oxC_;AyN+ zqU=@KBaZH31RLMHbKyabvp?XJT z18EAuBo#D}UL<%HWe7GV=Yx_Hg8d)$OO&8NwCA0SC}e|Z2*HV{az@NF>iTm0Vr_*H z@yf-~6%lOeXC10_3pdJp>iUYL9!WwjW(WdBU??YHnM4`oQGu?iU>CPa^bKTWk*;0hI~2R@$yFm zn`|e>sQ$fZ3g%mp4WY*g9zz*|O*?CPbnOs&lj>LH*BkPG34T;TL#QyF0A&a^Cg=In zHrWtrq7$ThQENOc@2zqpWFjq2P^%e& zjmBK)9F2$W$;a)4V5i`mgbcyHOYnvYLa@IR{Di8MXb5(-yICwk8G=o7UYdVADEnlNk95 zXdMJQhJ;b57QtRm=~`5TU}FOy*cdrjtAk+gBxx$rD?_lU3rFkxf?)68iw@WQ73^bV z%tVG@-ynEh1tHik2tGj>f{kr~U}IE-U?-^AMi6Z79@Zgg!4T}q6sk~$U}GbE;Ea)f ztpve#P;*5HHhH_n$g!#r>O8-k4|Cxl@P9!IdFF~`wR|On@fu@uI<^yM z>rTyW*ltC+O(;A-Fhhm4Da;{wMuk=s-XeHYg(?bP5PXI}u<`W%GXxt?PcBTN6O4ZS z3U>ClzH%`QL?{G%m%653!T!!JenuIBeS~U5u&wUpJ0vm$yE#Eu6e5C6tz8@=YV4H| z>~6UGSVo3mlW&;z4}$%R{g*`q8;3=PVBAOM4Z(O7gkWDKn2Xxn5cj$%JNxGdc1q03o(20sc7hv4uzplL3pQPc zI9_MA{7OeC1p5nJ`7bgATk#+>0vUpBMX(CWo&_75;90Qs8gm5O3G4dG)vsW;CfE{j zi@2Cc{cFt0hgJ6B1kdfXv&O-6YWBypo3bWTm_l#^Dp?2Ww8OrTR;Sqv+RoIEbUj#p?(4E3=4?|K>m3Cf!8e49qbU7+NpF(aX-$*I6y@bNH zSlZFK@=GZkNzH+%{5lHv5L|-{!Cv!@kL;630Kv9ChyxOWU3nI#5E+6!oM1l{^eosZ z1UIN41p6()r^pa&&$qm_Yt`DY_Wci}H6hq79$}pW8OA%D;1FaOuk(9ZP92Oll-e^< zM6d&5yF3dvM*aZ=1iMo|_8|m&1qqiUL$Ge-S+Mm|9KlY;dJ8fH>!ylu7d;2T)~M$~ zu=iuR55;G}#>RLSY>cvzXb85No)jTicknFO==C>yN3hS(?o(=;;bqT)O|3ts^EayL z1Ra|Y>;hb`qwHC*(N+j=sI&1`u-{YtjWuQ;OGc*t)kaxgL9lbxu0EDjJjzu@8G`Nn zu3x{ewg31l*tXQKg6!J$BG?gS_`I=eH-Oqh5U;jV7;npIYQbPe;vE#uq2f$bG8owU zKswxx`?5O_>@c=YqWTJ1#>3;>k`J;7!M@DaKdD}Za!*p|_ZWX29pxUNa67@ZD%?R~ zDZv*i+(cpP*?e3^RcfgG9k!fF=|oihIfd+5u<6A5e*LQo2zI@Lm(H6qqI-*5Q_f)(3M)5MH7iG+z1si=l3$|XvJPS7UK_kl$?2G;Bg%E7zlUxmyJqtD(^9@oGf?We|TVx1!6M~Hp$7;`ljp-%f z79Hy!Er%Y;UW8zKVcH&L&w`D%GP5NFTlu!nAdiX=?D2<01nYG?3pV;I?U-s2?CI=h z2r>jaieLm{mfEvmMwc;t{=?nXD!9cJFp1@HJr)n9_8k9SgLg%NrYoXlH6iy~MT7^R> z%pkY}RjGmUi`Y^_X(4KNH3dVklL^+L`oUvBu(wgjo&}pO_wX1MA=rHf&|V6?ACx@{Hnz&MU{l|+q=aCPzf*nc11xl)eVCTQ@Bg-TIt_*^`NCzYYdj)xy zqwHC*F@i6=f}Mi*HUxsbk1Nxi%Tzr>7tWpq8?!>#L&IZChdzh%E}eb_JBz%B zks;W51TUcMS+J?Ei&7KWnG}L8qZLE2-{W75;-a3#SltMMZ5cld z=fa`t@#uX&*S>^c3(xQ?2=-+Nc0&psQT8m@n3K1hgkTS(es5$5b|k?$s7lQmf_;$E zbX2i=OkW{_bra8mjdlm5oYhH3(nlfKk7(~hWc106JPWp7iqoehSih59^vO*;3$~u! zS9AZy`WG_#qedhTR)|yRh3e-;=3L8ZBVx2yLNQuf=AgXs9o{h2k&0;XDhzjri9Khs*hlg#e6if z72h)nPDi%l>$&-G5?9ut!DUomB)?XC?;yBc1+Dl#OzPXs?8o&_6wTfE}iHyw*d>EM0Ew_*;r24pL~?&4XnF*Et&if>!2 ztIMtxUpMhA*m`zf@$HJWGs<4svtW~TxF*%u){8VegkXDN+!P*bvtZ-< zo4-Xd32x`j!6v}~+B*c`u@Z*(C7fyd`TA1f4idf}`;qrX)>*u>@mO&?LBq;3~wkU}L|FCxLI{ zS+MD-vcpfj>~50pLN*E9#j{}R`{N{d2J2I@YZADLXTjF9`y_Y=>su&$RSt-wy9mMF z72mvhM5N}##L|zCrD)9N(YG{A1gaxKab>;vfl+M6#! zurE_TSDp;PK9xSAY#~!bu=(fthJ(olQa1`4Asa~U&xJkYj|lcSs{0`uNV5qZRzU;l zV}kck_AJ=Av%DoI1pDt7XdKxfI-1}x6*P#(5sXBY^JAvQQ02Gri?|gg$14{{SB7BS zo(rd{mwsP;n5OPS*|T6%XUr3a(Kl3oA&Z8QH&d`?eCV`&5hRW5WeC;>S!o!@?iebY z=rgv4%I^63A{#1hD+||Q^Pw_;>O+tX6}Rvst*qlMZX6Vc$|-mTBO5C2s|b(Ex3qfx z@o}h(#Bzab8Y*sU5?+$6rqv|bG*qs_as|rnMd!y^!n0uO%@_Yg{#3kE z_3uTqG0#Fagx(~Wk8B8eMlQUsPQ@YgHPxTXuY1u-FY%6pYzVa`Xoc)vdl3_$=6zxPFX$ z1+)%=y^)0LQ7wX{+m>3tc%4La>{%3RDll z&L`tlWC(T!TwJ0Gcp9*E4Ib6U}IE-U|Xo!Mi6YPS6GKchG07qtb=T=vu|u9 z7d-Osh#=T$C(&Fjg54*1J@QpqA=pywJ0Vzi@GRJv3Stw8Uq@#-)q| zOB+M5-$fHo9gUHlZvG<#dz=>8^efn1*}*Q_NyVe_tsu490KwiF2cHn^eKgP*f_$>R3hxuVtHSFPz9slth36^!PVg(@S+Ma) z{t<#bIi8+e7(^!`g8lGKU%5C5Nz+mO2RWF z%$S`WMlFKvFg_yK4MDI&+2JXu4uZXn4U@F77{NZvhR3wA7{UIpF5bSpr zfM9}*A zo!~|htRGbfwNV_eGg}^e8b>Gu`>!|nPKpe{wj*exf_??N5kV(p2-cg(HE7Hc?DklD zC|3w}Pl7!Vw}>6T;;)OxPUpiXI>B>0y?80RA4ts!n2u1^K@?^a+>c5gg*tgo!E%IP z|6=RPZ_+5r{XpRaf`e4}io$CIb5(esLW>3T8|CIxID+6nRHdDlH~F2mDNRM?t59h5 z7CzK=O$y~ZHxIYcx$?CroXysgQ2E9b<`CS248b1ow2$m9NdUp#cqRuV1l#d#P9ZV` zdnUmk6@*}C6Wp(Y5NvpdhviZ*1RI|8){anX!`gpxI;{!8?v8C|WEk&Ef*~mTCFL_& zP8|e0p4v-MM6hebc1was{s9C8`@$LQLkRXx5~d1Ckm3mT5v((jAy~IpgwyCb z2=+L&Dg^rimgi80U^j|Aflj1j&Bh{si1;dUiV&`}5Ukq@;Rba!BG|&a{39`I%s!UvnEF>6WjzJK_ENk0SkjK9 zHYh`|%hG6gK>Lpfwj1@GkX^e&2>KzrcJmv%cBfN21o3LSHREkAP3^Cd*qy@VR9uQm zE(EronhtlFb_asJimeY*eWxr-;c;%s2U&z*H(0kxsD6((Jd|rkVKBi!6{;ybMsTkR zWfV%^uL{4b@E0xZNns~crH0Bkr}|P#BT@AZ6b!-o-uOZqyXM~|K(N!#ir3<4a-Kwn zVBJ{SAjPlCe5|h_uCWm8$aG!W?7|T(YPvw}>KnzUm_C-#5Ul%3Qby{_qNe3TW6m=C zODsnS_V(1aM=59NS_70L1RFkphmvCm){XhFG2L+lyE2w4M4xpPW~O$xQ=b<$uhMN# zS7IYfYa+W67ZD6sL095!f|pd#m1zGV>ov%(#2|tJs7j65m6%NFW>l^#@e;voWC+&x zoGa>sMwTJizGu@5A=ot+^2e}{Ay`kzH%Lhcb~C))kRjNe33fyrs}QWGmxSYWtberp z^Bndf1bYak1CSwDx0RVKA=p>anewOz!G2GF?N_i~$Dh}Z{z^NhS_FGB`x%D}!Cp^r zEn=1m!S;OC@3N!lp(9w|$|G>K6$Cqt|JOyZ?kNqAQ3ry3LB}QpdmqhDMTTI%kMG90 z;878Rz1veh!2TX;_G`2Y!Cp&kM6lJ*W!)@BuzSa@{~rkUpjgds-ectJ+m2wrV~5|O z>{a>{pzZT`3Jc*?4oV32!*Lwd5~|8R;`eX3bDvY#g~B!{_YQ?I1m~(SkHYf=kE1Fz zP`;cke^UApwJW*l1OD=d64_pX#+Ax|If<1=TjzWfD-I#BXk`U}!c+Zeu2-f|D6!|U^f*ptV zLR5=jJ*lKYQbMrTk#LQY>LAz&bF%Z53m*A*We{xB;T(_8h07Os%(do%wspT2zDNMuOLIPUl4qR48eM0E_mc;MhJGC zI;&s77Cs>vWeE1Ew71$QOCzcKOzk>DuwLB=f_*2Qr1jL}(fb~C9{Uo4ZOwjKXn$K$ z*nwahWC+%C@xba5<`y#SrXEl%7EqAI4p-5W%`B7d$FLuxpK= zk3z6N(cTZp=#v}s4N{ywm3+#dd_zW`++Jv4_to50u(m)(pWI&3z%B@I*#-1S5MTrR z>mj30o>Q7~{4J7I-e=DzML?hj_HC7-RbEdiOHoRxX?3|$wBoxj_PtTI;`>Fqh93Fg z@fF|W@E#+7w&MF&N>~=7`UrM7=5vv)_+CnIF|rk3&&`J|xw5|Edpp&)$gdUO#|a)& zLD1k8f|ro3_y(T~6?u3R>}P@)>VUC{&ikn}6|&Z)JM_ z@F*R;ulTkjxec-vUw82@l454^#}(ghSi8us6<;?MQsj1D@!b{cE+~5$g55Z^ysIYF z*w)8uzzV@0g7IKfu}!qB5W)Jp8owcl?{EGV#jRys-W+TaoKAZ~kWB(N<{PB=Bp8Er zlSW|6Rx?f#;N_oHU}BR=+Tk6itF> zus@{~O#)9TOHoRxX?3+yGzs3p{uat6!D{gg<$_0kp?nf7#`}%@*(6vuCU7Ha=JQbftPjWRqZDg1uGHBp66=II>CL$@~>yk~IlN>cnXh zoQvlSC211eOmL$LngsU{Oh=(|%h=oEN#NUZ!J~BWJ_(*B`DtX6z+Ft@bQZD<{|mD3 zVtre7O#(MDZR^>65`2gCTa>*j*NCIL2*Dm7KY`@Jv6>STOAo)0gBDjS{eth3^mJN_`HMbPPEjsxOydTHVlm=dZJo_W#YVIoukIT2Tx{YiaY-6#EkWGWl zZKYv>Y&ETZ)x^>OdkD+DC_}KPrUUrad>MlMl==_k$q?*$=`&hxR~m~5cGWL=BSbck zdK2u3Y#_Oxhxp1L`Pq3?50+nd(>DlSQ9%RgzXVH=Ay`l5iM}K!1iQgktkNMHMCTHm zp@Ig{B!cTu<%HNxjiJiB;umWx91*Wv99d? zfhwo5Nf}OZx_gh&?W>MA-flOa^8|PgqrCD>0Y!mo*qilz33Q%qg2o^I)mUe z6et5rj=Pex-dJRglmUd+esgkaym`3f=w zTlkuP%BO-5YzGQ!peiLAg58DEPRJ0fH(Ur`QO~bnr>O(_73^VH4nl@tM-ZHgDwfCZ zu8knr_tU}DM%hVe(WCumG+T>cZ=imLWXI(;v>;4M1hK$dVA=tkN{!l>(w%Iq_DnhVVtJy{n>_%jFLWW?sA=p~Y=?@WC#;)a3!w`r$WAx^5rX}Wz8Hc%lpXZf zPAZ1Rw}RAa0|a|q{PrLO+m%(i#t`fUMV=KQ*g5fCC>K2Pk>UvURC;wXG6Z`8!FehO z!QMo01L93s2zFXLIU%&@%~J2-o96am>-`w+F%ye#Cl~RR5ISH3!LB3DHl3Q+vCTud zNfbUNSg67k6qXWvufl~C!nb@rRAD%UW)zyDP_b3K8vh8vc1~Z#Hlq^}!QSw=uUu>= z@&kgMp|0syupQXNnkYlCdx*^l!S2YWZIL0^BM1&fAw#f(QfnSjW3Pl@&%%9%Wf+3} zEV5Hhp!N@fEx=C8G6Xw64huuDN5@-s9R#~`|B|p13E|f4FlrI(w7VmM?GAz+&kip{ zbr9^MYyI{R9*&~nI=_PLN6mj!yK3j=;j8KO5bRad zj6+qOsjZ7(XMtAFpX~42yHhU&JD(PEuTk|5Sudm9a}-wpj^7@mlD5E6PvUQuDhUL; zEnD}Yx);iAO5s|9%TSdZ<-OVR8l}0Y-F_4d!5(e_2=+vRlJ9x`6V=s2DU^@qKRdCd zGcp7_F7}gu8mV2*>T=lSbW;fS4J@x9L$J#U{;PrzY=Q<_+x)~SM2285CAdHZA=ozvUQj^@w&j0WDn*81 z_l&0}gw|bXZCLvwuAns`*nwCMMuzb&B^ZYckniI)@}Sd zd381-*w#ODLqzmcA4{%C*P=Gc`U--5S?%g$$)+T9Rg(Q7;+}W-XgE&$j|jFm_1h!6 zc0&jTBfEC(8@qNFQ#%gvYWq6l?HrnV|1L)2dBFwr1*8I!TKfQ8VkWLNY`b7 zj%ZQS{nf6%QT&4GzcLzvbze!!NPSt<^diqG`;8NYLQ^5w|E9J*N;yl{`dm3eur2Zb zTX|*I*QVsdS9He_Y)7isQL~|-t59~kkBgtx=Y`EL=X%~l^U}v@d%}dP`R$eCj@UGL$JQ*Tu~o1vJAn#b`8A{g56>{ ze+&y5g7uVqgOr3|`{M1548a~u&<}B}La?4*64va>vHsEWyzAJD5bO|4Cn7_zZYwie zLa?i+Gv!ecf<5`#h+w^rABRPMr5#f(g1wdfOhSfWXAs!4Ba6brGz4O2aACfnfXS*o0u8qxmP0A=qu>yKydfRD@tR@swrQm!M|7qFo4f zb!sDmJtA%{MzE7(*Z&U$dsnQ^2akO9*%5614^D$*uhLBbZC&FjEQFC9lo0HpQ#q8s+w;(4Sy$6?UO;Bf&%!wxzI;;7wGe2Fj0TOZA_8l}7E(pkTj(9YHXK>PIJo zU`J9g1bbP!+#VGn*n_U88$z(V($X%-5bPlY2cU{uW9|wNtXp`zQQA><@Zq82N{BOW4=L3La>+Ny+nQ?SoarF6wht#vtTFTy$RJKSWhZxkdzSYeI(qYq&f)p z(`ng_Bo{pL@5&(92|6Gl*r&*Q0vUpJW4=L3La=Y(eI2oKKb|Y|IG3q<0)ZjeU*j%A zcwNI|Oou&h%aKag)#)&>`uQ^ z)<#*H5bRdkb%tQQx)B81F}9HlpQy*9_x)P?5`x`?{j84+!5&DkH!=k4IsDr|auR|a zMg4Fk2*KV*FcnqFVhHvVO7EhIPH~qjM6hnk1&@jl?379LQ3$rl|F~-*qfc(+DW7o< zp5pXrHLR=3F8bsq9;8yw?yI?-u&$4cKDnu+fn5-wxq76P-JbZjLq?xGr!?jGTO_Nz zJKs!-fWUs(_fd*gc|D~pMJc7G)xVXZ72o5rAB(aT-)`v|dgO!0SA5UIJ52t#;+qnB z#;87my%O_8WGlY65!{Nh72lYV4@ABal&$#2+f}xLa;+Ho`NbaiIx>2 zSbtZ`1&{nKid)NFygAq;xS00FA)5ql%r{8!NpK_9>t)v@aC;#|z6YNK_h6llY!bM= zq=8+Nprv}GN$@QGr;$wp&nZngX+$rr?sF?Cngs7+e_JV<1fEisqLfn8s@kPn85AnV#(o!1 z0^gPk9;Ji#N$?)Y?;x85?#egx$4T%#*2S`G61csPB5&R&K|V*!9Es0 zROG@MoHDrDm$!4!;%cjtw+b?@=C*w3j?D+*E>!nK#?{Pfd@(_p(9%eAs;u(_=?TqIjftFvX(0DBqBT$CZ$XVU@PYQ7A?{zCmS zc`^k1div<}h)fZ|Zk%rx)61 zQlHV(hsY4Ddw4LdJaHJUQqn9mLxy18QZS1To!(UMi0owu)`weZSZPxmDx2vuwuZ`3 zd}pdT-MidY7FNUNL*-(s#~~XkZYd8NV9`*Sd`BEAH{rPf*-&v`Mc7)trPc3Di9_W+ zEceK!q2jhCp^t1et)|GPq4Ertr%-k;nvm{A9%V5}0vUqsPOurOQlcT){*(?vhG4znLb#E75Ns#f%?ZJt zf#qam2=-cniKwDa{KnA;f?Yo?x7J44Nomoe{gLW!`W5V>G&Kul2zINK=#j60)<;NXdE{WN4uV}w(lk9?#! zf*nh*#vntm*AQH#f)MP31otD}goR*#OM~ZS29G1y7ck5*6N_)_0ZyEigs@O!Y);3i z;wuBG`3lp`IEXA@ zbRr_y#gSd+!q4DEA=qvpMnkaO*~JzpL$IaBWacK*F9E zXX_KS2)5J95yAEW!A@a^H=#NR_H{PAqK(A}b_pA5w6Pe$uHU3tSRJ+AWv%An>zC>w z*um5srP>RqJ(k)!zk;1k%_LNH9kq24?1!M$`Iq>@%1r8oVE3Vg+>ca!N7kn(_YH+E zD>V!2qLPWgQBUFrJW2w=KET%Fs6GVc?xb)p!R@F@j`Anj@+GAYP`j5Y7=nGr0ub!y z1gll@Q4duwp-{e@{~SbV7i0+b{n*b!_)NQ;)#ZzO>823uA}pUFL$E9Vt65kH8G`Lj z&`kyXA>!i*2BIqE8-l%+(pAV1?E3_7s2~Je)s#_(+WZms`UE@s=Loj+((IfXf<5rc ztk5We^`i=*Hp)iqYBO7&bRS131iK|&*&G>y?L)Au3PP~`2o6AoV7&?cMo7A-S!0f1 zPsBP%xk9k#5}b{=MLfu)J|K2FAO6+}p4;iQ7uo#+YOcj}nX+D{u!!IzRPqJX$#V*p zBLutdatLQtv#=q`txn-uf-x#Iqp+M{nF<98J(}_90Ogj`(q#mrP?dIG-i_)nC@nzc zJt*wBGT%s1+rAXmUAuXhO6SUVqi_dXuSewvQdmmxJ~9OR>v$j82a*7So%{d?Bm}#6 zb50>L1bZ97H7W?fE+Y6y1tHiCtDA+jkRjMx;_2bJYiey+`>$runh@+zET`5+olnow3us4uXgkarKn!M=^JR;aa3(g4A z@DhT3JGFkh&fln}t#vhoU{}G_92tUjTOrI=XCs2$gz8S#n0+kyB3+BxDC;W-c6YU_ zk0pIb*i}h}U?)uQ(eS4B9}(;T>JLD6?Zy#|Mt1E^ZtU9KO6?@XtL>4Dw=Zd`zeeIw z6rP~sQB*Pu*vjV^>k-dAUx(d+V4q{_XH>r}%YE=Tx8%(t1p6&pxBGXq&=uuArf>tn zcop8HP($#63eQvMvP!ei0p*^ca4x~gs7m`P|Aj4&Qo0XS=huq}*7wE_5MtN-y95aK z{s-f=_>P=!ks(+&@`HkUDSlo4#JU`DjfG&>j!0lya7?b(C_1U^m3S0Wt*ZM*eaZ-EjoF4b@w#*-+3` z*gv&Sf02OBeCwdF1LdYE1a!S23lv(OhAg7uVqgOr3|563$I8G=29 zU@+oXgzWZk!7q6(QIMJf*BPLkKmyCfbEyZ>BaP*aza~Vg&nR?E3$KV3)`0 zeDKIupB=%j$_`ti>{U7m&^98T@k>G1or3T7BV9R=|@exd_p&zZSg1vBn105c?*ys zSU2W_N1l=p>>|8hArS1}T$v7Brs{A_M6kW$E<@Oo?QoI>?4}mM{!ZSn$PjF^)w!!9 zL$IEh3m*BI5rQ4B&gxgNo8aFFWe9da+FNaur3t}4u3cvc)~g#quxF%`w5xhNdf!2h zu`eOmo!L(hWC->of@6^(SkK7^AK?wFaf+tXwEQVlzru03kI4ACMg$UM7 zx!{rWRL<&pPtZpp*frYl2^1N9a$~+hiqoggST~kkE4Xeiq{#Q+tGU}_?SYIwxxJ); zT`Rj+K2DDW0rtngFEaY%Ii)Gb-y&J%eQ`D^0s@1uAEy+p@_I^Hic(5Vt80{^72or* z4@cRG@5powJ@UchE529Zy+Z!D;+qmC#Hc=ky$ka+WGlXp63jx`if_!|H+)=KU-6w! z^{es=8hlMqqk>j^eNV1;1EVZ0DkER2>FB3OS{%LR}8Es9C75pNDQ32vpmNysLF8}kiP zd=fl>b%yMk1a2>+$oJrrU=G%2kWB)&mo%_z5?uEbJ<=q25C1#JCV}Vh^o;l>oksN1 z>UmF+qDk;Q_QgukByeL{ic(5Vs~eS~Nsw>HNtc=|e;JaNK1X=u7s@9=E4-`7pG|@n zVnPTW)yEziW8MJSB-oi?M`V-0Gx)>5MU&uAst=T3li+-U;VNhnj3>Ah*(C5}{t9rM z1mkq#Gzq5RnXDvXkCzEvR6&#AeS&vUsC+N>yLb}#wp{Qi9lTG1B_w}`Y!bLD-_Rc? zL17JcjBFCPz0kn!lVDY>Em8KWd@7FaA_Tiq{PGVa)|{AFdd#yNw76Oq@;V{oYHrJi z+p+l|>`(Rn$hewY3gKy;d%ka0Elm4t=zEv;TlHVw9iu-q$~2AkVT z!%wo+wE9aEO9SjvEFYi@!B(dOSgE6Y8G`*+dp>p`Ox3S^6xK*f9BaxH5$sMFwnjFP zPA3?QY#_OxpD)WF`Pp=;Z;)RD=`Vs`RnS0czb0S7kRe!4=C{lwCj`4c^}8S&MAHZ+ ztDr&j3c+)zvUBXFQP)24gRm9ybw^i*VBMYz{nbk!QoqvF56BR#d-9nl4x>(M@vRsc zf^|#5EIxDwP~8vN%Mh#&x6&|#-7!=i(PwN8mGSs4Rdc#`xveaW#O6cgR;ni<8!B!o z4_9OzZ_z2-hH4S)#B`oKaxV4K9Zc_G*>S*2?X!LC{4SrLLA7~h3*!6P3jj$m)5S2rRoH-1bZ35MJQwlwlcNm5jFNo2=;c|lP$v#>;;jX zhR{v>2f;Rhot9+?_T)G$48fLNmEC^oAlPm9EeU-{=y_&VS&LxrT@(>)KM?F}cK9Hw zgJ8d6!)Mx9j9^RF<)0jBV=;p5!NxAA^|V!*he0%4=U1?!sX0frUr@WarXGTQhMI>_ z)gRQ>MX-N^R-ZmA>o|YRtR=?}f_;Y;axL5bE9BQ}7JeZ!*OWpp3frQR@|l$>i9cwf zBoOSnY(0|a=ZMTTHIZqO{WM}}bcBIvDx5bSvbLs6CT4Z+T$ zG#wd&T}rS>1tHjVI)PuM#c{7a+1Wowus_EvL$JG^pPk@F5v(6o2(?ihuQOZzpd%E5 z-Gi>|h77?TMsTPKLa>7gPDF-ay@_0d#vH+p#Cm~pg7aUWsRWl7r{@c$%$VRgkX=wb|^9g`zXOZDhR>;MevgfLa;k@ZWgvg zhF~Ye(-Xp%YHe8iV_%~+A=vR)E<}d$9wm4f8OA$*Sk{9&2=)zXUq=za-WS^~2_E?e z5D@I1ud@#!*u^A#gABpCv8+LgBiQ9we?x{~-ChxXq30mjAJuaq*d|>#Zzw~sPsE<& zf=Ag%Gz8m@o)jTica$b?dIOILwl(dxQriqKA=u|q>t(Gtf1{e-sACg??SyMxWC+%6 zh0qq8qrRP~-rgFsk0lGzwWy7IMksm8jpQZfYF zBDNgD&2$6=+h6VK8^v0f+RJFaf^}a>@F?|VQPT;Y(-nVb%MpUzG_~zf%2~SB*UAxs z-2s13WC+%c`7nd-ID*}q>OIwLDCjEelG=S*eO}o78m^~ZiNTl#BD)f=5dkAhtRcg$x#FvylMdi8@m76yUe^D?5>wC@>^+6+x52?#ry!9r% z5P}^@%HhZmtf%A~q$C7;Cf?JLA=nEEMk9_@2-ed}!go5>KU$7{i@gZJPQr8@G6d_k zGP5NFdvH2a9u*vjC>C;BVxnE2Jgl{8 zN}DZMdP2=Ej3y!2HK~mVc5>WYj9@>HUH?B2?6oJ{poAAw*8QZNMjTDsgG6(QKe-liKuu&2?|smKuQID(O=;U_T_`eI?aFuwGK!Kb}@P1AVaWj%mGUhuW?M1nks;U)1ZyBeu%4JJY9c!`La^1e zVhDC;{5zry!Tu-htu{(Y-Fs-)8G`ldMiA`L=_K8y9*^F4iS{J~docUi4;g|TMKBy0 zg7qAJKTb|UursK?O9?`-9}+A;Rk9d@t=yWAKd53*+~o=ptebd7PP989<*ZKsfIbSr zZbp0EkkKbM@^4M*r8s@s1?x_-YX#R$g%tT7d^Ps~totFOPi`-1U>5{vr51Ux%u!ISJqd2YpDKQenEr(5&Wrw zR(zXw=dBspimxXZELkhQwO{67)u)^6J>zV)}GLIu?)8 z!TXBuVI&`lY{l1I`QTCV#}(hxu?~@4E52^xIUI3EZub@6i?EJG*~<{@lgawBCe_&1 zKj|oiU?*X`301rrEh|K@{;rk_9{F1olVApK4mJs9(cZ(zCV?CC4N`m(yomLA*)<8= zUPzJe!6(7{Sl>l93EW=Nz^+NqMm^FbSc3mMWRt*iN>ff6(MzlMTu6#0L17!NHnK_J zDP;{)YFe$K6itFvvA0CoB)BVmj_}AYl+&_}@OF|vn*_6BLI@t!#~wRj?ul#?98Ay; z*(C6cT=<}95}Zc$N%CtFTupGL3Yr8{2yR0*2|PJ($(jWJ(uva~coNSeN)qqXx7$hex@__H#tYq{E~RG)y1tGT5R z*21EJcaECUz`GgGwaB=d`%1!g@-3~N@-a3IwwJNYl}&eCx0QzdWUFa)zHAy`zhGI0 zG6b8Cs~5R&g84E8yViCrN+C=_u+7pE$4HqXf;|Ysp2!B$#RQ{~4J7yH!u9e;e)bI2 z_sg$=)S?Ho0@*;?oS-u@1nbFpOHK&(1nT=ML4)W?f=5))Ao`5pLsZ#5cGIZq*71X| z6@H9YE{?7Y!MZ&co>VV=NHy)rcLrn#);;;m6Nl0ERCkv}!^kZKv-r?Co$A5JUWQ@ORUBLF0EepX&fpaVtHRS4HdUF39HCf(`veG8Yw**egJ>bv4`kOMa(f{~-nqkp!ETeL?`E7!A=pbb^t50S zcHn!PS~Uc_N4gp88jat7!N=`{U|ZmBiVVT-OwdCG{UPFG2o6V8N;CvJmeLqx2-X`e z@O*GXuw7`^5bR_uHzGr@a|xbA6&DT9zT`B5V2?`&QyXO`rA3eS$E&;PSFm5v)E6j2 zutQU#N4^4D2f_ZAgdb5Yg00w*5~@Y8Bhq>D$iZ421lx+FRghkWV6RDC7_RdRg6+vF zP(1{@9vSN(L$EyvwpBq0b}xe6ks(-bD<3>6La=M7*+vlTV6sm{hG2&ioU7)9U~fo= zet3HvY05bR-bSQvu+B^K%+*sb;~ z3G+x;xqr6fS_IprboJ2T*L~Is$AVzrV23ZEItca;HvFoM#Rzt_ow=u=ItX?@HuOTR z{|e2+l9JWyBG?kd=9-6-sIBuW*mtRU1y$`yZCwPrHfVLiAz8;mIFWiG*nYH- z+nTCXcVVdr<+@NfgkT?3axQSxlX6)S2=+#{UPbjd`LCex0l|D!rDn^gv1R36TuRjL zAqs|IpSA!5`zpaMRBeN*-=k3eCI1;i=~QG0_PW^50)Nwme$MLh%{L4aA=nnXa<@W; zV7DRITm}6h;$sK~s2~J;6~TB^rF=uM^C&%o48fN6=2MCaLa;yN8VEw2rLbu zH0B8QI;__yR|s|*!5xTO#M)o46j~jc^^>0(=>*U1^j3j!up>2dF+HZNttqtV!`@Iy z(?4JlF{fZTLa=+W^;oJ8M7f%b?8`Ytxs50cA~;-ybtpVWFauR-=jDg6 zrP*%$Qzf>PA4g#@g?^~*=@dT3au1y=KZC;mqwGDvq$s-g?V6cQxU%4)ASyu-445z@ zDvCKPqL@I%EC$RG5s)Be45$cV&M1Ol76m~u=hqz2#k?pc#PGkL({*ZR!;jBzuj_$R zUC*hm?yl;Yt$SzsO}5TK<-;hfya(^~kRjL^hxy2Ek>}R9%Sw0u!1)w{y#UMU$Pnyn z1hZ5Sf^D@YM~4i-9zd`sG6Z{AJXD_AtJVg0{O&ti6N0@1%LL_YOyMZ+*``gkW=faWY6U1nb7KMk$V9TVk(5hG5-Z5q6{J zAlNh1st{}kEbUN+U@wb3;R9mnShKOnvtVx_rwGBiqcnNb3wT7Z>(lPKYMbFD1bc02 z{a~HHi<)=P)ewT+7S~qD5UksHWT`qEKLvX*)qSlods}i_>R(-y^%MlVuiDkyk~2v- zT}g&u_deW5!^PTvM6j1oKOEV$dxT&LvTL_NQ`hblYF|S9w7Z<~HlC&iXe3@i;TtNx zLM01;t#78oovYn}V1H$6^S#*>DmfV*=azhsWhD^oy=*<6>i)7#q%fD@2^GdtsNRSB zC(4ba(2rmr6$Vqdo8Tr?rH0CVnEy%o}a{dWlv?2I4dwOFw?>rBWH ztf!PVO7ZKmCe|*9YphSf&QI56k&b9V^H0^TexukN)21>Sf^}a>%1C`#(7aV`%-I?L zj+P??TXLvhKaWyQ?P>#+BLsT@{{4|5SU2WFX`v3m9!vGnYBm&f6`MGe={HoaE3s-Hz9R@3 zg7rP;iu$0DWeB$KLXJoX_8jbIAw#g9l5dof5bR}mFF}T2ClHKB9IFtlr>$WnpB?Q|wohgrs5bR?5YoCJkI=-JX`YY|2>JaRF_VYP11p70= zLc}Z;f}Ip+T?hx$L;n=4Z_S4jwG{+Ag#YU!Sof5MtEdCPzV#EwCInl)ANNjnVF-4Q z_-f1}6k=3_U?26A4N2Jmwdfm7La?_}8xicOadR<(eK>ag|3I*h$7)zYjC}Rk5$yKt zuoudHN{0a2dc{-7?@1h#5bT0~IjYH2^~c!<DB?uA}e?!P_caMxp)we0vS5 zQUm3Wv!xHET~Yfv6b!+>N$@JV&a@;V_yussMiL55&GF;~1d_C|thkRe#l;pgS$L$IqJz%N9oqDS22QW311a={}9 zq@30D{-BRSu)ERTF39MU8~F~)xCc*h`g91^gJjnVuA2%ea=WkQo``iIGWz89l16qx zfE$0OM}h#u@L!0GK6y@Q%JG*-R(W6jjT8ZaaoDd_idK0&r7T4$rKZgUrD(FJE`K2JbC9k0b|P36*@~|x7c5yTzGHOawBox3o=ugc72nn=cj%uN2c;(H0!i)Gh}ubT=fa=WkiPQp47Wj}^s zFHbFZ;2eQq&(wewf_((zR8(un{i~HVIy#y_b+p0ypw! zgbh-B5`2R7BiS_x+{C;426mqWwOD^ZHVNER(#Wn!aPyz^NRy!CAaEbDN#Hr9DJPBS z+UmC!lcGt`7JD0|XcBlzS&C9hO`BVlqDinG_H|G;3C@lE&jpYCLir@v4)3<|XOm!5 zObEfFhS=jE%=;so1g8+3jBFBkMlP&hGzrE~eUbc{1oso%tAen{69kVTn*^Smw`5I% zD|F&C3Esx@s**Gbek1rr1xEoy0U8$xSge*bkedN_$1gKYcG`jR1S%wy9mL~i|;^kp{M4=*wPdK=AgyZ`jOWc z8CP=~e=vy62jOU{haux?ZYl7cwA_Ihc>nxGQyO^F@JvR=)!bJSu9mO1dQI6h*gnJZ zfovLVZYvG<%2v~+Ae#o*vWM`N0%ZvH&2#|InlD4Jn^V7`JQ;%hG`&arpG*Khehs9x`tha#*+ANzU`J#K)|2^8c#;!>9Y+1BO3)yB zo8VOyG>CpD_z6`mjNLTqx=eigYlY|Hm5ZY*L$Ge=OCn3@r4Ol2{aLL*hG5;3&pdG$ z^`&|rSu~8?!qX0E#)r-&RF6RRV+hs>>KYEJhqx0Qu0u=!AV zh3c1(4HdVPhh4Ldx9X~BoWz$e`8;b(6)wEep zHVu`+p`2or-HRrrdyz-k(bXZ?74Wu_Kf4z_kfxPK4ev#3VeX7<2yH{KHL@Y(8Ql2P zsW^o8r+RPsHH6M4I8z1Pi$)QQKz1+kJmZw4Ve|~aQz~c}y-M&h z3YAYcaWC?1@cLMrZr(m{J|p=PWcMO>!R{OS;~@GO>q6Nzh};CnZ(#QURdN`wKFEG5 z4vRzmKOxv<(+cGn&ZQ7+%fRA;7ED^x;__Hg11q{LGkyLCJ=1* zbTD;Mc2ZjP?DzxC)*;v>G_@FI2zHm0=#j60)S_YUl8o9JRPq8DcG&a*a8`X-H%{j6@*}qAvgjVg7voY!J{Gs zd#jpl0>O?TdpI%#dkw)@H75i+FddRd{yQQFb~80shhR@jUXOfLRtWYQnG=F_MLeU*XlQS*2?V!G2!kSsH@v6kmmM!6P3jj$r4}s~3Vlp8`}Q-Y0EIE}(i1Usm3 z421&-_E(`lg<}YgLZRY@cqIP`!Co0p4_BouA=o96UFLW|13d%5KB=zhQ?P^C#W^TL zu${$b^eNc!Y`PX1f_i9Vk6?EKt?s>( zFXOyNy%6k2w2kl#n+nZo_6@*|16P%%f5bS*fcc3ce8-krr={;l!cI9Jumx2tz?oF^W zTIIaB*B#l}e@Cz*VwNG;|LvKb;3g5QA5{o-Q8r@vBI4h5ghH_A(v`E3A=pa^#;70! zJD%VMWC+%q$Te!r5$uClA5g9k?9&8KB5n~MGO6E-o#rDMI>EEM_SHC8Ld^%5URT!7 z6xKSHPg9_hTcJ*#Q?MK%*c!H8K=nx|_W^|u2wqU(RSH`k$8QiQ_Z)?x1ZS!67=_mf z=AbI=y!>ajbUvO*fXe@&FoNJ@)NYx-nuVRQY(VGAD=B=<){kUsL!sM1zOWk^f<0?j zAKB-S0D|pW$pHz$UV~)}G6ee-!TTx*!LD@zM~4i-o-LK92t5bE{-K@=!ESxv6+mcI37^5UZuq}7<>$gbzj|lb_>Tf`H?Or07i|pDhjQ)DpZa%f2 zBYxU-V!W09+A@6Ak&(DMg@377f=d1cwvJ7Q+YOHpZ1c04g-$22@`FlVgU7igA7l}N zU1qIj;Xw^%k_i}ePv&V&rXdP-@d6u&N8W8D&QjfG%uOV_2Jj%Y#i0cuyj zQS6CncNq=Ay00W$rEO!ac-MgvXA?ou-%T3^V+LaiO=?Y|5;tzuFRnV2#?i9Xw2HBOk zoM4y=x)Sdbyn?FKm|cmMr@~uMxvs=!1ZyEfu)gP9Q6Dt248eZToL&gQUV;5GWC+$% z@{Ljwg1rszEyxh;RDvmpV-9ufZAY*NvBLvU_ETC5Xv^=C^|lb2|HcIa!5-g^qiTOW zA3w!;Jjzv5m_~4~3S|_2A^28>ziDCP)A{xqRHX*W*QWY-N{6BLn^G_Y+lyd*s-ItR z1i`;6kvQEl2Z0 zu1wX?#K}AJ_NfVL$IEhD{3M;H$t#0(uyJ2Q}CaRG6ef++FM&oA1S5bP-SGZYzueTd**WC+%C@)_^pq+Z8mEG&{Ux$o7c@DS0c+CD1$tv$Y%abA? z@BsGvl%iE$H}@fVt0@W`i?)2H|Fz9WCO;@d7Iw2VtgrZ1pT(s{w&J@s!I~;)#kV`bX2@22J-J}XTJdeJ z6Q>p5z47d>B(3-!OK`LbTJb%L;0zQhyTslW)2FWKSUgGx?<>BSk~{|4im$u)i=>#D z{Bgzi7OXeRt`%Q5@xe5_krGTU|5>CQ*H( z{K6j35zJIUli&@4*N{yDPtIGiCPB4MoF>7yc)nDUCc(1jaMqDcf|Uu{qELB2?04}b z@NK!^Q95{^1RIdN90`^~kuITlg*woqPt~P&K82 zHxJKjWL(XCCE;)RYOC*Si%o;=H!KTf(_nL3X;}VuY&C60%BBIf+PVCGhcW~^HXT4$ z^JNHjPwID;Cqu9|r}t>RWQquOB!=^m4Wti! zm2LGNTSMgye6OiF-MidY7H-GpLuEeIpCcP8ZYdAbvW~Z!yh|W%_c}vz1 zny3?`d(l)p4=72)=pBN$RM0T`lHdyzDldrrF1{D}wp{Qi-MoF^{6_LG$nHh%$~X4M zK~!-8Z|#xYi`-slWcLBJ64n)w{Zw>}L;XJ?*q77v{e^QW1belHo)%2jp~bb;sv+1< zqLDwD{3A0iYR}v4BVnw$1Nf&W&hE$%>?s5TRS<%`n&2{2r9?xp(HZ0tVwCdS$kh+^b1-sl3ezis!f^C-8 zX+824(0T~ABMI$M9fIAM(uSxG!B)qna={}9YxNN9b|h_!^kWEijnsv$bbdjwJF*JY z0KxVlV{c>#b|ArVDhR<2CO8Kfg7voY!J{Gs+gZ&vfndjzeFHKCdoRJ=YEB5YYdR#4 z{C7kU?BgA1t`5O&l)N7Ks;m%f8|^zGSa%eHNA7h5`xsrAftYyP#D+5j`*K{sNU*di z1nZ_;@W@U#{|LdJr$sh>3if4oFi$(FxFNn2q*fat*o))f6M}t~2AV>!w-kAnhG6H% zSD{?+$VZAJ*w5(IC&&^LK-}M7(9+(J78GZOf0@td{f6) zLO5DuY*v@4;w#%xvlX@;D7P7f-3fM8p(}-c1P80ofx<}yC#cYx!eD~)P^dUCUXA~R zVE2xvCl}776O8`z0IE;y=qndPgaARXJwc3yV6SEuSD*~RULlkx1UrRI_aQ^DuM@nC zLWW>3Nv(NAjr}A9TZ8*c%P<6+iy0yG(f&cOW7&UMhF}-QVPOb%WPAarhhV$yToT?Q zVS{ejVbmem&9;dMb|eV)Z+7@As)u0L7z#T?^$_fiY}i^GixKQlHk^jq4zFn$e(Bi& z!Oo@TDb+qr?djCk`xI!B!AsoC03TDHwvi*8&ji zbb?c=ED5Q4p$ z;1U&tV4o#;0#zyB5bR<~KOjS}-A3>(1sQ@pnxH>g<-@qw7unf=N3dVTEJLuHZ;_qg zCK0S3RS0!a9Iw+`pWB%u6oS2yu3U}`!QM(RNd+O;DFhE9L$KaNu2Ex-V4uf2OSwX@ zZxg(UxJ6veq~2_!te^R?rB3kdt{-g8?x#|-5L1n^?xoOkB%h{0C7VH=Jf~neLa^tt z^%|-#Lb;PEEF}0ug(E2R9>s4EDA$+5ID*Sm*posH!AGb{J1-x_mL8+|QzcY>HHGm6 zBT&1WDIAGqDxE8zMByK{{w&-56n46pFYHE!VBg!sNA|TOfM6%D$pHz$-iu`tG6cJX zpjHJT*q&oJI%Ej;B7$>~A=nG!=?UQ(wKllpPhDtD2=)yuFDgd}b_v1n$S~fZ&9WZU z!+5PO;d3o0BG{W_yCuORe**%7eSZ!1Aq2ZF30;vPST~k6N^u0cCDtvFAy~Ipgg59p z2=+X+Dg?V5mR(SWU>}G*$pw$Hkr)C9_AYXY5Ue{&lQ+G9M+AE??H;JM8D2uLkEGT= z*ZI4sd1qY>A=ndf9fu6Tx~&lYP-i289YytUYs}u3%u3gyF3S1}f;~{}>TSubBurA0 zA=p8i`e?}(pvk22m?rKw{z5+9?m!lhhT zRMH06`g1zmJ+wOzY-hH1r+Qsk)`!QrB_CuFf<2zC*HJwN<@!@tM6f`G-W0aJjQc0b z?MUHbg25_mMd59N7f_WNDnFAg%U#ZlK-I%27=rb^71DnFR}~QKQ)|U*u{}AxkRe!4 zDQ%SE*QF2E-iT`~1Y6kH&+$1rq6N*rQoH(%;z&#bWHbcpzLJ!Y`m&&T+qGlP>G)5z z93j}%Q`;V;oZ8h+QH~JoMfisyL$GelhfC;=BiL)G9;;?UL04hZ)b4oo`J?4J>b9pV zF$L2d$gV`y75uF$vMX^Q!5%8;O59Fxy$ZS#wFL7~l^U}v(dA11jtQ0PO6)<<6B&Z_ zJ?D!0ppj(=wqI9zAq0B|_S=vlSWn3}N=XRzF}yR7A=noQ<|2+&2-eeie7%l!N$aY0 z*^3bD=a@c3hG5-RX10W2cS~o=qapvj3yQKcPI9fECf6(;~0f^AQ*3SyQD z!Oo1cE`-nNp(9w|nh%S#6$D%QO+y6hp3=~UIuPvp>u_vBup7~QS7ZqG#Q18=_jkmo z2*Ez>DgCh@f?AvvO+v8uQX3KM*toeE!M+*0{(m6Y4`Man2N)w?eRc#ph#j7UvY*mJ z0c``~DKCVzI4B|5AGYAAE~jb?&I?g)7=?KRGgUZ~!ZKrN1LaPnuq(kfs7ei#-^i8= zDV>Sh-$}s`?85}RQN8n~AlRuC48cB~F1JTT2=*Hd93j~0v@{JFf_;hLc~tR6%v}nC zbxSUI6c1bo_VM*-UI_L(TKfhWf^}oQQA$Fvf8qU8ej!-*7gFTANC>w1)vOSrIt1%U zC5@62f^A2_%1WyDDcF|Xvzs4J|BjLWt_*_hus#PQ1iLPIU6CPJH}W*_1}O=__Qbmt z0>M7Rl^MWgs-CF}Cj`4j%nIQQ4UdtXKV>&{2zDRx_CkhWk0Cf58G`l1Tu~F*xeaIu%qygKpBGVnf6u}rKBD&XxABn_39=N?EbNhTo|DqkLYvO2JA}+b^`kuhYZ2a zA()8_!Fo>KauS05nfmXQAOzd)8h&F!Rch7{>>iYMKotkaT`m>Dx+%vOB4?M;0V!v7 zn+hrNJ@{(w4Oqt^qfc%xX=E1!n6x21 z5(Jox|9)ij$#Y6mj=w~*%KLUVQUnBMVSiRB0s@{=mZFqW)8;m%XvOz`*xyCjitiEW z8hYf@$`R}jc)ycBTk##75(dSnA%e|ciy7I9?{Wk!kgfQ7Za!SgmGu?hHK|@*ey#X! zL$I|9TJhbBU=L&~zMfpLWUcsKsS~Fa-=pyiP?A=BFCaKy1+DmAMsNuVl_O(si&uOv zNyp+*I(T34y_Mui$X0ya#e0yLnf!6ZcLvr+WEVDYQz1oe_Z8olvCc!;k0IE}spUH~ zsYbUwUjtSM_H&G%qKYS@WvK|(U)6HKBY%lv5_IRq!6w0C+WQ^ZByeNCQHoE3Wv*lQ z$R>f?`8&Y)3hI0CNw6~3w#X)dn@SqlH3{z6gdS-UY=D0~WRt*i_`AWli!`EZtKZ+4 z6itF1uy3anO#(NTr6{G;w7FX;ngj=7KLBNu;KtZEU+Eenzfe92PR4tp{MjV9E7?41 zh&@JP9)@fZOduGKY!Y}zE<92+38qv1ko=ki|08%;1xcJ$ z!Z==jEt+fr4ats$!Fk|s3{G+&+vSJjH|h?B((h&Uv2ezn_<&nTlRY1D6A38o;s7kP5tk~M@@)d|wQ=tVrUl%!$w9l&*G zA=r78UO1+*T5-IRolQ5}NamD0|r4#A$9&XY$D*6JbH14-(O z^kWEiRO-TkI=>*;7q_Cr^*;rBJQ+tLL$E^$hNvI}do{ro$Plczl@A^jA=tasY!e7} z3fT`LL$EUmo>p^0u$QDm^2mR!1i@~l=IRja)yeCTugVI+-Y9cIuB!MZ6IJhIcxKSHqo&=*6nU$BGEw3CX(@ueWO+6cjZ6Zb0w zyFIIPhFC|>KhPS^=lbL}4HdcA%Kz6F5pNe?g>u0oA1RJtf1_8wAVaXF6PYl`5bUZ1 z9S|?VLa=M5mE}PU9!Id7VCZHh7T;zT@s$vUX^hS4vZ*-R5^DCvwhzkHQW!vRmSo@Fpn3>) zD>ii3#^Ns`K7ly*k#TTw6s+ra`5Y*&KOR9%3oH=|I#9sj&QX&N#F+dcNP z5c+DDGrFDHi*5?R?sqG%Kgba51q5fSAOw34!7VBX!M;cE2C7oNA=nnT(Ka#!yAwfA z74${K=M$WcRyjECb$535-x2IlG0PC_qwTU2+$4haqvGprV@?{c(_8M6OX|j$l8;`o407V812!8gYx*?b~I-jMxF*Ve16X?%Ge| zU?4SRw?osFHGsl?6m~-;FGHO?r(iikur2?Fa8i9E%9T(kyMsHK3V+}~mO_7&`<}uB z1h=U$pTb`RKcgz`ynGcB_qmflRYK)!QkX(89<|$;!UQav(z)_YC@g;$?+j4+wiNmi z?1T)#_HFAU`&AM^u-$g#fP`RYVwsK%!7g_80Q$f#yy^-KbWC%92@z(xO zYlAzUzCEo8!7jk^sd9v1m%E4AhO$pmu9W4}L$GU6y9SB~wnJ>UBzWX+KtQmE?7%*R zV7DV-TVx2vk6B-!ugKk9sZydpMRuQHEgGjXlW)k9;hGVArN6 zMF`d%rOBIKz$1b^g?3L?+YB!u*iBOFE71!O?ATE=?6R5ty z8nd@0+ofw!7iE0~!G5H6^|s_u5~eH35bVM<8g|zHBZ7T}`sa~dyWa^GA-i_3H+Ah= z+{@KP{IuJH@pceReRnV;aZd_esaOM*tPgBGH689q?G6OH66IGNxG6?7#YCzz~) zu0-i%KEXqwN{!i-*pe-qqjFt|BMA0GhG2cqxuQO3WEq0}Y-f5Q1p5T`$B-ddPvOhr zQ@68}gkWF8`wB7y`zgW4h+`Fk^(5ZJzs0dGX?@kM>_rIncT7JaL$GcuGh0HiFQr|2 zRD@uM?Gh2J*X4spm01tdvtT1epLa^Jc?04Cf=%FK6-h@VTixF(^*!BMd!5$Q=^T8uueRc#pk{w=zvY*n|0Bv8yQ(g!II4B|5K?iVD z|4=mv=XEIeGlkCx-c_N7LdS>rGI5mqn8INM`=cr~P`=C!72!Hcm!kHqDHwuXjo>1x zU)mQ0+lhi9*sWLeOW{!wf<0k3x*-JnGA+$RhG0J@_z+d>6LXh>VBL}n9>oI}g57F& zniqo2P2tmxv}g#{jrm3?3Bgw5Z;1@Sy1&rKpAc*(ysM%*1nWs9jgk_A-H3#4N~(uo zuUsWNU%B9s|E>&zy;TP!1iKx1+ag1-Zp=4INeFg7y!#>$?D|}p@m!|r4RqmzVDE~% z3}Lc{$H>kD_TW`IeG2v%@{U4=Uu(?DPx4wx<(xyl*mu)OdRjdm(dSR?O9*x<`*{Evg8hi#U1SK>bNK2wauR~Ac$hzm zL55&ABIt^$WHAJL1f_#f#fNd1OGU75$_0-ckaAXM>`fnqU@xP+OOVkgH|86qIDMLk z^(NW1g6sA|ihK{gn)@Ku2awSxx0f`s3j%afkF>Ho8~=02=#%G^rW}8XWRnpxnQ@w@!TJhbVppOb#@jZ&*2xKe1o?NhGt@yUm ziPMVj`FPG&l2&}LAsDNIR(x+GxCMpEvUu|^rcagW^~0ld@V?^vD9O{2t@yetA3RF_ zxZ?W?)|X`0im#grDRR57_YxE zUed^}NwB7Rq)D(N{_T-X0?#Q;IcY@KRv*%v6itGIu^*@uO#)9TOHoRxY136HngoNe zpMd&^YBBGH3?SKiPI!#{Rp>MWRqZXf=yM>B-n{y2NWtd zkNqy51imd7JjxE81wo$#hmd>_vPs~sd}Du{1gBspZqYS~GnhxMX z^JNJ3T5hHM%tJ7C!kW%r_O(!I!|?C6+|@e}!d@$M&ob}!l^ z-HSYGcrO}=`50tFXc)nT$cB(-u*j%R#UXS()nnz?z36d*M^(@edXZo*vU`yy=Pg-7 z=yshT-HSfO^S+WajB=0jwqFI^i&|2sLZPyM6ZazDmJ1%Go3{^~)kyA$>|W%qd}Dtc zL>pt>P<9O>w--|6&HI4b5$pEIekwv7>i-GB-k+xLE}Tmt*c&wTv|w@oE$**Y4Z%Jg zjk$10G%h}nx7!K94#asBG6Xw;V4MmVze$N6`3h(~ z1iL#4yP`S-dl;qus1CvYoX(R+4%X@+*po>*5$VSeY^%f`AVaX;Rz7%CgkZa>*(MO|T(X}>hG5?%cw5a0!B)nu z9z=6>2)0%7dgQCJLa^<$?}T98!Pm6MEcZHs{faKkM@+nq(UKw9`{N);u(T-z>!w`r z$WAx^2*D23BAY%1`v*JtO*^SLC%zPpeY19w8&%i2h>Bf>O-@| zfRkDARVbGtA1RJtmwl3Vp~w*I$^>my(5GNGBiID-A}j=ZcRV>E+{55;1iKrCoy^4I z+u22YC4?t5#%6VSOnhZ3HOFB)2IcOea5ll2DvYOaF~KMmuAp!u!SyPPq;LT|9v@1p6h`hG0Kt(|gDe>|X?b zppYThfvGi*sIi}fV5^_vT>@hNGXT1uM|R2y)c!%R*R%h!48gu0hlL^7qvH!eJp{Yf zHYMSG5?cPfw(X`4!ESY4M6kDmVAo=YtD<@cc3(E^rH#c1_Ea_;uZ_hB_5n8BjN1PG zY|HTHxeXBPB5J--?S{{_4Chi??^CerKh26Ks@j#>`k#WG3R=DLpRD5{97DYj>`}Ck zn@80kvW`T#XDK{Fa33n!`%#_+8TYsSXbNP>zVI-PPzd%(y7D+O1p6w%%PI)LeoXKo%AN%qo8Yep8#Lw!_9v{h$`yhQ z&+)`}3fv+J-|;Nif3tzWx8msp&+hu!Iqbd@HLGB(M!A(J3?w)ll^hOr@|=R@2*KXL z)|pg4B>xQ*R++_}4COAPZ~?*TDh#DCi{LR8&Zba3n-_RgrJa{gVaqX;`l9luD9k08 zg4(@E;eS{jqjTl+D6IWFBMOzjOW`zve#j8)jGX^&+-w%N#$8sLb_53`1p6+QmysdZ zHRkY#hsY4@K!U?n5Q2S(;7()+_ON(*LfA;H4et2+;j|_M`!|+fl_LbZ#$09_%05Y1 z$a+u@!Su*YIO8fDLd zji!pQ13l+cutU|V5bRl4&OjN0y)6287Ho{Nk!YWSeSn-I1nUl-1slET1w10yQM5Zk zZ8N;=S+J?~{dE2=YTi{>LkRW;T-T!PS+LPo2q&ns5y4KS`ax^V-j>{!`d1faeFecD zs&@6Zb|3iEioOrc5*m2XP*R&3b_RrjKhJqtFSSl_SzE&+m_ zb!5C2gUC4vWzT|*DLe}{MxNr=aV4h9Wz3!h z8+|+rwn4+>bT}&JOu|3Wa)e+@f?q$6yfZ7+u6CAkgkT@SKN)4uf{iIWM3C+{f}KhA z(`q&pbQM~sc3aG*&mS$`L^ev?nUpl{klBAj+Nv8~4n!U{fD7vJAl{oc_BSWyi5-dU-t33-grt^S79qW?T%OA^LgkYP$LJv{)EZAt{0fE>Og6*1m=}{4a zEj=b8Sg+%o7o)$@j;ZcbuszsMckOQl7KwKy*cmZP?OCvK)`hU2cKvm)l81q)lj2q$ zucECW*mL;5K7w^mX}E+s5bUS)$PnzIG~X9x&w`Dw#(dj)jEWHKY)=`3eKcy(H=2ZC zAEGuQ*i+-?Vg&ne?BxG}U>{G%;E}IBJA%E59o~qtpVFRywqEfR7QzG$N(gq*864F~ zR87ZuKgtcD@EgJRD(p{T(^vU2ag^JG!kGjopei*`elAhVQ1iK3f zJ1MCif?ZgW-Jp0DY>fPOWe{xV<2fK9*aOMyi?V0IMkCLHZIF@>>_EK7ArS1%T$y*d zOx2Tg;p|zkrG8KRM#E!d=dajJ9fBQ9-g(Fn?9~L9q3l_(F_AAeOHE`aUkLUVbylB( zor-@7iqC>g)($C3Nj+ZGuH&;{V|5bXJD3c=n+ zd$%B?Pj2K{uyGHb;`C`6)`w-+3a*=Y7Hk8%ujW3Fbrv%E!{Mm|czm%|dj2a@?^)Ro4Y{hpgf*#0Ld_6ZGnmu2);@gMnz2(=6 z?+FCQtDqI%^9asCw&Lr_1xwb7?{zwHTJar==W-=!#rIx1c0E5o1$f@2-aWKcouAYee;(nCP7bL9BdMFroB$cCV?Ay7HoqQ zp9Gs?-B@-_0ypt@fDPUx<>3V9`6nEXOm!5 zvU$`HdpwMJGO|hVBEei_lfW}_VXdM`@CDT$$*)OJ@)lDR*(7L1upF{U;K_MQ)+89O z6Q@bA4xTPb(j?fEV0RTX3HlKnjCdAo?04}b@NGN`HXT)V_=%UDO7b9NlfYd(3$~#@ zPJ&TbN64;8;3l30+raLV;3lj$qU@(~NF3co2zFk4@rD#>PK+%*=QIvlT)w8Py*k<7#f(Nw`eD+Uku@#iqfwIhGA& z(_nL3X}Ddsnl>$D(*QdXOMjFh*f-MwJYl{J!Cp!I7%7Z| zLNoJS=1mz4ZI)c{FtfG6d_MeCCP6=s~LQ zkwwGEEj-18W_;+(r}|@LKiRWj;~*;ytK(y+%+q^p4V6~!F^`Z96(5UbVPkAQR60}L z3E5C_3m?+TI^JqCHKn1l8J?E6pire_!H`!|1Y$2P5 z%E4F;MA^M)QapfM@F+XFx)rj zL$Ff`9#BCD_8o%PP?Zu5!Tv_+7i0+58!m+D)PrDWsspRDvfT20UWAb$*bNERK@|tZ z-&2}Eu-((a)J54zY1OmiVw$Z(u=~=~J}5p5HYM&7BVPfnhhPVga2TpXuxC;_9n~S& z-swDf~&;}MTTG>Ah=HjA=qaKoR>Y_X!A@4QO(58h$^H--g8iQ0TQw&HJ1`xRNB(Oi2zEO)SBGFvOJ0wBRaOXg zlFSLgx}y+0a<3!UC3ImiV&YvG8;;L{je{V;(xwpXveCp-M`L8Cn}390OSH%)1Y7k1 zzY8Ot1sh)qQmc&+?2EA>A=q7MpeY3Vd68#n2)0vv72T+rj_L{89a_)5695YOf0@_P{db4_)TMMR+lZs*#=TG1lwSgJCwrZ z1edC?FNK>4CaACzg@*_xtFSeNX9%7`e1UW9|9?WTSEj2{Ha8*IC6Qg`LJN@}5bO); znmz^l4!d{*WeB!|*o-~}yNFFcAVaX#A98y^AwCN>wf0hs(uMEJCzX4Q<#WThyI4l{ zEZF4x61*t{yE5#wEItc1-gdKR!Nx*81lxJb5}uX-6J5{{!OpxsBG{=Q*q-cgGgJ@3 z9><2Gw6Pe$j%LG!+E|QWXR+ZC)b_`zEyG|MuJc zs%@#Qk6_;etxo#d5o~|zg3UpO9aoNlIMY=p2VLXDG3Do6k}A08q@utN#XQb7oI z4#AVi5bU6MdO}!RtqtyY?hslNf^GE`zhxl9cv}&4M~3kZ`yuN=Jp{WSwfmxoV6TYn zmIROd4G0K!z=iBX2=-(WPDF-a-B{Kr#S!cUSkFg>VBKC3wxs7E*b=oW1bZ2lOHhVj zC&ZrQf=7PuV**OgShTP zhG5-R2uG;15y8Gl_4C%4y)Bs<+X|sB%K8d|{X*^PZONA;e4!*mu!nu`qv2fbKO)%0 z)c=I++I6boS5aiwZkwjAT@PxzBYxVQ#dy1vrhdAPk$5(RzEtdsN)83KevuCMQSA-{ zdm>xUqxxi7_JYT`g|FwrA_O~zt^cF?Wt6*s!X^v&c65|GmBNJtr>k%@g_j7PQK27& z)?f2>8C9vF^6S{LFQr{j^{o^P!TR0`X}|uf3J7+`VewjwBRSlxen_! zh-)kayC_|kFLguVm~NNR5Ul%3Qby{_g66k+&UF0KEJp}-`EULDd6aT$ zSNl^rLa=l2&qjt|-I(Xk)$0)KyHvleWg& zf9s0uN{lDCLIquk8iEg0(3R-+EuY{)Rcg$x#Icl)MCG~?R}c(EhG2cqxuQO3WEq03 z8BQ;RU>9Kj3K@d+lzgL#LStf%vAH681c*5gL77a`bAnA#yj zux{hoXxI{h?UBxuM@0yB^hFWDdL3jU`WqtHeb~=l$Pnyd1pN`SR0#H=IO{^#UAvA5 z*0=JP%i0Qp9mN0j5v+Sk!!YVVumf~#`V{OLG=Cy81lupZ8s~yXMF@5$Pnm>$B5H9= zv&GbVCUC4_f*S8G>#816LJQJR5VDf?(Z}3m(M-*Qa2& z8%6U%uRXnS5bV}?x0GK9)?I}Z`7RQI-3#v?s1Ct;Qc0tvgkTRP zp`ViKA=prx-Jtk}wix;E${^UgbwEO}CzE#~G6d^JzL%{*NIAfr!i z$y%$S(Tirb3F`?yI>UVtpSOeR6wABfB8LTI!Kjb{FFR5gC2*oYIuz zFOjVB_8UWrfIw+2?+cO9Cr>GBoKn+f9i?c+cO~pAqHM)?-*gQ<^1+CZy7Ff$ zz9*)H!(!AB!ETSa7qS)KeF^qKw&Lr#OpzINE5655eYE^q@f}8Rp$b~@y^7!pWGlX& zT(D%V__o!F(~9ricy3pcR(xj?JgtK0(`y8;pip^c>}~Oi?|JE1JW2=eE52Wn`~|WV zUw7q$N68;od>3Q=U3RVbx`|Jv#2vZaSA44$a`Qmhk0IEJ$=Z^01cEKSl%o`a?Syev zRB?Z_EEU1}t6DC2;6Ch+aQF=~iCUcfvX*(CUs;A3Qyz%z28 zW6>n|gX*8<*Cbf!C#EQ}Nw5~d8ptMrC+96$lc2p$oF+jpJX+-fi@{Rp*5=_84UUp3aw--|6&HE&H80$kQ`>DJl zj_x7^`$2q%kP91VPK+)6>q-t?auBMmCUIEaI#p8%XZYh0o-V{A>rRH$gU##t~el zg6^h|6HG&fU_Ci+$qB(Or2aD{Xb|=Kg%O2p5FJHuD5?x`B}QYYa;5l2*a~mPD;Gys zhG5;E3nh=zOCM5K(bOf#5UhLhnI{gT=c#^177Zh}6wKm7XED`_ko_2f_2E_;R%Uk$ zl|A$xTSH~7Uztb9hKk$DLRV})RC-X|9obNEOL^##b-dN%W8+ZS1J7>AhKl=m{)c?E z)jwVphsvQ?`pKrD;!|uC_B131Unq>Q2Dca(NpPO z|W$9zE&f) zmi%!L9fq~P>>5OF;)^sI*nL2qigggOpNc_oM*b%RyGmN2Jde{M1befFo)%0lqQzlq z)e!7@(U=RDN8`WO@OC>P*l{?oLWW>pB$%aw5bSpZU!f``8iHN+cV1nQAy{v?5FVf& z1iKyW8iMVDr6V!~yE8#ARB`-|*)KUwAlO~f!PG_BNom!yBSWyW2%c3z2=*ODnhW`)NB(7b`jY>Aw#hFKj<2=wa)X>A$jD# zR)S#XTuXCx2zGe#dgQCJLa?2*?}T98Q3xKn*AeV;bfJa15-P8Z4QB{;l{g3zENu$G zx+xbtveV5!La?K>$R-54Iy+cRJE{04z7(WZ8zI>D<9>x;U!j4f5bRGyo~0q!jpD0N zE_mc4#S!f0^lDRN2zDoe9aIp4J%ZqH#EY;H?22h+`9lVeBiOSroMt8#-@g8?j<4|f z6pgW2U7itN>Gb_F;aY50qg)#bw-el|LM4Sq2&Ss=FAdBgn61KZ6y70t3x$e%;*tC( z1Uo67o*duskPvKTq(!+fTVwzb%d5Nxx>+&_>Z*fj}OMZTjSo+G7Q1)lYAe7H-%s)vj4IS!EO_8yM|!jjfHv$cGb;G!lz=Q z^RjzW-KSu;n;sGDb0FCL*x??i9)cahhV!(s7{N|t!*$wNj9}kq!%L{`?Gre0G+YnC zcK8!JYWpd*7e3Me!5&P_Ua0DKYU?A|B|@+-rKRnO96tzlAT8vo+b;)EpV8;;5 zqiQCqzK%lqt^BjhUo7vjB}1^WpM}spSf1{|ADNSs8+TD?7nWBiMBI z?@3WMVnMJY$8&^2uwT=a8e|CePl7*G5Q1&?4?RX1f{jgpU>h{%2(}&8m60LXbqLl* z+#*h6y07ta*3W$CrxQH8Yt1xve>F8bW7=9-V1@iy!=D9Tuo^>Dqlch5dmLG651`I zFapanbgujt3j60;hFwv4_?NF|CAb)62=-MU+0#h?!9G5b0}_JG=Uaw9uo;5gm%>iS z5bQXD%Ty48{fOXAlp)x7dRXpMYlA!feG{z-!LC(cVGtR{+m~Q3lp)yHvmVq#umh<* z4mpC2?Sf!qxUqrTRl_EJLu-1cFUbws#QhQEFFjOa3I`4<%&?_B9_38)*L# z!L}%2!<+U-N_UWlJ|%QD`2(bVZ0iOngTNX2oeLB??l#mXDElhEKr` zR*n$tNBBQL8G?<*e7K+P_@`jMr}|qp8w$D#T~fPGs?Q%Sw~lUmx)ROG`GY2mb|sFc za1gR9F@@j`6?7&3B3P(`uEb6iEkh4frN-<^TtMkuRIV#=2f;X$A=tQQ5Nzs$MwTJi z<8GlBLa={hUxG3On~tbqN zjZlVQqpi$rbqF@~vPX=H5NzeGj$mUQ2sTCy5$rMS=O|r=b?d zM3WHgbZQ;J#?AE*Z0x}Qg<#V$%!`q)K0AVafgR34*-vQ)KwIy43JYOZ4oV1i@k1Qd zo>YB-^M5GUi^6Klv;?sbjgkMZ41(=?2L~hsJA%C7C_}K(2w!TDk`U}Tyw@TS>=3TZa4u8zg}QM1 z6l|NA6~c8I9wR${$8PEn>^eS_@KbXK>yhdv6yzD9empbWvLZZ%AC z`t%vrPh>X)8|@(282KK2HTNg1wJ1Zd(FB5RU>5|q|89CD2vF9X*E*CT*yseo#>ihH zS>^rgE>Z*pR>s~|DO%-qBM7!(N==&wm7*2j4Y03=B7%+1T-Y~8@l>%&oPmNJ@NOr6 zM6fC0uoyK&um@p20NIM~aRkSp48g_>zIvZ4>npw&QhmPsTJgP};5rqw;(Hgt9VkPv zF`3VJkgOHon{?u|;`=n7$CacN-**Y#RzWMiUlGhlAlR5*OrOq++j7C9bnw37`zOhN zpbWvL{x|Z+72g(BTnm&T*wo{Oc3<&b9qVc+`^gY&ObTI+Ce`S+qcvcKV7p`73{~78 zElWqR>9uiKjQk~vNw5Pi4mJt)p}oCOhG3%+1lu6RC&2)$hskaTHkv@N4eUM%PQ!W% z$`EWcfnXchH3_ENM~^fKM&loeG6Wl)AlMicO@goPB}J290`~DrF$5cpAlQZ}HEpIT zMU&uR><^)cV52h^#>6O%gE$H1;(cEJh+va#T#OoGk54dvfNT={O0WoJ2sZ8P-J(fQ z)q)F)Y!Ylhu$~H<1U(71LK%XM$@!pUO@do=;xq{kz|&hvngr((oUMW;!Nmll5C}G= z7f%A;27-;X>EL}5OeFaxlp)yEg+~5338rG5BD*2jXa~VIXx=Bm3s~o%?5FaIIJ%1w zY<%&~g&NI?v86*MbI{^ypOg0?$`EX{Mn;N}N{>aY`rg}GI1L*;RyHwCXdYxb% z$`EW!&IctY1Y1_!GW@0l4Wa`m^hP#_&LcPjRff0{W7Kt}`1aQdZ^kPZM^{9!(Vh#B ztCv2c?xLw%P=;WmC!cxZF#3?{cVsaH8!ZL1_|R$5icyB_CquAtkd=lv*d0UVb-l;d zQ0a+pE0iJFXe$e!WAppfK2-08G6Wkf<>9BS!2E60sj|eu|o{CY! zd(i`!??E<%W)nPzG6b7;wyHW6htLO9zb(IBkpCk1Qw0s7%H=uVC_}I@IUkg)A+)Ye zknTmR;#nElFxrk_TNQLK>P@gW0>Q@g;(L*A1Hs1Hbien3b0o9QMwjdnfDAbWrB&HI2FjddilpNc_olKeLW8%Jme-8daWu&YhsbZEikMq0dHt!4-| z&4}%zaoEGW-A)Mh0i1UsL$IF`ysv@~Y;FaX4=7YA(GcuvZ0U$H1e@l_5!8cV=cohv z6zrB*HbsVD`x6|1Dvp06I|)r8*mN+vq$oQnt$KF+muBk_>=2q7j3Rld z?Byg}is}&Tt&}FAA_N;7$b|thaFRL8PAy!KN;ptMdzjeP=2iuKy|6=g4>( z8G?PE;5`+DV80_+fHDLd+XBJHs0hJMQ?pGV*k-M{I?@v~w<1Anlp)yI2yZxJ2sSn(1iLp4G>Kq~JWEBe@l^-}8zUbnj$rqs zSGyxau>A-QRzV2%9D=hDFT#dk)5`Ky3?4_YmtnZrOf0@l`o4~@gm9b2*sLzS#MwTi z=00rqpxkQ|9w&HIg;^9{B6v}S85BMu_&|lp6uu+)27zE>|Nk3;O;=?qonZ8z2T-j{ z+~`RVp%Cn=>Y6?Un`^@wD7(oJ?8{Ueg6+WOw#X3d)&yIi5D{!7p&-~8QDZ;pi-`N+ z?rj+vf=#}ww0{unsvyp?h+yMwH$$+oP!GYj+qfhQAmOtq*}bU_!OnRrBG@-TumjoQ z5vU%5y_OAEX=5>hoyLaywXqn%*0SMq)b^;$S;3*S40(M7eb-{7&!#DtQn%>PfjQ2?YBZ zTi0*fGIT<@ITTJOI3880+42wBaxbMxsQm&8hF}+20D}FO;4`Y;Mb(v$gJ9e6Psf#5 zszQcfkBj}}FPg8QpEJ5$@F?9Bf_(tXUC0pZy9BSRAOxFRxn)?af)MQb6xKpj$~Odi z45fpSA=sM<#;G6#`!>PLXq8LiUJqbr{~f_z8?y|-e*JiMf}2FJepDgUMRB}NZ{6%M zj!+2pAG-1vG6dUl6^;QJg6%-i4jF>=CUT7$a|F8))^5tx7ZLX&*amTn==#GlVL|M4 zKD5^fp5660jf35&>5r+8vU*W?fZ#S%(h=(9IsAG;ju7mTY|Xc88Ge@k01Evn?2dA~ zQZ=tE&wRHcT>2eIWIN;jbL^C>jzz;C1!+Kr~LBbHutuKZ#O zCs1=3D!-P(BLp`iL$IT!`^Y|v1Q6_2PjWy)uq$?CN5~NDaRmKTsG;Tog4s?fjm!$upi28Na22hNh)-q@H@eGDzu}}Yjxf( zqbfC2zCT-rP&xxu51?S5g7v)>(tiDS2@ve=PsMBTFgXt)L$IDw+9<`Z%X3&~BCfFz z?9_B!4%QJZXnwld)o&DUVtQRhL$K~ENg1gx3!2~UIbY!a%yNWa-%f3NlyYiU3s18j zA=sbsFGPl5-Ixz2(j7;z`Ob7h3I$z-n$+%K_4%Xa9^`u3mFR$}6|yUFKEWUrbS35z zJfVWFM0FS5p&+{w{Rs9!Rcg$x#5I(zMCG~?PY^tS48i)IStUw+(8w|b`@N1x2)5N4 zEyHri5Ud;XjZzYVT?21tWC(UMf=v*|Dg^84CE*?&>yp+JX0jI{*u60Af(*gBt;}o* z!7fR?^r#5IUj9r(uwIwvX=K@qYlvV6v!C;jA=pa^#vo>?5bU5h>q3}C4;{h!)_izJ zTS2f3_`g1abx&znOdSaJSRI=_1$zt4-+&CkwtFJ$R4#Z_gkbmZl$Wv3LoL>bb|KjA z)J6o`D{d}Eu)|{4{|^K^CRXQzN4~!82=)_p_z}u}O0NL4RX>vTmPZ3##RUVwp8qOG z^)yv~;QSHg9;UGQnk>Mg+?^E8COAoj2^1bBn2f5_K>0kj{7C6b)c#!xhG4%SSeNSe zUIf9;r(g*7q`2=8JSsx4XFp3fgkV=+3nG9F!FDIu2vrP?xl2K?Zpj6Y;(_Z^u)91* z^Fpu((pq0+2-c1HMkxuw9*_4}`GsKJUr3SfA|crG@ScO}5UeMaG)hVc_7V~WB= zO6t*9yUq}-S2uxR%i^11o?xOLkLXi2n|%qvR<6yO95MvEF~NGs5Ul6$&0gdr1bZ0u z2PvW7W)Cx9Wf*pkUBxEbTLkI>VTk-W=7PPpszT$fw)nnz?itl8C`&H12?^6U% zAY1YEj6&t6vA4x5zCF^hc$5y_SA1Kp z!#G5?;_EK{A}MAje_ZkHjJ1>OTJd!gUsv70?km1qVBH*LKZaoYC+jFps?lvL=W>)n zuzO+L167<5ElWkP{;HM>9{EcYli&qj9BdLCLwiRdn*?smH%jqIa5mO6W!EHddm%-> z2cHBNV;zNT61csjkzJEuWA#XrU?TpTkWB*5DNQ+PMAudy`vNJN1XHn3QHmykrtyevJ1+`LjvTHzshe{(qF62b2}X_Vw%DI|)Wc z8J>(NNfZ+X5D^d+6*DS`@XP@ND*6-^MNt$J21F4I&m1s^X9g33VtinNXGT#}5EaIp zFnqs#x=ziV@MrnmwKkm7wNF)b*QxG%YfpDatD)@i1LSXjO@hjeIAp*kfk*Hh%A!fI zHpT6MO@bXUwwI$xFa%>SV3WXu^A@a0u(l4ICc$xVj#7{&!9M$+M|S ziMI!woq_3U&MOJa#jCBJ{$FTHw$V^Vil$_98t*Ee1Z`2xzeQ7m-2vrhkV&w&rX5({ zc$ow{m-0E{WD@KH={wpsB1H+d`6dv6B~l-Z9>5aG`MI#S_)$MQf#RX!>ufp;W4atA z(jttHfl06)oVVa4!M5$nw;5nbbR5P}a+E}uV~hutGh;WELzVBxAL8ariX#`ZE0bWI zj_ROZ`gwIaRZRmX!8(Vh3y2fb=v#`v5=Cj`6rLym#Z#wqHx{aZeN2M&Br6S*;E^hO z={vSkWeB{zfTfDl%EGPCJXMaQ_y}OB;*|36usTJm%zQPb%4u*$0ZSF<@kko+YO8-x zaw=8EL%B#arHa#dXOU=&YG#S1RJj4lbs#$zjfk@(7u?GBu1|Er*c?(twJ*Weu zb5Tz?-4vvA(Y_da%TXE~g)t0-%1dLvi_b;AjT=N`X*zj(;*2KvRAA>KXXP97V-j5g z^+v>Y1OymIaFIG!CpyKlR+lIwn>3*`3h(~ z3HCMuZUuD`?BjS-L7fEKDOQ!^{oC2EF&EbANw6;w^a9YwB-oy*3w z1p6)#{{tq$)?zG`BMCOQ8A26~Nw8j5KDbpR!S+luc79ySNMdPI z60DPQ!7V%7{38i=f)?2%!49N>J=93W-SJY8YHcLJUK5i~66`!GXi9>8sED&73HJMV z70Ly-JX2hPJ)B-03QU4M3F8Dgl3*{xm;ks4OM-njCC{MAEcFiEEVmb1r$D&LNG!hX zQ>3qia5yw1*cYU)Os3>nXfr_W0-QH6UXyb=&L>=^+@ECbI5hd8!5Bti+m`mvy66~Ich$g|-&`c|kNw5GO^!4Ae4 z2tp>oUYBZfixT@J33fQ_qb$NC*p@LOgh6T_3HCPHFUus@5YOr+!Cn=edJ=4#t|j4f z0!Cby?M9shyUVvxg8di?_G}tF4b+oh?`6ZC+E^^X{+A8UX=AYjTe>+*{cLRW_E{Vb zDy}EN_NR1P(5B^B{vhX@1`_NAl$;K#)~B?-1ltd3^_%Onj)$-#<&t1epoZLj6unH; z(;&AePK%zLwL!_+h@&2q%Yu+#w`c1P6!!+XJ~$U+j0IJywtOI4X5vi+?GL~)3HB&6 zkYGn*{6x{$pn5D$`6c|bc`ugtfJv~w#(wfj4)t?dx7^!wQxfbfDAR#SuwP>=k|PPW zrZ=moz$DlmF#3Wj#hU~>2JZx566|9b_sfw4`z6Lg&~}X*vZM3CTmL^2Z08td66~qB zWmPmO!TMf>P-n$_o!a^m?V%*te{8{F0Vct&gR!<8-38kNqdPDO)~nz}TWL_U%3Olo z1?ogDC z8SlYcvL4ivV6Ue1N)RR31+iXkrjM3?0YQTON^MAjeTaYufJv}UENc|v66{Q<&j6EP zoz8kWJx79_pjsutz7FM8kV&vhWBa+_R+c>WF4!lCDUx8FQJT2v0v_*zT|m7bs&3Lt z66}wu_RVzs&TG+Aqag|QTUbkhNw7}iW)XEZO0bpNFu;JG>ir0X8+~N!tgNp{u*axg zeJxpsfVCB5cfmfGvf)s*A0^m6ly?U!z`byq`tQA;CVz*69>KB+BvVaZbq_MH1{iY+Zd@CIQIZh%*Y~7&()0 zp2L_bXBdWF5T|S60zrg>= zVkE&Hp6Yfh#ng5>S22=cEBbML1SY{cF&{pnJ1)VlMsaIEpEU}nqVq=NB-rEU(+f$k>+i5iSQnTC>mm6@AxVPW3T_`@67236{Q>(b3D(0)!s_R+ughC^ z{D@X0!5#tWU|0_TeF@e%rC~T_NU&egBa>jKQT+qJB-s1o)i@X2Dw1H| z@Q{VjKL#sLi*!k_Pg5Et*tv0Yu>{LAzcqH@|Bzr;kHz`mmajg$1p5OGeh0Eo>0bzK zx5h(W2xqWUl3@S(ioM$SI&MGRkt_$fPB?pDY%ixZ&ZQXV$!US}8piXWN)?oE!IqMp z_#1V$wBHfOB-lY1H&VRcVkFqTa7=>zGYz*}MH1|CC5|N6EvT&*FbQ@5#x9_u672ER_Ag)(tP}H%LXreK7VeqiOM-QNAz9u;l3*`~dl{&c zU_Gd$QBaa#Zz13&1=W*a2TsZMITzgW-^xg^-9BcAB*8vJ+ylTQSSRKig(L}f7Tjk6 z670c@%wr5w^&uKKNw7!8CPR2x=`pVJw=`2H!M;V@JYW*+R~VlIlVCj%B{Wr$9UDoo z_p7tI3$}7+t^^>HV9!d_Ix7YBd0$Ou608?DA;Dgi4$`~o@%e)<`h>P5!LCU=YXFmA zcg5Hqm;~!F`Jk92!Jb0-2n9%jy#?bMP$h~kGKCQG1hZ~sskzy)uoYit zLcK(ENw7{YB+FayNpKU?8-Ps$rz zd2r5DkS4($7`Mrh?C}`JBOp}%68l{|34B{FxRrL^C&7OSei_&#a8|xCKTd)LP(Ku1 zlfdbPWO?;I34Vb39mqbF3u1N`Nw6ElZy>p_8ix#B?ffO|v~;x=yK#j8rmHzEA2x&L zN!W|xO@ZlZPAPkIz;rd|m4su(tF7MV3usEViBK*UP08l8(r~V5 zi)z*oO$qiil&K(-U^h)WaINt&3HA%h7mAZfuze#bgoi|m5^Tra`Go^4k@m#s4=j|xg66rmRd2*CUzhnFaOoH{`yagu-cGEprr302k=V6>FM@e)i#x0<7 zVC<%HsB(DxVQo&Q`q`C9uuji~uhmOWsd-fODliGwIr)qe)2Ms^O#_o)ol-E0r%oS= zdjR{G1ncQm8VcuGs=Tf5*h-aS;2o{%bnbFmS!e~#Q)LXrrvpnBr<8}apeR-PsVb$) zWpE|{OBLr;gzn|Eq5?lg(DC4NkzTcO@8y3R#T;wF;@bWf;9p*{@kQ!z9CYWiCe?6GP39>%eh z1iRkX91bm*yhx4Dt5%a>&rBzSQzG%grF`8^66||0=K+&oEBEAR1CwAk!dMqnDbOU? zJ@9q|Cc%2eg>WV1NU(F%0ZFh&K{*td1bZ>Yd7$FS_$#&v3HF+_Gj&#WP+IlvSgP)( z2NB;(Rd<6-g1tKhy5%dN^(5FQ33wdTNwBZs%>i{1?8E6ex#hxIJqh+hf<6HHm<0P$ z>cV|GzDTeiEThBq?}A-M#FxM%*wR59L0}SW4MrtTPJ1E$6xfyBA&96EN{U zjumGT?6ENkl33c51nZ<+aLW!i|44#eMT=~bV29Db;cBF!cf1s&S{q5Q>&MHyB-npa zK~oa!wndy3NwDX}t57bu<(c9V>}Yy*DliH5B8&^Ae%Pl`=~ z?a!tifJv~!F@}MVNw8f~ZEjIwpCrMKg?*+)m;`%E)K0nYLhU2Lu8YK3mPxP^V_KL5 zyG}d@*OOpZ-LNDaMZnExW|zS_33g6Z+tB&vy*hB!K?t;C6lFLEWgOt{nV2?yv?Kn2; zcnGgjE(!LB7HxR}97P`yH5cSg##w6!4SImjxlgKEc-gDINfF58~X6aTTai zwdF6c510g--~bn#<74?#C1&SJ7cHwq4hBw;ODy>uRM5)l8YgYRn)^c?_srk%D#)<7^FOXF6B@2+qIRdI>0>f%6H*Y+w@XPUm`NA5Q=hY`>p5o|0geV>*uek=i7|9s}htU^3p77?%T+ z@jgB;>p?vU_I^t51$_V2U9c;kopDN%dPTUGo+H7oqFN=veh%eRkV&xZVo$h1ELvG6ngqKgF+~!rGfERTUBIIR`y=&! zuewPuNr0VG?N90Wo!8R+9e^%V(r znd;Tok}V0?LO~|Mew?yliQ116?4FeG0&MI~#~1}{>}EDKc9SW+9Pnv3J2Vf=sp^lF z$iz7~4^VI~D4BuSdT83+b&sVvB-mHkI*;O)M0p)O&MEmIiX_0YVE&uvetI-AXaFoyvZt9Z9h5;kN}Q!8$P?j-Wd(!EQ|PhN_mc1jp`< zRPV{^^Zb^NF`hOO{UP-QHWGJXTrWo>@jb?3IU0$r4`sau*hpN2F$PqrG8>7Rcu#|J zjl^P%_kc;T-ZBs6Onp#hnFRZt_DB+J-@|wq7BC6ci9D0DK}eEd_kz18FbVcBjG=&i zl?3ZSCE*tB>+;r9meYzP*wZ1M3`~M`TA9(31p8EK(yby1_KM%41nXt_;8sHk_HNp_ z6PN`1IL1`KER_V?^?W~PKSd8+g7vNW@T#^V!7kwc`Vy>jO2fC5A;BJ}ebZgAuTuRB zz$DlY-bm5fFjoh;NjQgN>?da&&TSai${B<6 z8OHmdN)?pf!LVK8Mkn;txyOhU!^3Cc$oejt_-fMH1|pzjJUU!49OR zJ%CBDM_?QbDz=TWE0AEFk_&Fd9hU?<;18;o1baTUoeNBYbz;6zNRnW$f_sJdl3<-* zNR~H|B-lIQ-VW*{SPv>`6qF>`X#_l`pn4MQ*m2qM$_2Olw=xp!quL=!urCq!0x${I ziTOq$NrHV3?mGYp_H{;PONOcX4Go+m*sEicAq-G@jO#q|Pp;DGF4(V#TLMgi%?;z3 zBRD3(dLXw|r7E&xBMG)EwU`9ECNUjACc!?CsC8Bf>T{r)&LmhbZbE{6F&(6X)#LLA zuk;sfNrLT3JKcauu!msm2TX$Xn0!!7l3*{Pe4GL#!A`??091)$66|8U1)ySfY;uJX ztdmgIBE4(O6^`mFIp&-s*p^3fN&u!lIT3NKL5QnQouGCUT`RawLR@P=_to6)P`d$B zpPW?Eh_0309_o=+c6WxqBQW*JV@gwuUm{uMJvtB~LEu2>`zu7NydF}PtQ4}Srk6sr z;(H?W5g=RfofrF`3vR_jl_b~;;GQpjw&J@q1$-Q>h7#=ckgo-{;(IT~-N06SJvJYX zXJmcF_c@B65nrOg`xx)a(TeX9jK#oKd_A~e!CLX{tOKVN-*6OPNEDwh16%Q3 z7o#%>l|RMa7O(g&Py6Cl+Ie5`-ICxffUWpCD<9lS{J7$~C)5F=YsJ?|g=9J1SA2&- zJse~olVID&ixiI|)ug(xP0KucDGBy;h^K*y4I^cR60Bd5yTRu<~@h;eA zM{_0uaT3(TfDqhjD0_5-+!oj*=!ww-*d*|XT)3=g5)7nxSMfCoPQ(}?N0Z=ejI)4E z0uSa-s|nU5*gywPli*r7S13r6;AxB}{GdN%d7S93}syrY9p;$2flRZ6_ka7F^t)ttxMRm7{Uo>dA> z$#w^nn?+NyIgP(EKMvZWnj1w^g3X082V@fLp=k%!G+rjb{zUP&`3=B~mShej!^TRr6JPC14V)2j?v~Nw7Op z-V0a~U5jyr93|0ojA@{9Z0x3~uGhvN*5(X~BNwwPlVF{m3n!_Uo>EJw>Qi76taI`i zC#F$54I(fJ)+q&}cYC0)Ze@E{C&7LI_dW5m3-VU!T;x{6b5SkiuYjdc8LgKH50M`pkqhsu zQ!$0wVz&mCLR({ODM#m`-7)$DI~RFy-h!1vQ+0rJE;gQHk+brR`7wzehdNbsor|1aNS0Uc38k@l8Q7=doA`_E zZ%MG%r|J786-a`;SE;83llg4W0nQ}Y|D=<_ACXvD*|tc6t!3*HU=r+_$MdIrz$Dmy z7+ZlV1)2nVINqVaBv`Mw5ZbZ{33fnpIv@%5O#D-UNw7C#Tnj3`jK5-=kYHa)J5y(6 z2c=ctju%pGodo+VRm}jI1p8hJbjw#j>q)S05bzqPlVCr?TL|hT*oEmhx#hxIJqh-E zg1!a%m<0QC>OyxmOM*R!RiFkEY{>{BfJv}xV6>5=yI?oMSRa@K>viRWTSXG=R;soM z3AR7cy8x45_rusn)oHDBdD|A9*odjEmYn-{@maoc6g55-ICkfUWEG@(+ z=eh)YG+j6nF!5H2luUxXJ|;mDOPi8losp}%Mk?83ilnZWornm$R#kZG>^py|}P>#)7XSVc}LT&S~6xvrH_cOHLF@BTt6;6v2 zxO#%z0-W|3ZRNa;vk^uY5GvM>qw%*S*pBJv%dwXK_8{W%XZgy-$$Yht1iLpPqDip* zXreF3B-ryQHVJkpoAw7L!H&f^1B6V1-9OdlRvLJJ7wlEAudoP{VBd_|X$ZTjeI(d> zXum9zU}wg(FbVdb@d8j!f^E58N%)F@2Zv?5Q76F;*f2`4eXmcO>(n?fZPl6pq$-h*(n9@tSG>~8)q2x|b^%te}CD`#u zt6h)smA1A>Pm*9qQA6%lihdyK3y`}8r}s(Rdkjjd5Jx?T2Yo9D33g+)oRm1QjNf}Ny2lmxpCUD+C#1Um?0 zpd3lCLop5pCc%0Yxki<_1bZ^nlN2in_B@Pp0H=t(I1x;Xokp34_j{q<%4m4#`px71iSY! zp4rb3fCT&EKiDBju=|bX5CW56@5Q)DjwIMxjL+prg5B(NCJZnMHXQA>eWBXMbZpj& z+9biA4dpaoGTyxycLI~~zBx9FsVBkCqV!pSv?K|(L#($XS^fnC3HDpHAqnTyEmE|ySpj96Yyzw z2>G@vRgG094#jzaf@eX=JBY0(rrkY7%^|^l&ekOqe<;c(=y6WrmPRO&V287H$1yD6 zf!skjQ!uWUGYDrH#zHwe;`Baqm9P=WZH03l#;Kr66_uaDmS^#%f$DQ`OoH{+3aMTH zErA64)~azVejw&MU=pl{lr{?SaVa^AKbrxJu_V}Y)41G9N04CuP`&y^@efGVBANv2 zypj}=`m(r1x7IOcZTOumMiT68scyGYOl_x&6e9_CGx(bVlVF{g50BCvmteQ2cso@a z3L1r}sov++=lLyr>9nVj7z$|!u#tEM<6$`(iDqL_-sNZ{2IK4uY$R^Nm<*~^nT^ET zcymFyM&b{QT3`~ax11~LgEGq`*pqAMg(TP^XY(*DU=pl{@MgT!?JOiout&o^5|{*g z8pbHVzDk1ippx*7_H}vdb=uI1B-qO#jRz*dI<3rTNrIi7nslp3f~{GtZD{sAf~S|E zOhkS|33dkUOa~^xzJ{S&rkSOZV7K{~pJkgL#6HA#!TQ#GXsfMAup9G#eF@e%rC}S& zkYK;1M<&63O7$NAlVF#|t1-9wN2^GJecMB-&f$QAm4A*TNwCjR8YS535m`5jCD=i+ z>;H!YyI(BM2e*9n*(KPHG}sgZ42WeEQCSqlqA^Fb=j+`>$&|DW>=8QDf^}lPQAmy3qUr3fWktEpZaGwHo608T6Gzv-*?5hOKR!}_&cH(i_@yZ3a{I@a^Y|k~= zAxW?w688Zx3D$}EMj=Upt%bW3Ai?%!WX3a0)!S&`B*ESpn+)MbrN_9=KhsQ|1e-gL zhZPZP5^N1lOJEYL2lAN4R7G}dB*8wS&gw4Mp748sOoE+}sC8Bf>hrOh&LmhbZbE{6 zI~}C|sK@6IzN{^6NrK&-c6I_L!Rk-;M*x#xJtiL%lO)(%DZgF;l3-uOcmY(2ViN2h zct3)Q4`P!mlwh623v432Ys?jn>TVtAqa@gM&qtjDran0_-zdb@r(RGu7hUR;(+kP+ z7JM~#7pOY{Q=gn((ugh*;PLkKNFu;N@DBi{K6y-Oit$S%tGr*gBSfpbCqX|!AzJ12 zkg{Z@kVQ35DMTy27eXHgvK8M?(-^uH4^@(2Z-9H9_}Pl@A1UCQXf>2zABOxOuod5D zF=hZ;@%7kzc!rVn72kI${-5{~4ZguxCPyp2e_{LqY{l1u3l^*u-@A0+wBp-(91{uH zitol48_Lm&?^YOnK&UK>C;wvgsWM$Z+)6v|E53sW9tdp3*I7KSIz}dbT=6{;>Jg%A z#n(wZuDSu;SA5TaIvQjjlVCSa)YmkrE^Kp!5>^uI^cr^}Wpr)zw;c)5B=`~f_X^P@aAH}qQplp3nF`S)Xnq055oD8K z^;mf>xRu5=O0XT^wi7>_1nb5CPUO*QD0^%Uc~fAMV0VoEz$Sr5xAO@asE+@m1L9&<6?kfTZP3C02tDtpD=7Ec1- zmJ4pBo%c!b6Tv?Kn*`3vH|EDlP4Blx$8b4f~3=sAf&klwe;#SqL%-_QbRUBaD|xu>ZJ-YaD9|5L5zFkD2e7_yb3BO#%`MGdQbdeZO)-_zsVXiD}e*Jim&8Nw7{S7{ycPNQ#F7`x-9%HWEP(PM$j(LEq;rv5+1}Mju;0S16+b%{?Vip>ZZ$j?m0rRa3LVL^ zwiv4eOCgWoJ`Z&&rqHGoZz#S}XfVbgIZC0!Fops<7kO~rf|WwOb%1m(It|WA3evgg zI*e=ND2?vHxC?~JgPJ%O`LSL%M0sB;hnCgE^g1s+I-`*TcNw6F1=baWzzN5x(RIA+u`%EO}!fugx>3V$KPItkU zPGHi)HVL*TPB&l@?7kR#fhq->1UnkuvUR~?W9dj*tBfl07aF&+dJ zzr|m%O-QisrJbp>vV+p9Z^ue?H{AvM4pqGcG6{A`3Utd?Kbu%E0?hwI-3yE+lAfl094FgB4R3AP_b zUtkif*Od=$6-lr&Rc#Xz>`ug(ej^_NU%dxU7ZBmDskQN zRar@}4~v{6SZ5T1Th4U}_AI(E1~BnD#)>lu_P&?|Ni1zjf^||ZxMhc%e>|#JB-mN;DwGRud8W7odk4L`4VVP` z7{()VB*DIk@jBolED83mcyPEmi{x<$_HziI7>UKVv9)ztNwE84kYM+a&h``~h0CZ| zcmSswV--15aMr?DQ_j^mn_+A!=Te-07~2Bw9*(2&wSlVIP7X<-uVuy_HeC&9K@yCfV(z=(m_Zq!Mzb9adnY>Nxa z!z>zn3e=Nem$G4rHWo{;D^28D2kJ?%JF%fRX!F7D{HCJfdJ^meO3qbj>pfUCq_o~$ zu&+=u9aL>hX?+Ry0i@M$_RKmSLVwC7!Tz>0$Nxo&nqSU?Sc%L{#~FaL11LEcanyry zSr8KJ6t?P3G^c~ywK#Jyo&!~?w)_FM2*Vg5B^6Zbbua*BF!?ox^F28T~gU*v>I3dl2!ySrtu6u)n6GUuVU9 zo!WZUP1r+8u>YhhgMmq~M_~+;BMEjC#>pUi5OJ)G2N9=gv&vk89S`*)#Y%#`7USQ5 zQ$*!A+$bMAoex*&06*X5WaU8@N~S`(Pf?w4O0VQ@3Y?OWs7@YJuoy|OkF#|@D7%8( zeK=DwZj*B}&T3b2{6X#toC7iTk~1FXK8#yIl^QR9o-Mhn`BNpfl)r&96sJFEHy`I| zD0|Sk@(*#IXY1pjd^vl!EX$#@U`GwVS;3HCio z-vLpAT@dT#LB!GWFCa*;BfHUtB-rl>_!eXjB925JMBE_6CD{D6)DN-;5l2!*Sf8FF z!M0Ydl3-gxSy|K;|HWGxd8iZ7%96+Kg58doA_>+RJcu}Q(*-@2ImQk`{g{0Q*u4$ zPdRts48Z9JayQ^yi*YHaQd{M3v*jJUS3&hcoa{lwu|qtFI9mQ&0tt4X?r|)d-@x~5 zkUfYv5_u4DgAgB=)uFBi7-LDW{UR-dH|Yox>{!*SUlbcaT2I96LBx^AgNPecOw6Mm zvjzNK79$Dv@Km>3ssFW|R@#hqB*E?qe`k4q|CD{Ea-bdB))rW&~N~-sJ z^?82Fr*@()jl?KO#{e6N|6#l=MHJqG&GAbSvT+M|XcNrF8K?igSa>}41e0Q+hW zB97twxyL~Eb$RQ%H>VXzuy;bb1!NB*jx_$n16q<`$ERMpRV2Y)+apS_UdDrnBfp^p z`xfoY117VC89%Bnfs0N}~ijH*PMLV5?&%{|^av^|TLe z`RcPvu$$B1W+3~N4nSzTH6B9VX37prg1vBi_UcTE2EyDCp#4=iCc)l{F@@q!`y#rE zrqRG8*vm1-gNl}evte9;1nU$YL>$R+$0flI=|%ODU>~Bk2SD~9;z;B{#0^4{1p6G^ znc~}nh$D*!5jWr`33eXbH$j~Q>r@^@+#o1Pu%8m}iGu1$umktW_L&C}N6UXJBf&nY z9g+n5J#pWH>_Nnl$b*O*gd_>J^j5AgfR+0P7?~#-rs@YZaP}bL7{wE8lpfJyI(JHSKc@S~KkVQ3HD?}^4H$uN2WGlW?A~P4}|37G&}8!TWRNg#rG(JhXGshbrye- z6eANquK13Ddb;RZ@pTgSN;jbUiti+-6G8UL9z>j|e`r!&*rsMH_EHk;oe*ya6~9Ny z3ME*-s_`J=czyFr6qDe8TpVl?%%HyMz$Sqcc@S}f5T68ZKz&VgO#&zJjGG2@p9G&k zT>xwnIEe=lH=t`0Y@;4&68r@J2Vj%HnLLO%#uQD0ky{g@Nl8B7)f{xJJgKQGKADP??7Oga{QG)FOx4Zb+Bv_niZZ(uWc7wb#ut{(j#!z6Bz$0>@ z#h!JO;0%gS5nq$wMvUv_NcOlN<6dBsz=QJ^tVz&S2TqgVML07Rq)G4v#v(bI1V3Z^ z2zU^2?04}b@NGPZIPF!o`$;cb=?=ya*d%Zk4a2o5S%2~k(3{<0433j7&GN4iI!k|3MvQ2NK;*h#~;?_ zbgG|S@j=9C*S}RS{k*#B-FzVj*@K8vXN(imXcvn6iJ~;}RtrHCPn|Ioj{^3|9z-1b zP#P)*S*jeY@7PL}`{CWI>U8e%Tr3N#LGx6ZLGg58sp6FKupShp%A9^NRo;a2IiQyE+NB{2qD; z;<>0r4B+Q@v>Kj^)_`0CEQL13=n5=_JR%qNQKw=G?M(4@;wy!QV;m(%=c3avMgcn) zd2rr>l|oNz&vh=k49-OgQW`yk@qiqq(M*hIK&WgVds}=i@@+hbIF_dKy(i9Gg5Lmk zE^-zRB5uf!N%R@ig`z8ooWz5O8_+$WeuDY~uusLz_*?03NwCMpB<7hM97{>C4=MGu zU{Y}}zb`<15OJCjr$=JT9r?PQB-k}zt_nWWCuDR3HBZ+w*ix2=U}`DDxQqLVw;d)uSq*oXJrSaRbQ6n=x&l=mr~VN zAU=pV1>PMkUjeNr!TwIbZ=gPfI22x%klLB!E2l3@F(+9o8}QAD2%OoAPU zah|G^1UozJl3V_>5()NQWkH<;J1=qF@>N+$uszgvl3<;|gNS34b6tYHk}gaJOuUaH zB|eBaCP5NQo04FUjU*mK94$NC{38kW8ZEL(g1w6d?ocBYz2j*()!ImcT|ZvtCBZJB zf~F+cZHqW7l3>q`S0Nrm94*fjmtdc!S5E?yU}s~zB1aPJVvNrL7h!u4aavh^ndET^ zb~%Kfjl|+xuOfXVg!h$Wv(|Z2`pQX^w7H*?Eyx{-vmVAea`wmRjnPxi0GwShc9ydv z&b}CX10F;i`~SBj*l*IPd`Tyw1iSy9e*O45OJ!lOSCAlPm*AtgFVwCvIh}I?KFg!cc*`0T!Os?>P?E31p6Sye*mY5SxoAh9$7#6BS#(J=ezuJ1kHa+$s9<}De8TkH6Gz^ z3Q*E4Ul&ub7)h|ZvvmZ;hk)F+ICC(bl+y!e<45@g0dni(oP=?-oQ^opVLT41)Oh*6 zY^iw+LpTCw6vj}{?gX3{p}a}w%1^|3pRKQnb|%hRQ@L;flVGRy^vwR503_Hs1K1%+ zu;ZYd0Zf8@2V=GzNw8~7WAA`Tu!ms$6PN^hNIX0ttl68|#&leH4{DPHdq0%h6|))6 zI~enT$#?^MXFaGV!PZi`6hsO3tXOYJaLd1dAi@5uHYC9|dz?K4Cc!$ftWk(du&Y6B z4NQV{I&U7K=SZ;Es8&g^>q6-aG6{A<>`5-Tm1UwyurCl(B*8kPG;z}fJW8-Vskevf zCcPxVUYTm|r{i~Ci+&mnNwB-X+5wmZ>$F1HPo0et>|qoiY?ay9k|}8{>a47)O=Vy+!Ffz^C2C;@ZgZ!E>bK(0N`>lm}- zRO77vB+~=r%5aXr*jLUU)bt?6ZJ#QW!Fp?~e#Nf&PZcEC4+h4u z==c=pXJ8Vn6Isn_5aQ#~73#)-F_r}TX&RRg=m>IZVNdGSFN$p-Z7rfnu+A$<5vebW zTlDmpf$;aR7)h`toBQ~=m11f;U8WdGu!q1u2$%%xM3!&qj!Up3C_YZrhJr?+b*lFd z^?82Ft##VdNKAlqHn5TS65}H|8i^iH^WYg^BQX|Zq#TXJY>XM8N|o72u1~3WMTh0~rL78O|?CFE(g(TRsp`Qgzg7pv{7N5GEg(L~~O1P7ONwBwLOabhx zBv=nB3F~jczAkUQ;b2;k1UntlG++{})5?sNB-k#gNw{qn2 z1egT-8^$kySt<$k<~Zv@=tmD-g7vNWFhpCCV2|Yg`Vy>jO2cWCA;JDkk4%DH`5D>* zCc*9=ug1CHR*?id-$S;5-V3a}cce>#eVNiI!JZg57fY}Y$FBb$66}+)I3L{d^=+46 zccZ~wLG~$~fzY;HJmiHio}H2eTX`sZwTz-+Fb@E^g*bO$TrcNsoJAP(<-Cfs&J4cA zfGSl`{u^5kz#9bGm)#I0*lLXXDIRtp5^O6RlVER5!|hg)1Y16YZb*WiL`@TcNw9Zf z+yW{dim@w@V4ac+Zp9s!1pBV4mjwF~wY>mLf^}lPQAmy3qUr3fWktEn9 za2JC*3D$#38U-Z@_E!RaR!}_&_M0uT6I3p^<-e7YV7K}wJ0uCV*-VB3m;~#@e4~&g z!L9+f4M2kJz{ot$FjaTdz)6BF@8jphca$FEI{!g4brS4G#B~8C!S=)03YY}zfw`h8 zvST9&_6c=XcflS8e<;W#*bb?+Ix7YBS)`^j3D%37kYG2Db>zZg_4xe3SME()l3-7x zos)n`u(x7d4@`pfn7qX#3HCM0Usix5*k3We1y!onB-r(zkBXpAF4s2mo1 zTfE|XOxhQ>($4#e@0kRj0c^$BS^3~r;>Q)=$xtsBT`Rs$;;xj~kkfs|_b#Y+fb3%u z?4^lX-iJeRVVi4}u##Y>LwpKUTpuYblwkd;mJ4qAC5lO~Hx~z+1aDE_JYbW+iTOq$ zJ_!~<{Y-RC0;lsRmUspA7JL%?4E0A~lfX$Ojp&*Lvkss~nglD&f)8vGcnptjiA|)8 zuC4xge?l|~)`Z?cA({kEEK61jSyc0)LNp0BhrSueCc)@fc`mr+1LY4Q?hkht@v}*A zK@14Nt%kD4p^y&(HVIC{7zJz+ctkGLFu*w&y#duhbCc!L>XMs%u56)Y# zCcz^*aGC`3;k>ONO@co$ewU+3(BgTNGY~5O9s6B834B{FxRrL^CqXBII|7>o&dN9D z$4Sr=Y7fyh37lR?mRIkSU^l3{g6vayR?O}q3HHD78%Qp!t2r^L^zwt*Y3XW55O**z zUCn9v&<~m?;Y5lr2Bxbyr4SC*!6)%LsVXJj({QE&)76|;5>6MdwtBaNpefnDfU;0D zC7aVq!z9rb)vPO;66_x@aQySqfmeqDSeQnwfR(f}-x24n02OoH{`yagu-_F~FMD?mv!ALDH~ zN}|6oeg&1^#BQ4E+B|*{Hs`rGaxuFy3D)Vkuw1?Ll6d@TC*@nv_&<8L{q9%zRXks z*}3TEbS`o$+q*gmwjJCx#Lvz}_os7_TMf@e-5_rSEQNN)*b!I?c|<%t|iNwAyg=baWz+EZg&)oORawvWVII6o4vIE=5`NrLSLvkNc@_ArbCwY3AT6InK~;w zD6RT-Y^m-h3AXTG>IInuyGsgm%U3|_NwC!ftODvJ*mdyM26Ynbpmdzva$&8W1lxn4 z?m!=tV2?~)cuL0?33l<}bh!Rqusag59WV*@K#cw6NP;~c;}~EPtk;zfZWT$eFRI!m zB-jZ=j|V2fUXO9Ds*?nJOxh*4{AVQ+?Eb2*PJ%rtaozG&SxK;ui<~4_XB2{4&UFd) zUb=8MVB(F96=xFcN-+tNSlW~X>!e(8%MLgHNP=yvMK(#W&(OfrYNX=5cqvG=Hj-dp ziS0^)J(LQXl3+h6;;cx5T`OLNa=|Un6qjJ<(yKRsNwA+_ERZ7!_79BZfQzss*ow5W zJeTBg3AW{I1`y~|_@+o-3E?y4*sOI1OK0oyZS$}Rw2eTn1J2eMTgqvLGXP_EIpsKq zU>qdpPii|J<6j_DTod=?Z%MEd# z*cQFWP)V>;*mMIh3HCXRXF$j#*x9Kzw{!^fNfPY4u-~=_lVG=v5h2V~`$(|ekvPjT z3ASrI?V1GpVsz?Bu%&HF!bk#cUOih4sgq#eJugbIU65dFX>c*9C&9Lv!v>*Pg6+kI zuG(1qAmWqQa0F;``FcDWgNo}(uuo9(fJ*03x+PRBR_l>7^E)Pr)tf{=hW3@ zf^iGT-US;g;~62T+N?5{V5dQSOtF$+U&MGGaEdsc8GdJs;bnC?z|VI%{al*Aj*^9t z-c{5joNjM&Hw7rU5!K0K3Kk;?b|G8GQG5!>y^XUF;|)3g#o2x?zaT*F8JvqS&XV&O z&bt_|fhsj#zKks!%|meo<-g%fz!;?sWrgP9L@0ylTzNUpH*Eb(v{pF1|HlKnLG~`# z4xZUl2ta}z@Go{q672O*CIORRmtuS(M-ptex7a&i66`4$$Aau#u<4M#s@leMoOBGe zNrIgP8YBo+H7wRjra>w}R3KWD;z<$m0)(qm?C(Nw7N; zQzXGUgLlD3Zn}U+33hkt?XS8?FMAhks=Zdn@4OZ-suz-A4~Dfr$le7TX@yX>0iBH! z>}eFAY?ay9lJ2R0byn6_B-r0nufCRCLBJ#hnFRZB%7%7S>=NwVl-~ku?B-#-4s7gZ zHZ^u%QMv^1Y1e^#+k~o`DHA*5l)u9P2PGX4TMtdUyT6)4g58L%T`2A#$^i5@r{seu zl3*`p>xC4b0di;Je2(#+oD*@nzRUR&k;XEU_God7 zajI9pDE z1sg;1;TpQ*66`pN&r`Lbpi#IZ)qA)4Jiq0$=TMhMVhW_IfsI6XpTBjLqmk&3(-+uC zT!nG59F4>$7;k|pRc0fx+6Vj{6DZe6^u_1~vUkD8mU$O!>Vq33eW&S3&kJ*hnig zT9RO&O1*TeNP@k2M3i8?jJIn=enSa1H=n;eqb-wQSHY{?j^+=dseA_?|j4;cu353us$ zNRkBGpVBD7=GV?@DVAWji=F&GB-mZkKDgzp&o03pN`r@h>{Gf4LfhPU2n(SnJ0%JB z(zDpBgD5%!=7}IT2u^E<|Oa<;1$z$0 zz7#JRjRboxPWCR?_C6FFN2^GJz4%1BAqn;_YPtiM1UnsL8mQPdMyx=Bbqeo-O$}vx zjs&~^NmMTh_Csp>0A%lijYQrB+aM%Ku*=|nExx@AHnMmZYy*ChVE=;q2dI-^oyxml z8w4c@cIA&qCQx639oxw>%Ps${j08JVJ0uCV199y@_Ab~M!nUO;w(DphL|Y+t;dpkj6mU!er+B;ExZ>0Ps3(@}kE z6n&Hgdo=YO2~2%*BKJ2o2yyjkG}Kc?*9xwaxWBOh-B)wRL%j%?`s5_u1>1nGmECRC zBdzS-4F5)8>XS2h7i^62OC+njC!a!y1cAq(KcWz=@;Z@s!8Qz8RI|N8wBq|;=r4n8 z#dlt0@-EnD#Y2@O*adJu6hB+>U77+uj#fhn_6Nw{0bB7ce2f8X#n)r=VG1MbE555! z+*&lP_-=~PRgPACx5elSY{l1u3l^*u-)=f^TJhZn&R_*;#die8adNccdltqR5GsF) zy)9OsmZyDjEA70m_+CNqBw#DP&O$1Pk%=EyeD8*Or|4SobrP~c1G=yHJ_Ge>kbO*o zZ67aEAv~fhVB_`8FHuZ__qjOOB>0N@mH?Xs zPUKy%4MKbp{0{Xu(KQL2#JgY{(0vlL_yoxY*d%Zg?}BYW*Cg0cJ<=rT1ivG&N#IQ0 z1sh|ECc)^_2+<_y3B89xGzpx@yI>oJEUMW>A({lcLEjZ*lc0HI@-EnDrE!gS!48Fc zu=v>|s7W-p8p1DkL-W=E@ za2D@^ZOD(4V0WnfMb{*767Pa-K=(;-DAYqh_NiPsW_OVUyI;I`bCS}Wm{j_YG3>M? z*wcwS8JMo-w0x+A=1F)5#Ww@f)tth!!8c?kk$AVCK~+k;xp3wH)76|;64n*3w)*wc zp()w^gz}4MN;apJhOI?gRCAALO0W$+<@X(k?}AM`FvNJ71p80Q2a1zPu*avbD94Hv zCD=C zPgH=C=sS$B<>*Yh>gRle29;xDq^Yjg#vj(^42mNcvn!Keoz80#)Js3FZc9~tK=v-! z)EVQ%G&-5$<3&*#c{K&A##85Ril+ekm;~!dRvMn6Ia1{aeaBX+ya(?cRi|^8)5^kY z&^%SXqIe0gRB=jq_$cdmtGQ>!RQUtWa$u?Ayo#_)yxQtA(UdAHFXEg8ELEJ=Ec_|j zqMEmq!%CGkp>zP*xu|QLCAr{Mws&O1APLTTnOQC}>4gi)y z9+3-G8`Y)INQ#dWUnz7I#uajOF1j6K3b1pL2j?wVDfFE7T<4;v;5?=vrO}5NAIMP} zeU0%Y;9an>-^J%5-^ROOV`)0yd*b{_@bAFRMb6?~unqY!iB?(6_efypA}8@K*amb@ zs7_Ej0{c{a6MwP&EeZDeG=1B1EG5BCQ|f8KWHV~qRJED}`=3b6g>I2pb2eYMlLWgH z%x!^5u%}_1Bu5hLbr@HIDg~MZ`!wE@AbS^VteA(+QH}(=|5!R83HEI$Zvc~Ef5G?; zRD2nK#Wo?qzLIvP&dLr-tG*qtpxQbKw#^qzAQ0aLn*!g9mal-;lVH~)U>#5=!ETAS z1*nr?7sd*5!7Ufo>PfKu3EBndlf4Tzb>T=IUnJP!tO7NVU=JW-A7B#fNf;-{kpz1_ z#@Qfy7i_GHKN^fykp#Pos%=7ookH|2z$Dm*F&bqV%ax-bJU@m7hH_%7I(1W7DyN`k#Ul6V(vwCr&6 zk0jWew8$n2_J1@mSB+F09WMo`)-yY64x!B-oDe@Z`eH zbRtTyJ- zdP@I&O9KhE@+($6DXn^x()tqY8c3^$l=@2Bo0Lm}J(n7Cn^LqJk=uaW`Z$+kTmVWI zB93}cE?5u}Y<_xWc!lEW;{OVz>T9^5N{sRQp$0XQw%s_(O6k{|+BS7`m zIOV(Y&y#p}0Fz*kj{Piz-__4)-CA8hHzmRDw3O=)FbQ@9#&9{3V6VfNEJqUTD;Tpt zmEui;%`IbIvBf0V-Ze zu}IFrIQxCWF9?v^3+E<`E9LBpvkc=iP^HGp&t*%$Z~0RtP<|QC6pRU=-E}zIL3xMH zm0yoj_8mX*MY{`U08VdU66^&Pp4lf6fCM}DVs=Op?88v*0w%#0zUL1QkET9ap`G+9big2jxx0NP;c=z-+@Y8LwmWET*0Wy9SIlAWE3ULW`d#Kw1lVF`*5gwrDNU%4lR!OjXLD>^z z66}GoC%NEOmWd|8&L*Zvf^|k|;`+tDI!dsIQSVUIO?pX!JtEaUL&xvD7Q1LPB*C5x z>jYpDtkVkNZFM$Eu$NIh-YT=NB`2k^sI#)ZBEgPPz4}^m4*_>6$RyZ~&3ycps{QyN z;u(}r12%R`Fg^!1cA=@U%l*jc!r;^HQS$9Cs=7p(_!v$*3fq8^o`|itrrqt*mgbOP zcVO$b6!#G20rWVhaK9iFNw8nC^+t*(f!s$p%Q0%@%*EO9C(fTB_ae^a80X8Gjx!(Q z4N#?u%70=@o1gjh3##)QM+w$jE2MV)rwS76C*$K->_*J4z$91?DQy(u<8lDh{QzSu z3HFgRE_-W_7Pn}23H9n1#j%ivi)a$8^GZ@g>dWF5TY1bG@JCyWB-sC@y4^}KwVke1 zj3n4g;9m?(f^}j(98Gszg1w&NYgKJ1XcQKudQVfI=eOKmr#+3t6Oir)HWICWVObE^ zNDRdoB1a=}AI8mcG!j2!d_&bwm6-lrQJ!Ba4!@q=>~?W;u>^Zg?E3#9!CoAT^T91&-*yT1R2n=5WS`QT5ZbECv)&d$c{>IS z3AW`8?A2=&O@etL$UTQM7vp6)Qx&wF-^w6&Kh7YGok5i+AqQ}3HCdT z^(j8~-$=0Ef8w~8d#78B`)B-m%D>1kjR>^zKDLB-iIb_EiwQ*yzrxZ}DD z_9Im<3HEzx`xcl4>%@GckR-vD{Lag%fl08==P}M{U$RD$1iLESR-jITb!thYpd`U| zCSWZE)w>IJW~FDATmD-a3AW$m?2shb9>jGACc!!}AKdbgB*E?kcL#t3`xhg#4Z~C& zZj2J_JF&?S_ELI`>s*+`RXRzq`x3V|FbVc}jH7``upY?WFsX{{$Vh^nq0Z_q*vsHg z0GR|^o2YeG3hMJUK~aMB;wB{6viM~<7Y>DYSdYnD zOp;)Kqx=U2NP_MB2j2}rm8vxfb_m|?prSH1xk3rnNxX3>(z|B6rlY#gmGn^(>{-+| z2AKNfMBeh*AjH+DiBK;UT`RawVkN%;-B)vOfqD}#^~p&kjpz~qp1*<~Nd%Y*|50G- zlgE^%7{5fa%KOV?LbS>|8~Q5>ks#n9Wywk*i)vm{h*o?*hW-)AR(xB<{^x>Q@lYiR z_D8tii=VCdZj=H#MysI&+x$-k3fPKo8;lxYE506^=dZQkMA4ut#T$yR72lmPc9f$P z-@P%009*0(VE)pdV6FH*sspDL-{as6SCCeG$6=f&M=QQpVoV01a`V{R;uYUMX6R(0#@Ce^BRw>|+w_L5X@UyNLvQ zvl3Pk>=KBJLB+9=vO)>guWGsAmS3Wn1P5|)ut|{ni|@eHX_LT-`9>i=396y50&EgE zz0ip6lVB~VYXX}DPUrQS@q+6e(j<80YI>we&?pV=i=Rz`y<m7+=T48@O&uSxJR#z%5A32HHx0-FRL%wMp?N$`XYoF+j5_ ze>Mp=z*tX?CP8nEo*+~n75iO034B{FxRrL^C&3;B?*?oVI4j?nA1A?KP=|`HN#OKC zvb=hq1gAnh1!SMf0WrIaB-m@?6`!Z2Yfelmz4}^qTDsch#El20t2r$nWSJ&=%Ef zB$^Uz8z@_VOoF{N?LcSaWfJVMln)aplVBf6-)puMDN3-nLAVxJBE5z2IAtmW>EYD zu#ZWwo^GY#Qko-GzPLW7N-eyls!kVhrv*dns!FNS z3SLWKsp34oK8sgdebIF>RXRgiOEjg5)0&0XL|as|k7!Djo=|##>|8V=or~Pc_O4EX z-39JW;%DcgG3i|7Ry-alg${(gFR&CEiE$#Z6!Hk(ORY}D6uOw=^TbyQ-G_0H9G#1v z!gvDMxyXZgFEznRp&fL9bS`=m&TIuKjlReDR*ud^`BHi(R9@P|xyZNWf?Mh2?TPab zf~$d@i=35j%#TU54%D?pR}wkBkSwp>6RH=~&4GO?y2e!hTN3R2G<}zGI3&Stp`UkJ zFxizFcUG+?!7htLZh7jE5wE?GuiHt2JrL&Jz$DnqFfNiK3HBk3dqI@~O@f_^_XaQt z)+;WAj+7(8exwdag8drGB4841RawhWA#4zT12iGQHcQK`byjvzTJ`N%qwc1=U^k(v zjX);Bwn>3*`3h(~33h7&wghz&>>#{>piYAA6syVww_I4OC&3OS=wP6aNw7Ur7kcXW zBEc@bi4NDl3-&}JjsqsaUW9Rh97(X(VO$MNg7v!c!L1?*c8;oTLV|sQ=xM+t*q1S0 zRCSVI`=niR%YP#x!46e*brNj9#C6M8WhKErBXW{polyvGIoBoFcj&@ffQdISR-8$& z^W#!R5=)zsV4ai;ZrS1HA4#yCw8$n2_DdT0LXA}19WMo`)(N1!G0gFLb>3UXNpU(f6}Ypfl06}%DIdIlVI1!SQl^+mIV85N}fGP9+zOZg3#MY zEWRC5q_2cImW7E7>S zv*9DqX5ETa!f8}oPlDaF8DE}3n*%9*d3pm0_9#jY0#zd@tuMj$MOuC1tE}T8Tu8Yj z*hi=#_fLv$BMuK<%^-;4b$g#W0Y)4E-C8{L!yJG`=G zI2@P+I~ikw97(XxU`&-G3HED@MW9OYCc&<~Qp>O!FbQ@)jKOmBF4*%i#(=iVW2+-* zj2Znm?}9D;Iyb+y9^I?t-@bg_ZRvuJ--#o0`f^SeD zm&Z8>V=yRr8P&;S3Kk;?cBPW$;Sq|bh#zoTR*@8P{vT!M0UlM+w&B^`gajf%f`X_Z zq9BR|?1&1M&x(MEU{}P3y<$bNfTAB3uwnrfdjV|NP*iM)h*(iUDF!?C55@A|&wJ*b zY!c-1&viZe&Y9<(Gw00A+0ESS=4brpQ8*RlzM${|!DJOarLb}n);X%w$;(zF@kmPh zqOx@)68Avh2jf}Q!D&+K*$c{J|6`o8yaK|-+a zVwsK%!M1D4%0Y%;2N4{qg8mll!vy1zA=q*8_Jq(&tqo~&gnf}AST{DPm*NQaD6B^y zL$Gcy4+H2q2)3uy4km@P}g3wPtg%YWMa%$tgmx?kG*(^a36c>@eEB zSZy=CgkaxGt)HU%cS++J>V**O4Y)=lL$Gcugv->~h+rpC{g5?gZ%Y=Y{?$ZTPeHIj zqpY_jGf0@OBtx*rEb-YeR_Bihc0ToUkd0kMGo}%;u{&&eW48{qYa@PI?aq9gL{rZ` z%S_yZLN_Y9qLN;~)~au_)A4CLoel(hFh>Vc-Cvd_@Hn^dH}0?q!S2D)sZ>9Pa@$jA zwFhvjv+Wmh4vI4CAde0Ruujs_z_jAp|XA)>AGsu&>2-7PQg9}>t`#Z^ZM@+ zAlM`Bi(_#jImaVIu%5yNnEorH zAz1g7qzrGEoT;938~$4?M+kQ3)V4<{XGz=D?&my0un*&Z5E+7XV?L}wcO1b!NA)kLJ0On>{F2;SWn5jR48gjsf!Pv*JuclTkBSiN-SoHNPe4?!MoqOqTHqwJ|dW{LVF5L zT5@kut`&uy3ARO*YM^Wnj+{bi5Nh3zf+5($3EroA$>Si{ffNkE&P&7XQ4xZ@`XRa@ z1bZ7T-GU6kP9S&)mH!ZPSAbyMk_#Ti3m1YN@G#8_!M;Fi&m%*yZp_z9NeK2Gyl=~| zPrFT^HBSWxm%mZ9>d!WpTMhhLa^(T zw;nPC+l`?R46LxEaV0WYyL$HV9KNw{Q_K#$(iL%>CQrDAo>g-dnUcDRy z+bq5r&V`lL<6(VUPvl(s6zpl7=OknZ_8Nkb$PldOXcoY?&`;n&_^NI7HcpV$mo+B^Yv1kK6Sv_UUu!^y1kGh zKZEb)cEP$8GWz89l6rPQfL+xi?dBo>S^*DeIl5rg3%{}Z;|czdNLb~Bx}caE8RHl_%>LRT>xY| zzO4z?R6#qw8xeFwp<<`l+hY2(Te=pH(#89Z?~WvQN4DeZu6*z)`Qwgnf2{k;t{q=D z6;kAO-|;;j>#->NF$8;D>{AGxw5Tp?xz3|pr4a0e7%xEOXGhBl5p37=+USwLM6n1y z{8l6&h8=v+bI6>&tGQO zniy5O`jcF=5bXNot%HoKxh)@#$L5o;FV#JfaW%K_8>wzS6Yqh^G^L3*6wf)xxSIP) z!g%?XRK52EHchq%vD_`2CY#$z!!xo~x0ooKCfJ8qW}^(jR;3G=ZN3b_maNq@{3TC@ zVAo1p9AC;55$v{@Hbpj(P9QiM*+g=Gj_p$Xk)Pd3^=SDuk$xdqqJk#UYHj!x5*dQ^ zUf z`Vtv}bx%I?#A&q7+H4UaL$Gcsn8l|~f2#LJ_G1XvryEZUPRCR^PVccbRW8LhOwH-p z<+cW4Pi#I_Zld}IWK+d0W#PcAlu(HMdoQK-0dInN?LmJ1%G=e>S@Dd0WE%}Rt>=(k{$*RM`J5?DQXbx zuQG+La-yST#O9CP9V4s zmG2RM2Ure*9hxqtCdzI~vu>wOR-^zb@yN_-WLU?T@i3&!ep8887Uk9U<|;rsOnHUiqZ>-1=u;cwf9z z;)OTT!18$E3q_t4@xre0k;$J)iIMNNIxlQTuhv1v3pXd&R0Vxxvo}Fc#4Cn);aW?4 zzvEK|+C}bVS|xZ#YbT+82MY163E$_Vb*)uAlJaiGd_+mviXRz@Fb_a z7uAB14cqhYuyn8(M()nR9Z)S8c_9Z*LoGjA)&wR{2S&b1%@ozH{6~|p??-iDfj9@t8`Ew^vj1OX`^Wg&B;AtJ7 znZxN{qGmj%G0J+H!cPQWqLPE*FP>Ad9Kp!jIl5cNreSN8yN<%$1fx_KL80k}++dU& zLZKf)4;4I#>1zg()1Jgvw@9 zXs|Ia$`lMn_Wa0a_Jc?45Ef_hQ+F2;V$ZoOSlHifQ6ayn0 ztH*+o-;nSXG8pN`2K7=LMlQqp8!{N__VTa_JqJckP|pP;8+GFS1AsSb;SH0sm*;GTzq92CMovp@dz5mPw7p9?f{{Dn-vJqn zbYniuq&p5H_n~@kH5&>Vh4)jt^VH{0n&$M_(@30*=?G*a@g~6wDrh8D+Z>vJY$OH} z^jAS6@i4(1s8WsDNPJFdJ}T2lG}?l_1PTTt{mi+dK4@kcjJ)PmdLbCupOk%(!AMWZ z*Gow-@;JPMkip1v3C>1bt6-$3mxM-tajnam@Ax`r5sVy-X(Tcj>9z)DOEB{5bf-Kj zf{~lO7Gb2<<%36cVdM*(=Xqo>au&f%#45F~~!idRGX?b5VkkYkxo&AEs&>oSUND z9TZL?I9i44DU2t$MTL3noc(aBR8Y9&d6Zo&ICK6@>62&3SgvLa>1i`;ewIhsd>T3ezevX8H{ve zzFta#k;mXYN`Ape_ZL#+r${jJ9K2_t8W`zGCH0aLjJ%wL%al|LM)sbYjTPIUF>NgoM7b9@kAj!s_8MjU9%ay zN+%fk9C^Rmx&8 z@(N1BQ2CAVlq-ahZsPC!MZ2Ry?&>jb(MQ3^2WjtqWE{qg{Heb>Db8W0V0}h*?Pa=& zKlN9~?)#cEvCcroVcb+w&#vw8cW2TgZHF(!KOY%~@to3><1dlyca|$f`<+X%|Ed)2 zcX~>L6s45v79YGxiuOJmcVR~vWqY6FV*mMCrx^LNat_lLZyWiuz0app!b35t3nRC} zyalqo&s_+1Mz;6qx%u!8BkOyg2UESj{MtT0gWxn3wD)-l!9~dSK0Uc$$=dszrn{iM z&ztewpd{^mK1wi21?_#lNH7(JikD(zYACUYWvb|4t<%37bANM}L z!TOc#+WT}d;kf1_G2*e>)59d7HUyl)^egItYBnw%&VaC-=bxOF!Gu7 z+USwLM6n1?;Kjif!N#<=A+kl_M!tYQCVPr6f^Jy1lU<9zO@$P>-4{V`tUZw}0=Jjc zvuhE|d7B<-5gdtsAhJc^Il!LSqco$JR5ezL7Qs2#&r*sOfg2m7D5X@l_+%C-S_D^N zABnO>@KU;09{E7|A{dYN4*9c1Fe@g6;E|7^Go)uQPe!%~W)sXpwg^0f4=)rgg0HFm zTz)Nr#$8#W$QHqx1gj%k1fHC?WG#Z%br-Y=7J=IfDe~rh5!{9KPL%yrd=h7O5sbV% zz60Ug3IAqIj4Hk7T`pRL={fSAL`In0mJe%T^GWz6)eDgkCb#e#DHctloZu1_^fY~l z;2vZ!(v$O+tchfkXd(6QC_$5Gi|v_F$R^Q#1btA&#Mn*ak9WjhtgWzC?b(&VNVoHC z73!r=sY__;d}J`vJ^YDQdEzvBlIllf(KK>P!7M&?zM;Ar*^j|UpKhh$JDOsuEPX#t zl{LGuj*v|iw>1cVVe_f7G1VI)n<{Q83zfkrYO^ENl%`5|Jli9iD())}t>s%%b<=xs zs`SCqTQ*G1nK%U0du7}+#cj=*v_%AQ4Ere~2y+11s+$ia9|mp^+J{hFRd9>x2S zrqJb>ha;Opw-by-HibMR7q(ZY;uM-p^(6WAESf{`feM;JUl3Fydlq?e-jX$i_SFs2 zv*<58OO>Q))TTSXpCFq?n-FY-_(0aD*<0-5XOSPvu?dsariZsroE=E+hU{77u6%ue zoJ9Lz-CK4|BDeF6JawA)33VjafyjQ!+r+8U2$ zdgsKymMSZ{|qD7kFQCBk?q)0S{{ttp~$l$82LDd!GI9PYr?(MzJ;Jr#m|jGiydK8DEBwE z_5|yy@Dqit2)0mRF@@a-c2Qv-h5iKlBECO1&Yyn;BfpR4TzHI5L>Srk{cM$o;E}I) z!N|+i&3)i}$8owrI;FwLgJM!Xd=EeqjC@o^!N~J5og<^c$cd@-APC|xax8|Mk-^Ak z2qvRSSqw(bq4W+i7`c?-XT*=e$VREjX*xGBauWca!N{te*a$$O;)pn(3`U+(G`aS{ z8)4+R@vy`)SXH&3GMh>$87gVLn6X()R!N_Z|U5N}vP9d1Af<77f1;J-32u3#Fl{ZzWQuziWds5mF8H~Jy;CvMX zBPS5tgVuZ|p7nB0#^d5&elqgqm}M~Xf;X}oyj&RRR~14{luaODWY>9Ip7+JX+vmY6ZY(=mJ;`wu+o-!|I{mh5Gbc3gL+)eY~ zTxz;t+C*8WQn-xZd{puy{Kaz$mLnLsWoe@@m+Cj=-+)5b-I)|9*P6oJ1h=SAMd53L z`6@J|u+1J#LnluoE&EIhtUE3WAXz63j#fBM*zWhhHYu z+K@Jnd`fGAk?r=PU&w$~FM>Uh0j=JYUr{{|<^IC5YcGC{MY$g-j3OAWLN$fC1aGS_mqLf$JgQKo8Y*i}D@Rf~5LLCM zU@+3pR!HYfFXD?DpT8iE#f{`#j|@h7N@=|mhmrSUy&Eycf{_c;xLmF)THN?xg$Y;sv9l=M(#wxVB~FSxIHR@ zk@r{A4Z+CQXz3MXFmevT2dI2f%v}MDbW1LH6fayb^4!HVFBthXt$m3MM!GRyFD1dq zKk+V;Uog`Bg%tTI5{zuJFY^M`z(`Ljsh5;sn}N%J{fr{=eY?PjC_V*GBOzHIeE)TF!E#SKTv{Ti}dN#_c?+WB=W*?eGEWk@h&x!ao=phjC|V%JG*-_B*fpiWF^)kHmh3QncUcDLm@q zX;MmcizAexz0W(ak3-qs=VxgQJ@RGc9A+}!$K}uVK7UUM-^QpejGTdaIcDCl@SPd!Kvj#%b@f6P^u~q`lAG z2zF6H9Hu|Pz9>`_;#0nO@3TC;et48F-uFI_C;3=pd!O#g^M`8vl_tyZ4fG4KULd>n zKHXGEkvH#qpVwo(7G*yMBRi&+Cuvb#)^fXVxJtpu2Qc1;%DY6%3Ss23bZs8_OB9cm z-@l_xErOS5?*(Lwz>RzreN6TgUj*-Boh`c-ft&dAr*-VU2tLQU5ZNMdQ%OC$7Qs>K zkru)4_?IGE1fElxa?*@mQZ?pVQnUz~?1x>_BJh+3DM~5TEe0t?i(p;sZBe!e3N!p^ z?~xCbFM=+3w~{|w1S`h`cD-WcW9SU2H|8G57QxX3M+*&=XPzP>*KfOc5dkzI?x?S&M1^S%hS!MZidek#_Clc@+sPLJI2$Ng*jr338 z)f;oer|CV~u`)#%c@&0&kWHi;2(Cdkk=)N;1du7IP%iPLB=s&|z|)5t9av-s4xkm_@h{TPh&=~fz^<#bGyVS10P zsWJ)Q1U08;m)jbI8Q6TPyhQa2$fk;0%EBjE$D955W1K4Q;duwyRB>N<_(r}ZRqbWd zb7?V_&t=n8aa+Uihiug?e$gD(RQV0d|4{ZUT0cFDJj$-F21ZsK%+f;fS+r$(7I_r! zN18%wVO|5-6xxztb7WJ{;Zle0_hML|T! zL&#v{9D;XHd87CSZaFZrd%BpKD7z`my0v+XW@}*N?=-a(WiWF0l<1M~fYySM4G(3@ z0M)?AR+QF2H88SIx=$W07e;PK(gsLB1|ttmc^+jw&tT;7+7Z$xBfFB*MS10?#OKyO z!^lDLP6Ea@D0INh;LGjyCDAxMs|v~Cl@ZF6A?yU8$nwL9{GY4jBEiLGZ+~TV;fAT zG#GhHOv;DnfM9}=-DMPvY=*H3%3$R8sr8vMI*i;LLnmY~vNu5wR4I$W$P+0YgA7KF zBp8ACF&Mc=YI2mC1V%oqbL*3l_h7qS){60QJ{gRhR5ZCh!y94bGx4y&$X@YLSPMq} zP*xJw20MoPvNxwSF!HKZT7`E1+ox^V92mKPQ_e=UVB}^4_$GN&3r3#Cf#Y0_ljbsmXt>tbwEjTNV%6S7?McmAg;fukvr1TfliaFZxFhQw&ejR4e3IJQF!BK) z+dKSjQrgKU}S^mE5bmk4n$Q|6v|rjpIazhh73lIi2W>tU)9ga zowxg)Ar*{V{|Mg5B7>2A2zsa>7&(OC3>5?;A0W63RVv?LVJnT{#{Zj2udE zz6yeoR}qXv1|z+RT)oB|M&60_cIE1mk&h5eL_B|*{n99uJ&^S?A6A*i4W8EVy(;Fx zX4K5YG)-9>P-t}&_X(9;3V-pOg5?NCzQNH`sXiR#o~JO2;8_(OrO@?g_DNCh9tuMV z2CHxzg|`S^MwL2w*#{h1_Za?FFDhF|;Sz!qQL7~sw#D)=oh$pE!eWkoEZZLxIt}7Q z85xW`{~@2*Cy)S){NqpVr(oo0EF+M?$VCJns-RCsb~u*#i3~=bKrj#)jO-n6PY5@t zwIOY~{XuJjkxyfJL^=AJ)tYH=(=SgiBMPezWT{zhbDH=W=WWMjAT zgyoFg0%|`){In`>&?x*yQv)><8&dd-ir-Pm4PeI?)8)4Nl+ytt@8W3N-6h0xCr9vMH>z%-RFO=Jb!l?vDsjwY|DFl;Hr5Y+5%#q(I zeUGXxqF^x6&sIq1O)uh$8dv-s$6})s`HnJVFw#>>>!mo1+zxA3#25=kzLUmfZ(Y&i z#+#{Ky|>;A)1ERKjC5Z~%1C`#-1unEIT-(emLnMXb86e8l(VGm^U4v7JOTf4$Y7)! z`4ek&$6@3Us?Sxkp`cM{@Sr~>PE(&hX}X3Udm4!`n65-N68|IkS_O^7jwkWQF_4YK zNP-Jh&`5kpFauSpF&l{{C-d7lD$_`8PS61vjPx_-iu$0LWiaxAKraL%FT{QUG8pM8 z`Fbe{MqY<^G%^@@7r~u~YZZ+2^pY@E*Sf6vL3z$17&!&gWMnYXZ4JzpVB{LL+*3Ub;s-oir2ea3(RBfGB5Rb5Hd5jYP* zxr->=L~xA?gDK1;ctwR1C=^bG&QYjT17%}4(upG-Q0u!@ea+M%tsWt0P4)E^twPnK z6bwdQnTFe=A{e<195*&}pZ;!bvfRS#=1&`u|3r3cg(7a&eP+B`5 z8H{uzU?TM`OG+?u6yB@l7mRclETWD-!N~D=??5#$(yb-+k`j!3jD$y&R0~E9otVv} zT=2-rBA<*rK^G(#IgPv*k-grO05UC+31je)9z*zf@=S$;j5H@fH|mF!I54wwfqQ)7P{% z*QqlY>D9}DkuRm2w4ZuBtnbUD8I0VN^K6U^M)oG?fec1^PCh6n!N`-TKVAufkyjI3 zjw)p_82LD*38?(Fc*+&RNH^tzN6!AZs~45iM{$_d+1}@@G=?7ee+qovm@5^QTAgna*gK=U_bx*&=Xz zNjI8cxT9;ErRffztQl>$Iuzl=a}asTLga){Elo9cm{tJr)UwZ zI+!;o$QHp?1Y4+}MX(FO&d3&lC+96$i(sMdf)>G{c=lJ47QuxC7pR~`a5ce|C{#3! z{VrYvek>O}N*C{o;4YHyM79Xrm9OuQi{NRjPs%O;;Pyg_ym?;)Z()5CWj_@w#la|o zkx$20d_L-~H8HC6g~nX82-6qjEkH(?+?EfIVe?7Y>`Z0`GQ#8*ek0Y*XX5oyQ<`|) z@N_{&nA}$qzL9T9)p;vn(_}ji%aO8avbn7^6y{^AZqZ*hO|ToVT!S(g`C__&)yOROO(qjYHzSus^a%bP>UMsN%EOP2-QVAI=tn6?(;yi?b_( zk#5h0XbkTn@4ygONVnO2ftY zm?~8($EmUlzMYXx6}L4Aqp|r^*^lae$fk;0%EF!M6jSAbCUL49i{}_*Q^kGd;ZgaP zR6SZ5r^jG0YQ@O`$gkUPm^CJR=w0QK#Y*nosq|^6Le;a4vzQDO5$UGO}lpC-XfA zBx?$tq#LAXQ3pJ2m85C32f=PC=vlNsL4On~wpz}!$dBcMN9p116X!UR2O)bFxr;w! z7+XvJIEjW}Jy&*3A~zLMS79BA?5DhUoa+AyMi$ZzE7gG~uH>Fv(Han=h>64LH(bPzk!N@Kt z(Iejhtpy`*BjFZQ10x@yG!fOn$Q{#t@@Tm*@&%HfNBS`s*(>FFl=VD=k-zDl2u98# zXQuMX2gK*rKf}oV;~Pc6$Zl*Y8Em|4;r`ZehL_4uDe_qTezodlZTK6z{9ngMCU4AQ ztOLGBg-$KbEp=K?9PErQOm)znuLcs)q#=2sX0%z4^sQbCUs!sv(!9- zDxaseHjI2rF!DNoll%eof{}}9Ay-Y+k7Rv;a&swcIFwK1qLPkaLQmq06qE#v+>@gR zQoT3I?MUG|f|00Fj68_zm{Cz1LNnvl4+l|63f>%`7 zmcpvTc%O=Ln^8D|-~d#qlb0ROk*6r#hsw^P&~iA_0JXY=!cJJa(z&u>6wc%5$*Ala z3NI5(KpBj@(P#GQBmg5vtj+}qMs~QAS%?fqo=tFq3WAYS2p&~IpN!03#{M0J3`WM= z6T)q3ZAhCLtI?WZWG`&HA_H1y6P$rE7*S1_^-39Xfs!N@okA$+IvM;N&U^&24@yF&>ML>Y`6 zvz)OzliD*7Kdo+MzJ=LM!uK096K|t1nu@DX$ppd3bh#Vi5saL|(aBUlAj?&dDYxW< zEP|2KIl9W_yyru?=O~;)aHI;4P6fG4d22m)TfnA;#EXWVD5_pRS0%|EPBL z-g*J1&t%MCWb^?e>oiQx&z|!m{_icvU}S3h=ejvd+V)tJ^9V-f|I0a01|y>}AC9Fv z4kN3mURkzK&?q#x!JiW6sL!7?y_fN{k=O*&I><)izXU^7&`5kh@P-N+iMAsF%*aOK z1cCvmQjOV2jHfgXm1!hiCzygV7#YtDj7)vd%rY3cbt`%y7}@+v_9{^ZBcl-*StljI z$PMszKn5eXA=nymtp+1wQc1X5*Sf6vm#sOAU}PUmJx~TCqpgA2YG7nK=1EBhxjU6C>Y;br?CH6Ml-apVGHLPMgMC$OmQKVZeZquWiUx{YBMpIDbI7A1Q2n z6;CactEMoJ;6N4TQn-=eYE-EP${LL;4=+=if?7AHU@)>RK|89~=>Uvehe8G;eNF2PF)M^#njXX3J-s%s z(&>|tL&!T98H^lFFcM`jGA05eQxncYrhG5?Hg@3V9i zZ(LCZBV$HBoW#ib-shTBuZC>zb8~`CRnXq&P6Ruk3`WM}f+cJ3^Ell&?R_4Ar=OCv z_jxM8$tq~?^Fo3P5HK>P7ju}U@mMZ+lrDZ;zC~`tyt(0elCMP>j7KBdGQJwIZ=gkWSz?g zC5lC`3NH?}2)?DguTcggqY)TcC&d@RUs(T;-C$%i0VC_!eGxPn&CEm@jEp8=WF5N} z!O->Skru(a_}eP4H`Cjlz{r?Wv>gMg7Sy?7D$ zF<@k@O&9NrU>lORMj4DuU8v`ei=Y?Qy<|5S8STKxI?ekcI0Eb8DEp~cDGos~jEpbd zxiD61VpM6*4Y+8*$RXsNi82@&ZG6ozHlKv|Qhf)?U}UuL8>wzS6YtaYX-X6CT|6^U z1|y@dB>W`blB$NXX|jdu0L!u&jEuI@(CA%k)h!ljVQGSGh^;+}Ff#i1^r`tW7`Y$y zedLKSGMYlzTBZmiuf{MO*+hDQ;2D&`$kb>r`6EgCAJvQH*F@U=dcG(M*+e>?;3$;A z$e5fDN=`8H4(dlKL6hibg6~w&leEPR{1FdS@mb6?{y01SB5s9VapdCciZC+u@-+3* zr_@d~wH?Y}Wa^B0;xsyw>QiJf7#S^vAd63(2dKUa*-r)|<0LB$m*ZoqjMaN=O_h)F z%~5lDcKKXv5XNBhsq!t=U!x30#+J&${aMGGt)!+jRsP2FC(2-C^p%IFg9v4wS*jXlodz%U0c@iENrG>tI>e4WH2&yp`JfZqAKhw zqYOqyJ20|N^FE>0#o89xPkHY+>HZyzOgofcaXSPff6#oT!N}NfA*}hH!N}`2q67M5VWxiGRHNqv!iG8mcidc`Q~c?KhgYez^h@{|-jR+ru9|p%V@xBWMFg#>m&ZU}Wb`bW<>L15VdLr_5kvwC2Nq z1&@G{2goQGxgDl1GG;I`wSJ3?4kHi2Z~!tGc@Du~R4I$W$Qvn*LIxuz6FiFe$zWt^ z@-Q_CjC^0`)+Zz1#`cD+71zf3l)=cN$@M#4hmrAc1|#Fss1}U;@^8LN9_%=AX!c&S z21eeuSA>y$fRQWR!dr4qTMI@W%)wr$7L2@=1J~(b@h2nSywdd z+{%kSYPp!&5k2a_$i1oA6;=LDZEYC&6OggfMgAta>SgW~F!FR-$Te!SQn-|?At;xl z@B+b8sAL?N(3ALXW+ee5r*iars;lLnOksoDc;KK)Im%{mWPeJ%Q0osV7>rzG0Wk7= zf{|1WLsfrJC@Y`JCoL&Gf(%A>iTx~ut#!)Do%?S_Hw7d28Os}4WH9nPg25^XM&3g( zRt0@B@;!pLP^Iz>Mm8Qt6*3sP6Tx;W2u7Yra1>hezNVyt@=dI7C|5A@ z6M~Nr&!3BVVoZ)5$cKKq!P7b}*^|@XNzGDB-zjShgi?qLmlS>{s8(Svg(L4^pA_ZZrf@&OI2B%_@EgGrRH>7f<;og`o_F%EdQn+p3J(+9 zh+4Iza6XpT=v>+A6q=6bsfWtiQ#gQNXJjyP<6%CtCy)S)Y`zs2Bp5jb%cIC(WaV9a zhdMGC*@s{^6$B%1AQ*`ZMuv;MwK-~SNSpn)pf$nBMOZ#jjy@S#c{jgEBLiCFhG#jo zU}Sr0*F_OVt`*xY2_E@NF)(t6Ejfo^WOov_M+PI^*q~mD!^mD(_d*6E-OiWZ(Q{zr zLiJoQ@(?Tsp$tZD6nl~j9%&xx2N>Ceo)p1Ica$ctzdZUUBTuB=KUyy-=JQR8-7$Fb;7&c4WCq^FeD zOK})^G}a>#V=NeXaT=G=x+4DmquSMb>oYN(A)~=a_m!lK)R)DLFZ7&C@ei{c!N~Ec zZI4pUlD2b{BN%xD{_BvzNH_9TK6J-nb^L4Gunh);ESp*{& zW15c)M!Kzm*%FL=BlXgwA{cq}HW5a89iL*1{<<)7)dvAg$YA8U1Z@$kR4{VoOZ_Rk zj2=3S^rQLE_|*(XuEqar!$|j(hR)OhBX`iX2}X9I`Oe5-U!6V=4br?CA6P}K;pVDq1rv>pA7Q#+k zlwjn(yK_}1QgtQH;V5@Fg_j7PQK27&r3Bxruos1m9)ixHN;Ob+4o424)CaX5PQhU0 zD1yVNp13nGax?{lk=tM5cgCY47`gYhbVD%mQd$~@3`X8aa6KyDJLawcM!F@(KUMM* zWmgW2Y`Y!J3r5~gYxg39k#5Y_OGz;DS-elnFBs|mLW<(O4GBih#5)7kz(`Ljsh5;s z+leyVc`Mjpg@_Cp3E&mkC$3`TlRJ}4)_ z$T8GkuLQx!rwJZIm9iL&{FKrhRDM=Gn{vS;M}^$gTXvw2f{|eYgF&0dVceLn zm*O0zDfTAFIE>p1_3XZ{*%oUXWE{rrCH3su4lh@aw8yy>{wDOxBDU(kM#~@i@@zA z_3T;%jnyM9f~W9LMz#n%r!?iH8NH-xhn+~#BAAJNhElW$Jf%U3Qc87;m6f7Jun_xv zlr4fg)4lS@2g(=0QoO&)pDlukF(Cwxd<>l-HJJprLAD6m6ReAD5qL%}OfOml-Kg#& zzZSs&f1gL}ZJ=lk=9WMewICNsC|vo{N>FMeqQ@eJTh5JWcQ<3KcKJeittS zKgQR_rmM;>Kar!iNPZL9B5)Vq6kFFH7r`Q|3uM^DEp~+HqP!M z7`zU5^hKJR>%mGTlkIiHJ(6ByyMlB zCf*=C1CbFX_mzZ=M@Vmioo=WH9oA^w#M#nIepA_b6YXgKQ%8Bj}B6BDp^oE|))&r2kTVp8T3f^9Vjv zK@%zW82{vzg26~n&RcSVkz3(e57{IdL2$7OnnVv0+>I)(j@{H8s<U5`i8)QEQBYnD+hL<@V zQ)NTF$JSIi8Q+O&PR}m4H3;uv^Qm$X)kBd@6}Oay&$EsFe04Tiha>rpl98o1kQ>S|!*biA+0 zpFNA-PpiVv0;lJqP(o#0dzG>tAMxDbVk#j)ST&mupT3m&D1w@;kwNFI&s zS>&#KeSe%p_h7wCc0G&SUPzHQ?-S}Ntdo)bl!rLg{}qgUG%eqD+)Kg8^ELIfVe$qo zzOGgcMm`sfxv+IK&f9~x+v$^$pW>W@3`RDc%#uR}Bex>xj4G9AFmgXi{gA;(Z@3Wp zQ_t75wxwNzk*8ug9vO_hkzf=mzd!yKyBrw#S-O~-D7z`my0tk_-A$j2e2S(fqYOrV znG!wn9ne}Z@--4(K{YV)6G|VU8W{Owx=$W07e;9ykZDOUXZpy2QlCdBlp6vyP4Q2npgw_LO53w?xps73JQHq&2iWUq1>kw z&LKEUg?A`iK`=svS1H^=Fh+&vC_F%L9}49S89wE1|zqPN%`<95KJ&~v5bO|voXz-(O~4&sr3(JbQt*)h9$^gWRs^@ zU#L_M;_;>Td*SCI^caI=~OMh*nv8H_v%+hMX+>>THl!N|RfCfB8S zBaA#S9yS=cBo=DH$j_JYPhCmqePnizYGCA+$3_@A02p~Yr@RK$f{{ORV37_Me=>5@ zr};i(R0~EP%YlPX%ZiCj!mESoz{rWz+^yOjsBKPdt*>dVrsfk=*_YbdFtP=Zan?~j zxW`j37@4Dm+{RR``3wsk<=Ro`N6-_MtO_RdB)&*NNx;Z0I692#bLHQV!t(@^QKcMZ zJ8eiYzY53kkYQmVC0%@s2AN7 zjQj%20%S0<=@e!PG8nln!R9ImMjlIW1gccN!N@x(U5^Y#en>D|1;NO|bG!+ou;#LO z*5^3czlV{fM`!ocVC3^BWQFCzNWZEOY9dWzgOMlo<_ZNPH=;Wok-^Ar1ly?~7}=Ac z2QnDxP2}n|<}mVbtcNLAF!B_FlMv6JuK#Nk`o~V^!$jTSX&uiyhSMKN%}7iaE2|HM zPY7nCl3n00o>QV zs?^ELuII=?O7EbuJ1Fe*0-s<*tsbWEA(nmVT-gK)cXMH6 z;<>x~>UZwL1^qRQPm;aJ^8y)+yp!Mt74*r-#RPLz5RBaLCHC)-!N_s(_JpvRS{u@) zdT&}2j6565Dae4;U(fRVS5Qv@U3 zQJTE|^5`(KFpWEc_%RsyUTS?`-M>p3uddM$j9e90Q)DpGZG5+iIvYP3xe3)Btucd< z3)5KCL^_ed$ewCfFmewPc2knU$YYN6*>JJWA3qs+DE0l3jok=>VaUeru;q>2?bMD% z{Iq(N`F0&mHPTFcjlvWvopC4U@>`D1r}{lvdO@b#!msF91S2o! z==Lx3@BC5jdpAiir3t9&4hjY% z{cQYB9lMrZ#1}Pwq;DLHZ^-!y8H{veX}uI5mp`!nju>OX$aP}NA$+SV;_pAIUA?zn z=~ecZPzEF2SCTSPUlup6+&AW|iGOv=5sch9we3;LS69o6GppnSE#$PB?K_k(FLU&{% zaRb2>s8WsDNX(=(9hGS$ej-?m3`Y8yb47j7%rY3+ryso#jO_k8dzHvwq^Ix?MpC!4 zlmsLD;_ZVBMjkhiNb}80oeKW=k;gxO7U7ieTi= z^w&Na>2>+wQC%2$Kj*m@8H{|2U@~Hr3Pw(ht1g6n>7m0&KMJ(V2CEC3@P^_1VR{|_};Iobsy$5I<%WXE{87)HJr zyZ#R_a(b+0PcTNl59=_pVmj*%Wk018Ku#CMTV4paa#4bj3y$Qf=25i{&NWbOHii8N zdaLjXg^>iqRG32HMS`bMr5Y&viX%%XEk><>rC=~Je>*gX>g@&qBMTG^M$Sva?NJeo zoTrH+7`f&fEK+1JawCF{sQibRy8;;LmR#^CUbw!db;ABMFBsX4*0w_iBi)#KxS3`YKutTjN-WI&S0chF9$|8i*JT= z;b--DSl{Chu7H@G7jU$e7zLsFn41eFT3_K-CjtMpTYMvCu4ma z8HaIuNj>D-9%+wr2L9>DIE?3%rW}8XWWV$EgGkYS=X~s+Dn2LfWQ*V#f~Sxz0?){Wb&D3kyHwAVUyI;Zf}d5; zA}D=JzXHca;K_MQ)*`rEH%^P7HJ;UwErRX@+pC~O(2HO%6e7W=0{KL^}|4MHQW5H#LVU+QzrPRu~&cF3zqDM!G#0${(YbKBZ2esiTp> zNcZr!c;$)H=ys}amPOOZEqtvA7N0urQT-OOAA^xT-Acn+_?RkB={>flO6fZc8nUV4 zwgzDnZ2r7zLG`N0rixqmVn%g}snT9eX{xM`XFX(7#eLA;uIQ3^%(i}EP9b(stTGyZxg(Q>;>7A`JMxkHHDh%2I*O}7|(nq zX&N2jV$ek>O}N)K@X zF!FSqCnAH9cN2_LL7$AALGTKyRHDJiZz+9^3`Tmxg)oVFVB`dKK%a~(dyf{RHM9Xu zupTPkBmNGs92hw?T}(}s-IQkC+I&H?H88R#P4z$-j2w{?J@OsUS}^ip5)MQ)F!B^i zC!rb`IjZJ9#b~)OawtjXBmEeR9Gmhy%6gu`$Z^^c5{$fxoRP{apA?^4{|qDVi+4&e zvYG~#2P0o7@~j9(c8!nBT=2+uTOCH;Nw0241|uIKn5cqaGalZlKVFLSvM>fdz$?^8&!sm1%!pL_cXbZt3Uyy>4dx~8NM)u`&eRN8Lk)OmQ z{%Ez>1~Bq;83iMc#xzhygOQyQ4eKnU!^q1pT!IWnjwcw0DrGSk`68ufk-^CM1alET z1|u&|9sXqkO#&mo*SYn{$Yt1mk+ot`oKFTLe<+$8W$oc;( zgndc)tY`LKyaqSvMZ4Bu-;k6L->Mv!N@CVA=ihh zNo3uFa=TObnqVO+xg1RBNx3Wu7c4LSKR&s8Y?AJ;9NSDV>d4zevGg zo3X`jBM};qltL_{KOMuaqKkT8mSvRtz$#YgJw$`g|?VhL%Bv2P9ZoNm3$0;@tlI? z2u7||-YC36^%L?pqp9L97djv^-N?i((UEp z1$qvQ{8K#_jJyoXaFoHwgJVx}!6VH>{Qx7^rzb@)(jBGA>o1QEBX6YL>(w^XOP`E9 zGPVA;?%ySi@6ojhM&6I>Ze%dhZH4fKIvZi+G^(dsV+JEnOJh+J=|l!2KUTYfk)M(< zS4jpVm!{e9x6U77T9gKX?tFJNOG+1P!*ys_Jo+RYI^tqx+oHNCS*xIr`VUx1S3n&ZWsnreXJ}KI@MV6K^DQtuQ>V+)vu!5JPMr_@@p*0&8BcJ z!AUB-Lg5vHr&X9jq3I&t?4wFGRQ4-JdQ#dMRpmQJ80j4^YP0 zPp}-p$ahoQ9;KWmZGTdZVB`zj^GbK_fAr;5`*I5*t?Y=@wL}#%v@8QaTisX(TQqI1d?& z^fTv*`k4jkAd)VJW1|vNsUoR!W$S?6OMg}8)BlsWUS_LCLy(CQ5wJvLZ z_34~NFtX`l_6(50NVhdGTY{0x(w*|C2u5CbT7;2amk%D*g^}Gj&vwXQWKV(~h*c^W z*?nK1L2uJThmn3X9~SB;F!C4vUmHfcr!U{9Xw{0Cpj^l*4q3ox0Es#@H zpR9L<(2|Q1j6CTguBs z1&qvI3{%xm4V*q1d1gFi2#0BU3~x8!OkSnaCnL8dZyRJVvJXKIWH8bbb45*L_eL-(F|B^WuJ^IU`sMvf;K zhYUt~PCh6n!N_UUPgR0G8M%mH9;%eZU}VFuc>9CO?~SKiA&hiWE_mdqkh}WCIrLF5 zas%4yfQ-Yqkqg0dfjk;`JALbzIs>av!9 z=_&;yuf;eDl{btpSSy5)Z=}~okNhQyMeqzS4z>s$q`mu*Edn?4JqR(`Q+yFj!TOBs zS_Ez?q{!{Q2xelPfou`Dy`-L9i(ozVNQ+=0{`trjf#;N_oHV1CR2_I8DOvRDR1#BCz4wu!d~a zEv}GF6YOg&pQ8*$-jOa~Q}bmovc-3BLxid7jk#e$dXKidOc6%*!tftt6KN>HImjlG z`+1KdekK_@XFe6R9IXJ7h4@lXWwc6e3N%ZVrzw64_*5}UfqOaWc(rLag;bdf=M~^n z#dw8ok$CG$)(i@%vINR|qA693R@r?fT4{|LqA69rg7PIu?nS?ci0Wd_oB;|_8a;$DUXIe}8H_2w71ap+&b}Afv6M3_-n=bw zUL|-A@b@BPr7QA761@*~vFQ3jHhLynR=p+EYN)G#{}eV4ss69T$klQBZsBrBjJ#K= zrv;N=sqq)p>cz+(12M&u*An8U!Tj8gJ0mOqOv(T+Mz+OhB}ZapZ;aDHu>!pqc{AQ1 z;KfL*IOF!A95M1>>h)secqn%RFGkM8cm))G8vcsiiWs>=Twp7+l8aKUUHvQ7-MBMy zHC3$wi5OWk2AX9npykBKp9xqG%EZV@zmSulOpI(0s!BPtwkk&MOi(qTj~64G#W=H) zo+o1DK3Wly7`X>A4HQ>+SeSDEEJhv}zLO+IUQPvD6C=B3akeE!E(*8Ilrzg#TTP5S zfL^r*UW_~j<0v^2BhSX@4fw{87&$dw>~;*eiIG=9xZIOiDXPyZzb))L*HsBOzfoU_ z0jE=P7qqb;)fwkejEQoNz?qIQO->t}H!&8-*%#*{jHSR89vJfHUx|?}Tps?-6P*ZR zU4a)P2VnFEe7qQ0D^_`#szi(&sJ10Wj)68@)S@dw zK6x?nrmW<81a1%`M})&(jI0-Kh2_M^&wt6duLy7lCD*7-jO;Qgh>5hy1{p22~WbTC_t9LIrMK+TO~tGZPabHvC`DOsY@y~kB`%_%LnGjfNGOkhyl zj?(gCWKTrKL2YetyHhSPa#w0d4WQ^~q7DYB|A>ciHOTuLnb3k#&Ichz)_c9kO{MrT z@vGx}hp`G2i&4;&BfI>D2kN%L@nYl=-aw4(jM0grBSFdOI0fhNpP_h{f#jW$p`RHZ z`cFS+w)pEdx+yWTWD`GRffpm&VziPYG4foDv*bvO9EULq6f53~k?-KW2D})V{+*vX zawJCXgVPYyo)TL9gvS287&$#ec`@?R!;=fVRWWi{y!vI9(%6fU!-jE&5+l3Qm6L%N zBQL->PmaXMt1$+E2%5fm|B+e|1$K;I1*<%aqq#!j0 z=K_qLa&E9xKRDe%olkJ)L%EdB6)eYD!qEkw;2WHp zf08Z2Vzk5?4z$@0lgGA73m-L{V82JsQt3ePWFAeqb&d6ZdS21Gb zw`xOT=9Ijd=M%IC{D+uq547`*Z z7%b(XK8TSsh{+Nojlnx31J}MDO^n=!dYh_l(#yXyGS=Q+*KbIb{WTgABiq4h3zBz6 z1{%+eP-lY}*@NPfePzizBV+%@MoSHOG4g!XD>3p40{SZ`d1qu83)a@veh?#vQGOHf zV>bjY;=F+|OHNCi9a1GO52PC5oQ~01P92=bG42P&s;J-; zj;zL84odpqB=3xj7uMR1U*ca^d1qu8i|XkTw-ZR-85u%&XJoJ}#Kxr&)I9)W?B5v~ zXwH42GvfV^s#m|QTSMAk#N?fkfyX-|b1EjL@u(1UH2fodjKs(dv2L@hGqu(=7^E19 zk*B~v33xHmh-tT$?wA;PF2(1lT9>KH#i?|N-6b}w&ntFZF@d@?5`!UK1^h^SiSeNv zjYQK-iK_?vNDRQZP>x38b&TntSe5ya*o3zM6lf&s`62Cm0K6Ev8e z3)wxt#O(&Ez7|LlBWF<>#K_OW;cPLof9T{th>_REb1=)+VNHx|MT7f+%SZ2fP?*MBW*h6B5P9>)>7^zJF(AVDZk#9DWodN5UNe%EU;c z^3KSdpeRN@NWcRMDz`Io&|yg?@y^I#Wr>mdj^%_TMm|H_6p*|#G7wQ(azdgQ`6}Ew z05NhMBl8NwRI*+J=ieC_qMTc-^th$rk2F&zM!rwnV&KKdH5jWv^3KQ*$U7rr70Jby z82OYstDTVr1tl&YBx2;#ky>WOptj4@ba-cEAZ|sBoF5xrsU8nK>6US{B{6bW+NlA& z7C|-~am=3c9>U*MVEz{^cNGEj2TCjD^RZv#~ufrILcSh#WwH!Y6 zZhEBU@Qv^{0I$OslXpgj82gH3y>s*V^F|s4%4#2N{_Q2>4{Mx6*rrkP5*494z zQGBuZTKl{W;}$tu`@9F^F5uTbEjZ(Ywf6b2E}YgrpM~?3g0%MeCdL9eTKoJ6V<~V& zzl7dquYGQc=VDeod0YEjOYpbAuYDRT?aYe&u=e>k)IUYn+NY6tXJlx|=(hH`Q)PbD zf#j3CGctS|Irq0F)onFLC}AZ=Hi5V&C~Oia+Y}?e4H>bWMU6@1sYW1Xsf!0Q@8{ zChv?4Fdh6a{_~ zG{e{j_(@>FX&T$_X zm~I}=NlRgRpSVT9D@;aXXD>8M!ape92)x2%6#gRB#V7HqsVXI2>4I_!Rg=+If3^#sZ&6#!tD$;s+(^IEvc>pGXg4+#^SK)7LO&gXEo&p|P|N zj$-6S%1afXBH1F2d*wioOhyUVr=`{2}h0&SB(2c7=CF##8@Ay|nx4JydlE zNZuJ4JL5SajTTY-hA2uSYc=CUvDEpS;@^S)crntFjJJ5+>r-W^eq$?DniVsTfKL^p zRdThUS*jdHaXa8s#V7@CFDOct_Nq#$aw43rz^97w3f)2Ctt+|W!H_C_p`0z6QpISM zT}RPMYaAh(QspWrSAyhTR5Q$ylrt+iyRt9jVQ_C1Ke-n*iqp!h+t6H&##%W_p)DA{1Ai~FVE#oW!Aha#x5BZ2MCU?1M|35T(RpWN zPW6^hS3?~D{HL%>$jg5vMrPs)<%L`hiIEK-=5lDkWH>e6rdpGCMg}5FbAdRNRf;k( z@*$Y_0xw1`!B{9qV&q1Q^`KaRUW}}qRtK~*vIUf;z>AUH zF}i}n&Ec=ut%#A$z~EQ z9^v`Hg;-7*Or^?c83_8iP~;&Vd+hu^rT=pm;R=R%D00q=|q`SY*D$olcO_7XY~#K<8*Xycuc!Ls=-F|x0;D~XXe(A@QE zGI?iYpr+mSNC6TfM~SGNk#|5EDWVr6zl^ol7SY7W7a%+fycqc&#zIgmiWeh)z$*n_ zj4Ud_0DO{nM#d_?M7)z2xgE-&7b6=&t0!vFxR6iDJ0r7_YhSqb&d6{$d1qv}8_>8q8@X19 zkxx=X>VAqoBkFySx&vqDo%rbv@~%K8v>^UDih>X$$8q#XiVp&*5jZzs3;@Mq6indA zGkB9g-KTN982OSn5F;00tfFW+C|QD2u!8^8+L>Dq@M7eBp`RIdh?<<)V#H%~Q)1*3 zP#ytZj9h}TP>#gNEf~MZkr>&edWqW|6f53~k-hOw240N32jdPo5+mnf%m%ez4z2d3 zv41Z{z7e9l70SJnbAM*fBIha8EKRci1R z4!js?Rir9ZW@6-SQ0oCNMmERT7jXYMn;T1w`bj_2?sQ$?1xV z7q_pr}#_p55YNM7m@;`THwsWm@20s&R-ZCJURtHk|)Q|CW8gQ5H}2MOpBoW7Lw00r0LJd1HJ@M7es2A0_`5`Y-l zaWW?)F>=RU;R7#5_Q5zsj>O2vF~-Z$&dBdERsk{w zU+a%L>Q~h(F|u+UMj0exWaHf}8}?QEL5!?Rd3E5&t^>xAz>i)1t&LqTO3wm(>fA!U zwWq4*m5I0FTu;H(Aa74(#}DG^UaaO2BU^EF0>$G*xfEr}C}}5(#K@;O`X|Ldfz(4d zr`6@pSdh9C=P``?_?Z=B)-|Xyg?1!Heh>dU;KfKI^1dm$V`AhMihozNE~8PX z9_yX0KCjsE0>;yi#4h#G41gbrD={vRqmg(G<3%|diK5*QnB{0BPQmF2idC5(iII52 zK!HZ$1&qgm7bC6ZR8}99Sze6%U1uaQ@^9#W0xw2dNV-Bu6eFuOKx+bCjNBb#H^8|{ zjI{7PSE_T}QvIoCXhmXVTS%>d7bA^U$ z@M7fE7y|&aRAOYmFzfJdDib5^Xxf$NC}QLu{J*>yX`Fo5nli-5D|K$#899>bhXOA~ zz8SuaQ_d_)E5yjtEaWBVGeFfPfi5xfXi9?^`F%K?Ek@oPy8aJhIeA#K^y>?GNC^NF$~zghVlNhdnq|;KfMe^9-VR zE=eO%jBEh6J}46-jha^>D2kCS323gMa$@9|hDj!+oLO07A5;5|X*jkwtgW8^>rV}yJink(0E{zxIVfA?E zN!6aGEs2rO(azJri;?ePECgPRw3xJ0OcW!3qz(~xAVf>!6QDn&5UqDwNTq1SkkT6M z6r#1y>CmTvWbO0IIEH2=Sx~n2xe)GK;wNjLn`6NLf|V;qu7vzK@N1txV*CL7+NZ^) z-Bd=_);{wa!4SN8)Glv*FG&cYbu%?bAp+S}=!h zYoC*$J^_-C7bBZS>Z_Vmx7FO`Mb1)UIgjdjdZRuEn?-_(@<9Xh>O;U@XNW#n&X5jxkM+Ccy%X zdB9Hs3r0gCSd*ZIE}SO8=Wv!ONR!}ij6daQ5)?P)D+=)IHuN@o641&r?m#5ogqNsFi8lw%OyCtJ72VTE6QjT4{~PL{oz8+=L%-AQ2-!h$qn7^OB@GjPkbPBx2;s z_`Bw6k%Aa`4TMX9Po$?X9tA#;jGuC&#Sco-mlQ7%Uy0OmuM)R6@QHLXMrYu~NDEH; z;3!6pp!_-oD2YDDSSCkF_=!G)HHyd(q=?CMZa0 z^cKdOa+F5PFg^mV=$NhCi|iP$KM$qx=52}d9l>jWzZV%RU6CJ>XbaTeMOP9TJrgaf z-V&mJDd5FOt2pD%pd2yslvn70#K03nU!3WYVGQerrI(wvdX?(GLVRo$HqXjYz4HO7+ITuTA)mfY>u}t zC=(;Q#p`6&R>jD61RVnO@nU4p7-v?}^F)k1Mk_)RBTpcvli~_53-_&m79%eRS4v{! zNGjNx70Xh>};K%>k)bao)ptN6s{yl^CDPc>-rW#*cCy z!ucEHPv8nK2x}kzN{nnCE)RcE(}^HPjtfGYb7t9uloE2k;gzd0(ddb|uSQIZt-h_7@@M7cyjPZbv z7b82yDkrE)#K?QpwsuC&hW4VUMURGj@?zxkS;_S>+#p8291eRivU9lEl@lXB`aa|S zAixzQKTg|KRxcz*UbrHNkq;t9{z{YIfO2Bw(alTT0ic{1c?$<_(7|jmaxMp+12v~y zTGeg&EJuvYYr&VkN>@?Zkni!Mvld}LypAAi5L?=vNJMNmU6k3nHV_( z>Whli&d4_~<^%3OyKZKeW96iuygoq}ctO+WKBf7#l&pfZOi?Xynz!OQfxP?CUo0l$ zVF7uX;hj zMx1*vZUS}E+wlNbD8uMnK?Y|tM}HKpD$WrH@TClrosmVB*^>!Cj9m5xCnPcQaVX<~ z7bAbe_+F00$hHUaPqKg)BL`s&0LjkCaCw|ts@ewDueE^MBu2gqQrBSxmxV~LSX2-p)OJ0k;;osl^qCPp3rwKYg~ zMg~%$`-Yw)Mn0;ZON=}Q%26Qfj0`;f`BkuzO!Q*p5@NE%NMo=wGH~td(ZtB^)O)h( zCcXU5$XNTYx_(2doS<`)7$=8v5Aq>D4zoS*nN(%93(pvmz^BfxPqAW(4G74`}fg&+-yOx#RofO{!Qhz~Nhp}4D z&o~Di%x^D{D#aO!agChMah6~#0L7}PpgOfwIfTInB@N{0`de$6XvHt_ud9^48OEYL zF^7U=XJj}Bc18xvLQIV80`&yI82g=(aWqEijClX!f2mi$t$RT_OT=VnWZ zbM-qTLr|XkOy|0#dYgr`A~A9aq=g{a85wAmJS~cmyT&HX$`T_Rzim4s1B;!J!O9gQ z|Dv5gfEOdHwC866V3zuwkzv+3_bWY&J0ruPQr&A5B)e$^|e5f7`c?vAVz)`4rhyz{X+--L5#dM zo`YGo4r^j$PZ~TEB%l0Ck(^qFOUS>#;-n--R{w-9K19(~FfRqEJ8_=IcvQ|UIIA$0 z%NdAM{VLo^wrM5djvNJLe*%_G=62-{J;7$_X z?~DvAc1Gs#qZm08?sQNlMjDl!kvTz8jQlSFZz!mo7&)jo$s~401}jU9?C=gJBr$Rs zaUX$XXJjC}s!7c(-KF-#>(G;n@rWQgKli7GvAX;}C!-_lWx+(O*% zz>ASP9?nDq${AM5#BcG1cGAjnP{fQvk85xLM5hLfv zhR3PLLr44yOD@1xSpXgz+FK7R8H^Z{f`Y zg>QxMZHkdbVrOKao3hANJ#z_tloza;q~Fy18jGEgAu{sA+Gi7} zdy1~LPb0B2GKX$!pNB#{7$l!$XJq&`a_&VaCq$Fr z9q0=|G6{YOOm;>FD~@XrBUiy)DSk2u+z$3b!>n8ZU=!pGz)ymzN6|UpCxJzz+=8r0 z(3s)|z)ymX7#-wj67<064*Vpr;It3cB$%tKph?gl&czDSBp8QrryNa!Nf?g+c1DJN zXHNn<#?HvHv-0O3m7|vko&o$MFcv!_bNOKsybE=a=$ZsZVrOIy-6p|TP`?Dpr)c{y z1X*I_?C|BCavy3=+?hZABTiZh(-z`>1zuq?TH39LW=YuSXryY8?2L@RBDTMrI}nMt zkE&AQb%WChBs(JmFV8g=Z(T|E51}d9Zh&&NXi7F~G2gWlt+Yl<(Uf3ML3tE}ossbb zPVu}%jQp7LCE|pgk%8pge?$smWbrYa9q@_N4&y)_&@(m{$4ZBYAC#mkDef!2?xz36 zcwLSXX)VUrAlVrif_XA3!BLE?-+^-Alc+z&#d4HHcVUbMMPG(UuRnee{t)+0=P+_1 zyTZ=M*vlu?OS`YWPE{|1WM^dTjOTPjV{Kx5V)c?q2Jl}B0I*;$WR*Z_m(&}5PUuG z_abAlGcuPSl4uOnQKBn}jKt2!9J(dcM5q&h{}gr!dHJuz$V^*CAs}xt*JKVSaS&Zxve!oeKto7;E#mLLDINK53!IYc? zts6*Pg>yDWZ#fs?T!GPFPEVYn7=z`Uf-?@|PQcE{kU#%QjI19nPs$CY6G4m|5`;GX z<_(t3cZrcVs+$rcpQO3R)nu|WGEmd*bwn_Ukxz=Koslm?nkizkGcwlxzKAA9u7L0f z@M7d9j18bz6fZ_rKc25Z;Kj&R7%c#wWM^co@-9`07`X?^pcf-MLpxT~qH!UglAV!R z$<+a_?TieElbw;_Zd6W;e1A>G4I^O8PmR?)4>0ln<8OiAHU%;AX~f9kGKz_cF8ZqG)-oHX;7$H>BwlkJJ(ine z&CpLa38=}LEgt)VZc2=NAIc)&#mLPV8{|lgY}gg~3V1Q{M2zD>vEscLIRfuS;Kj(- zFyaK!!X~aqu zLQIT&7wRJ5#Ym$Ux-Ik^F|vhfl^D4K%BLU^BdcskdYf`)SuXOJ)-#F85+jX~AG!AR zXkz3K)Vo%7lU@?Tc8;|doz3+dQsp!CLSp1!ur>oPMj9>S8bCAAYnM}*0DzvhCSvzc z7s6t+lD;BFR@Ep=jNFfa77FrW zxn!=^*HtcG9me7#VwM6gMp{UIg%BH;Z=kLQjIqSXv*Tz?(i!poN7bv}*1tmfMMN(~ z8ZR$K#J;Slve;tsPbYzat0FOSNUYne7_+Xyo?p|B#K@iDR|8&*G-BFKr#mJ_Hl%oW zRqHYug}YY~Jb{x!j`jI#sQfuHx;$e)jax@ZaF}{$ak!W=W0yFR1gGOkz;A+4&cSei5L?Avs7Z_`Y`MGeRfWn7->h-u8xkfGqM@~FE2(KC*K`L8DivU zotwnSnN&X&cro(m&32PB%hm`HBd@TKub_Vks&)xninp4#+}GXNsOGdfwL-}ROq%pi!2AJG|pid2g=z< z&;X1}o$$BU6IG5S&b*E+<={cyY(S@+lEe0VN-u(HI+ zhu6>ziIMp|nWVsrk<~GF0);I?#5Tl8qokZ!;l#BwvfsBj5K1pLP!)N z4}yDu_!1+HpNW<=5yi+(a65uBG17waDg;F_@(cn_Q&2fEa)>t>^ig8u4b*o%@H&hU(-lHYhZzlZr0CLNjGl>>wP5R-6QDi> zybfdZyb5$Jho7PzX^nF_{As}JFcy;^W9%!E_0Hkn6QZT@h0xzph}JtTq*AnENNJ58 z3eno_T;9DvapxS~fwzq2QS9pfJo#j{FIKPpGZ6MP)- zlfYQ~E23O}m;`;G_7Yu_z)1Wfq8z$Sf~%lj36f9I_>kRMVr0kg3nb;%YEIml-{fab zT4LlF;)VmSFd2=1-PgBFVS1V3>A)*YM&U0~C`!E9KT(wuZw;JPAk&4EGG3lLRJ?U1 zU$2LzWUF=#i3YsFWVC#DvS_6>UKLFV)(*;nAQ2GjL7;K9O$3xCVGJ(t^`IIEsN}_^uF$5*iUKo3TqJE*9%Auk@;U~U#R)&!a*_DWqMo+o9>ZRRRPob(Vz>AT_ zNhh3;M#Cu{B8t+;C>c+&)R{~1OTd4;7->nC?>?eAQsr9x##XBQ2=50~r!R1$RdU}z zv-_1hkGmlhpDIRS^GVY2YHNN8sZs)O2jEl1c>H`mmlIr9va4uHl|7&|5KZ?bqp=bt zT4{~7%3-BSYbg7J=I|F|q^Pqs33|MKj{GGAs99bOz*8flr~!F)jl> zg)AcF8mdzvg@#c)SbU|>6pYDobT68X@e=U&A`4FYV5QJ9ow@EsOW-V2kkaU9jP-Jq zMyd08^bn3K`fuoW_PxlCrJPyu=52{njS6-I{$6CPbVYthqJ~g+7hOqY^h~s@dP}G_ zP+I~2Df}}0#rChn$gy$yw&Ge!jC@C_rv;N^sqq-q>cz;1;?1B#Anwg7MVT0RCd}@@ zi;<%-hRKl_IUQpvC{~~sBR|Ib5O^`tD$cm`C`XL!_bVNc7`YzGTHwXV>KBl`pm2Ej zD|Rbl!h#&p0phQ!F8 zaT)X)2HeERMG*e$NvssPEoBS)&W%vQ&2My{#DKPxd>l>VJ}85 z4o*2S^4--LSN-=o?zxYWYg8si4%xY`YxvuV4cyC!k@YU(Cpjo5M)u=CA05mVBcJ2I zlRB8aGxA#wdh|bvoT(fqn(l8VtfUP74OB!`j@ht0lXM_3Pu+>5+iTI zxCYcdJ+!(#js1HuvTum;Vr0E9k_)_5G1AV;xiTx6Ylx9^bcPZmr_hzjz>AS{FkY4; zG4dUZg}{rERz<2pWhO>`3H1xbN{n2G@jt-*X9RbQnW58Z_nt2Bf~E_rkq1*KDe6ar zFcIf8j4mK=0s4!@WPFUo$ikxS+*FDm7XJ?@RW2hbg?#{V{85N7uQo_)c^Q;TK_W)(6MB+zW+j>EcSf!yCQFPo zMto@; zFGd~_$D+(i`idAiUiC_he2aiL739Upw_-LtqV|Ir`8nku0Y7#H1Gr+qkKJoq8@qax z)&YF#97VoOqpDMtiAUqKrJxPSyA;{6e>~llY7Q}SAV+&re4;3$QKpQ-yRe{0j9kdk zS15iCq~_w(yox_#LFxsZb1+Vo^El2_j7f4H#MzATBPdoy1s`*y&DCrX1|?tNcrnsi z%fxmIlS?Ks62T!EiwlW4A9yj+Lh>tw*tlE^^=iNvON<;G$EBz; zsaluOD9niU?xQ}h*l`El_B0a9AT0uZB=*0CN96-Q5;tO8E=MD=5M!`uq z`4z^OfOC}?Y2kUUht73N^{yFOkr=rd(gxtgNTXHqv?xX{ioG-|ON=}`UDtUr(#q1# ztXwg&@pViw;Kj%`7_9)aRAS@~E0Q~=bC=UY+Zky`({8AaB1YcB|I3S!#>sb+DMO5` zt#gwY*@^0p1YV3hH+&nXoLO07WXeLWf_^2a+Aq*0M*fde3}WPna5!6xY!JHs4`SqA zp*Zc#vSnKnBZtx8tswd2cSdshDqQl6dzq7x7}CWFGRA$A*Lq)}4NtZ?EIBmY$O5+mnO+snX$ zFEP^i{IlP9E=eO%j9dkGB`6akjha^>D2kCk5wK1{<;2M5pC{KV<;=j65BF50HqFXGCh56@%Iqsp&+FwBoIZk(bAd zRH7aaJ!v*!UW~kyb}j;5j2wwE40tipVt7b1F;R?shVsb@(9XzrG5!mRMe$>lyYX7RLE7msxp0)7+LKG1_O8<#)#<(A*RFZ0kwhXTFW$gCR)~lt!uV| zx*za5jM4Kd(6t=Cx{w}eIlLqM4#4X$7Ly-i>?@M>&Ke5QdS_4QXDUSNofc9lS}~-w zMri>dTKl{LdVi3teGZCaXjYO1Wow_q;NB{Jvi5m@3>X=#Tru(?$m4-u`+Npt3h-;6 z7Mper7+G8UTtM+_;%n`51;(dxwD$Qu#&^K4eOfR&0>N7QT&k;}wa@g8EFvpNYoE1n zb^(6vvkAtYz!gmjz0F?xd@`PkS@Gm;?ekEA4+ehi(^zR|R^*4Z&l90`6-lo< zli)7u8w>m-Fk;%7Wg#{R9*6p<=$ZsZ%0$cPHVI}zoeumYFnV4Ex+cN5Mf6CM;2ro2 zfu95xlOJPZMz1TWtq@IuRnS)|M3cZmDn%=Xl-BruJ3=%GHbUP3l1VTrUMsU~piGP` z8pKJ1FbSRu0nV9~D*!ZrTo?FBa3Dq-;3t7au;C+X5_F@ullYnhS77v)qe(Cr<0jxI zfd!|1uqMGLx(b>EUt%!(&(li(|YzXW~~ z7>kVw@hT({_L$b+p#CblCV`PM(X#4o5^R4H83K||(JLXlv&6^?!#94)b<>=zDZxI3@*YUU$o}yJKJ>gqjC41n8;X;NkvGQQHQ$RA z#K;36?F)P&U4U^m@QGynluLJoAC#nrDIP7p66q(5@8u|wb{foAD)3^Y1*d&*6eBxQ zeh~0UG#=w_IZC2eF=m0HF`=8vp`x3^AJ*RaJB(b&u0)J9ddf9YFD<3Mr>bv&7bA_6 zPB`IST5kxepumffM#*@JrOt^I9}oP;i;{{f#ug+uwR3w#P$ z1TXVZr$P$VrFa+MQ>Z=0p>mW$oiUCF{$6CkX&{i6cFXPFSS;1X$j=B^4$8#Hb$I^+Wn$#d z@j98cRWb4}g8l&dcro(t7-v?}^F)mNkMMvWv2{X)qN(5?rmH8>+NM#%XL=OK*oau(xE#dt=}n>ceZ zUIDJKa>$>5B}Og@vWxu``)hJ5m3WY?_Z>H{~3k*9~lUW{B9oN{91+bc6}5&=u* zCfBG;jNGwh5F-~NM!raskAiYyWd5)c_nQu8i;+ih@DNZ=j2y^;OF_+V4z0?=Qgg(} z`IO93>8|anx}Tcoh>^cjvJMpQOKEvAvKoqGm)C4?kEUE=O>0Ax56h(R(Q#C4Ntw4=@&jVlfJ?;7Do&r^}JLgK+%L$lJYv7(u(Ux61R_qd$~fEOb>V;mz# zV&p)Kt3a{hy%;$iZ!+*=?6?bOC^51wjUW~LVQWYvQG4e{Nmn&9cnzW7xq4>b#Eg z0+i--u3#R{ERH?{3f{v>-@%tMju#_Om~WZAngGPe8+PS{Bu4gyb~^B4!_|TJ-Gb_nNFGgNPOqLjFjQq&8uSXLjt5fezs+;tZ7{wUlAjlXp|*Jo=L#z3i4v)w=o;e zRQo}U>`(cHz>nQ{jC+9}yDzskb}v%;0^n2UQ}XRns`{oGnfMvb5(?e{dAA}v-WgB# z0X2shc^5}FQ2ebZ>rkeQ!a@!diIIElSJ`zP$G`Ijsk%7NVoa1%g7Z7Z|KwD{Ir1(< z29Wxbnnq&`2F0qVpf$zs;LQUihvRrL(pt;Jb_bG@0NOeT?Vx;l%VnpoAnkwH}Of&fV_!xF#9 zBrb;33;20Z_naJ(34 zEvK^jkPHc89=E91d!fuAcz&Y_)`ffpm+!B_~G zr4l2XzmeQAoohx9O^mdoX?K{8B1WFb|I3S!#>sbmDMO5$taFnXxr*wS120D2626U7 z&a5mka+HN^e;3PZJ$hfOGDT$GD_Tj94q^LE_eL?CgoQp8dmh&;r1dMy-yo>V@#=D?c6%=gd zNcw(qkRx>~JsQNw5{z*a@6rS@vKo#TBhQ*=Lt$2y7&)sx-H;gBjN0}AUW{yyaVRLf zEW~a@j5JEhnH5f4V&w4Ms9s`ZH)`twyclW3bcK*8MxFz=kN6TJjh~5@H4(+g0dTJX zWn!cS$@NM(v$DjhaK%j@g~Iv@?Sc z8qr6Ikxx?JP4!jOyG5Im3FeE(dosaH8h?d4TK>t}GTJN-wO3{iTr8O>Bh}J$UkLPX;lC{qX zaSY80t*~C2EScAZTU-2O?Q?bvcqUl6V&s01TL8cIc{oOU;MYDaHtoJ(WNq!U2gN6g zujTX0FfNs&wa-BqHvqr(X~7vEthLWxx^Po9M{b1^HPysdpMCHQ^d*FKGvc4kF>So{1IYN_a2`!o^{^9>Cd-PS(;gt`SJA1_9J zAE`fTQr%XwlM+^9WXXffAyD{xplnl&d^vtMnq^;6OoGaMIrvGi7xgs;ei9fl?aZ17(w70^EnhPbR^V5a66y zxdOmU$kTwI1n*(I1N#!7hMuHb}(CJL3tA@x0{DdKcxR#Yx1-hvRRwCqxQjwEqPD00%yiZowENM|ac77?Xe(BQ2QChy+J5awX-96`&+)@dz0Od=j06 zaRMlME_BoDj}yZm*50XCKD!bz(&#Dom3nC@HHfON1zwCaPCDU)G zmO9^3{1xyYFGgCr<-6Z$j#L?^-`Gl(T_!S*fKL^pRpMFdWvQ|k#f^ba6{8fmnoyJ~ zDOIIZIT+4Cz^97w3SATN)|Ir{JEY19P&$dGR54m*cc5scHS$DLs`P?#7D(5aR*hQ^+Dx?pSpyq|h{qpAld8qK`0^ z%25h^jqw%m_aX~U`(UNePdX*ti#EgApdh7D?MXab6!hL`KR)%jlL+y`lC5{!>^#r24-SBbUbM z+kcz+}0x{(-4#cBbr6?04Z-sdi@M7dFjA?STGjb)ya!{;5 zFGjjY`Da)h@nWP^oN*&4M~oc4FCCB=Sqs`uz>AUXF%ANS3*SgaU@KyziwkU7mcJ;~ z+SQ*=wPj*tZ>s7E5;3xJ3^dDDK+B1d{Rp@Ol!=i;@NNcWVq{6ED#hzYl8$awj2uhQ z9Y7y1M%IgQX8AJyQ>%I^|2nM*X=mg_VkRiAutk_b|13r}3ExQ)BVVV2t%;F`WpTD8 zM!ptj@bO~gcCpIEY8x?f zk=oYI$l}MDQh>*Rg?#d2$c*QiX4 zeCUKAMlMH;JeDR81m(oY`#EsC4rYsypK{;>9n9VtS@Hy51)%2hEvmX^R9tRn=H)74OB!j(CRxFGdc+xK@tD$SD|;K<&1n)kZY-@5RWYLR9jY*5{K8yj3x>X1w}k zmeQEJ;Ed|abcPZmKcXv3ffpm!V0?M~4JUeNUGPBg#kpS&3lQd32h;0(dI7Ucbi{$ep1A0sic<@VdT zfNRSRb##=UZian@jbE+-$S^)tLT9Tcnafo|;KfETm|O-*`GPK-R8 z(%vA5k$;DJc}#1t?5h|tvUMBUkQh0Tfa^f=nASk#F|9cvCPv;4bvQ^K(;7&H?t6NU z82O2ME-~@}DEEOxjI8o>(pw(W8muIFycn5BPqM^FWAK>Pz_qVO6CeK;Q5ZMN zITvR+#=COP#MxsS|1J>}tD=ItIno=iJ1CimlRTz1URZ0lFu7zBBWoQP#$p^XcY@?G zts#WRvO{a8ON=}_(3~5qGvfV^s#m|QUxf66h{9(hlNWF-n57CdrSvcK*ABo8r56aOxmg*NBOe+#2_kdIvB#&tgv`U^9#mFhKmu6*&k!Q3GVx*PvnAX706(hURP8ZA$qiI)V|3r+e$N$TVk;ch)Ehs~bY^`&X7&(CIF9FG8 zT3@i6+|j|x5+irDkVl|D461esB#Ds)lm;>KqHs7{j7&e5)cg-(MV*D!JH3L-EiDYR-EJ?SFlE<_@lbjE`rh}CwMjm|#-H;f$fSTq3 zFGhZZu@n@x2oc*5BaOmiT4O`WnIlHlIF#xoMy{c@Z$R>x);6SJCDb-2FsMiT7#NiuM?6O z*_5~@AbCt{Ao7^joRBC+9s;*5K#UyC$XvxRm5kBA`Ny<|DCdSNJ#J}ua67)GqZrwl zxZ{BrBl}|X1j%DsLm-c7ja4KUUt;7Ybyhnghr%BW!ed$^_26j5ptcRwba+f_DBg+~ zd15HyIdSUo(33tS%!`rt(av4Ki;*)irU5TTS`3eeBPNQG%P3!}0Ev;mVf+M&Me$-} z?O7}&g2GcnliL&{jl^SG1Kp%TuIe3!(?^MshfrTz;B^=y@|f0~5Yu5!fZ9oP=`cp( zF|9dtTLSM1^-SP(7$fnR)*QOlIR8A19%+s93i$nj*I|sAA7i*P_z&xyEfk`q@nO(! zRfyI*EriFkhGt?&X$_|kt$jWOeLP6kK6?db%9#~fiDKk5xX+89tbJY^1O5}NTru)3 z$ZrC__PGq>BjDFQEtY5WGP1Vz`6I<^#n;+rrP*+SU;Eq{qZ;sQpB9|)!CL$LpH4|@ zpL@e;tRSs@9*J?d9O*D8Vsr&OrZx07d+qbKcrIqelee|c^9eo|__a@C@tD>S8Tn!D zb0E~~MAzDw;tw3=YhcGb@g3P~=;|-B0{v5{wA}&Y6`f0Ca-f0r*L9Hb!sYCxJzz+`_C$a6QEX z#MdNv2xGh)2>{PvOaXopSa8}0YZCmdQ_>`O6V7W2(j@p6qg0M2!EYG90v^*E`kg%q z>==(}jc1jdepHUOe}ypwei9gq$F%11!z9=ZYCX|435>*JT65?&30gzlA0(fm@gcjj z#K?}}%bO?LYEImlzvLKBS_)HV;*JGgVKQ3UZG>h?crC?O0Ix6^g}+E!aR(ytdaEiW z-s5m40Ix6^FVF2O-nxqilzkn3(6*th>_jm37p}1 zi5R)p9CSkfsbmqm+~ZG_%S8%eWFH8p0-s1@F-8KPNXF-hX5t4W>1~Qdvq7gB&D}X^oxnoRCJxQhbCcN+WAE<3zF48A$O}z<-j*w1yy$50UG%&M*Zjjh@GtDo1Jb8pd3}V_HMMv+qTAjK{Qw(s;kO#QA{WCBWZ{ zjKyPGbNL~OzJ~gh=t?3Z@tD>ex+T;`s2hO)6n+{0V*6KO5zr@jOlyo=89S5oU1DUR zR)i!*wjrjK;tGEX_pN^xBfkq*N@C;*RIoKMG8Jn1e?F!)+%kDgYp`s!)x^l-=+&{n zi;<^coGM3RAJrp|dG@ z658V+)g5Oh#&kKy;k!*85p8E= za|n9_FGhC4=m3gE@nYnKc;^5wMh?Rm3iu?CX${Jta}TIW#K=<-@Vpo~3EG3A7VQyk zF3DqBgQMiS9pqv;1%NlJ?--TAELJGolTQac~W z71{j_NATyLO(O^clC2-i{)MDro_mG|K*1)@M7c%7#-wDjJyWpGC2|>pTKwo6f53~kt^|* z0xw4H{1!iTfEOd%V;lf#e->JuMq~e8jQl1S~(IUM_>#CUW~LVQWYvQG4f%k4=PqWBcH{18gT!a#vP;0=%k-% zSECLWctO+4lm|;GSqSMhMJ>ds`8L-H*ANp}>ogUt)YHM>`|;c$a^Y1-uw}0Y*>Y z#mGV7^6-8p)i$vHXWghxV&n`c&niZbY5fvo1@MAa{jo_8%88MiDBTEx82NChH_w@6 zU&V-#^G~D=iIFAmaWQ}wBaK+8LWqfxyFsl7yclWpLiaR1M~v*NS|vs{hq5n7#K>nt zPg2gTBonk#BIc z?qcq5Aa5$llu^=76p4{*IeHz%mx9z6IGgX907}yP2QkuG%fxmIlS?Ks@`;nfSTuQ`XOsaiMp{UIg%BH;1EID7jIqSX z%ow}IC+UoM|D)>FZ|h?r9V4O_BaN3ABVu3HRLPtYVtT;u?qeiI?h)%YE5@vAaJph7 zMqU8_JmAGhBk~qpx?^JGH56Z^YF$R7&^p#TKz&}Z<4nfWkHp=Oh66tmzhJD9qmelD zgA&&g_>mZfF;I?1;zNwLK(Q+GBT=-Jdy}A%XpXT5@M5I3oXYA$G9-wR$8@I`5+esf zzYcgY(n8V|LZTRX2i(!Xi;<6DJPbHjiIEnb=O*f0w^ZMBDy>M2oCRqb@M5IVDtTHI zBae$$%B(Cg@;mzLcSc%S+L@IrMy{cqZ-5sgH)3o6%u zQPd0O|50`(@K#OjA7AI3d%HJRx4QRzB`S$Bza(=gMe zB4kWvGG!i;B5vLcB^g8i@9){`S@+yQAOG|D{OVbI{hqbg-g~Wm&RySo_T3NVo}+L* z!IdgJN?``Ub1K|NVHv?Ms8S7-eZrRY-)9V>b~O|XMlL2;o$8Gb14jNx!C>UHbh$k$ zf|2j;Pd5Z3_ot~$aj%o=_n2}VvP;eI96fsvE1%fD7(E$RA@H zxp1I*JZ!H+4`N^XX5@d^&$`H9k;hSgv=Rg(uOPS>RjOHokq=Uu zgvx)7yId}ebW<*PR0Jd2^`no1k?+vnOk^C!jrj&C&SB}`~y^-fP|lA@GS z)9Om4XzjBL_Rc6<`wZz8>XAvb9go z&4**TvcC3tA=N|W*V^aJ1UIUnwaB$94*4pP;I&oV2d=}5sO48cr#{?g$ zptaAh32IQNSR?kfck#9 z;5nr!CynTZRnPY)MU!A0_OVLQB=D3bDM~3dtwt(Eli(5TQ&2Vu)=1~dqjX&(jGTe@ z75TGCuu)71!K3;B;B(BgkxhbM34TU42|R;UxuQwX@?)0KkWGRv1f5mTB-oyyJF-dO z$$3lGBp9j_r%7-ip1qZ%Nic-qY!x&Kt{}J!g^KNBzl$eq-%3c*)$I)E`BNxO^AUxSlb7Exa!AEe= zB1~VB_Zc$6XM^H1mrGQ#8*ej?S$XW)H*I8ABbb;YwOGQ#A(lCV&|g;gud zrona;mP2LJU~^k(Xwn{AO{*U@u{6N0#d0OeVC3R-0By~e!N_N*e_WmnMlMUA(KeAO z!pL7Re1~ixtv!opg(DkC?$3o@@<)<%2-Urj4W!8g_o$$O^e(|0$Y7)=^U0p%1S6Y% z%HQEpf(Frn6!u0oh|VP#j4E2hl^BhoihTU|YlWfl%Ei%@!AQ5~!inmo52<@->JDTu z(mnai6Yr&;QT>rD8b)p@n8k-q)oea|A$u8&^x;+-E@pQOmHYJ>TSH}geBF@^6}L4B zqp1^|6Vj1^S#K1(8~lb zA{#=U!Sj67sW^mYQ~ja*dP81D@TUqILY1F!zLDLFJeeo^kgOq8p%bKg(VBSLAsa?J z6YQvh?nQeO^hKfKs7CHZzKw@`#M*T8_JMO0$petxi`>PpfYavs$%pMs6F8x$s*w_Ggu% z7DhgZa}qKbIgenr3WAYM=P;O1r4kKBu1jfcZEeQ-u{T@@E3a-a@(y)C-;CT5%eKg1 zDVC2x0=TX-4?32F+%RpTv_4`wm))mDd*bLrJ*$YA6`g6~uijI5Z; zNJhM42u3bTCwpBkxWmZRFsy1OR*L2p!GI99#s-XhLoi^~zg7s_VC#x<%_;0k&{Ks1 zg@XwWRN)sIIDz0e6~3o1gy3ux%7@4P|05XLC!U^M*p*I182NAnZ6SE%^Ib5qJM_z7 z7!+&~Tk^MqWV8VAW2fcJ#&dVB}-e+>a`sptdfI913LYb4J$j z5Z<9)F!DlL$c>`vd$PVnxhpBGJ&$kXqLPVVLQmp15R?Rre3`BLQoS3>O`|Y^U^uFj zqwHO_OsDiHYBz_1!N_kc07m{ou!O2_QB~nZU}SUt+2Bi#31yFIjs4_@dF^s)=Od4& zn}U%~V0joBjGRX>TLr<$%CES0A%l@y6KsYmm2WWeR7yu9gOT?T+@XTL8TmfJ8>r3M zaj)Ik**}Mo!(vwUnAUT%6Wl0_+&`WD+Q`OH07m|xBNU8WMpyns1|wV6utRL|Yic%Y%wgmvST|O#VB`)2+ac~h$8s8K4vf5#+RIUdk=~j+P5R9Bi z!ks94OlvgqnAUnJ4kI7M`Y_5K(;7`YC~X^l}fcnn6i zqbEf$(j7deHG2K+(P8BKwEM2wW_a0ST2t#!>ik{QY>bXgFmgVwc_@2KYqS-@JL+tN zk-2Y~0M=OcnAX(4!&8*?6&N{F?FvS=A!!wq!N{-EX!xJ@A7Nx?>eoSb?G7Z^7umI& z+t{@`h1!!5ueLWb-j>qT6&i^*QMj6l%TdW&V8@Z^aMxBro#If3AT4Q=ixJ}2pbfsaZu@}L}-k5rz>@ls;*2HWHMt+le z=}{4kJpELEOl#_*yXwQpbJ)*W$YA8<1j7-t)E?7%PIku(;YoVvFmj`~H6Py4R$$~D z{;vxo-BTKVpbi+>N5>`@IgaK>qwF!Q@!gomw8p3iMsDgUuVH@`HNPgB1S40cHp0kB zadR<@+&*^lZ(wB4bPOK(I;_LU+3au@%3h_-K~DKIv(r%sg%(^eVB`@Oa#Y(=^%KtT zP;O%i>n>)+3FSIb=tr=x3T-J|M{otIR0Cx_+43x<$5Fd|C>V@9jG#T$&zuX4Je)%I znAW)O5Dtk^5sd7AI^7VA{GOJ+MFu065&VhDPmUSOfst{{`d))*DR$Wb~V!N|SI>x;6-v_>P3X|0!%VB}GF2OwbNiCme@xlC0j>B8A# zT4PoSJvBTo?zqoj-lfwwBhMu73}i6!YJ%Y?drWIgWCbTRk)3?O$SPVf82JGH`%rvL zYqFk`qLkFNn|2)^(;BNAfsxn7s$4igJs!5#_u7|WbAs8(V5H~dEhoXq z+!6+x5(Fbxr?4ujRI>&ncc#=Gm5+|QTrP}s6OU<)c1MMr)k$a5N5ROWXm0>A4&z21 z(^@aZIm}?Jr^_x5<0c-{TF>t5n!~YPf{eqsiO00ovuioLm3pK#&awE%AmcFZoJf^jNN=>U(l%loISFpc?vbE1~(U}V#Wuu^W?Q=HX zS@LIVpHHNO`(jidMlQy@2-(_a?k7I$Q?Rv9&&`K{Tv=cHTp7#1kga`gMDQOKwD#GJ zU>js>pPpQ>WUYOc>BMR6b00i=DoIP|ClDN`g4RBV5S)$ped*ZSVh;04Iu?)8!TZ|h zNRqEXw)W{R9@82#lRvI~PQ-er>{|PD6OU=FXZN+wr?5VOvRC$))?__Plj_peKk6t2 zBj3jO7ApTOT9ykVpN#KnJPj;H{uad~n9Q4lO@jZ?-h5<}z>PenwO)!(g5R+EqDjybdk>UNg6E?%7d%SWH3EQscn_98n*=js0*`5pQGEb#I_5#h zCc%{imm`}5p1~K|iYCDXs>jJM0PqUIODbp*d`R#}~NR@NGP%H62xU_=y~CM)D@eCV{(nOly6AoCLkF?jpM; zftz?tYdyP9g8oS_|VB}@-&6}^_Yfg+TU2q-;Ey8prd8Z&FOm54EN3r=J zyo2ho$Ow~L_=!{}pMiI_n$p0ViDw2f!sNb^@V$HstL_|%O@r+ZEI-Sp!REHoP}&k( zO{?={(*RrhS3bm{3`UMj2hhfR8I0VE`rh)y$F!!8C|zWVF!Blv7a$u*PZLZ1cw(Q1+PCn9Ls+b`Cbb_ z79TnjslE-_D|<|9>_cf7hL54rRiCjnR6fM_zM9j$%g17qa6L93D*vN;KC+?Wma=eX z*754QE{H>ADW2bu4Hfs5hezaFSoP`oai}y~%IQKjRNThTjk49Wnk1Ws%4%5JqU>Ju zzjy#S{#tVO88kb(+Bf9RcsGhP46*P<%5PXezOzY6> z@QUw6zKzGU#@ckh_kr^V$-g7J7rBeawAS~>K~(t%AJ389i`>LxTI<<;K()u(4%w@` zeH@qn2u8je%^`fnxfG1NQbSJ*CL7b@Mrt*COlz7EzeeMC7x8gBeKT@roZXSZ$iW1I zR1l0DOE4N$D$!u%GnAf2*<)H`!+e{h%3x$?+BF#YF_w3c!N_FYwH)$xzM8QDQALV}TplG9Il<(=aU`g<6;PJB-ij69kK8iSGB z6?v8iBcF`7Og@;!$X8n(MxI8mPC*7EFCw@=1;NO11Y;5J81|UfbbRY@!5v0EjA62w zSScD^1Or0oiVYZffS}O3)VzajCd$1`;d6pHDm+PHF~K4g9-vV8i$Iz{p^Bgd;xVmp z{QM&rxhR_X)fqYwVdP$?`z_8RpYMW^Z>XF4W@IOJx2ATPJ*G7#<-;X{N5IIRWfY9u z64RzKW{+u2t=}M{!^i_L?1KzOo=z|bRmx&8@;XXaA%l@q2p&MZvd6ThCJ$7Tz{o)W zJcE&MV0&5CiX-B9${y2NG`L3L^~bcv&DmpG)WaA zNNt^OM(#$<4yf``YU{$t+kuSN9O@VMP3i?BThK!8392q6>r9k;kiydhkD!t^U_wvI z1xo@(Zq3$jss2L#E)+WDszWG8j3SV2}!ek+&1vtb)E7`8L68s8aa` zBbyeg!=G$17}<@&mdIe_K!U?in$#V4go2UR(Up&wa&jQoh;1H}Djjb$r@ zR)=N%%m>#01S2mW&+d1iW(lSR%G!#;4ker?RB|8u#dCOs2|0q1Kd^N))t92&R}_9G z_(Fw`DI8i_9ri`JHz-UX7^A`q6n-N3234w|vOn33Y9gjTp`>;a2;y|;p)Mm}^U2P7EzIF<*H!N?WLtHWO^2uAj% zup=@Uc`dqBqMvkI-q%~$R^7hof+DJPJ0T_9(+7*m^kc0=6WZ#Tjdw`FI zueARNBVVF^8nSD*h~Qgf*RFkI*RFg8t}f!$_CJibUudeeM&gDP)}*36Dwz*z!2Jh;m~o3id6>e#h%9R@F8BN$n7 zxL-eyQqIB-rzuA;@>={Okiked=EI?M$6@5{RNtm%LqS(zrPS`p>hq^9-@c8ubS0)^ zdKlT2Xxpqhv_y6#jwU!r1zm|L1QS)zmH3NbF{)H!b|p5gtPY(~nXbeE1ig{LNZ)g= zs1LdxT#?_a550z72u4oCekU>*=_&leNa}W$l3?VMcppawBVQwU6>+SBk)Bi%ZqczW zU8!m$dl8JBhiNu480oeqW=k+~y|hb@ieO}6M1+xEmk%D*hmkFtSBK`vU}SrOc8FOj z77LT?9d*FS+4RU@3$ z-l*M66bwebL(nGQJnVWiF!Egr1|!F&%k7bOZIyGk{7wT$F!DlLIv*K~ypCWbDt|EM zE(b=sB^Nx32d-~MPP>-o1tTZW+8xMXq#N@MQWA`O4DX}z3r4!XkRsnjf{`=uzJh9D zq$ia$NJ=pB6B0gBQXLq1%~9D6Di=H|f{|-n#{mgOE+Fq~WH8c=`35NoM*e~KcLa=_ z!u3cv^(yJSRk?*FHw2yi`Y_GGgXJ3Mm`>~(Bkip2)2?im9 zk)Fff4xm+0Ord;r-2u5x(nm!6f{y}@c zBjYe`%r{7J4%4ivI#eLzFm5k2u=~1ZJFIPxaTvFkG_Y$q{Ei#wk(R@|;O~r#!+1_< z%JH{I);m8MMT(Zjdtl#LDOwu$lqM-kDK)JoDn)Cb2V*}FWow^v(>3(SrYVe@_YD#i%}vyae+wWNV+J2(Cl6_UXAi-GD3WYoGT~eYgBt`+Sk$c@?zw`5wVL z$kskRxnRj!`@BvkPHUgv;F+%^t$h}%2_&t3RuQy7p`sA)^2KYP<>~#yqjd1T_PG|x z9g(elx+@<%O8&U^xi!|UWY+?^n+hp%yRUujfpvG3y$nXK7yA^#>6%oRwmwe-Rxt8N zj7OmIEu&?*Fmh=+Hjn%*id)MzygAq;IG6U$K{g58$RFd0$)4hq;A*T_%B}@{Hx*Lk zcAo^}u#QDG3EW=Nz^+Mf_f7Ojli(5jQ;RzR263oFq8)cKAaLn3v1#-b7zfe92mf&41e>MqP!~|BoVpJahRQ!w2M93yV z2ZHvO7niC^S&$xwy7GbLVH}e4*VRBnOJcP{$;g(c)K}ML| z!cU|+`3$^rHKlcR4BAbmpco(dXBe-iwH3`Tl#-jWlH?9!?_tbuG04I>z;f(FrD1mjV~qS#I2k6*+e z#I4XTUb#5BG8pOhTo|Zc`jC2$rrtybBi+Lu%&kB_19iauj&s2qoHpqkUY%WX}<2y8x7&ZYVsWJAR*W#Kk;ilMTpn$l3Y z2G3QD7zP}lkPMny6E82$i+QD`^O=L$H<#8bVtT zY=-P!qefxme3HIGdKrxDm-0Nydd^Y| zF!BMd2nk01OwJPJm7g5%TYnEDkBMhWF!CoFXbeW4U*uUHj9eOTnYrMRueLgjTwzr% z4l)?onxK^mf{~jNbV0mh2u99HC%YpT++pM{7ZU_c0)V*^Ic7Yw+Znxn7{ zK)In5PA523g;OY8LNH8)qbQ6f7^T7?6ebefi9-1?aqZ(D!N`r`>0xTqi3lUFi=Zt8 zk9IJ`=T z2G<%;#0VpwjGGNc?jCQ2bztNpuNA@(BrMt~yRX#3$akhk82N8tm3%e$R%v z+F1O}$p5ruH5}D}kw>y&Kh%1kZz{v#G+gJKk@r$FUbRVB{Cne1s}*rM51N zd>P1i(trJiIF)+A$XjS3_Zd|yw<8PX-lwo9K~GdN0!-*hxnN1a$OqYaKGkQ)e;0)( z38tV*Im(`9%K}PsQM*?u7>s=10$}9l1npL1{Tx+&N1^OD{@It(4#;5SnX#XRFkAhc z+WEW*bW`BlA8I1HMat#`D76c|5_fi2Khh?ijzsPV;l6PVfust*mjdl$zm~ zhAL|@g^vi{L?zn`#-xj)9Kpzo*}6dos3FRoMd5OSGgLT%!p{WXs&E*Eu4}N6f^z#) zxQyUDRH=r_MzUoNrMFPoSPI?NtPbm-w)aq2B7>3Ldw6T-s;E}%-10x6C%{~Mp-zMQL zWH8c=O&X*)jGT-0Gh{H*?d9PbdJc?SQLPF_F2wR3%3$R2u_w9Uk;b83Rl9WBf}A24 z>5kIm^|wcdk;`cJPqoeP5{x`8wLVVg@1kapsuzNhE!SdE02z#QTOmwUXCsVUkLtA$ zJ>86q3)8izjkF_!kqgwWVC2pu?5HGzk>&APgz%>JA7SKy)b~Yp?S>JYk1~+FYa`e0 z7HV%syxKm`c$-U86Q(f|U!d?f6_22jWnjmL(&4W79lHZYHan|nm`(NDvb+VEa!WqQ zA{e>CrcJ|EYgdQ=pxj?rZXmc^g~b%UAoxIq8VVb%17twC*%Ss79EU2^P}xef@(86# zsHy`6gOR?sLfUV+4ucmkviGETExsnF1{sX>l+p$%eqDaW`ZMAh3r0SluFDoWBL4oP z+SO<4@^$$Xi82`JzLJ!Y`ZB-SJ)W~N{*^38F!IaPwnr&vVTb&^>_;$iZTy{(!ALjq ztGsl_VdNH6Z>DCsOK|RfPVF9`K7ZQs5U!_PiM=uHg6v8>L@+@GU5P&leo#SIqQ`mw zW@K05T7pYZr5dv`!nA;#dVEJ-sActYcle(yjNi7s1HEm6K0+`BF-rv_`@~rn!Z>>9Fw(cOWTdUY$QSs(E{t?f zY50ITVB|m@o4y%2gXW(@1|uiLcjH{}s0c>x?kPWE{}DBx9PNUUU8#*Q^0m0R7)Blz zyZ$#Ya$u}x^(02V4(l+oYy*B|N7<`%;hp87Lp;%i@HGb|7&f<5j=`2)j-+0RDVNh9%{E41%r{>6O?{m89ts0jNE~O!N_yd z<@U(C28=xG0lFa=x$=LQq{v|8Is|K>@)0q2IWW>Kx!_SeaKXr4lWATsvMa4^i3~=% zG2b91!N}e4_L5&P(*1=L`7RQS?1%SYR0|_LsiZ+tf{`bZaJ-W0z{rz!%ce&zcvJ)< zC+mO&BZrbV1R0EUW4=L3f{`QeUX6f}yK`mQaG9$5=)ws`UJ`d1!iH>z7@YJV@6zd; zk++j~8!{OAIKdQTFwzrqMNMSqMlf=HS}_>;G5!xx1|!F$z12o3sq6mQbp|87x)B&T zC7q;h>hZ9>${%81f|1{`pZ_6)krf+qdq4&wJtrTOlVId})USmMM)o4u302BsF!Cfy z15x>7ahJ=5k#5QbkBVUAix1OB!N?J`cQrB&zY%r zK8TFNxV@x-U2B}3)g!HOzJmWHWE{qGN>h%%MY7&GUqPVrp;LX7% zL3L+-EeqKsaAUqficf+yv38JMlfdnT6!{)}5^RdK3$jVz_L2s6O@htTBTa&y_6iBa=Wi>M^-!ud|NJfln&k}L4T4D zK{g58m2c>eli)P0r^v2J;Pyg_ym_AlmtnmWWv_}q;#?_$k@v(;Ah|G9b7Ev^$rBv3 z2-EH4-GYoTxh)@V#^!_YO{!l(Mwr~fPoz5e47}?frzs7*-|;L#Mwr}J65f?>VbwE_ zVbfsi)CI7Nj4-*aG%S#BcDm1(N>lz z!pKK4+>2}=%_sOA*+6oCE^H`&BuQ;IVIm+KNGB2;qk;y~NP;Vn!AMWeTXKStuTcM( z5_BhBWm85JvO%;B!RDx9X6&Z%$LHb?;#TMuXGI)c8H{v$F7#C|eMlWcQ->pik?zT7 zo;Zwdq51|{G>qI*FpCeJx2b*&*~?(054X}Vklis<_SR=?4VBzx%p*0YdzagqgtM^u zP^re!64_93OIf%q>v;8ZPtufzN=H0vAR8*~D-Soxx3KDG4NeV}&9Q7Mo9;_)YZ~s6 zt)|tBvT3O7g5|#`yB9T$Q#2Pm%8srUMjnWFfBCa}(MmBP1dr<9i%!IREV3bVF~LR1 zhLC6E!V~IL971EL9woo-MbikLQb9xL4T9H@-HSXqZ^;@$59tKyUNjHSY$a(Jm2S={ zKsJp2MNox8#afNri+me@{yf&Eo3{^~P9(31>|W$9o<~*R9|zGEST~bhgUC&V6nXPL zpn78Mf$UY@Jr4DM1S5Y;({~2vQZRC&hMpEo4x+^a)T+VAzoIc0W=CTgs}!{`@+6!C zk-^CE1Y=atHzQvmcn(!6(O~5ND9uL(Bfa55_=9@>W@N9Y>40ElVGGvpuo;Y8hr$}D zd_nx#wGkNEJ}tM_M%hWJ?$-VynyrPAJ!z^3%3$O=DbXWe0j&cg_a|XrR0|`Ir*tf; zg^?S_rgFifMq%VRB%OuyG8ow{<$09#JcE&2Yeh&f@^W&9E3bTyc;EVa7`aP)PZEs0 zfCd_ak%ty}mIote#akvH%wpuLtqvn^rB}BggOT?W+^d3MBVRyZ? zOM{W;#H4&UPHY1h*#d}WF!FFr{bV#4IWx6>j*Jc?FT!vhG8j3IU<|61#bD$#N{=Cf zk+TUtM!XD0uA7?dt|ozzS7_gYk-uR3LDq_k;&?I`IihHAO~xBxM#mrC-Bd=ls-ZRBX^1YEQG=8=hV*4o~N6Fk!Nnh2U%n= zay-Ep74*%>Hwa!-K`?SD!B41C`357qY|C;6G8lOb!QmFgN6Wl0_^rH%V^!MwaVQesRw2n|PavEKE3K@)?N${o$f{}9wW+Q`<-bAiJ zV-6#K#QKAB1tas_mUm-k4^+WPEr_jDTg97CW6fP$?Uxi;to=NbM3g1&$Z99fMs?^TQ*1~%# zr6W*T7YgqYOhawEQJ9A1Tsl|Qox_o$ zXOZx+k_<+Elt#lb+JA(Ri>Ut^*|l3`Cl=O`UAvi$UAv8`-3ak&yC382Y?|t#k+?sF z-cg?9DX`W8$#%V^(>bYDrzNPU^#Y;(`K z5C0^~5sZ8|we3;LS=ixfqpoReB*9`8M{qkiked<{P9W82J_6dB|YoPXs?Aj#V(y(@VnY zb2-+fE3N+;dl8Im){`D0gOP4)VzvY$XQf_xR0Jd2&WJG5>sX$Q{`xSoEBo0}`}_Cp z{5B0i55z1LjBLMocE=3-U4mK|>09$*H*Ez*_T&G$Fw#Ax;biK7k-yL*gOUAceqUrT z^7Qy_oC_Wm!N^ZN$a>rBXOVA5d zs)4eb*m54F!KmE?3I-z|A{a;Yk?#Q`r%*5$*?SYe6drlkfRSad(+$DM`)FwrG8j3H z;3-soXv|#>jC4ybcoYv@F!CccFBmzK*4{)0Bi+b1om1bkqy!_sz&lrd!AN%%Qslcx zFmegr#i$lWdQwS)qy!^NcI6Ep)rFDWx5&;{E_hS~Be!{j0}_n<7kO34V5A%K4N?+} z?1Xns1dM!!D>IeLR5e`}PB3!cxXTb`Xn0)Q@lSSB3nRB6Z!=^tvNu5wWH8bbb45*L z=SDE{adlSTj64DVaVUe4$ECg1Mk%Rljdq>ENUv@LMqZds(kJTiu)VH-lYI$BUci3N zMFu0s5sX0wBRwY{l#^iObn2f{g1#9!m*5jrDT~3#(%o1{WJ~#_ahJ=5k#5Qbj~o?p zR`-0HJ_<&5qRlmtaTqu9cSzzMJjFT8=2$nCU2B(0nHjN3~Z*tHx! zZ6-a^8t1|I4@AacJf}3}_**3For~WhMeCh|u%Dz9t#^7#lN6}CE zwa;tPHT1}*l`ol(!F!YZ+1lqlDdCnF)rXM}VtxSG+UInFX~@<-JvSc~aAke%^FylN zm0xS03kkkcL2I9X5&VH{?bDMBmaMhU`*q^9_WAGLEFvRY``mzFJr%@ZwkFsLg^DS$ zx5XUhv2-jRrGxji&pk-q9ogEayFk`4Gx_7%=aE>CkX>t^ZUR}?v-{fT*;vm+*~?($ ztYrONlj_peH)+5MMqY#QDpdZzXjv|doRr=hJ@U6GCc(bEIoKq)i}ofUn*?sm2ai0( zC&A-br^>EL;HE-~-0qWL2G&=QO#-)Sp7;5nr!CynTZRlmGL ziYCDl?2DD6N#H3>Qj}6^TD_zcO@gMo^N|H*lVD0ZS01J78o5zBylv#qCc*TW5Q0bb z0l=o1J0qI}yAt$7HVHf<7gqSZb`lJrx}W@-1eXvDQ$dqp6v1`KCV?mCEm@ObicXv+ z!2@{iR+0d~+XQc^ph+;7;4>5|-j4k)o&>&)Z%3u0$__t~qn}9r5!obg7hi~~?~jvU zg+2^YWRt*6{H^DDcAo^RVQq`DSHjGO_3?W$X*z>LpG4k zAvhh`KyrUB%#c5lq=%>;FTVy-$(}qYN(Bw1wJ5BP3`Tl#-jWlHJed03kPV^-2<}!v zgXkTC*HOi|*iGY)BjXR&R%l*#bY(Eo?YZ#1dg=Gozi8@LWH8b_`OFiC(Z+qN!}`cz zq+1GR@u71h)%}sZ3`Y7OE7kGCgI=Me5l+-^#o)?#Vuu_ zBNh#n-PM$a$`g1VLpD_0R~|N%Z(-GiAI72bI+hu-X{flZY1m1&npS(trlIl~mQPW3 zFZwv1#2ky@Yi9=*|MfTIMR>oLKf4#zB%4R|??okhVMaEDRwZbSYzTQqF6^yN#Ua$0 z>hjDmkS;> z3L{&R)LhBD3`RCjc^+jw&tT-MS`iYAY)?)*<(01aNiecGON5QV$j(Kc z<-y2F@s^nj9{Fmk!^lnO)yBwReL9RhUQNL4pTV_>jVL1k+V`lfv5sZy|mu zE{>mn1S980b1u9_CnAj8v9sUeJn{)C7~$6??_;WH9p3qQSKd-UuU)jhhWdE{laaF!H|V3*lT6Hfo!lqgojG z?QaoAb^%7d%r2**IxuqO{rJ$0>cGhT*w9BCi(%w7Y`6fm9`<%+7(&B!z8U!eHLt7o zNorsJwH}OIaetOhQ01G{)`gMHA&!&V`NgfFUNCYhE#x{;wLMu|pj=xD=MbEVO3nro zdQvV}5-{>+woan@Hu*!N|%3xl1C0k((2ARzWcGFoFYA5RANr;4)OH ze1nm%PR}};!*Exs}VW`clxYtwJ8Mlkl5lhawu7tr+GGg*MP4c-t3oC@~ z`P_abBc`jkf60jRhBOHkU&Sngk+*itPH>|z(vK>H+DOCLU}VR+9HC%jU%IjfG8j34 z;BXZLBTpq5gbYS{6S)SBIgGp%>&40yjJ$#1dc^&wSFR##zFOALd{|c}_=WX0);Ktp znkks>R@Pw@@&|LCD3ly05*Tv|mLnKBnXUU``7g@dLE#aC+f*1$q5UDOlcL-e6b29+ zsKSL59wxX4RchyDPqC$GKYpv1EoHAzIEF%B)b>3Jdt#}eb7k*Sc%7}&QQ7Ad{@tH9 zWeNr(?_b?V_Jt$>Bln-j0SQJ9#&!ZS82Ku}(<J*M?lf)|kit@dkVJ*WdCKc{vMiZJrl*ltPi$lr>Akr#cz zJ_I9|lJFZc80p3)4N@FNu5cJr0vU{SJ5TeY=fKELYE>|@HI`N=gOT^ep5%f@8i#rT zBljey2u8Z2GTHCO zdsDrKHD)mK`E)I6BkjmwWQne_VB|?8oS-Cwkv%&2X!uk6k1%o=^+S+dy9Wp+A-i_n z8@qNdQ~M&~)%H8aTl04-!}MPmiQiM0N5vdevLV=UaXQ?tcmyN2VQbmp)nTbDS3{=U zk`J;7M$TaC5m@#^xoH%hC3r-IhbXLg1Up8#2^97v=%vCf6vh*bLX~Q$>;tyUq4Ykg z`htSNNZ(r_?YCTq!3!99^q28kR1M%KPh>FCQ%W18_;u-kwLRh*3q}^&`#C;JN5tQM zRJ;0Yy)mYZWHcD*zLJ!Y`ZB-S3!bw*{_d6|7`bL@+oP1TutS@#*pFc3p7{G9gOP5` zhcoGp!^p#^?yqJ;L04h3)b4Qg`O}tzxt?|1s7zO)^--)PNN0@wEbTd$B3%u=cuZ?~4ZRSIJQDj6$Y7** zmbH`A?JOn1$g}VcMg}7!OA7B9jJ!z4rf)_rq4{r-!N{8UZp zRPBOuJCs{Y;aq~#Rj8pbgK^+R-#}qvID^;RR6dL z7`X-ogOStH<@U(C28_J!Yq}vAxjij)M+PJN66}G>-;TMayJOl4(@(V_~i$%?P{sbe3OB;|LhJAy=jsm#JzaT{ywWm*Xz^ zvz{6r7k9jD0q@f3n~`sj_Zl)7IgemAG8pNJxuPbrlP?&#Gp!hmEDR(WWiay7w71$Q zC3QVTyUt*wS2qG9e@rLo1oe2>ULC$+UxJaX*iW_gw*`ew2|6Q#k)D$e%1JPCZ|e6@ zf?(un1Sg_OSqw(rMCm$I{%hRja$%&Ka={}G5*;r>G<1lV2X<*kHXD{_gYn+SmFG9v)Jf}3}_**3FokPDR zMN8vl$FeerjKg?JlZGiZt$Hg(YoBefuY$6*&ya4R9%Z9|wT8%HI^*3?{%q}Ym6Xsd zM)hIj&X{*Zw)VLYoBiuyoEx=8nL&<9A@owEFPtU_qER&lD|Z@_UW#C z@F@A?+UHWNzsat(Pd61(t~~M!<&$6v-UsE+Cc#EAAq0==1ArNrUqUtsJ|~!iY!Y}zE{rXj1iw?g zM1DcJ$cEq!-k~9g9Bsf9^O@h-1PC=n!yV&pI zN#NUZ!J~BWJ_#-(`BG$)z+L%<{x}J4#d?eEngnhyq{y51N$@b%hfwya*gB5xA{eXUt$6|; zqmU6M_mzbF`}h`Cef$G94Yod5ddjB3=C;z%TDF>256h+jb`F-)Q3fLyrvuo?d>M?q zi~8~MWH54B`dss0nIepwi{S%g1F7YS&_HAZ$^E%-i2RWx{g>*^kqx9939eN^chjc` z9z_NtJvnd52}Ula{tG2&5bbypBMR9dI*Q;>RM8@?#2A0f#}C3*7#go!99lg~VH7`;sOv$ALyxrJZ9r5PVOOR4?|*~?(054X~ABR+=8iTaGK zp|ak|%p+t&#cfT(-PnAnY(sTdWJAR*W#RFx{WhVoRR+sMs`Unl)rH<1tXu;(9?p+#k6>lS~VECZ8YY> ziXUXg)mf#eg^@Smybc+Re4XGW74*%>#RT7?N+lYMtUiTb!$Jllz2QPwk9uI_fS>7r zVB`i^)2`LzvgN+%CJd528 z)-DZ3J{6OA0D>SFFmhcP1tYJ-G+ai5ku4&*31O0q4kPc!a1SyVIfLLOR4I$W$ge4V zfec2LoyOckybMMTOdUQ^O#&k)Xy5u~PluF0>h-G^EjdFD#1g^s`U?GUyHMjpg2cSUtz zzS72G7}@c3r~zud;?umX(r_IZc`P-Ds&;#7_y6~5b-x*T8#One%Dt(r3nRM#8C#TO z9S`An>IEZrq=j5hsy-y^4V2rCLd!FBduGfo0uy=?PjplgFtWwVd|#64%}}n4!dV1^ zP^BDYZP;=*rCU+EwJ8{k+{6N4WOstuRK1U?cBN3ZAOEa07>tSxMz)UqEQD*d%c-5$ z`h!a<7xxv_7OG6pZ|uuGAodk-roCs)Ar- z)3fL?G8pMiQFtRPyRguBS^$FHR+-%|al{997!c{YOrE2T@RI=PT?Mc>yW|7$}%6> zD@^0QyUQvy%Q&BckBc4vQXEF!iuD#`Fw*ViVP|>{jGUsL3r60L=M$W|bIx-mPwn8{wosBSZ0o66un8C<3 zVp}29Mp<9^n~@{bu3%*8d7J>0!N|MPXt+rGk1%o->Z_1lyB!I-BfECv8oPD}QF{R5 z)%F6$+bEjaO(XF_3WKRQ6_xxK?6_w-+~>4AVC3Fx9YggsvMhv5xg{TD5sX}Sv!>xU zs=q_Ib`oOJVBZzA(7Bf8r&(y-m zU#R{`&4z-m!l=}43rxVsQr-4+CH{3GpT3b@iIWKisGuwH6v1Q_bS26z0x+wfE3qeq zol&J4vnw&2(lAt}D{();cw{ir_spNQNqxvJ2{7{dJiQQ%T#EfSWH8c=e0#lKN`jHi zhtWJT7`YljTg0&nMtV|7*jmTBbfuk3*o$D~=9oGogOP4)VzvY$C#79_R0Jb8FRT^} zMtU9Jm5BcOFmeF)F1tY(pHp0kboO6k_D-unr?%VuvrF>{Z%rVtIHjp29*H%Rvc7cC4a{Cs6en&JR%TFbdTd zv*d$v`%vgX&|QVyC=4Mu4OOavva{H752f*_-Nh6PMvf$SlIruCtrn`TrC>0!U6bs1 zLh#7D28>+2lx_${en?C2BZHA&6V#yc&M|j6Fw!l#;88qqeKT^gniq`xoz{Lu1|!{= zZ;+B;1h_7`bl~ z4oEO^Tk^I>1|!{=Z;+B;WFNe}5is&ruFN}JrmArS1|!#syA0tg4UdaEwklh#2u2=8 zUVmgTaxlRlWH8bbdA3z*B0K$pk?*Rr`ex*4{G(6?Bezc0+9)M;4cc`EBfYv27}++0R|bVB`#fmyp3o&&dbnBpA7X`Wht&My_xv_k2_-i^0eZDXoLb z_lvt+E{t?jE_mdqkh6N+3iMGhvJdU`M#f>>m~W8c9Oh80{bU!1aeE;}z6W2|9E9~G zWE{rrB@OIa4*#erJ<@XcCHRLS<1n66nsWRtlJ(9Nm7?{|G1zZXiq<U- z<)mos^Fiznplt24f4YVq`OI|=^Ag?{YV&q@i$$EZGxoQ3&gWNV)b2);(P_UXC# zP&&PK?K3x=XNbwKwa?ZRS|MBeT$`X1vb9f7E?BbGK3~yU(AsA=JYAKfCG>p>_Ete_ zpGOiLfkMTFvA4w>=F)U59;Ji#wa>FjJ`>s6r@Q$6Y|Kplxb}Gs)~jUK+NYZeDRR57 zecp-nc9gvgMovmC|C@6JjC@!FRxt7jjE|x6$D?JrF!Jp5-sq9PMKK9Z=FPz-!8^1! z6WJtiV?KD~DLx72Vf|coO#(L+Qsj1@1WT|kMm7oDUeds>NicgwdZbCv^fEq7Ae#i9 zQ<`$ph+bILQYo4Q?Xb5|iY9@lG)YlPscAL0f)q`HF4#MxY!Y0U&Xq@gp?nhbz`L{j z*(A6oCWPQoeE`r8^MS}F!RZ92BAW!BkqaG*Cc)KI50_t);6Z{1R1g4|PB0DGB=F?C zC2JDAp|hY#@G+ium840ql;AfNGznI?oI!&^#ci?Q#go9d<$_1);C<MsizZlfYg1 zhW~F?3x5_FQmwu_ern|*8igHRWT-x?jji3GkyZeg-talMwU)$&OwVX9Y)?k z$Ox0$@?j5bJ_xU*`VwS>$u0aus*}&a+geR&;609K3NpgvzLGFpzJ*msR$|j&`wGh( z*)-VPRvO01R?})b*)+gfUcrYrl)=b7(*aC1Uj`$$p?-6DG8ow}n)urzGDR498ir$$ z4WtPKNDb=sbuYvTRD|t{9vVpV*K`&%5(vx}649N*bUPApDO3)zs znBZL%G>HBn_!(846uW8s@v!(2-wJc$m5ZY*gOP6Mv7^t@OCM5eU&Yhqkikgzht4%rUxw^uFw%!xX=u;x7%G3Xj6-EQzG-Ss_b#_J2^(Saq4EyZ zGm#Ayx0HqMS;wo7QBxW!U*h=!*-&v`dFUhG!m3+Z#G&#tmL;-jsJN|Z=r3DMtK($T zP$|EfPoF5e7u}uiMIL2GR|_Lo!Mn2j*}dq|bT9I#{=MiwnAb%%gmxm>0of4p4E`E{ zIu(b|fmH7;zlP8dg0of7z32*p%aGlRJej{sK(dC={yIUr7mdd=MoAh*FAzMZf`-w% z1aG5I@p2>gBHzaE)y3L$^Y(%B70L6E-HY6nZ|IMM=ohR%$*w`<_Ckuhc^^mY-XhY}p9f?(t&1m~klB^r#pi_!#SFwz_5kM~dyj9jb^2u41K`6`!<(2;s?^}NlBmWoAlwjmKEGabx zBXhA8d6oww&yKguT=2+OTOCFoLaz=&1|yFrI93J0$l(N+Al@+qBm1Rg&=!hb1zORzwNZ7D1z z_zm%dj(8;h2u4nhr;uM9rxOuI{;RNdyfz;BgcOXtO5M~qBb$%p!yU?CWSf|j4;{od zfRR&W6pZYEshx}lBTq`LZ!Dw3$Q>|rLk1)J5gdprWic2zgwh$vVB{Er(TJD9$Qh9g zhVb)KGzpCC0>CpE`6#x@vR14a?_CBXJI8_s*S>fojO-dW8;pD_7V5yrJD)6s(Im|M zb}c(cwJ@?tmk1;G07m}6E{d7^TR9CO~J@5M)5%w8H_xX;6N1wBd;L1 zNCm;jCkP%!mC835xtLN7G8nn`4Sdu=1|$0t^g?Yek9)m}o&9qdd40?>7`gjT*$HkG zM*2~OP#a})4H((2HAg5IIfSm9jSNO!O>m_Of{|kh#vp@{-bAiJV-6!9!a7;G`ex*_ z1kWJuKTmSUm>)aMv+#6+Us!Kfje}X#%*OPtvfiPv{%FngwezwXwsg6P-|9tWiz!@7Fa)*z zi^6GGI?}naWfXp9>jK#-TJonQZ{|%I8H_yS2OrrJNB~Bj(uM;Pj2w?;G%^_ZBf)$X z1S2;e!>?o^gOTSD3_=DYH(Kbe%~Wec+CRDqtqDfHisf15=$ny05-dapv}P{Oa_Ydy zid(o`D8k6yW4k56BY!IfMvh&TeF#Q&Bw-CDp3Xkp*d#@s;xKX(tQ#YPk!~*!U(j=4 zWOubH7`X$M?NA0I4~{*_1&^|kXfX0Pa*AN2J4%z+-yR)C_NCoD)HcIQFmga@eX-8p zMa>qd7Xn}da2<*aM!JokARerRkwd9I+Zr<%c}lt#wNchrU}QU8Wx>dsNEodo`)1^? zX*9H_VTX|qP(KmbwfmUhePq{eQDfKc2Wl50UTs@3-ZrMGPc~vCu1ulXSgsE$=?8Wk zpAPpB?G6}uJX4Z$2022t4TRz7>7+>sQ{ zCpb-ogDJdDFdbE@p|VkIX*!Ot2(zVXJOzW1zPCc!Z+a8|ve^Y~4^CIk7`$+tq;OxD{(ib zTaaCeCb#jZd=+#h_Mos6vMVu$;2ITlCFT>%LX~RFu0*@>{K`5i)0NnPU~^bAL&?^uJmqu z_97VhI;NM9!AQ3?FOH(gBDuR(O&|ia*UdNvvj{f>E@^|+0D>4|_^mYQoEESCG z{-fVz7t=$Bk-jw_N*>B!0LG^|Y>FmkMpO)#<@&98(EMvjW_#t`5b6~V|0 zJ!Kc{|3%HmMU!CUiPT0I`DEN&3?ui9UH=;xc|fer2akLm)?ws<>~MdSy-FXLSRSet zWv8PMw&I`!BOm$?NA($1r{Fvm<=&xi7r{6cUZOCY;C&UIRttBqu!}0yK-mJebfdI6 zYWFh*gOT~Wc;YA3&DI4*7AP2uJR$Bo1dqIHz{vYoryGKi$I;S2WH53F!P%(%{Fu8O z80nT=@F*U*VC2vaG%px=HLYEV3`V*!-ykKy$lLJVD!;xN>Hb2Bd>08uPQm*is)doB zRMH?R!N})HcveYuU}XO#*|o|AkBVUAmpUN9$al$m8ySprW4=L3f{|b0ori#t&ABos zaG9!F5EzU+BknSU^EEs!?s&%kzU;hjJ!Raq!H@zu)VfklYQx%k=wDKZIHppegp?1 zgOQ%Yp9&=>!N{T1pREMJ$Xf|+M3u4_jC_I8G*o_9+~sm%q?>ZVBS(dt)!#bNN5ROi zXm1`e4&%mrgB0g5KVw}YyVf$@UPzJe!Phm*Ca`3OjKjFSq=8+_;RDnot#P)&zX~!A z<2j`%$KN7Z@4T@iDOwuujD16;XuZ=@nxrVD)U-NUDO&s78T*bXTl<`xuAxUhc$~u= zhit-a2tw`+N`2OeJaU^IL)iDroIh-~fCUHRZq^2fE$j#$@_U2C6iDx}EmzV^8l)-6!>G8nlu_9=u1IZR;Wc588z zf|0vp+zpjCjc-`Xg^{mC6OYA;k-tST3I1A#HZ=*3qP+pgCV?CC4N`m(490r8?3x5_ zFQmx#;FDlD)=Q900=JhmuxkdSTVrwMo$=n1cO5rDzg( zN|O|&l$ut@D@Bvw73?peY!bYi&Xq@gp?ng|#yd;?Y!b|k2_bk?9{?=Dya?GOsJM$$ zhHMgeMlL*CGzr$Ex*f7furtAqDrgeyP0$zFB=F?CC2JBKpcAJ_Z~~sAm83~<4Z&3^ zXcF8?a0?0*Kg50)PXgbT3m&C|_ety3zWo z2G|5F<4^`8$EO46YrYIdzC-=%@?{JNVyPw=z~8b~z+bCJPFPv+wn$q7cbnWRrMBxn$wKyb7Q8bl)qE=Lv9V>gXI zJ`{hjw!(&WM^^?T-JT0~s+T^bo~Eg($Y7*<@|h`4(2KE1T|1mtz?&n}&+pnub4Qt7-L{#;}IUEm&?w*}dqucoK8LqwMHv zVdMjN?~^~f7d83Wf6DTx{=MjV%+DYjLZ1+Pglq_T24B*9xONCFqI!Y+8bVd~F=CJn zq16diLv}CnGQM-v>0LPe|C@8WxrZ_5Rb(#_ik z&RHZ6Ms_c9SH7V?4x%ftUM9N+k=uDTP29OR?*nQq)-lLlDsrx8QBZlPO?^< z8po5t$n%Q^*Oz!BjJ!Nz~J0hBaxp&Nm~kr{;3iu77)FIHh+z82K7C z&!Wn1)YgTOX9F3#f8rN+U+M)T521zJNUHvivU35qYFgj;SZnRQ*G{JuyOdJdA`T(t zE=Ng1D3@GQ>YzhzsoX`On@&n{4-rC0lE|f0l7w=P2z7QLN(klh|Gi_5Z|t?#PLKb3 zp0~blj`tg5%sIX>=i1}lW6#vnb==QHriSCR#@P!LeT+O3ApW&haFGhC8I1=O(@5RWWcvk^0M!tkGU5<7} zuEO{nG&(P|x-E_UeKGQq5S6?$@{8mGZ&HjrGG6^kOKHqq@Y#9`b%qin%ck*k2VRWa z5u>RbiIIC@v;@gJBSU2=S6G>ek%vP)OtBIpPr~Q|xc~IyUh-OqW-GHU@Z9E0j-mNm zDCrC797WxT^9sgvP}Cg##bPo(Mq=be9If{(j|`AH6Q@5$4>>2}EW>zT&QUl!PG=zn zq}t*1!#Ee@)OhwPj?Bk<4rGVo{PQ^y12nz`XAYF7>0EX!&IpcP3$o*J-otnqcro(e zPc5^5Bmgne9l!}mjNI>e?iav|k;5>qmLoB8A;xSu+8Mdk45|gmJ0m}_+L}B_Z3D^= z-H+NNMs|mC67Yi7FpL|37qp)GEQzTiMvkZSUJ%5{7NK6=85t~l6eC79-=8)lM$RDM zIgq?FG7x!ZWI>3Dk*`C24J7Z345U)GCp|}ud{aG_82J&D4?uWlWZ?16$Y3cC_2JL7 z{z^=q7-?jxNM z?|)Ri`fmL_q%|TY?~Dw*B6mwc#l)OvF{zh%Aov)Gk&IU0!yjF07LBwEfy zU@w6yL zeiEBBD^H9(?w}w>S{d(*4E#bdaun^11YV517h@b?mil)_F0;FATY6|>WO+E6cE{@| zJ0s8H|Egl7af;oglp#ho*SSfIoJ#eRK=RJW@HFO~k-^FnBe%4W&!8^_wFd^0#K_+` z#UMuB9S-M2slYW zRm8})pC{LgcSZ&)PmH`+CnPcQ9O8O`?D*+31P ze`jQf;*T0DJ%%)E*_Nkt6eIsj+>OACkq=;u1IarhLm=PZV-?AjloZMK{$${F7-RCz z$Pix;5X{q0Q@8{B7X-V1Y3wrf?BVlMgTtv zjKn)53+Ofpnm}y?{3I|E?~E*m?>vg9M|x-iu=OtBYrXoW`zLW85yiX0bn@f z!N5;~@fi04KM5=%ct@W)La;{J5P+fGCaIfZaXd+3e&4caMDtk{!82t;1wpL@v01H zmW0zOo&vnWWE6fP)x{_APEu7$yyb8{1zuq?UXkl3-kP$3heK1c)qaf=172Y=TCuxP zw2Jy&MN@*chO!R`?~IHmaKGmzV&s1)?`a}xE1(BT7( z%DpXq5F<i}N~BY8jt4%GuEMwkcrns~(>^$gky9wYUja&@%41FkeTTJw+QcvHpl`3DuTczss0JmH$aSfqas{BUr2H;c0C|S2F6s5}b z9Yd<*7Vw=9_*5}osXI`-HD%L}45?BMrHN>|FBz?d>nK`9{UM?$Ra!yW6D0SdCE)~k zXJo;Av0sd654WB8$-Sr|(#$Hn7o7sR3-Bp)5yl0;r;tUY+-d4mNTIwH&3OtVV&pkWJuR3VMvaH6Rxd`r6=%eNK%9RxU$^7V$WvjS0K6DE0%Nco33gL3CV`v+ zy%_lp-Xf5^Gcr`1;kS9b82JzC^6kqk!1_XUQjwC{1m$hF>-A@nMy0UD0SMD zAExfcosoM{RZ9@w85skA4VJBdRuLoH5zrP?ijgPbbpe%PWI8PJ@y^I#ZBmRpo1im+ zKFK>HV_faHOqle&VZBuG@46-uBl{E6S8=7=hh+F`F|t8;CP|DulqIE2iIFYyIGYnA zCxu%k?~DwVt+tvNIgDNn0bY!}9phFx+8H?&V+!Dj;olh<&+kbF+{DP&Ak6V3R*J^w zi2;0DQNqpHX&;F~pHT8YXv;zBZJZx5*2$TJQ~V}L1ya*->S5HC^CV6)j2!^)j12kn zx5UWL13Bdu(TN~NwqIh)5@y+aml*kox~ZL!2hiMpYBG6eWC-GyAf#;|MlKdnV&u_~ zju0_)TpY``aZXJk+Yo% z+bMOFZry!JUDvQhYU=~IB0VTM3FIE5w5k|+A0lIqmu+xoQ!X*`o8DZjXDPaksQ-f0 z6F7@7=7XZn$b=S@ay|$#@*gV*9ZyiTBB}V>xF<)eX7b8bt43;A?@>z^0 zO0T7?*%XBSNc>(AeJ>BX12+$vSIT9o1W6T4|&d5+1J0oMYNo6KRE`|EB zVkJg?gYgyM{?ojOosl6X?MiOq0?%#UOL=e@GOvA8^+L*?n-%#W(>ZJ0oAQ%sztv#K@5+azYX#7ebj0ycpT| zL;i+3@M2_7jFaU^jC>el97uLX&a~QwtF{522g%OJ zKq_^2({seg(^RX($P1vH2g1(Cz+-1*u#)8QV&o8F^2A7Euro4n?eS=0e0QfXMgnavks(w6|Ol*g< z9|e1XqEXrz8Be$VD4IizyoaM*Def#vZImga@H=`?Bt~}R=yMc54pIl>Z2d7q4pOaf zdSG;svlGrFjQiv?##xW?HOQ%=>`5Hi>l3yJgR+0)Bs(MHg|&9$LwrT8aVLeb=tay~ zAlVriLf9D@EDN!5xfE)Dz!>|Tk%8v;t1g@o?|)Ri`ffc0(hVXeJ0k;+osk6<6Z4D3 z+y;NFkMTPrW8Lo+#;j?2?8&qvG4f&f4}xT8WFV&b3o?~r)`AmVjC6cSg>!yX+)-XkujBa5U{+(ow|7xB0)S7-^hh_XTB$kJT0DsS+;CzV&q^N zydET<;!#LWWwVmY!FmcOB{6d0e>kg`DY^&dtswO@&N~;p`1^ zsvx_7Bj@7v1Wi7`@nYnc7+a3cxt-5Mj9iYB?2HU;vokVS)-}Y)`KQqhiIKNa(^%le z$cY#afzm-CVl!f-QTQeO*idrjh>>@8rFw~x&r{oUknD^MM1D2DAS8;BZ@_(Be7`d? zu-F+{z>i|&r*J<3m13k(*%?_76vfDI3HU}qRm8|1bCa=RXJoMQ#K=E%LJ}i?CvGE1 zc18vwJ0lB1q8M5Ga}pOIMy_FGc4nB$)@tA+MqU=8oI8-?C{(TYK>C#vbNGcpu!LX4acic+ql zdOWzxN!@5mJ0s7do&NwYMh?dq43eFZAtvo(q8RxokI+-Uay%;MYDM z#h3{E+NZ^`e96e#+UG2aUld42D{Mx4lXMC{MJ}=UR)7s}Ba5gAN zYoGPL;Tvq8G4()_W4mf7qjBY+uG-W1n&?0+NZJD85trYKdgOrhI)+X zTKhB-J0lC|w)S}z)PIBIlkAL))ZUs@!y0r|!b*(10^(($w8pE+&1th@BLk70kp&?(2_AqtUUa`RGLYCASwOc*Fcs<)knD^MBz8s? z&@~Be_%}V$B$y9>9!PdZ1|~ZrgOxW4p6f}7Cc&rBKT(J#ff3mmSr}4Lf2cw<3D!Yh z3zA9jZeXUIS#ey07@1v87J@JdJ`VxTnN=tNG=ba@_(`x2#$Lcr0*gqwEAu8nCyI{{ zUz4B@#)Wb;39iK$0Q@Ad;It3cBNvAg=u@@wgt(~$UsZ;mkTQurlTqD0Fs@Nfx=Iuy7(mC^0TN) ziFY}izQ8L?)?$(SOuRK^wM0|0JqYDq(UfdPD|SDLR#AVICYBOx5tIcW?2L>j@Q<6t zOT@_EC|@s5*cll}&g~#l5F_{gAAdpz_(VDz;|$;vX>zReK=Ff;bT`E##8)DHi?LFU z5^2i{W+F&-MuybY;rA}vxj|Bdc?2HV3D0Y{?BUL8o zJGN5gT6hCgo$g(hizRL_G`nBjOz|j??2HUGW!lD1}izc$_MfixF3q2JdjJ~ z*-u$!72b=!h5QxpDO9wI*JS~pLKcy7uc}iag&I;^7x)x92;)FGN};1Ljs*T*WWi}4 ztQ2y(K)M(8gws_)x))uKF-VTmXbi?^z|P3f@BDj_9b;!?D2?}fOPmJ@egOD;k+E2H zDddMFdKT(4qU&B{Bz8s?&@G|nL!Afwr*zMdbbm{XTpq~Iz0b9j82OVfhZamerpAv{ zs~01`3&fOL6^JLYN>M3Beg|_E@M2{7S3F067b81hv;{c@dNJ}pcxQuTXJnis*)d*> zyz?A7pq-I}pj-vK7&#H+eo*>x_$hW1V&s-_fvwU?E=rv?PGcpD? z2$rpYRuLmVB;b8eDMo&S_Z6rVBb$Z_*clnDO^T5l2>J!+lkAL)aV>(C^qi#_#K;@9 zA|x@g#@DP`0Cq-(iT2lGLh3JT8y3IWh8$aLeS2S+H!i)x^lg^lDq+ z#mL<-c9kPB@(7F$fG38;$jR~i8Zh7{MxGAg6i;HM=#)G$z`5qo5F=+x47i1oE1_Ku zQbTcuV+@sZ70z84cgVR2XA;Jva(dy+z<3U@Gcx4Q-x4ETxI8J>noa~U@~oHa-es1} zcZrevpniEV@-3QMs3w!0ks&C}9~9?w5F@*bC^7O2NS}(B?2L@H4;9hG$n-a;6OgYg8#lJ~1qak=GzbK1Gw`K@~AFwYrY`K?n22 z$U``I0H`8HUcrI$K!dlg$+?56xXRARnUqXZY0}Y- zUPw13M*a-td*H>$@-<`%@M7dq7>CM{7OM5~_r=J;A2I16L$2zH;OK>{jvG7^{F6BRf52nZ1wz z#K?wyIU$LWJ%8kW0lXObG{(bnv@>!&#%ehdBU}H(`W^6MWcedj+j`YDpuAfjYLgf_ z49Y;@1+Awso&;Xdnl&kjsUk)$pmaV6Vq}|8Z;><09>s`}hh0n?5+hd-@FnnKq!CN1 zg_s!m1Jv(<7bA_%ZkmB!j9jUnON>mfryD}81$f7Vo}{9sJk*Dsk#*=vo)~G|;>fkf zqluAa)VrnXCcPv^o)~N2hF%~>-mG(z7`Y>?a^S^Cqw&|6)!86M9!&9pzA`UHo*BoY z(o#cyXXLA@S7PL;1e~lOFGjA4+0a4l2Ql(O%6kDnc6VTm1%B*4-_+PWMd_1(PvZ~B zw^OKUkTUT@oP`w32SpQ+9mmAey+O?(Mo#1CT8dYQauLduQPNHniIICU|b7wswn#`N9NAR#---3Pyu5sF>*p2m#1__y#G=4>bv!}kQ#{S#Yp27#faFK zm9++2Omq0V_!x2%;n;#G|2 z-pE=4ju#`XRbz{9NFQpZUks}}t240LbT8XDcG4h*urOe6`BhR}eh>=#7c4ifdkIyIM%;Z~V{$YL5iG!EL-U{F|r{I zZUd4}@t;Ue=|_{xk#RjZDT$G%-oRPy@o1@Q1#?%BYKrq8j5Fla!x@J$R!%LP#Tc)H zoGQp3$dNzr)`KP;aJ(3KJjMWupScz>@&p_&Ms^QvJ7<=44Keb>%jky0$mYK@Nr4w5 z55hPQlwKTSHzP(GCFRTtC$625J6%ro5+gfN+tI*_kw#2c3yET654hdMml$dMOth?t zC`R^$+XqyNkrq@`EhvhS*AXyKK~==aW1mRID&@?|6C+3Hgd|3eA#ODAVx$q%)k2~e z`5@c}0Al1BjLcYusjPF)~XnUW{A~|7(zlkyppoDy=#j2{H1Pc#)>7$Ah~pS6dPz-5+(_ zZ?xsb$R;=qffpk!ChZgx#mIvxKM;5^vOC5pASa3!Bd^CB07~x&O>S0Y<_+O)BYv{>IU@!<5v)QnvIXSbfnWPP7~>$|*FG(lS3EJYw)S}<#m9-S zd@m$P`CvR(?Zxj3`@N1vON;|V6KdgPOfcmBATKhCoCR#?fwa;In{tS|j7bCw3 zeRA$YP7^V5mC{3EWX{zkZR@(yUjt>cV&n_)*=UwMqPVp@#KXZ)f}N;uN8l%c5!22r z3$aPCAJlzB*Ca4fCR#?fNpJ+z4!}F(zj8nzF;L zAw-j)FZ4bN(Il{tl4!+{iu!dGqDe3m`e2Yuf;sV8nPmfIlVBX&yTnf>!J-i0oLPke zz*NYSfu95mFy;e42`nPzR_0BD#F*k`gE(m^OwSVc6z~d@(bBHYb(IR! z7ZiU2yuxG@ej?N9#&1l8$ z-=bC2zeF@8*x69d0ErkmCZ50*o|lM`H&Z@BoJ5SgFMdZGEm9C8UxzRg_(a-(@gwkw zWc-wyD1K0q_RQ3E<-jM>br@I6(cSbRjQfBWBP}@XgQFPv3FU7nKuNTF5g7%15*>@t z5!8GtbkpmP4}>4Ay|Z1_>`KH)qqFv|URp|BO;wiyFGd=N-+~Y)q|s9pKPHOO$SC~g z0~AZ06%>C4{Kt!tmTtxFOL(Npp8AfhRH<9cJOVydj8@{-L9_eSP89D5e5x3QH^5!* zJ6`9W>qDyS4`*NCQ^k1vwxM`y$`)T2Ql%r5BScfG7_EkDDq2PT@uDeJPKRJM z*|C%}E8e^XD)=iHx3!mQ`;F)eUM_;6J71A=Uqu82N6T zzU{b{5+kou>S@8`B5J%qwR$n~vp`I_69e(f!F=70J0q`$IRJPuavH{DIocWd3C8;% zr$8@8{)V>!crnr{&ba=R^JiLjqFygX*2^;OffpkW!q^v-E(kxnZbFQ7ae*z*@)xB} zoANW%-MBNd8&!1$i5OWU2AX9npjE`k^9kq;D#gfwc-MeRF|sUFm2zfnQj8o$&`6+< z7bCZeac224{*f42Un@cqBkv_cJE zIkRlF)x^lB>D5!fi;=Hj%#7gY08b2wk@v-mJ%j-_G4gu|-+B@&MO(7uZwvd* z-Jyh=vr}h@LPt?jyOeKDAk_w^2}UD1d*QUe*j>)fIBhWwmeT~MGsZE%mF^Pq=WmIT zYXh0z5Tz4AjO_BTtq_@I6H;R2Y;{vRBhRF{o@&yIk*9~Cv|E9ICNc6G5hX@m3aPJ% zUW|My*8Zc2CPv;4;TGV<$f+2UK~5AeMlQyC19&lVEyilV$BU6$#44Xtm57o5LBR83 z4XHmUnnl#JAoUZ@28?x}=m2Cw3raa3 zgcx}$M|Y`N*KG$<$Ksrc(G}#x$ezuSF?hp3lZ$b@7&*Wjh>^oF=27%AD7zIWdq4mD ziT4fgV&t!(pZu9Y^>cd5RX5U2iIM;P2VZ1?7bB-(OqQdak)LCHBu8Rot`;{_kW;)D zBRk+72)r11HO8fKBt}lexDPbic1&`0X4BZ;7bBa6C@)4XyCbP$lVYTumE#4kHV#T- zFGlto!5K=7TufKq240L@j`4*YiIM9t)&eg^S{3|;R6%7XMwa9lK;Xs5tug8V?mu^P z$G9wXI_<{m0?%zea01Q0KuJqTJ1gpGoPijZf}*d{Uo0l$VXW-m|F#vcm^1HEiMSmp#F>>NfN^D7vP*wvkMjl>P*R=*-j2wY6NRGtF zMHusd7b9nd%j4V*eW`6g`PcuYHi?mq>o8k^7qkw?I23q6tH*6g52}cfXHeP=1Tk`1 zsJFnC;jC_~kw|!+^jLh6(BU@>yAumQAuX-g$en-G+1$i-Y*sT`RPwfXW zGE=v%+X%;x-R?NM06%sEH#K&LQFvBHD zDX&-8)de}Vm90lD-SAETWleFs7-_9#V!QDnzM|H%qrzB>CgvvK#YhV&t`=hBG9K!^ zfH9UBd1xG$Pw5C^sj5^rVPhj5JbKd1OJRm)w1YjD2VRUUZNQgzz`06{wD2O=ydUSfv0nBTT9Fu8 z4yhsVVx-YZJS~cmBVsSj$`d1hp}&4-q?M(eS%qR`C)zn0crmgYMpwWrl^D4w%sS@| zqldOL(vGIx$vTP{c`pA~6(fyP?5?5=G4h=;oSVeRzEs~EcrkLPJCoZ$%9)iXMozbo zd!XM9YVR575+f&28pOz>!r^=|^2^ZmzYrt84#oV<;9%K0tcj76Y48bX7|&VVOVMjEXM)rioZm2hlrsdUWkYUbATASaOjiquV&qS7e-K|{r13M+vL>P!ncbFU5>P2dT2N87 zpeRPxCtzy@RS_fC-fo#?R-PES&8?h}#K@hAYX-a+X~eWM%R-_Uc>vt~0Al3ZjLa(x zQ`sU7oW#g%_-g6gdrFTX%|4=;N-^>%;*JDfjO>Zg6?iey0$IU{RV3F&V&qtLR)3~- z5d3RFB1Sff)JiJ`wSGlSCt{=(Z$gaRE7Xy4E7aq`UHaTcTM{F0rJb9B7bB-)Oa@+z zv>1MpBqoZH?^6D@0<<&o2aIn)P82UjZqtaTA1K{FG`U$Z(nu+1mPv(N)!px;j}jvf zpuYWp*I|s9t`=fCOh>3kh%Oz*=$U9)3%0J=73!(L>o7(ysz%px_?>sqBQ1ybfqx#~6D=vflaT?SyD)d@%Iu6{7V{3n__K45_F;P9a+RybJmrAX)ot8^_Qrn^va7 zOosb}_{rMmX))lKU=@myb0Njg*O&(QWPXCaC`f$;XS4BSN2ehW2Mt4Qp_T z5>{g51c>*8(mMlXvtne|_-r)G9#Kq!Ry-X1BzS@Po(Fys7%}b4vJjgD3!yF$U6a5_ znP?f^Cc&prKLLIc7`><(U6bJ6yXlc8!8-VBfu95xQygPrMz1M*=Pp7t39?O;B4H9( zNJ;gOiu(5}M3bNq^oAgr1ZT!;WtI(;O@fwiTZo@bf<7U@IkO4{fFmHc2YwQqfzb{4 zNnjBvSC;{{NpLyEeZ|)#xC`SBIT8RK#h3{EB(UJL57s2ONf%C&U^bi=6{Jb90^>_L zngl;!d=FgBL80IIlfaJgR}JD>C8r;iqtfkoJ_0`pjK!ZcDCCDp&=~5rqH7WuiN9!2 zK(|TI3hJI9`P95RWOtqzxoh|al5#t0PK+r&|6Wd73e!=<9R|F@WHkOzIy6hdODXOH zyuxG@ej?SyC-Hv2hpLo#55O4*yuxI>B6qoXYsz*OP098al=-6Rj%&1HH%hdM`f1UW zU>l(P2of=}RXl-*JueX>cPd9W1dz(!_|&zDOB^qW6vW8x5V`=LNTV=@1D{C7Pr3KR z4@%Oj6i*XhiBy04x^64r6X`&Vy@3}aEjaCiqZrwT@*WCM63xbVQI3-6e;CU^&0|A1 zz5duPeEs##%rJ5xyAmRdr_ zKj1%JjI<;xcC|0@sq&J(V=Gl2g*Q>v>E30u61N>ROO+QWejfN#F-q38fTC2{RaGff z-h}f8@Tp=vUf?d?nzHWqg;ZGvWqV-k27C%xM9Q6^PK6X|Pw~OxD}{PtoFzy1 zqDwIP0e>&D;It1`3N_RP(!FQ|oWTlG8a;tANsiL!MT{B1)tngmoqsQ~W9aLlG~Vwm zao!?$A@KJiVdOqza>WYi_`ZauBF7t z+V^ugv|v)SV_la9i5PiJyct{ASqF>lqT95HgLI-s4Alb}2VycoF{;|);SJN%Hd2{CefJef)>xhQqol&_}RN-=UB zRjmby82M-nG|N^%tB8@QW_8`41XYTWTXUois1zfgj@QYoO^T5_64Vsv81KsY0A~fpm%x?29?s-%iIJn@Pt@BY$3LJ%tl(l!tyFBef_WX+vei2{ijd2AF;winUF z$lW0P6L>N52#oe1CyEy%d*Sr}UW^=!F$nPSV&r47!~a9PlNkA<+Sbm<`=H$^YR#f> zFY;pKR>4tnZG(y!#K>*KVJ}8b4o(#@^5%&dcPar}_D_}~D#ggxUI}94IK;@0X>tLm zB1Sgf8Fd9z5hKszz?nLjFGfz_z^$Oc^3!te6e_N=Gx94+mZ`Ks*PNR;t3Zt0?w?c! za=TGlRgA2;!#~{UOKg$8J>?Q3$52D6DMcp|breW7z!`-x6cjy)OlUzV=YtR<-{R=Y z6h9;Wt2n=4tOYqSvLAC~=Uq5m(4+##i;?TRff)G*MpueX0A*V&K#Z)%KV$I*0xw41 z8Ty%Vz17d@Eiai!Hzh`Hzbjv4ffpk?VziedG4c|O3*<NB z2k~LF9<-4+C`r${IW->O=9HJP##l^{!HsqjE{g9wA__R52}cfKT^651Tpg3P;Zel%O1su zk!L(c8xkXPEx8!Li;+ewsTN{lWMin?0xw1yz0@_P=ZKLh)haP^Hz>P;M2s96dXjQx zDG&8QjNF}=JTcN3#gS`|M-w9tqTT~lH|ZrY^43`U?z(`fKOvrcMEp`Ro$&jOyR7jU>zv>5ZUpac)EA0ImF2SakOD8G8`1O zK$$X1+KD1DvNuOBqxd|K>W=ds#(X))<7~GV-@QPp15R&@?sEQxGY#WWkW)q3OF6O* zZxtxJ4#$g;)>j0m*L6DpFGgBOakUT|mwlk_1sG$Ak;~(_ys9(e z{g0|w->naWbf}14j5J(PcJ%X2qB_O@CI5#K^PZp9#De zX~eYqknWfmc?re+RISTs6zau#SE|oTw>p9G^dm6_(h%TBVhzS}IU0!r_o?gl0DdF} zV_YFeBe4i$F371eKN8t}nT8;%k=PBR9C$I(T2AHlL7C;n$mLJa3yG0eK)(!lG15ZP z)k2~eITG#&;Kj&$FzyDNtHekPFLHIdajqNdjh##@5+kQUnhd-cX|xhgi(+K+c%{tB z6C(#d8N^5{OFOd)#mMEf^9Ar?vZMnca_{VrasPk@LdSm=|>hD^HAUZy~J+*%Q=W6i5;y_oOt4k>7;F z`C{aCq3eGkM&1~T)6Ohghcz*>Jq@-4$)|W3l2f~I$usT}PD)~Azn3_x++(HgbeLU0 zDvfh9#&9|737UuTvYc;mHe&n$a;hNP5bi(sCkH{3op8Ju*$QI}#cw@_7`YdY7bEYD z!);cc7lXr1uDfz3o5D>6vfEL33yCFRm8~AS0y(n zUZoc-Qx+QzZ2pi=NMhuR#LWO+j5K1pT1XTl--5dkAV#)fWFBRh%Gzq+Bt}jQ4LSFs z(ql-ov!CWE9d|~4PTXg}i;?Rw)&eg^S|BSpv5Mr{NQ~T`TD%xp?*M+u1tenRi;-Gs z#h})m)N~?7TJa{t$ag~>DYsBP9^B=3wIwlfSK8SLcro$_jP}5bkrtEoF;R>>hw`%& zATe?n#&sa4YP}fw1l~kY`cY_dvtp!?QqC-s3c0E?rqM@XFtsix1@K0=y1mF~u>)9+9kf zp7snOS{iQ%eH(>nz0*QUq7_3b>hGcut$ntDzB@?PK0l9RXqHVY(_z}fZ6|)B!)%BF z-v+Btj64n z*4k%1T{x|Mz69ra1!?W`eT;YIXzgG$o(Pi3rY_N zl+B8f8{@f|WsfK(!Au?wei9r@eVu@x1V&6dvn<3WK~Jb>h^|Rsq)fDoZj+!d)IPvZ z0;3mIqiYg0SC2FahQc2V{3NiL;usS%dQI6G(+SZe7zh0>g=i93NJ+F}NJafU6rxEm z1^Q%=OoGe+yW5);^C0|1&3SO=il0n^EkgjSUco9906vAh1o%ntBgQ)5CxJzz+;4f4 zpw>ZrhXQ^Qw7}S1jwZpu7zY7A2`o76gEa}Z)rHd}I2q1y3eqIF0^>3{ngqizh5%P{ z`_S9`NnpoP&a8OyHVN(__-^1Qfw9un`C$?~4fQF}B>)&b6D_OWCc$e^Uj@mhW}}d} zd1B;(@C_m5{?VN|F{b#}8Jx5frq7A{77D|CFwMZI|83bk7GP6 zM~U<{#_Pa~krtfx!BLDXZd2F&qyQz+$vDRWpF~$;^anN9hHff{YJM4h5ckd*VdO$~ zC1Rw}Q|@#1(o*VSsu~Zx7-^hz!U<{gF~#qRqBJr}##1bHa&5UC0{`)1q@`Q2`}N`EMQMN_I6t%loAw2JyOL{q8^fpP;#?nS%Ady!em*;R^>cfh?({N!G=Z@d?o zRd_FY9P%T;r_daXSAb6;i%7Y{)v1s|ODKLXaGXe&qeqT?_+16T9#P27v@82t&Q@#bxbb0)z(fxj0Si!K!MLlRvA zwV&upA|qv@Wz}0k4TU-w_)lq%km`R+jI0w^C{N~EN{k$*)YF2=oz!@{YV|uKn*?IY z^$x_}Ugqm|+!^@<%!$B@k;^ca$dMRX+>Rf9adHauV&qO7*%5d#(kjll;glmrwx!;b z#K^W#4g_9|?1j+-lx`8ez->Z|Y#UFe(n>B$oi^oHsJn4zX;5;~Y6R;aq`n8E~cNhEFt6L??n6IW`Dw&Y5KsQexy%byH&G zNSYg=CcPLrE(E3BuLx)oBa0Eyycjti(l`A!b`x5k)L8L0Xb2; z7`YMeC*Z}%hV79M03R<#c8pcNskRX#2dQm|k$XeiL)4lNhJ5m3T z?nk-A$nB^h)q$d~iTWI*{)Mw+2edg*v;#7s1*M!1LX13=qbE>&BuE{IGZJGk$cd5d z%#j!Io(4_2;&?IgKi)u$?1!mTAb_%{@LYlE(1t*MuvW7TsQS|ddu`&x+yX8 zStw5dFGeoISRzMam|U8k^5t`0y)KdF|rTdS-^{t4`Ym%qn(k9FI08(}mA z$c#Zf+<8;CNHxbf9piYA zQ{&mQI5GwAevs{hv(?e;V8dyAHO>Sm{pehF08W2O&H>rsI4@yL1j)|G9+uhf5r7!^ z%4?jE#K`hvxL*J-MqZ3@wj7C((=aB<(ay*X7;8bYGcsHr{+^g>8&F;}kJ=PMT{Iy=}-{F$Yr5kc18xv9>s`}tJQ|Y$O#1850agcfymCt zf)EoUpN9GrNOndB5-$cj#*2|RsaA=RuRxgz!p_LRV`pTrlH~DXMKijMxJ3K zn~7G^SKb+UzUq}2xlLzA86;xlu$~svN$m$Qa(Bv`0Y7#pW1Il|*bUs&*j+^F1%OZE zTgkT`RP|3~;%zu1C>RQg)@WyB=vd1ASIr?t{?5_K6i*Ok6v~uQ(w-tQasfyGaV*t? z)XO;MVsw-9G|n>^kH~o#=TD3uxqF@9%ctoy9Om^DprP>jUL4e);f$(n#zKX*xgrCE7m zWZ4_GGctD3ScPKb<+O7t@M7dpjKP3e>UTzlS;wyx&_fd=7lotzbsrr?jBL;URmDi- z6uXlsLyTNakGvQ;j_SvPWM|~r$!&n0k-^FnBNto9YtUZ>wf77piIFc+8pOz>!r^=| z^2^Z4zYrt8j^|*Ot;3oaxr7Ek1j(nkGm_H-;bO8;hLe&Q=|1MHuA%6Am|uZZU!0vz z(S>g0w9GOq zPmFB!7AGVz@;Kr;gJfr92w`Vruq-5sk!Ql~2@oSEGcw~Crn09raDHcG_-g6gWTnTD zX6tCCQjENWxPHKkks~k$gJfr92xMnutRlJi5+k2fXSFkO68uL&*clnAjiMEUT7ROZ z!_LT1ya_RKuTYfYdj~xp+~vl%X-i_{Oxk$?cro%*j3pr185v^IJ|>Ehzf=CJ0whK@ zKAE4UK~B|rF|r-rL7;U15WZP4(n#!#40KZ#xvGc1LmwqZo=JT@L9#P4cB?SNbeR57 z`-(0d#z^dpENH=&zz0LU9wa*>1BsoH1$3=(PF+lov>bjH{5wFhGcqvQ85t~l#IxSH zauFd~8lMdP3596A(}?VhEDWir|Exl^_Bj{&Y>=#dwhhdbGb_o0%C*lWa6c43S^GRK z1{@QtLNW3?$g6>0`}`eaBk*gV7MteFWaZjt-BZX7;MYEP!`M}h);?Qf902^oDiUb1^HPysdrSMDTxsU;8u` zJ0nA6L z1IfGznTlZ=n!P0wc0BvM{8g z{tF7xBj|Q1QyKS2O(IK;1OLoO@h^MDiowikUNd167Z9t zF~+ulosprp`IEqou`@EBRdV`KIci1lp1@B6W3e-`kRK+&;ZP3~U6a5_?2Ig++ax$0 z>S-YP)Vw-mcb*uzYj}94+@G2gV~U4-$Vp3Kx`eokK(aG3(9&+(&Xo$&c#7`=$<2zfkB>^h>^!q-cg*eGcu6)YkDFDF>)A$Yk*Ir=P{-NpGa+DrIW=E zO41sNmx-@LI^=ZzP!#ZqbQVT;knD^M!D)Vs&3k9$U6kLb0433Cj0!orlh*FWfP$LG zhDfhJwhLc`y)!e6T*$7lGcxw_UG>uLtF5VOACT;fjGghEkVY3#e6A=;BWpF|M6uMF zK=D1mf0CV%A<2r}*YHS{50`{gc^BSdRi}HGPjz333g{{lXRPQf?{_!P2;lsizJ3Mq6U#pj5x z6dH|jlN{ZP?!&kT_cYhNNMyT#`|)VMim$<06QZ?zw_@! zc8uSv3#IXXZ;A5@!Rvv)7a5D4k%jz_L|dG}0~7drk&)OLSwOdhY6P_*@SoCI;b*14 zB}VoON$gxlE{DX(UG(Ff7EJb_#@$q_7bCBUGoo7{4ri63QjBZ|^B~~G$o?1?%8?j( z7sgnSQ=k_kU%-1FBs(KR#Tj=s<%p4Qssj=u--q%x@M7dfjGsVh@9=ZVCdA0`@nkBk z&B9F5< zF|up8WwJ9eShm_~V&uj2>LTF9$blHw$dMR14&yGs6T|O}jLV=mG2kXfJ_X@%PhzEL z|2#3kx$#Q4IXkVF7|@TBx1cQqssG@7it&k@t~lRetd`Rm=TD5^<#fQw_2jDsU}t3L z|KAcLM~BP9%jxMv5F>vKLYs4D*?gB6d9Ji8iIGidu3SwfJ0n9-+O0-FlNdQhMD2{+ z2U1HBy%>3H6i$8<(RN0j1mSq##mK%G7lNE9UW^=#cO&p(PN%Gcq_;#K__IWn4c326jl6A}YnmFE#`* zat2~#(ZBghPP0|S$P+nuIH)2<-pYZII+!m;zR7`^pur{o%DKK&TxDluoin*}f(DZ) zedX5zG4e=C+JM~4lvWiZPe5dJN7y3$2b4>Ue4H9my(zkus7pYqC(iR2Q$W!j$b=Te z>#h`p82KDWS5f?#_>*y(p2ZCZ8lj&V_nVrW-g4CEbW>vFQD^f-7I-nTKgNY}Bu3tcal0JtjC>R0HIP%h z7bA;%v7EsXFGjY;*#~$rvKK~o(5QK6^;{a`c2Ruuk5`W^A~}j~e(LIybn5sFZ%9n1 zPAR&1mfTZ|ZXP(G#MRs3ptjCTO{pE=wyhK3HLUBiR9z;m1LtUOpw z$y!JiiuxF*&40K~py*Nb7mLaG7>SYJa&#=kH-OX^IO{Mzlk+}Kw{uu01*z9@9>BOm z&MchoF;;?{8qfa9kq+nbTfHD#y!96DVT{qB@m4tPpg200EyJnNo4cN9O>mCKIS6<$ z@{f*|+5HGWjO?_66OtG?4ay|o#mJKL_#5hSBt~|`X$!m+0)x5$}gk7C5gE0)uS#K`># z*cW&)(ugJ1LQIT29O_}fi;+ezb(85iJ0rJMtr8fkfqluBdsP`<@O?pX;EIu;17A!;R`rT0LRrNw*h1j^90ks=oj3q{%5Xa?Yoe}SU zRK5CceG#M!MD${$@%XttM8v+Vto6LbTnm4IkC7PJKh|wlj9Jrks|wnY7&!|5NZ`dt zBc|QCbjQTV`zXFg)w+yEVMwg^3iWyERu?dyek5Lm^c3(T(V!12SHO?NSs16t(MU|j zm>@?Zu>s>dkW*!TBwAj~udIWtM&cxlj=+nN)-tazjD1jMc`@>Losq=I3DEBcUW_zi zx>`sSBd5ci2D}*g8pf-DbCnor;YIEto$JPWPp+aBiIK}7EdgGPG+K$LMKSX3*h{nW z#K`+r1~Jmg($1_xF|t-))+c}$BO75f1k6&2k)MZI=iE$sXkw%tO}oW9iWs?^|Er3T z#wm6`QHB_Kh0aYoBU@7aF2IYC`*yb5kXdxf z9vUxFclCI1m-?$|OJZaf+Bp_@F|selg}{rE7L#_0iDKj!%5PGD#K@;H9tSy5ycqc* z-eORCL}+reVx*B$&a6B!^1biqqr}KxsBb;+I*bw1)j~{%sc{K6IpB2|qi3qoZC$e= z)NO#*VT@i>jjrYJw(61AI9tHq9e5qaVv1voJtA4}?EftxS{iQ;y`4g|G;Sd!(TX7z z^$%5u);>>#elkebK97xKXjYO1m200D!aZO7WbLze4CofDLNW4s$b*1i`y7KY8u+zO zi%q)=8ChHVe3asc#Mj#AD;P87XzgS7UCQhPu4cc`+x)f9%j3D26;IyQK6fB^d*IhTjg@w0MSfWO+#l+`qH6)&NSSCE z-PS&jfqE23K3S5Z-_lW>7#+NSuygw_-r)G9#Py{mhf=! zli*6~yBzpQV8paD%R+1tjDR{^bS>x`DHAQD+awqV^)BEifzgYq(KQJUQ;#$Wrof*J z{3NiL;usS%dQI6CYYEXLmFX&EV;yw5SRVnd$!s!aU!eqQ6w@$n@WpAy6 zreqrlWvFOMHlr208izousQ;*FO0eglOa+M;*)EqxPhI?JK ziu&&?$9~v*FGXKe-n@9PdSD72b<=R z&zlePMh*usJ2p!oI+KTK_W&z9|O&@70@bT`b5X3CjmtF0zRmR!U11YV5X8l#RJiIFWaS^%CH5+gguWzgLja1$dB zgK&r^u~M`)PYiIb4K&2a>m>#>FXi=n(0YQ@b~t@8`pBt+b3Mi&Ia!>s7-Qu8L2VN- z?gy@PNjQ_gB}R@9mnY>q(}^HP79DQuxMtaelo+{Q-IN$Po#v*gNiRnJBLwm8Ac;qa zk=r4nc`9hN?u2yjyK+XJmJ1r-)j!ZnzhDF>?FhD7j|B4Ps>TaM+8HGlNq_j2wJ-#<`8# zxwg9|*QipAys&<`YxeUAP2KB=k$2MMa8N~z{F(zxbufQtdYxBma$YI>;&Bi;;KX-2}WCxd>x{9PNzUi17nx^i61W{crytG4iJn<;BR! zt&$78NiovS%DGBQY3#+wi8@1xkl76P$ySl)0n?JKPd2lx+gCSj|s4+P2VJrYe2cy4O48MFv zjKs+6IJ(PVauK91#TkmxPfl-~br`GUbjR6m2n#77bt29XjH^LT6=iSY$R~Jjfb3m3 zt%tIM4K#ijXCsu6bS^s)=U$GE0okcID=`)WFGjw+hh_F|yKvtI0M~BPf+)1i!KzWlt86Am{7ehH0ctPuKjN5@1 zwD#OH=|L4Saw?@$KoBD*hkA>gS@tMKj4V-)B}TqUz#G7ekwz@37Gh%LQm7vTFGd=@ z)SW}m5hEW_&m~5F1LZ4_h>dN+cT##g;L~^}`Su)DwcDCZ zoP{%uf+?VAJ7mZ7?n!gJ981k1M()nhB^19YN@tWQqwp>)C=w%Y`eU2}a;hkM8%L(#O$22R;CM08TFbN>y}ON^`&PMRnCuAC9?e@s)azFQZKM8yS(7->BITxf`h zeOXzngT>T^U*=;ZM(!Q!HY>)gX?m|>Bu4HCzbWuyq!H7uDcvzKa&L-TsaluOD0GPR zwo;#$ZndEuW ziEl8L0WU^c%c;CR&?`O-H`KW?LoXyo?mvpPO5nvv3rSZCiDKl@a61AoMxKsw8sJ#lR%Sg&<4tw@aQ59vbS#Ym%-cv=)AyT&VJR-PESTT!|5?~JrE_DTePp&0o9 z?TiOrjGTfo88AyFMvf1&&biC!p^1@pls|E*qll5?_`j+cX`EvBBxQ(^B|0~Wk@Kkj zW#Glg_2Frpa%Sa;k>79!7}>B6UF=TLwlM1`;&_~6F^-Va0cSAA06G7{ znSt>%$f<&CZ;q_QTLzk3isN@iUWf51#h2vDUD@?GUW|Mz4!2o(Vr0D%x*;*L?#)b6 z;Kj&h7(0N{FGB2Q#7Lv0oLS+-_0GtZs$OE`e$=)P@M5G9)73(v7{6eG_g;9Lb&5hG`{v^&08d1BAR< zn98dnxi%6b=c}{Y8Tmf^cR?aXu8yr$S}~~gPXq-q(uy}BMrPvltFImp?(!f#_G08$ zwDUjU#mMX!zPkV~Mp{hTDJF`MJ5#;`@M7fQ7>9tIC|-;_AFmfEEe%a>R*Wo68m9AoSe$$Do>AzJTT0{ugUXuZ=yN}?4*D(Ww)L5S8qzk|LS zBx|2rhW@9VSvIXqhsoT+uz;}kxoZq)9IQeyavR9?6r@*F?Tpb3__a@qO}m{LSzA6o znBoJ)*V^Yv7+vIO`TT5*Gl5_GwBU>n*4pPwx(ZtRyc*8s3ewu=Sd1}pwDvgx<9^_3 z?iG5Qufyyg&&8~G^0xN*9Kp{5zxHV?-Ygm-BR{Ntz6tdW(Y5wzB=*l1&~5GWOQ@fN zw?-f3Ertik2DE7z;6%yBrs-i zjENb&rmRFEngm^;pQ;c|0t?|C*`b*jQc?f?e-NTc&Dy_ zKM9PLuFemW;9{s3iLOat^h~s@dYc48pxywIPtBu4cISza8^Sk`lsj2-VodS)Ejei^ zO!pCYC-4fB(bBFTG)uw-6wd`-VKNFok?P`;cr8_x5^p`6wZJP(#w+?i#?AvwiehWS z)iaxLWzj`IP;kX87X>j#R7@C9!H5dxjHnnf5Db_R42U@gM9d&&Kt;tI5fnjw45*mn z)%(BS={mKuyU61_&!^{ff2X>-yQ*ilUS>CplW$RN-xk<3*g9UrN)j@{2{t&>ZK2v)JD8!B$842P&w43&e_ zl!nU6cveC-RNTi0eEAmDj#@Sjm2OzN%BJU%+nR-8vMp$HuxuJC+hN%j<ySN*+*N4mkArA^tn10HLFD#gioAIrP}^hef$UW^GCp_y6^z_AP2bzNmV%Mn z>c=}RnCwf7d#hE0k-Mdb!DG>QJF67+F!DH@M<9cdHxZ0cqHjh{BX|bYsL){K|B-!$ z3`Tmx#qcis`DWzj>VRP6|FHay3`VYYJ);*@Z5n?DSPYCDm`G{ifGU}TH547z|D?lAHr4DXwXm7;q}U_c1J zX~0cgeHlTa&)D-DwqH>80ZHWzOl*|BO0qmbYbDQ;tVOVflE+ClCfE@18#-eD{}qhv zA1@C-lyy!pa#{p!A$a5yQZRD3x+xgB3y15eLmG^n5sM0;hu8)%@_rfh&B%V3`pRf9 zvM$lEJ~BFt9D?C2WH9muf-$H@7K4$K$sR=pBWDu4hjAF!D!i z-^g11ZX8brBj=V3u3hj(7`ZTRHW+zsd=xf-kwdR7hRY~;vo>FfsE3h%c8f6b!;34! zIydr>95sNE=d$5MZ7hY6&$3~nHkN)f@>e!|iP}zRTN5s&;RfG~+~OwQ^ikXYWACi> z>Kekxli71Ls`-t*4PoT_pUIGKs;+7cBrrzD+QJU3a6}Pe>}i z;y+)Iy^9P+?ic%63>)f@6T9BqmTn40o^lHxWRbzhn+V1z(KjPsCU{$YVB{Pu?;(ScUGCy{s3U`sg9wgM zA{hAu!31P5vaXf4_JLYEyKdYHv?dr?aX0@QPc`~xWEYbEAOl*@EuYskfRQ`0cY6ew zIf73eTg7(EQsi&Nz{t@naty)9Ln!Ev3`TlMMUxVTktbq30U3;RdsX<7o&zH{P^*HG zL$I8Kau~U5>`4|p%15HX$b+dVfsyVgPhNj}bQn33b}v`k3@^dRy;AGH>-wG7e2#h{ z70ZtWx>b~D0ojr1|z>nqhSpi zt{a-e$gkNyAKATYeGg9`WcTjV#ofDg*!v&Et9>8F+a@&iMps7SUL-x)u{|o=2<$j2 zo$lc}958Y_whmzTA+k(>Ou3~HWD$(~imk7*`&pEILbB$)JcCg7Hp$5ZM=E)d^}ZoB1w%Js{Dm5+p}eJR9o0I!bm?_F&#I(iO+9-T8DTq&Y`U{#k-^9d;=3_lM~zVl zj6B^-F2H^sYB4gJ1S1b)Z-kNK;^tBqxlQc)KfuVIad#njl{`+;?g8dK%EpuQBG>`dsDa9l*m4%x zAk<+2iNVMp2o7R*p%XCjM-qdP2gPHD;8DxiwRY!ha(hR*AsBftE!~X_MouP}gsM)A zwM&4JZpng2v30@7L95WbVB`#1dj%PcbYr1ONrI7|;GHeMV5IwtDe^-k82KIEZ&5vr z^rEsRMF~cR3B2K}r~!=Jy6$Y7)!3r$KAjO>WF4gn+o z$DKKa+f*Cwk1+Dcc*qb&Xn0((+I6e)E}gy^xjuF4A%l@U33?!dkzSYukNnCAM(#x` z1|yHbe-z4L#W7OmG`*dB6W9gfb=Wv`ek-^9t z2*x0TkzP{>s!1^NDfUlNfxa0zo8Wy^Ba6Yv>_HY1*-|wo9&(8=(oI?Ls7t&eT-9&a zppSx)9ci-;8HaHr-HJ!>66Y}8uy&PQYng5;rpWESuGs_YHpn=P+sm5RwZ^%>dZabZ z{qXODjKg?Md8+ZZNY*09H)BY(d3IXM-Kk5OY7IUe&kWNV*K5llw5_UW~Sa1VFZ*FN82_Z#wS?Q zh_)N9$yo|UUW)NzRP}qbED=UN8Q;~i;E}&YF$sQLn>IBG?x4NfkWB(N7Mhg!BzO$# zBeH7}xV@MnKY~w!7qL!5HVNEb*2Jz!&`&+mB$$PNCbCK3HRY)$jp#+Sqt~KDli)k- z->O8Dz)LDplu8z~IYcFz1mzF&5eem!U~0Nn9{G*(Nze}O^77}C;LTVNf=7)3Kv&G2 zkxhaf3ARTz3A`c;(@Q47!R+oUzb3(Of}u(@2}Ti&L^cV$m=Q>^CP6PefL96 zwz4f~GgUSXu+Ol3jB*$`DxJXo=F4GZi$}Re2$Kl+&FM4Ri84hPxdVnRkPW2M2~I*b zkldez5%Ncp^Z>hWl3xQUJjO4IQlf#h3Q2opFw%<)R-9nue(c`~*&rH6aHkRtqSpzg zqv{7^H;q5u7Jsm|WTl3qD~FM8&%*ucr9W5ypsAmb!ASQMa!(va>pZ?(SQ8nHbW71J zK6DOY_W{UW1|xltm4~Suj-hgnK4WXBjKVik&FR_YwuG#$%}vT3Netyw5`z_y^xw;ID5Dj#9_5arLJ zFXKhbf=Bt;)x*fI@qQ(L{w(?>O)HNYKa0Xd)&?oCA=HMX6|y1Z6@KKN{NQiodma|P+hrV{t>(M zS>)T`>v3;-c>BPaNbzIHo<;5gsWz;&pk`s6iR@KX7l-=4 zf|2i}>AMQoQZVvO4LvQGd_#*1)vCeBPogmk8%ARnRw?RXWHyNpySNQTb|dMG3`Xup z&>PjL&|u`5WTzv8k=}4I?8SayS1JUY$^*LEfz*Le}ab+ z(#v4vN~z8x+sA+O&B(*K)&?V2q^6zfs=CG*^v^JIt@xfK7&(px3^q1`kz1E|mINc8 zjE_t{n8m0(_RnEt7kaf0G8nlP!4^scBl{BUhj_;jjJ!Er>?6714kJ&%aIBeFDe7MW z141}M18(Z-Hwp$^&z{S$U4pVJNNyk)t7JIIc!F_CP9u4S;3*{oNM0j&6@{v`;`kXf zwlcpWBj?uR*^LU>9)*+b%y#NJ_LJ~kG-u%=I>D{l4tUt7W&R8ZDf0O)7`Y5=%wXhP z4mU@KG#Gh6EGmQ-fM9}=o5&~_`4gt^WHcE0U~2t6868Hpnhc#l1|z!?bVfC@7>w*i zwi7ZKIe_38#LHmhQmM)7)Fd$SF&$gqj2wY&n5@-@#qne?^2CzCH4|@yk%QxAgOM%b z)2IQAJbN_1qH_JZu*_fi$Le|*Ib!z+BR>a5PUVn~paw8Kekxs;5{wVQ}?1mp9M0G{M&yXIFbE= zk-cdld!JofQn^0LUL!f3U?3{{6-?+wtR$%j7};hgU1jGRU`2^oz1gWxA6f|08|%ZD(u;*;^H%W$xN z4D1^s!fv0tPeK!tYy%d-j)19g+ko-;X6Dm6j z{^B)!U6mTa$otva`#JvI7RqiRd5GXfC0CKG_&oO)Wg|!qCfG;Gxg-w~+=Xh?P~{}H zluzMb^|GaM8p+`#y-@o%Nj}DMH=V0|i)1=mpF))%lPo)xH)Rrok(X!w*s5vHb9bk9 zKX1Yb2}TaWb__BY`2xWcO7zXhX4Cj5SxN*WcO&V63`X{kmnVdc)!Ny08*fZ&f|1u_ z8I25Ry+H6hGN2WTc@G-E$dB1O3q=@tZfv(Kc;s)zz{ooFSTOQe3VucgBi&fhq{Lxl z#S7dZWH8e0RiP(62S!d&&jlk}VQGnS7cGPk?tr@UVnRZ7`Ynl zuA;UXUV@QVr`Gq^^*gWmaXL4_$c=DyLk1(=#sacB8^0O32fKH*#tcT@p6*3`l=l@F zd5hW=j69BlV^m}?a?OH|h7mgc&>Th%W&at-?%gaUH(|u8g14bUm*5ZrHgZ?4@LNlHMdcpsYQ~O$4J*jT)-ln=P}*-a@s9kk~gP{b-1H_szj@ha z@m|zSXPq1wjP#Q7CMAAfI$&K9agPNfKTG%J2b~dr|55Ggv-LWd{v)HoNcWYciqx0S zoA>vcE%9$|HG+|4!SA0(sb*2fNvaWy+ztOO$Y7)!3!$v09!4I-?gP|pDC#b>PVFv- z2^hJY9(%eIgE5_e>`r`0Fhhy%#40cI7s`;`i2($MDAApGf?zzVQDb%|z9ah@Rq9T( zdWB1i3`Y8qvywh&WEqUSV{>{T7WgYmlT?mBp7)r-a*J<t@qlJqXVwMU<4ve!dg#GEE!${v+2*+tF-;6wm|2Kq@?kNu=*$0fQ)42&oen<0PAcK)F z#&_c^cvJ!-%e`cUSNSxBTD%$Uf|1{IiV;RGjGIeg45vg{1TAnLF;iNVN22%cs46+6_0+CxbUM&6Wew?`!~vddOZi+ht6T7?_Layd?#I`-__&u`#eLL!N``cG2M{C z$gTvPk-DFoFd7`X@gcU6I4IuWvPs}I<*BA*64a?gli+;p!&Rb1 ze=n&>Q7T!`X3=((XcCOYJ_hBJpjhEgdymq6jo*x%fOow7`6O5-7O?6Sqh(`-Go%+W zPeC>bJ|>ujY!Y}y7S<}61i!HRJNY#UmVc8eifj_BL9iOKN#Ml=E7l~Kt*f9(&>hdF zD$*o4grL6?O@b2%PC%i0<=ETON#NV~73=A&@{>vA=mLt*LpBNA#qU>d?2nV+daT#U zu1Vk~e!Y4lyHA1#u|9zESM`c<;FiG1SK=p-ENr4VF{*s>PMov|)63LNMMjw1RtS4x z^FjC%yT3(7nB2loq`LSFyq(pQ243A;EKVaMOztZSm&v!N_LLp5X|U~rWqa8)*xXhg z?vQOko84v806QJaNhpVrZ>JM@(tJ6Lyo3EW$&<$OcmLxA~-v zY#_NGY$bmrN!zl!8?u3PHNh21^faAB@GvqM>BR*rPB8LY_J5)R4WjPvFrttRqC*J| zMAhHLZW@1_7k?19q+h&qadhP{((PGjz6`ze=js(SbrCWc>7GLFiNk0ryPuXt!^kZ~ zv-r^YmEGSXdl`)MK~^4CZIRNTier}6eC9)xOKf!&-hLBfeVURi%htL#uKPA7O zMe_;fDbW!6k>Gn|&mu1_Sh0rCQMy2S7Bzd1vqm?&6E$js0;D9fb7&*)@pVR7{aK?*nQe)&a;~RsG{o|5q@w zWm=&;k83Fyd7y@#7EFfG;t;iJFtS55X5rdse0o1AG3Y=&owwlB7>3B38pB~ zHzU6#_yX0a&|qYX_j%hx1|z-UVtAbWz{ret4MwhoWff#FvKPTlsA{SB0d6rcvU@t2 z`Y69BEw`%MRNYPAj2uW)15gelcS?mG`3h(Q7N$fM(x5{%rK zC8fo|$e|^kCBeu)<0F#~W-;>BR)>)<(5tD)VC1_5Zz~au{EpyT#5;yyhKd*bm_&4Y;YRuPrFln>`(|)uC($lCA{nD%p%=8-ngi)+Ompu!oY> zNe&_CkN6E8aqZ(@!N@N0@?_yFIuT*yRS~p>;E_*A!N?n}n{d8UIou!}(qQBbv8WJM z7ux_vz9^$$& zvS(`Yk7}9(Ms5SZGZ@((Ya0}*?}+2cVB|w3gX;*q5k@{4Hye!X6(3#=VB{HB@TYAl z=>KW{vAP~cwmLq-$X|ew`*O$~Q3DuxFB`7c#?o&_e#wTp+E@xBSDpzqKy7#VrFppP zxJEGYNcJ44y~Ei1^RaaeVdRbM8I5YLW^Y3n`5BP$)4BfhzA8gT!FugBAcI zpCXvauD4L_bdt(<`A_XEFe+ONMt&Ll$!`QzKPPsbx+mQfjJz4!b;w}kbb={L1S5YW zSg1rWa^>0lO?FhHdV`Vsk?o2MMqWX1krKhk$pjCh6|3jvSLa3!_U~b2t5{_)@{KR@ zCKd}L{j69{O7}s-m<8#_TkqDJGZc)RPgmw4gOR@w{G>!MvixH%4>B0(P4H2(QDY7x z+hT2l3`VX=usY)Tb30FrBV(rv;d@=+X`T9N986_T4@{e?YBI@af{ReuU+@>NDO!zS zJo2|)T&_QeOT^6IgI=`_9P1)#cu0wMh>Q?1V*}}JbC@?(P89d+MT4f z8D4^s|Cd_7M%VAW=D({Kf{`WcRK+!RE;B-N41&yM5WaH{#X)9LC%GH1*{% zjKp(E2C-uxDmxPF*zvRca9Jq)#^HdGr?7PlyDydH1jv+I3T6?EypOFvv-?Yw-9)nI ze142Y*(j1539eLf0m&Bxvz44p((V8FcZsM*$EtjsEd$ApK($jy3`Y9Vis`uNO?-ay zEBA@_;&y6oMFu0iq`XOq-wfe?F!ERIKO=*YUQ%dMl3--@7u-E$FmeTgwuo~T zjP&xdaF)*X&(`zy=O}`a-7s}V1|!{8VYUP#2d69LQ3;HEhyEIj^nHckQMH{@2-%%m zRyJdW^k9zD4;hRcNH72~O9dmJi?c3-Yv`fFNZ-oWW3&|*Ihp@Agpuwk4>Q;Yj2y3X z6O25c=Fdh3BU^vz^U|Xd7&*#I9>o3tYEc*Mf|2L2H^Rux;^tBq`F8C3KfuV3;_gE5 z$e%|JBd2h{=TQDCKNsXQDqiwp_=J-ZjC}qm&gubneT4IEl-)+s;!7?k%B~^lL9n@! z%Sg^3I1$yTfy&8jxr^*3)Zs-EgOP6&{K@VW4+BQNLt-%U+jP41BY&Z_pOC>wHx`-_82O`4NHB6!>NZ9O zBi&dC9(hTEk-OmSiGY!FxHGlC^C0_FH%>6}*LcVfR%1KF;E@A)mrgM9AnFc41|tU% z3_u1Wy)Y|jB0o*R$P;MAVB}T!N1+@>E*(F}hEN}+qRnp5p>r7NyB7l^SBY(8VFUH} z{60G$#If|v$a^@>9mrthiv&}U!AP$uSWSYF3)nwT1%ipV$j320imEP(mLSIyN#Mpp@W@Mi63oH+vFw@zZYrk8?LG;0}2v3ExKBn(YkP&1n=Q_Lq(bdzY_ecM3bQ6TMmsv^@*|HrIWz7@o&-7S>>mn$k7TE zw?#Gy+{LdnXzY)ZpbOS@WY;8c6Zo%@-6z3zShq#_tNOS&x=UbWyZ8wt3#VvKj4I#Z z2u@mr=^*O%MMjw1#$U6<=7aDeb`M8JnB2loq`LSFyblkjDGj{G@Jv8PnA}$uUY2iB zZ9z5-wz*hl$)>^Pw({_)Yzx|atcj%o)_f5k;!qAFJEjx()qFXO+=TtzO$-x^ful_AKnAUix!&)$jSx ziVQ}&r;vN%Fxr>hd&;6=_F@-3>}>5OF z=Q}Wsn)d-!{v)>w*{kZo_*2urf{}-&>H8elQZVu>jTbGLw4udTYSm!mfb=kUCmMUQ zN>L9ZJK_xdk;4hjMl~ul7mY({=J_u`qHYiZ(!c8H}8e>O9JOo_{m)T&)NRMs80{57kvYAD>(Q z3?rY2S4uGQ1sYf!jC`xavm_X~b9`iG!6RR7br`unz1kNUj69m)NF{=i=MxM^ykiJP zuA7!Y%l>3t^5FHe-fX=N!_{VDrRdEP7!X2hZ0)A5K2b2Bx|%<~hwU+x{SVuV1k;rK zNb&)}drCeh`GR19l21r}CHNVIswd)^{3{qaBwn5@tWGB)jGP}qTL>Qcd>4#d8#ZR& zjI92d35;?W`E@KRghRwOfRVjr6pZYEshx}lBfBSXa*~V=Be%k^88R5zmtY@MBa6Yv zGssRx1|!E1T!nZUj2xRfyrG%|M!unA>zk1eW4mA0>Yw6xG8mb~CyfTzk9Z@Dtd5%v zM&2Bg1~BrJONwEAu;Y;F`P)D}jJ)ll2qVicsSMw6$d6G27`f#y%Y`ne0gOC{4X0{j zDU5ua4fmk7ojz|Ky3ufhZ$|!?JwIsg!R#G2qOKu~T<=$wPEgGt_BMo(m8&it!Yls% zbt(G=Baf$rtOL7_qUs=&wIaEVU@R(|3nuiUELagRGJCB$yv6R9mdw z&Dp&vSr^oyEs4R%)hqx;b|o0Vt|L(G79^EB@t?cNMk9lf&0;@`;bHZ2V%ObIpqqk` z>;KLNS!6KsK!Sag2u6+|7@|Zl@^OL(QH|;iMt(~+4;hSH^$&W63`X`M*a5BBDIRrg z4)*V1@U%`}T*%=Evu7rzH&k^J$(nz1 zolw~*_>0#Rtwu2NeYT#>?&DGR3dt;jmy|q1vi*NqCq>!AB$p5jRdO%MM+9%88XdfH z9$VJ^i+|OND!(PUg5V6){tuGhusl!aD*q(;fvpQMMbLIxvGCm4VXM!uQuPj9t$cHN#Q(wbo8 z3s|03jebq*B7%h|2U@S^J!k+UD?_VLjv|a)6x%He9{F1_FmltAIEG;4$`q`G3`V-K zqDhIv$SzpdK?Wn;UKI|f=fKF>>bYR#R#>(`IgI=(_9P1)X&mZRyVL4b^rQqvx}!XK z{q50VWG~v?Rc$l81S88|&94PN9qRg>*ZcyVn_%R@xDG@HBi&XEm#VW7Mh<58Y1Wv* z$d<9K5b7fxClNr4$`+8EO>m-;k4dHzJcVl1P-SacDKEC-Us1IR zwH-+eM*7i;>A2}le17u|gW|o|n7R#-!ALLRk7>lS@e;o;J7V1)agPNfd#C%-{7cS= zzyGLq_1St~Onb{{Fw%Wxslpqk=1i|S3jYySBN#a-we3-=S=8}u)d)tOj{j6-Fw%{M zuoB&I7&(I77pPgD5?s3rQoHM_&$E|Zhx=)F;!aH0A-fZWvR2_2CAt&4l5CCaPK+VA zREh4yX9ORh8Z~BjqFs5b&>B_hPHaWc4H=B|Bl87Md1j(xz$O?7U9k?m-{78#7(@GXA~d9+sSUfUCzujD1$Vc!M*`4 zoPhI4l+}{lL2!eT3X+)wZz=hU7HTS6g$h)o1}fKP_hw|>P=^gk3`TB4@DaQ39RiHp zmc(FWO?vzEsAcRLzoxb4>2yOd@+ew50vU`vgWxn&wQ{Uo0*rJE->ygp%G(DOChQ|e~bw87L=>#Kxr0#oUFtS+{6Ac-R^uny9iM+Fdk^fa^_07n&@UMY# z82O)cwE8F&ZMK#Uox@1qy%-p|ZMsOysmJH{`H(V$ky~(_O_0IJz6ARqgOOfS2&zdi zaxnW(Q-NUQ^#oU=8d(fRK1VhgRqYrLxkMQ0rYv~msF16A_1W}MFmf*K%|XUt+*oK* z;vD7&tl!D5wM@4cQ{+eRbV6Rk^di_Bo2(m&>oU&-)1OQKGfaCkQ4YTl@6l zq7`fH^Lw3=);{0FGebpM`}~4nffB8K{z~vO3e_ja-j=R?o}SLdqjd7V_PO*@+(Tq* zpYAFIkCH#GeXfjkCE2z1>84_e-0o|i8)97_HLAgm|Ju1VmgVv5}Eli+-; z!;wt_x0f}sYZ6qbN16m<@sB|^3B0B})ua)CAe6LCc*Ut*P&2- zW$bt9B=Bun@F<CG>b^lnnA}zf1F`ua?67pJuskxtM{@Ot9ufs8P@uZ(|JgKtso6+^LUu$_u!pllj!ZYvMZ%C?}*F|uiZ-G=1`l*7nv z(h0n8zWmAhI{T-~lf%ef>2u9DGDR3!(Y#goFD4sE8Hv6Fw%?pMKcs97`c26&lhBa=oo^-lxPrLMsOjj?jO6UF;u;0{2*+} z8}ZJ?(UrqUxAQN9)Jq>yPtepO$Y7*<_@_Yf#AoR@?EYL94I{Vk&wsG^&{?@ftFQvH zm%&IMZslPsd<>P<^ch=2We0bsGNf5 zWMo6deSC_SZ&B@w!{bo75XO z306S%Eb`)l6>A6$(*@GAs2iTnD$=uPFM{4mG>i@-I0S|2iHms_`L-;0lpfwba89Lo z5VB{Hy9!PHaS)BbdV%a3L~bvp$eZ^8H5Tg_WUs0><4z9eFHaAHhokX>3;4L5z8U!(&dJDNTddGMI%aJKnOo;z)fAfhoI0@ z_UwYKC(0(0^d;C&$vBeZ2#!&5Gs)QmgOyxEaw);ZC{)diXY#LLBkijp||Kx_3nwxg0QZ7>7Iw zHGq-tu;B%5Ed6F=%jJ0YMh#%(&TQBMwe38!d3f&5MlkY9_FSmFhqAW?ds`he6WqIQ z)@l>3$V=>b8r7W2-i9!;6Oi$_NBrhq&VIqjKkndKZNsj=sQM9Qn~-eOs#RDQmF*2C z^r9?S5is&pwjROm15kE6$t?t9P>mdw!`Si$*$b${TSqzV=pA)-&di(RAeyn2ZFDa2u8MV!*xUkBX=g)4%MjM zVB~PJ(~!Z)CkP%^To{i!k%Rqv82NLoG8j2wa(;mq3nTrkLa2{4j15K} zbtz{k7+JGC@9xN8WF0{VC4!Ob5_CoeBfW{NNn;Kpx5c`(Y6T*X6j0WWWFWx- zN_vybB6v&54kUH$SV%$HmLw+-9FA(#P~~ZCnMU>~svJ(T>I&>a?XMvD1Iuo7u5u*F zg=`&+DsLcplVCD382QZOKC(M~#B+D2b~jwX2?<7aTao7lG8lOt!Rbl_Bc~HQqeS0~ zY~G%hq}9P3Bje@apC7BWv+L$uMr(qR`(xP?8PGb9U?UQJC2jC4nN^7`AO!^ruxJ5OyhyaXd(NUfiy>vvxBmbx2)k-y;j z0U3;RTQOX&&PEuyOa~?aqNf{D@lLuI^^p!_FmeaAD;U{{g0)m+Fmm6CJ{s=S@rULx zvOD`XMt1LxAvglrz1w|p_ih+_hag_{5e!taC&^0$Pb%4-q_&QaWhmQ% zqgNc`94Rl8r>Q!$=H9`q7H%xam!Ne)Dl7 zLNIdWRamP;1|z+s(4-{6$PMszLk1(aBiI&ku7Z(XUKS42x&GPuzoR*dVB~?A_CW?C z-Bw|?1S9*VE9FrMjQocF8jSRPh2T+R7shbw~4!@RT>6?*nbDYTF&EO_LokgM8pEPWJ=JeBqa zA>%M^iYaotuYJCX^<|X53`X{ieF|YiO{x)X zkI{e?jQkYiC#dS^XjvkR>=fVCvfz=wMKKB1;LX7%!Edzp3$jVzMt&)KEcOzg1kKju zogUdFa8t2~-6ugitji;t1a2>DV%H=XeFHtxBv==JXJnJWYsyni8qtetU%H+WO@bcS zw^4~EftOUID3vT|bB#(g3HHOj56UM&w{)#M@*Cwaasb}rr%CWXJin_* zlVIhw_@Iew5_BP02ZicAV!ul#fp5!#N9p8!5^P8Dw#X)dy9!PHaT4s0bzj*v3EW;x zkvH#?-~_D4qx@C9OB~%LF!GQ1j-Q3SH77=uAAB<>Ey6T{x?#u&liLd6By2tiA7S@+ zWQ55r{6wmY&%pcPCYsW~n}cU2GQ#A(vT&b#i)vStO@pm^ZJI(xnA}z#o|kPwn_o4t zG{82((iP<}vJh7<_{HJo%VFf9>_1SR97eWCOB{=2iZJqe3|Ar>NHYjtL^hDzpM{E# z@kf$W=)@1;@@pXVA=wStKst@!L}W11iwjnqVB~oA->3o&qW=;6u0&7Lj{ji=4OQ30 zZW@2AjUR+9xgy@VIJ$Be>GmwFtzP<&+Kr}mLQ^-AW7!70hS+Zytxus|pA3Be- z`$1$cgONVm%EQ(ij-m4Kt#PO+@QyAG$aUZ{4UcN=Oy>E#_WkoFQWYcrWZOy_^*%q|vD4T}LI#~XL@@LV0=~?7a zes=XRvOC@_<Mqpt|QP@-YZv92Jy29Y;fOp)7tK&^|lGqP9J$oSm(S1@whG<|R7 zatKD2-Nxn6g2~pjxRqKp7`a<|7(5z{hp|dg4M-&=dNm9gj2umHr4qr&2?XO2?-+uSEz&aR|8c_|Moz`> zteIFT>Rti^Likk!ZtCi9vC5eZX3tz~b5M2y$#(?bDmj!S>%xb4CHs)nk}QL=-AGm@ zSP6xy>tg@^6^!g3FAskX_LBr7r$x{ff=50f1tWVvzYIohz~Q>-kOm`X#G*pjR%`

_xvA~>_%iTatgsSh?l|0GgF7# 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�}<3tty6yw=uuGw*Ty@WK~qfhQ*#xRqp8 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

ZAOkwA`w0H+47h-ElN^FUtAuMXAsu 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 z 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%0D|pNNiWE&C*`sv`0n0p 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

T=S+%B*n~gJ~Zy;7_%E#@fOrH<)9N?Ad2QluG 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

CdhO>yFUp35bOIWdu3!gzDb3! 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 z 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%0Dpo)fZCB|TMkN6Sa3SY)6 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

UqKMvXuHQN&#~i!9C0jNa~sxBhFp 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�w!Qe7vhcaG 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ü*xRb3{9oO7Rf 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

Ah>qW|9=h^AID}S^3 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