# include this directory for the config.h file. created in sanityChecks.cmake
include_directories(${PROJECT_BINARY_DIR})
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory (src)
add_subdirectory (tools)
AC_DEFINE_UNQUOTED([API_OPTIONS], ["$API_OPTIONS"], [plugin api related build options])
-# hmmm, why are we doing this again?
-#CFLAGS=`echo $CFLAGS | sed -e 's/-I\/usr\/include //g'`
-#CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-I\/usr\/include //g'`
-#CPPFLAGS=`echo $CPPFLAGS | sed -e 's/-I\/usr\/include //g'`
+AM_CPPFLAGS='-I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/network_inspectors'
-AM_CPPFLAGS='-I$(top_builddir) -I$(top_srcdir)/src -I$(top_srcdir)/src/network_inspectors'
snort2lua_CPPFLAGS='-I$(top_builddir) -I$(top_srcdir)/tools/snort2lua'
AC_SUBST(AM_CPPFLAGS)
+set (DAQS_INCLUDES
+ daq_user.h
+)
+
set(EXTERNAL_INCLUDES
${DAQ_INCLUDE_DIR}
${PCAP_INCLUDE_DIR}
include_directories(AFTER ${EXTERNAL_INCLUDES})
-add_shared_library(daq_socket daqs daq_socket.c daq_socket.h)
-add_shared_library(daq_file daqs daq_file.c daq_socket.h)
-add_shared_library(daq_hext daqs daq_hext.c daq_socket.h)
+add_shared_library(daq_file daqs daq_file.c daq_user.h)
+add_shared_library(daq_hext daqs daq_hext.c daq_user.h)
+install (FILES ${DAQS_INCLUDES}
+ DESTINATION "${INCLUDE_INSTALL_PATH}/daqs"
+)
-daqlibdir = $(pkglibdir)/daqs
+x_includedir = $(pkgincludedir)/daqs
+x_include_HEADERS = daq_user.h
-daqlib_LTLIBRARIES = daq_socket.la
-daq_socket_la_CFLAGS = -DBUILDING_SO
-daq_socket_la_LDFLAGS = -module -export-dynamic -avoid-version -shared
-daq_socket_la_SOURCES = daq_socket.c daq_socket.h
+daqlibdir = $(pkglibdir)/daqs
-daqlib_LTLIBRARIES += daq_file.la
+daqlib_LTLIBRARIES = daq_file.la
daq_file_la_CFLAGS = -DBUILDING_SO
daq_file_la_LDFLAGS = -module -export-dynamic -avoid-version -shared
-daq_file_la_SOURCES = daq_file.c daq_socket.h
+daq_file_la_SOURCES = daq_file.c
daqlib_LTLIBRARIES += daq_hext.la
daq_hext_la_CFLAGS = -DBUILDING_SO
daq_hext_la_LDFLAGS = -module -export-dynamic -avoid-version -shared
-daq_hext_la_SOURCES = daq_hext.c daq_socket.h
+daq_hext_la_SOURCES = daq_hext.c
*/
/* daq_file.c author Russ Combs <rucombs@cisco.com> */
-#include "daq_socket.h"
+#include "daq_user.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
uint8_t* buf;
char error[DAQ_ERRBUF_SIZE];
- DAQ_SktHdr_t pci;
+ DAQ_UsrHdr_t pci;
DAQ_State state;
DAQ_Stats_t stats;
} FileImpl;
if ( impl->start )
{
- impl->pci.flags = DAQ_SKT_FLAG_START_FLOW;
+ impl->pci.flags = DAQ_USR_FLAG_START_FLOW;
impl->start = 0;
}
else if ( impl->eof )
- impl->pci.flags = DAQ_SKT_FLAG_END_FLOW;
+ impl->pci.flags = DAQ_USR_FLAG_END_FLOW;
else
impl->pci.flags = 0;
static int file_daq_get_datalink_type(void *handle)
{
(void)handle;
- return DLT_SOCKET;
+ return DLT_USER;
}
static const char* file_daq_get_errbuf (void* handle)
*/
/* daq_hext.c author Russ Combs <rucombs@cisco.com> */
-#include "daq_socket.h"
+#include "daq_user.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
char line[MAX_LINE_SZ];
char error[DAQ_ERRBUF_SIZE];
- DAQ_SktHdr_t pci;
- DAQ_SktHdr_t cfg;
+ DAQ_UsrHdr_t pci;
+ DAQ_UsrHdr_t cfg;
DAQ_State state;
DAQ_Stats_t stats;
impl->pci.dst_addr = impl->cfg.src_addr;
impl->pci.src_port = impl->cfg.dst_port;
impl->pci.dst_port = impl->cfg.src_port;
- impl->pci.flags &= ~DAQ_SKT_FLAG_TO_SERVER;
+ impl->pci.flags &= ~DAQ_USR_FLAG_TO_SERVER;
}
}
// hack until client / server is resolved:
if ( impl->pci.src_port >= impl->pci.dst_port )
- impl->pci.flags |= DAQ_SKT_FLAG_TO_SERVER;
+ impl->pci.flags |= DAQ_USR_FLAG_TO_SERVER;
else
- impl->pci.flags &= ~DAQ_SKT_FLAG_TO_SERVER;
+ impl->pci.flags &= ~DAQ_USR_FLAG_TO_SERVER;
}
static unsigned flush(FileImpl* impl)
parse_host("10.1.2.3 80", &impl->cfg.dst_addr, &impl->cfg.dst_port);
impl->cfg.ip_proto = impl->pci.ip_proto = IPPROTO_TCP;
- impl->cfg.flags = impl->pci.flags = DAQ_SKT_FLAG_TO_SERVER;
+ impl->cfg.flags = impl->pci.flags = DAQ_USR_FLAG_TO_SERVER;
impl->start = 1;
return 0;
if ( !n )
{
- if ( (impl->dlt == DLT_SOCKET) && !impl->eof )
+ if ( (impl->dlt == DLT_USER) && !impl->eof )
{
impl->eof = 1;
return 1; // <= zero won't make it :(
phdr->address_space_id = 0;
phdr->opaque = 0;
- if ( impl->dlt != DLT_SOCKET )
+ if ( impl->dlt != DLT_USER )
{
phdr->priv_ptr = NULL;
return;
}
- impl->pci.flags &= ~(DAQ_SKT_FLAG_START_FLOW|DAQ_SKT_FLAG_END_FLOW);
+ impl->pci.flags &= ~(DAQ_USR_FLAG_START_FLOW|DAQ_USR_FLAG_END_FLOW);
if ( impl->start )
{
- impl->pci.flags |= DAQ_SKT_FLAG_START_FLOW;
+ impl->pci.flags |= DAQ_USR_FLAG_START_FLOW;
impl->start = 0;
}
else if ( impl->eof )
- impl->pci.flags |= DAQ_SKT_FLAG_END_FLOW;
+ impl->pci.flags |= DAQ_USR_FLAG_END_FLOW;
phdr->priv_ptr = &impl->pci;
}
}
impl->snaplen = cfg->snaplen ? cfg->snaplen : DEF_BUF_SZ;
- impl->dlt = DLT_SOCKET;
+ impl->dlt = DLT_USER;
if ( !get_vars(impl, cfg, errBuf, errMax) )
{
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//--------------------------------------------------------------------------
*/
-/* daq_socket.h author Russ Combs <rucombs@cisco.com> */
+/* daq_user.h author Russ Combs <rucombs@cisco.com> */
/* this is a C include, not C++ */
-#ifndef DAQ_AUX_H
-#define DAQ_AUX_H
+#ifndef DAQ_USER_H
+#define DAQ_USER_H
#include <stdint.h>
-/* for socket / proxy connections handling payload only */
-#define DLT_SOCKET 230
+/* for raw payload only */
+#define DLT_USER 230
-#define DAQ_SKT_FLAG_TO_SERVER 0x01
-#define DAQ_SKT_FLAG_START_FLOW 0x02
-#define DAQ_SKT_FLAG_END_FLOW 0x04
+#define DAQ_USR_FLAG_TO_SERVER 0x01
+#define DAQ_USR_FLAG_START_FLOW 0x02
+#define DAQ_USR_FLAG_END_FLOW 0x04
-/* socket DAQ sets priv_ptr to this */
+/* user-related DAQs set priv_ptr to this */
typedef struct
{
uint32_t src_addr;
uint16_t dst_port;
uint8_t ip_proto;
uint8_t flags;
-} DAQ_SktHdr_t;
+} DAQ_UsrHdr_t;
#endif
add_subdirectory (codecs)
+add_subdirectory (daqs)
add_subdirectory (inspectors)
add_subdirectory (ips_options)
add_subdirectory (loggers)
SUBDIRS = \
codecs \
+daqs \
inspectors \
ips_options \
loggers \
-add_example_library(pim codecs pim.cc)
-add_example_library(token_ring codecs token_ring.cc)
+add_example_library(cd_eapol codecs cd_eapol.cc)
+add_example_library(cd_i4l_rawip codecs cd_i4l_rawip.cc)
+add_example_library(cd_linux_sll codecs cd_linux_sll.cc)
+add_example_library(cd_null codecs cd_null.cc)
+add_example_library(cd_pflog codecs cd_pflog.cc)
+add_example_library(cd_pim codecs cd_pim.cc)
+add_example_library(cd_ppp codecs cd_ppp.cc)
+add_example_library(cd_raw4 codecs cd_raw4.cc)
+add_example_library(cd_raw6 codecs cd_raw6.cc)
+add_example_library(cd_slip codecs cd_slip.cc)
+add_example_library(cd_token_ring codecs cd_token_ring.cc)
+add_example_library(cd_wlan codecs cd_wlan.cc)
cdlibdir = $(pkglibdir)/codecs
-cdlib_LTLIBRARIES = libpim.la
+cdlib_LTLIBRARIES = libeapol.la
+libeapol_la_CXXFLAGS = $(AM_CXXFLAGS)
+libeapol_la_LDFLAGS = -export-dynamic -shared
+libeapol_la_SOURCES = cd_eapol.cc
+
+cdlib_LTLIBRARIES += libi4l_rawip.la
+libi4l_rawip_la_CXXFLAGS = $(AM_CXXFLAGS)
+libi4l_rawip_la_LDFLAGS = -export-dynamic -shared
+libi4l_rawip_la_SOURCES = cd_i4l_rawip.cc
+
+cdlib_LTLIBRARIES += liblinux_sll.la
+liblinux_sll_la_CXXFLAGS = $(AM_CXXFLAGS)
+liblinux_sll_la_LDFLAGS = -export-dynamic -shared
+liblinux_sll_la_SOURCES = cd_linux_sll.cc
+
+cdlib_LTLIBRARIES += libnull.la
+libnull_la_CXXFLAGS = $(AM_CXXFLAGS)
+libnull_la_LDFLAGS = -export-dynamic -shared
+libnull_la_SOURCES = cd_null.cc
+
+cdlib_LTLIBRARIES += libpflog.la
+libpflog_la_CXXFLAGS = $(AM_CXXFLAGS)
+libpflog_la_LDFLAGS = -export-dynamic -shared
+libpflog_la_SOURCES = cd_pflog.cc
+
+cdlib_LTLIBRARIES += libpim.la
libpim_la_CXXFLAGS = $(AM_CXXFLAGS)
libpim_la_LDFLAGS = -export-dynamic -shared
-libpim_la_SOURCES = pim.cc
+libpim_la_SOURCES = cd_pim.cc
+
+cdlib_LTLIBRARIES += libppp.la
+libppp_la_CXXFLAGS = $(AM_CXXFLAGS)
+libppp_la_LDFLAGS = -export-dynamic -shared
+libppp_la_SOURCES = cd_ppp.cc
+
+cdlib_LTLIBRARIES += libraw4.la
+libraw4_la_CXXFLAGS = $(AM_CXXFLAGS)
+libraw4_la_LDFLAGS = -export-dynamic -shared
+libraw4_la_SOURCES = cd_raw4.cc
+
+cdlib_LTLIBRARIES += libraw6.la
+libraw6_la_CXXFLAGS = $(AM_CXXFLAGS)
+libraw6_la_LDFLAGS = -export-dynamic -shared
+libraw6_la_SOURCES = cd_raw6.cc
+
+cdlib_LTLIBRARIES += libslip.la
+libslip_la_CXXFLAGS = $(AM_CXXFLAGS)
+libslip_la_LDFLAGS = -export-dynamic -shared
+libslip_la_SOURCES = cd_slip.cc
cdlib_LTLIBRARIES += libtoken_ring.la
libtoken_ring_la_CXXFLAGS = $(AM_CXXFLAGS)
libtoken_ring_la_LDFLAGS = -export-dynamic -shared
-libtoken_ring_la_SOURCES = token_ring.cc
+libtoken_ring_la_SOURCES = cd_token_ring.cc
+
+cdlib_LTLIBRARIES += libwlan.la
+libwlan_la_CXXFLAGS = $(AM_CXXFLAGS)
+libwlan_la_LDFLAGS = -export-dynamic -shared
+libwlan_la_SOURCES = cd_wlan.cc
AM_CXXFLAGS = @AM_CXXFLAGS@
--- /dev/null
+
+add_example_library(daq_socket daqs daq_socket.c)
+
--- /dev/null
+
+daqlibdir = $(pkglibdir)/daqs
+
+daqlib_LTLIBRARIES = daq_socket.la
+daq_socket_la_CFLAGS = -DBUILDING_SO
+daq_socket_la_LDFLAGS = -module -export-dynamic -avoid-version -shared
+daq_socket_la_SOURCES = daq_socket.c
+
*/
/* daq_socket.c author Russ Combs <rucombs@cisco.com> */
-#include "daq_socket.h"
+#include "daqs/daq_user.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
struct sockaddr_in sin_a;
struct sockaddr_in sin_b;
- DAQ_SktHdr_t pci;
+ DAQ_UsrHdr_t pci;
uint8_t* buf;
char error[DAQ_ERRBUF_SIZE];
{
DPE(impl->error, "%s: can't recv from socket (%s)\n",
__FUNCTION__, strerror(errno));
- impl->pci.flags = DAQ_SKT_FLAG_END_FLOW;
+ impl->pci.flags = DAQ_USR_FLAG_END_FLOW;
*sock = -1;
}
return 0;
banner = impl->use_a ? "client\n" : "server\n";
sock_send(impl, *sock, (const uint8_t*)banner, 7);
- impl->pci.flags = DAQ_SKT_FLAG_START_FLOW;
+ impl->pci.flags = DAQ_USR_FLAG_START_FLOW;
return 0;
}
impl->pci.dst_addr = impl->sin_a.sin_addr.s_addr;
impl->pci.src_port = impl->sin_b.sin_port;
impl->pci.dst_port = impl->sin_a.sin_port;
- impl->pci.flags &= ~DAQ_SKT_FLAG_TO_SERVER;
+ impl->pci.flags &= ~DAQ_USR_FLAG_TO_SERVER;
}
else
{
impl->pci.dst_addr = impl->sin_b.sin_addr.s_addr;
impl->pci.src_port = impl->sin_a.sin_port;
impl->pci.dst_port = impl->sin_b.sin_port;
- impl->pci.flags |= DAQ_SKT_FLAG_TO_SERVER;
+ impl->pci.flags |= DAQ_USR_FLAG_TO_SERVER;
}
- if ( impl->pci.flags & DAQ_SKT_FLAG_END_FLOW )
+ if ( impl->pci.flags & DAQ_USR_FLAG_END_FLOW )
clear(impl);
phdr->priv_ptr = &impl->pci;
static int socket_daq_get_datalink_type(void *handle)
{
(void)handle;
- return DLT_SOCKET;
+ return DLT_USER;
}
static const char* socket_daq_get_errbuf (void* handle)
extern const BaseApi* cd_ah;
extern const BaseApi* cd_arp;
extern const BaseApi* cd_dstopts;
-extern const BaseApi* cd_eapol;
extern const BaseApi* cd_erspan2;
extern const BaseApi* cd_erspan3;
extern const BaseApi* cd_esp;
extern const BaseApi* cd_frag;
extern const BaseApi* cd_gre;
extern const BaseApi* cd_gtp;
-extern const BaseApi* cd_i4l_rawip;
extern const BaseApi* cd_icmp4;
extern const BaseApi* cd_icmp4_ip;
extern const BaseApi* cd_icmp6;
extern const BaseApi* cd_icmp6_ip;
extern const BaseApi* cd_ipv6;
extern const BaseApi* cd_igmp;
-extern const BaseApi* cd_linux_sll;
extern const BaseApi* cd_llc;
extern const BaseApi* cd_mobility;
extern const BaseApi* cd_mpls;
extern const BaseApi* cd_no_next;
-extern const BaseApi* cd_null;
-extern const BaseApi* cd_pflog;
extern const BaseApi* cd_pgm;
-extern const BaseApi* cd_ppp;
extern const BaseApi* cd_pppencap;
extern const BaseApi* cd_pppoepkt_disc;
extern const BaseApi* cd_pppoepkt_sess;
-extern const BaseApi* cd_raw4;
-extern const BaseApi* cd_raw6;
extern const BaseApi* cd_routing;
-extern const BaseApi* cd_socket;
extern const BaseApi* cd_sun_nd;
extern const BaseApi* cd_swipe;
extern const BaseApi* cd_teredo;
extern const BaseApi* cd_transbridge;
extern const BaseApi* cd_udp;
+extern const BaseApi* cd_user;
extern const BaseApi* cd_vlan;
-extern const BaseApi* cd_wlan;
#endif
const BaseApi* codecs[] =
cd_ah,
cd_arp,
cd_dstopts,
- cd_eapol,
cd_erspan2,
cd_erspan3,
cd_esp,
cd_frag,
cd_gre,
cd_gtp,
- cd_i4l_rawip,
cd_icmp4,
cd_icmp4_ip,
cd_icmp6,
cd_icmp6_ip,
cd_ipv6,
cd_igmp,
- cd_linux_sll,
cd_llc,
cd_mobility,
cd_mpls,
cd_no_next,
- cd_null,
- cd_pflog,
cd_pgm,
- cd_ppp,
cd_pppencap,
cd_pppoepkt_disc,
cd_pppoepkt_sess,
- cd_raw4,
- cd_raw6,
cd_routing,
- cd_socket,
cd_sun_nd,
cd_swipe,
cd_teredo,
cd_transbridge,
cd_udp,
+ cd_user,
cd_vlan,
- cd_wlan,
#endif
nullptr
if(STATIC_CODECS)
set( PLUGIN_SOURCES
cd_arp.cc
- cd_eapol.cc
cd_erspan2.cc
cd_erspan3.cc
cd_fabricpath.cc
add_shared_library(cd_pppoe codecs cd_pppoe.cc)
add_shared_library(cd_trans_bridge codecs cd_trans_bridge.cc)
add_shared_library(cd_vlan codecs cd_vlan.cc)
- add_shared_library(cd_eapol codecs cd_eapol.cc)
endif(STATIC_CODECS)
liblink_codecs_a_SOURCES = \
cd_arp.cc \
-cd_eapol.cc \
cd_erspan2.cc \
cd_erspan3.cc \
cd_fabricpath.cc \
cd_vlan.cc
else
-
ehlibdir = $(pkglibdir)/codecs
ehlib_LTLIBRARIES = libcd_arp.la
libcd_pppoe_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
libcd_pppoe_la_LDFLAGS = -export-dynamic -shared
libcd_pppoe_la_SOURCES = cd_pppoe.cc
-
-
-ehlib_LTLIBRARIES += libcd_eapol.la
-libcd_eapol_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_eapol_la_LDFLAGS = -export-dynamic -shared
-libcd_eapol_la_SOURCES = cd_eapol.cc
-
-
endif
-
AM_CXXFLAGS = @AM_CXXFLAGS@
cd_icmp4_ip.cc
cd_icmp6_ip.cc
cd_llc.cc
- cd_socket.cc
cd_teredo.cc
+ cd_user.cc
)
else(STATIC_CODECS)
add_shared_library(cd_icmp4_ip codecs cd_icmp4_ip.cc)
add_shared_library(cd_icmp6_ip codecs cd_icmp6_ip.cc)
add_shared_library(cd_llc codecs cd_llc.cc)
- add_shared_library(cd_socket codecs cd_socket.cc)
add_shared_library(cd_teredo codecs cd_teredo.cc)
+ add_shared_library(cd_user codecs cd_user.cc)
endif(STATIC_CODECS)
cd_icmp4_ip.cc \
cd_icmp6_ip.cc \
cd_llc.cc \
-cd_socket.cc \
-cd_teredo.cc
+cd_teredo.cc \
+cd_user.cc
if STATIC_CODECS
libmisc_codecs_a_SOURCES += $(plugin_list)
libcd_llc_la_LDFLAGS = -export-dynamic -shared
libcd_llc_la_SOURCES = cd_llc.cc
-cdlib_LTLIBRARIES += libcd_socket.la
-libcd_socket_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_socket_la_LDFLAGS = -export-dynamic -shared
-libcd_socket_la_SOURCES = cd_socket.cc
-
cdlib_LTLIBRARIES += libcd_teredo.la
libcd_teredo_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
libcd_teredo_la_LDFLAGS = -export-dynamic -shared
libcd_teredo_la_SOURCES = cd_teredo.cc
+
+cdlib_LTLIBRARIES += libcd_user.la
+libcd_user_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
+libcd_user_la_LDFLAGS = -export-dynamic -shared
+libcd_user_la_SOURCES = cd_user.cc
endif
AM_CXXFLAGS = @AM_CXXFLAGS@
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//--------------------------------------------------------------------------
-// cd_socket.cc author Russ Combs <rucombs@cisco.com>
+// cd_user.cc author Russ Combs <rucombs@cisco.com>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "framework/codec.h"
-#include "../daqs/daq_socket.h"
+#include "daqs/daq_user.h"
#include "protocols/packet.h"
#include "sfip/sf_ip.h"
-#define CD_NAME "socket"
-#define CD_HELP_STR "support for sockets / proxied sessions"
-#define CD_HELP ADD_DLT(CD_HELP_STR, DLT_SOCKET)
+#define CD_NAME "user"
+#define CD_HELP_STR "support for user sessions"
+#define CD_HELP ADD_DLT(CD_HELP_STR, DLT_USER)
-class SocketCodec : public Codec
+class UserCodec : public Codec
{
public:
- SocketCodec() : Codec(CD_NAME) { };
- ~SocketCodec() { };
+ UserCodec() : Codec(CD_NAME) { };
+ ~UserCodec() { };
void get_data_link_type(std::vector<int>& v) override;
bool decode(const RawData&, CodecData&, DecodeData&) override;
};
-void SocketCodec::get_data_link_type(std::vector<int>& v)
+void UserCodec::get_data_link_type(std::vector<int>& v)
{
- v.push_back(DLT_SOCKET);
+ v.push_back(DLT_USER);
}
-static void set_ip(const DAQ_SktHdr_t* pci, CodecData& codec, DecodeData& snort)
+static void set_ip(const DAQ_UsrHdr_t* pci, CodecData& codec, DecodeData& snort)
{
// FIXIT support ip6
sfip_t sip, dip;
}
static void set_flags(
- const DAQ_SktHdr_t* pci, const RawData& raw, CodecData& codec, DecodeData& snort)
+ const DAQ_UsrHdr_t* pci, const RawData& raw, CodecData& codec, DecodeData& snort)
{
- if ( pci->flags & DAQ_SKT_FLAG_TO_SERVER )
+ if ( pci->flags & DAQ_USR_FLAG_TO_SERVER )
snort.decode_flags |= DECODE_C2S;
- if ( pci->flags & DAQ_SKT_FLAG_START_FLOW )
+ if ( pci->flags & DAQ_USR_FLAG_START_FLOW )
snort.decode_flags |= DECODE_SOF;
- if ( pci->flags & DAQ_SKT_FLAG_END_FLOW )
+ if ( pci->flags & DAQ_USR_FLAG_END_FLOW )
{
snort.decode_flags |= DECODE_EOF;
codec.lyr_len = raw.len;
codec.lyr_len = 0;
}
-bool SocketCodec::decode(const RawData& raw, CodecData& codec, DecodeData& snort)
+bool UserCodec::decode(const RawData& raw, CodecData& codec, DecodeData& snort)
{
- const DAQ_SktHdr_t* pci = (DAQ_SktHdr_t*)raw.pkth->priv_ptr;
+ const DAQ_UsrHdr_t* pci = (DAQ_UsrHdr_t*)raw.pkth->priv_ptr;
if ( pci->ip_proto )
{
//-------------------------------------------------------------------------
static Codec* ctor(Module*)
-{ return new SocketCodec; }
+{ return new UserCodec; }
static void dtor(Codec* cd)
{ delete cd; }
-static const CodecApi socket_api =
+static const CodecApi user_api =
{
{
PT_CODEC,
#ifdef BUILDING_SO
SO_PUBLIC const BaseApi* snort_plugins[] =
{
- &socket_api.base,
+ &user_api.base,
nullptr
};
#else
-const BaseApi* cd_socket = &socket_api.base;
+const BaseApi* cd_user = &user_api.base;
#endif
if (STATIC_CODECS)
set (PLUGIN_LIST
cd_eth.cc
- cd_i4l_rawip.cc
- cd_linux_sll.cc
- cd_null.cc
- cd_pflog.cc
- cd_ppp.cc
- cd_raw4.cc
- cd_raw6.cc
- cd_slip.cc
- cd_wlan.cc
-# cd_fddi.cc
-# cd_i4lrawip.cc
-# cd_oldpflog.cc
-# cd_enc.cc
-# cd_pppserial.cc
-# cd_chdlc.cc
-# cd_i4lciscoip.cc
-# cd_ipx.cc
-# cd_eap.cc
)
else (STATIC_CODECS)
add_shared_library (cd_eth codecs cd_eth.cc)
- add_shared_library (cd_i4l_rawip codecs cd_i4l_rawip.cc)
- add_shared_library (cd_linux_sll codecs cd_linux_sll.cc)
- add_shared_library (cd_null codecs cd_null.cc)
- add_shared_library (cd_pflog codecs cd_pflog.cc)
- add_shared_library (cd_ppp codecs cd_ppp.cc)
- add_shared_library (cd_raw4 codecs cd_raw4.cc)
- add_shared_library (cd_raw6 codecs cd_raw6.cc)
- add_shared_library (cd_slip codecs cd_slip.cc)
- add_shared_library (cd_wlan codecs cd_wlan.cc)
endif (STATIC_CODECS)
noinst_LIBRARIES = libroot_codecs.a
libroot_codecs_a_SOURCES = \
-cd_eth.cc \
-cd_i4l_rawip.cc \
-cd_linux_sll.cc \
-cd_null.cc \
-cd_pflog.cc \
-cd_ppp.cc \
-cd_raw4.cc \
-cd_raw6.cc \
-cd_slip.cc \
-cd_wlan.cc
-#root_fddi.cc \
-#root_i4lrawip.cc \
-#root_oldpflog.cc \
-#root_enc.cc \
-#root_ppp.cc \
-#root_pflog.cc \
-#root_pppserial.cc \
-#root_chdlc.cc \
-#root_i4lciscoip.cc
-
+cd_eth.cc
else
ehlibdir = $(pkglibdir)/codecs
libcd_eth_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
libcd_eth_la_LDFLAGS = -export-dynamic -shared
libcd_eth_la_SOURCES = cd_eth.cc
-
-ehlib_LTLIBRARIES += libcd_i4l_rawip.la
-libcd_i4l_rawip_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_i4l_rawip_la_LDFLAGS = -export-dynamic -shared
-libcd_i4l_rawip_la_SOURCES = cd_i4l_rawip.cc
-
-ehlib_LTLIBRARIES += libcd_linux_sll.la
-libcd_linux_sll_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_linux_sll_la_LDFLAGS = -export-dynamic -shared
-libcd_linux_sll_la_SOURCES = cd_linux_sll.cc
-
-ehlib_LTLIBRARIES += libcd_null.la
-libcd_null_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_null_la_LDFLAGS = -export-dynamic -shared
-libcd_null_la_SOURCES = cd_null.cc
-
-ehlib_LTLIBRARIES += libcd_pflog.la
-libcd_pflog_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_pflog_la_LDFLAGS = -export-dynamic -shared
-libcd_pflog_la_SOURCES = cd_pflog.cc
-
-ehlib_LTLIBRARIES += libcd_ppp.la
-libcd_ppp_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_ppp_la_LDFLAGS = -export-dynamic -shared
-libcd_ppp_la_SOURCES = cd_ppp.cc
-
-ehlib_LTLIBRARIES += libcd_raw4.la
-libcd_raw4_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_raw4_la_LDFLAGS = -export-dynamic -shared
-libcd_raw4_la_SOURCES = cd_raw4.cc
-
-ehlib_LTLIBRARIES += libcd_raw6.la
-libcd_raw6_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_raw6_la_LDFLAGS = -export-dynamic -shared
-libcd_raw6_la_SOURCES = cd_raw6.cc
-
-ehlib_LTLIBRARIES += libcd_slip.la
-libcd_slip_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_slip_la_LDFLAGS = -export-dynamic -shared
-libcd_slip_la_SOURCES = cd_slip.cc
-
-ehlib_LTLIBRARIES += libcd_wlan.la
-libcd_wlan_la_CXXFLAGS = $(AM_CXXFLAGS) -DBUILDING_SO
-libcd_wlan_la_LDFLAGS = -export-dynamic -shared
-libcd_wlan_la_SOURCES = cd_wlan.cc
-
endif
AM_CXXFLAGS = @AM_CXXFLAGS@
* Layer 2 header stuff cloned from log.c
*--------------------------------------------------------------------
*/
-/*--------------------------------------------------------------------
- * Function: LogTrHeader(TextLog*, Packet*)
- *
- * Purpose: Print the packet TokenRing header to the given TextLog
- *
- * Arguments: log => pointer to TextLog to print to
- *
- * Returns: void function
- *--------------------------------------------------------------------
- */
-
-void LogTrHeader(TextLog* log, Packet* p)
-{
- const token_ring::Trh_hdr* trh =
- reinterpret_cast<const token_ring::Trh_hdr*>(layer::get_root_layer(p));
-
- TextLog_Print(log, "%X:%X:%X:%X:%X:%X -> ", trh->saddr[0],
- trh->saddr[1], trh->saddr[2], trh->saddr[3],
- trh->saddr[4], trh->saddr[5]);
- TextLog_Print(log, "%X:%X:%X:%X:%X:%X\n", trh->daddr[0],
- trh->daddr[1], trh->daddr[2], trh->daddr[3],
- trh->daddr[4], trh->daddr[5]);
-
- const token_ring::Trh_llc* trhllc =
- reinterpret_cast<const token_ring::Trh_llc*>(trh + sizeof(*trh));
-
- TextLog_Print(log, "access control:0x%X frame control:0x%X\n", trh->ac,
- trh->fc);
-
- TextLog_Print(log, "DSAP: 0x%X SSAP 0x%X protoID: %X%X%X Ethertype: %X\n",
- trhllc->dsap, trhllc->ssap, trhllc->protid[0],
- trhllc->protid[1], trhllc->protid[2], trhllc->ethertype);
-
- const token_ring::Trh_mr* trhmr = token_ring::get_trhmr(trhllc);
-
- if (trhmr)
- {
- TextLog_Print(log, "RIF structure is present:\n");
- TextLog_Print(log, "bcast: 0x%X length: 0x%X direction: 0x%X largest"
- "fr. size: 0x%X res: 0x%X\n",
- TRH_MR_BCAST(trhmr), TRH_MR_LEN(trhmr),
- TRH_MR_DIR(trhmr), TRH_MR_LF(trhmr),
- TRH_MR_RES(trhmr));
- TextLog_Print(log, "rseg -> %X:%X:%X:%X:%X:%X:%X:%X\n",
- trhmr->rseg[0], trhmr->rseg[1], trhmr->rseg[2],
- trhmr->rseg[3], trhmr->rseg[4], trhmr->rseg[5],
- trhmr->rseg[6], trhmr->rseg[7]);
- }
-}
/*--------------------------------------------------------------------
* Function: LogEthHeader()
greh->get_version(), greh->flags, greh->proto());
}
-/*--------------------------------------------------------------------
- * Function: LogSLLHeader(TextLog* )
- *
- * Purpose: Print the packet SLL (fake) header to the given TextLog
- * (piece partly is borrowed from tcpdump :))
- *
- * Arguments: log => pointer to TextLog to print to
- *
- * Returns: void function
- *--------------------------------------------------------------------
- */
-#ifdef DLT_LINUX_SLL
-static void LogSLLHeader(TextLog* log, Packet* p)
-{
- const linux_sll::SLLHdr* sllh =
- reinterpret_cast<const linux_sll::SLLHdr*>(layer::get_root_layer(p));
-
- switch (ntohs(sllh->sll_pkttype))
- {
- case LINUX_SLL_HOST:
- TextLog_Puts(log, "< ");
- break;
- case LINUX_SLL_BROADCAST:
- TextLog_Puts(log, "B ");
- break;
- case LINUX_SLL_MULTICAST:
- TextLog_Puts(log, "M ");
- break;
- case LINUX_SLL_OTHERHOST:
- TextLog_Puts(log, "P ");
- break;
- case LINUX_SLL_OUTGOING:
- TextLog_Puts(log, "> ");
- break;
- default:
- TextLog_Puts(log, "? ");
- break;
- }
-
- /* mac addr */
- TextLog_Print(log, "l/l len: %i l/l type: 0x%X %02X:%02X:%02X:%02X:%02X:%02X\n",
- htons(sllh->sll_halen), ntohs(sllh->sll_hatype),
- sllh->sll_addr[0], sllh->sll_addr[1], sllh->sll_addr[2],
- sllh->sll_addr[3], sllh->sll_addr[4], sllh->sll_addr[5]);
-
- /* protocol and pkt size */
- TextLog_Print(log, "pkt type:0x%X proto: 0x%X len:0x%X\n",
- ntohs(sllh->sll_pkttype),
- ntohs(sllh->sll_protocol), p->pkth->pktlen);
-}
-
-#endif
-
-/*--------------------------------------------------------------------
- * Function: LogWifiHeader(TextLog* )
- *
- * Purpose: Print the packet 802.11 header to the given TextLog
- *
- * Arguments: log => pointer to TextLog to print to
- *
- * Returns: void function
- *--------------------------------------------------------------------
- */
-static void LogWifiHeader(TextLog* log, Packet* p)
-{
- const wlan::WifiHdr* wifih =
- reinterpret_cast< const wlan::WifiHdr*>(layer::get_root_layer(p));
-
- /* This assumes we are printing a data packet, could be changed
- to print other types as well */
- const uint8_t* da = NULL, * sa = NULL, * bssid = NULL, * ra = NULL,
- * ta = NULL;
- /* per table 4, IEEE802.11 section 7.2.2 */
- if ((wifih->frame_control & WLAN_FLAG_TODS) &&
- (wifih->frame_control & WLAN_FLAG_FROMDS))
- {
- ra = wifih->addr1;
- ta = wifih->addr2;
- da = wifih->addr3;
- sa = wifih->addr4;
- }
- else if (wifih->frame_control & WLAN_FLAG_TODS)
- {
- bssid = wifih->addr1;
- sa = wifih->addr2;
- da = wifih->addr3;
- }
- else if (wifih->frame_control & WLAN_FLAG_FROMDS)
- {
- da = wifih->addr1;
- bssid = wifih->addr2;
- sa = wifih->addr3;
- }
- else
- {
- da = wifih->addr1;
- sa = wifih->addr2;
- bssid = wifih->addr3;
- }
-
- /* DO this switch to provide additional info on the type */
- switch (wifih->frame_control & 0x00ff)
- {
- case WLAN_TYPE_MGMT_BEACON:
- TextLog_Puts(log, "Beacon ");
- break;
- /* management frames */
- case WLAN_TYPE_MGMT_ASREQ:
- TextLog_Puts(log, "Assoc. Req. ");
- break;
- case WLAN_TYPE_MGMT_ASRES:
- TextLog_Puts(log, "Assoc. Resp. ");
- break;
- case WLAN_TYPE_MGMT_REREQ:
- TextLog_Puts(log, "Reassoc. Req. ");
- break;
- case WLAN_TYPE_MGMT_RERES:
- TextLog_Puts(log, "Reassoc. Resp. ");
- break;
- case WLAN_TYPE_MGMT_PRREQ:
- TextLog_Puts(log, "Probe Req. ");
- break;
- case WLAN_TYPE_MGMT_PRRES:
- TextLog_Puts(log, "Probe Resp. ");
- break;
- case WLAN_TYPE_MGMT_ATIM:
- TextLog_Puts(log, "ATIM ");
- break;
- case WLAN_TYPE_MGMT_DIS:
- TextLog_Puts(log, "Dissassoc. ");
- break;
- case WLAN_TYPE_MGMT_AUTH:
- TextLog_Puts(log, "Authent. ");
- break;
- case WLAN_TYPE_MGMT_DEAUTH:
- TextLog_Puts(log, "Deauthent. ");
- break;
-
- /* Control frames */
- case WLAN_TYPE_CONT_PS:
- case WLAN_TYPE_CONT_RTS:
- case WLAN_TYPE_CONT_CTS:
- case WLAN_TYPE_CONT_ACK:
- case WLAN_TYPE_CONT_CFE:
- case WLAN_TYPE_CONT_CFACK:
- TextLog_Puts(log, "Control ");
- break;
- }
-
- if (sa != NULL)
- {
- TextLog_Print(log, "%X:%X:%X:%X:%X:%X -> ", sa[0],
- sa[1], sa[2], sa[3], sa[4], sa[5]);
- }
- else if (ta != NULL)
- {
- TextLog_Print(log, "ta: %X:%X:%X:%X:%X:%X da: ", ta[0],
- ta[1], ta[2], ta[3], ta[4], ta[5]);
- }
-
- TextLog_Print(log, "%X:%X:%X:%X:%X:%X\n", da[0],
- da[1], da[2], da[3], da[4], da[5]);
-
- if (bssid != NULL)
- {
- TextLog_Print(log, "bssid: %X:%X:%X:%X:%X:%X", bssid[0],
- bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
- }
-
- if (ra != NULL)
- {
- TextLog_Print(log, " ra: %X:%X:%X:%X:%X:%X", ra[0],
- ra[1], ra[2], ra[3], ra[4], ra[5]);
- }
- TextLog_Puts(log, " Flags:");
- if (wifih->frame_control & WLAN_FLAG_TODS)
- TextLog_Puts(log," ToDs");
- if (wifih->frame_control & WLAN_FLAG_TODS)
- TextLog_Puts(log," FrDs");
- if (wifih->frame_control & WLAN_FLAG_FRAG)
- TextLog_Puts(log," Frag");
- if (wifih->frame_control & WLAN_FLAG_RETRY)
- TextLog_Puts(log," Re");
- if (wifih->frame_control & WLAN_FLAG_PWRMGMT)
- TextLog_Puts(log," Pwr");
- if (wifih->frame_control & WLAN_FLAG_MOREDAT)
- TextLog_Puts(log," MD");
- if (wifih->frame_control & WLAN_FLAG_WEP)
- TextLog_Puts(log," Wep");
- if (wifih->frame_control & WLAN_FLAG_ORDER)
- TextLog_Puts(log," Ord");
- TextLog_NewLine(log);
-}
-
/*--------------------------------------------------------------------
* Function: Log2ndHeader(TextLog* , Packet p)
*
if (p && (p->num_layers > 0))
LogEthHeader(log, p);
break;
-#ifdef DLT_IEEE802_11
- case DLT_IEEE802_11:
- if (p && (p->num_layers > 0))
- LogWifiHeader(log, p);
- break;
-#endif
- case DLT_IEEE802: /* Token Ring */
- if (p && (p->num_layers > 0))
- LogTrHeader(log, p);
- break;
-#ifdef DLT_LINUX_SLL
- case DLT_LINUX_SLL:
- if (p && (p->num_layers > 0))
- LogSLLHeader(log, p); /* Linux cooked sockets */
- break;
-#endif
default:
if (SnortConfig::log_verbose())
{
}
}
-/*--------------------------------------------------------------------
- * ARP stuff cloned from log.c
- * FIXIT-L these must be converted to use TextLog (or just deleted)
- *--------------------------------------------------------------------
- */
-
-#if 0
-/****************************************************************************
- *
- * Function: PrintEapolKey(FILE *)
- *
- * Purpose: Dump the EAP header to the specified file stream
- *
- * Arguments: fp => file stream
- *
- * Returns: void function
- *
- ***************************************************************************/
-static void PrintEapolKey(FILE* fp, const eapol::EapolKey* eapolk)
-{
- uint16_t length;
-
- if (eapolk == NULL)
- {
- fprintf(fp, "Eapol Key truncated\n");
- return;
- }
- fprintf(fp, "KEY type: ");
- if (eapolk->type == 1)
- {
- fprintf(fp, "RC4");
- }
-
- memcpy(&length, &eapolk->length, 2);
- length = ntohs(length);
- fprintf(fp, " len: %d", length);
- fprintf(fp, " index: %d ", eapolk->index & 0x7F);
- fprintf(fp, eapolk->index & 0x80 ? " unicast\n" : " broadcast\n");
-}
-
-/****************************************************************************
- *
- * Function: PrintEapolHeader(FILE *, Packet *)
- *
- * Purpose: Dump the EAPOL header info to the specified stream
- *
- * Arguments: fp => stream to print to
- *
- * Returns: void function
- *
- ***************************************************************************/
-static void PrintEapolHeader(FILE* fp, const eapol::EtherEapol* eplh)
-{
- fprintf(fp, "EAPOL type: ");
- switch (eplh->eaptype)
- {
- case EAPOL_TYPE_EAP:
- fprintf(fp, "EAP");
- break;
- case EAPOL_TYPE_START:
- fprintf(fp, "Start");
- break;
- case EAPOL_TYPE_LOGOFF:
- fprintf(fp, "Logoff");
- break;
- case EAPOL_TYPE_KEY:
- fprintf(fp, "Key");
- break;
- case EAPOL_TYPE_ASF:
- fprintf(fp, "ASF Alert");
- break;
- default:
- fprintf(fp, "Unknown");
- }
- fprintf(fp, " Len: %d\n", ntohs(eplh->len));
-}
-
-/****************************************************************************
- *
- * Function: PrintEAPHeader(FILE *)
- *
- * Purpose: Dump the EAP header to the specified file stream
- *
- * Arguments: fp => file stream
- *
- * Returns: void function
- *
- ***************************************************************************/
-static void PrintEAPHeader(FILE* fp, const eapol::EAPHdr* eaph)
-{
- uint8_t* eaptype = 0;
-
- if (eaph == NULL)
- {
- fprintf(fp, "EAP header truncated\n");
- return;
- }
- fprintf(fp, "code: ");
- switch (eaph->code)
- {
- case EAP_CODE_REQUEST:
- fprintf(fp, "Req ");
- eaptype = (uint8_t*)(eaph + sizeof(*eaph));
- break;
- case EAP_CODE_RESPONSE:
- fprintf(fp, "Resp");
- eaptype = (uint8_t*)(eaph + sizeof(*eaph));
- break;
- case EAP_CODE_SUCCESS:
- fprintf(fp, "Succ");
- break;
- case EAP_CODE_FAILURE:
- fprintf(fp, "Fail");
- break;
- }
- fprintf(fp, " id: 0x%x len: %d", eaph->id, ntohs(eaph->len));
- if (eaptype != NULL)
- {
- fprintf(fp, " type: ");
- switch (*(eaptype))
- {
- case EAP_TYPE_IDENTITY:
- fprintf(fp, "id");
- break;
- case EAP_TYPE_NOTIFY:
- fprintf(fp, "notify");
- break;
- case EAP_TYPE_NAK:
- fprintf(fp, "nak");
- break;
- case EAP_TYPE_MD5:
- fprintf(fp, "md5");
- break;
- case EAP_TYPE_OTP:
- fprintf(fp, "otp");
- break;
- case EAP_TYPE_GTC:
- fprintf(fp, "token");
- break;
- case EAP_TYPE_TLS:
- fprintf(fp, "tls");
- break;
- default:
- fprintf(fp, "undef");
- break;
- }
- }
- fprintf(fp, "\n");
-}
-
-/*
- * Function: PrintEapolPkt(FILE *, Packet *)
- *
- * Purpose: Dump the packet to the stream pointer
- *
- * Arguments: fp => pointer to print data to
- * type => packet protocol
- * p => pointer to decoded packet struct
- *
- * Returns: void function
- */
-void PrintEapolPkt(FILE* fp, Packet* p)
-{
- char timestamp[TIMEBUF_SIZE];
-
- memset((char*)timestamp, 0, TIMEBUF_SIZE);
- ts_print((struct timeval*)&p->pkth->ts, timestamp);
-
- /* dump the timestamp */
- fwrite(timestamp, strlen(timestamp), 1, fp);
-
- /* dump the ethernet header if we're doing that sort of thing */
- if (SnortConfig::output_datalink())
- {
- Print2ndHeader(fp, p);
- }
-
- const eapol::EtherEapol* eplh = layer::get_eapol_layer(p);
-
- if (eplh)
- {
- PrintEapolHeader(fp, eplh);
- if (eplh->eaptype == EAPOL_TYPE_EAP)
- {
- PrintEAPHeader(fp, (const eapol::EAPHdr*)eplh + sizeof(*eplh));
- }
- else if (eplh->eaptype == EAPOL_TYPE_KEY)
- {
- PrintEapolKey(fp, (const eapol::EapolKey*)eplh + sizeof(*eplh));
- }
- }
- else
- {
- fprintf(fp, "EAP header truncated\n");
- }
-
- /* dump the application layer data */
- if (SnortConfig::output_app_data() && !SnortConfig::verbose_byte_dump())
- {
- if (SnortConfig::output_char_data())
- PrintCharData(fp, (char*)p->data, p->dsize);
- else
- PrintNetData(fp, p->data, p->dsize, NULL);
- }
- else if (SnortConfig::verbose_byte_dump())
- {
- PrintNetData(fp, p->pkt, p->pkth->caplen, p);
- }
-
- fprintf(fp, "%s\n", SEPARATOR);
-}
-
-/*
- * Function: PrintWifiPkt(FILE *, Packet *)
- *
- * Purpose: Dump the packet to the stream pointer
- *
- * Arguments: fp => pointer to print data to
- * p => pointer to decoded packet struct
- *
- * Returns: void function
- */
-void PrintWifiPkt(FILE* fp, Packet* p)
-{
- char timestamp[TIMEBUF_SIZE];
-
- memset((char*)timestamp, 0, TIMEBUF_SIZE);
- ts_print((struct timeval*)&p->pkth->ts, timestamp);
-
- /* dump the timestamp */
- fwrite(timestamp, strlen(timestamp), 1, fp);
-
- /* dump the ethernet header if we're doing that sort of thing */
- Print2ndHeader(fp, p);
-
- /* dump the application layer data */
- if (SnortConfig::output_app_data() && !SnortConfig::verbose_byte_dump())
- {
- if (SnortConfig::output_char_data())
- PrintCharData(fp, (char*)p->data, p->dsize);
- else
- PrintNetData(fp, p->data, p->dsize, NULL);
- }
- else if (SnortConfig::verbose_byte_dump())
- {
- PrintNetData(fp, p->pkt, p->pkth->caplen, p);
- }
-
- fprintf(fp, "=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+"
- "=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n\n");
-}
-
-#endif
-