diff --git a/configure.ac b/configure.ac index b4873214c9fb..c94b7e7406de 100644 --- a/configure.ac +++ b/configure.ac @@ -529,9 +529,6 @@ AC_DEFINE([HAVE_DETECT_DISABLED], [1], [Detection is disabled]) ]) - # Tilera PCIE logging - AM_CONDITIONAL([BUILD_PCIE_LOGGING], [test ! -z "$TILERA_ROOT"]) - # libraries # zlib @@ -606,16 +603,6 @@ fi fi - AC_MSG_CHECKING([for Mpipe]) - AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([[#include ]])], - [ - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_MPIPE],[1],[mPIPE support is available]) - LDFLAGS="$LDFLAGS -lgxpci -lgxio -ltmc" - ], - [AC_MSG_RESULT([no])]) - #libpcre AC_ARG_WITH(libpcre_includes, [ --with-libpcre-includes=DIR libpcre include directory], @@ -2510,7 +2497,7 @@ AC_SUBST(CONFIGURE_LOCALSTATEDIR) AC_SUBST(CONFIGURE_DATAROOTDIR) AC_SUBST(PACKAGE_VERSION) -AC_OUTPUT(Makefile src/Makefile rust/Makefile rust/Cargo.toml rust/.cargo/config qa/Makefile qa/coccinelle/Makefile rules/Makefile doc/Makefile doc/userguide/Makefile contrib/Makefile contrib/file_processor/Makefile contrib/file_processor/Action/Makefile contrib/file_processor/Processor/Makefile contrib/tile_pcie_logd/Makefile suricata.yaml etc/Makefile etc/suricata.logrotate etc/suricata.service python/Makefile python/suricata/config/defaults.py ebpf/Makefile) +AC_OUTPUT(Makefile src/Makefile rust/Makefile rust/Cargo.toml rust/.cargo/config qa/Makefile qa/coccinelle/Makefile rules/Makefile doc/Makefile doc/userguide/Makefile contrib/Makefile contrib/file_processor/Makefile contrib/file_processor/Action/Makefile contrib/file_processor/Processor/Makefile suricata.yaml etc/Makefile etc/suricata.logrotate etc/suricata.service python/Makefile python/suricata/config/defaults.py ebpf/Makefile) SURICATA_BUILD_CONF="Suricata Configuration: AF_PACKET support: ${enable_af_packet} diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 0eb1719ab129..0f7e35caec20 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,3 +1,3 @@ -SUBDIRS = file_processor tile_pcie_logd +SUBDIRS = file_processor EXTRA_DIST = suri-graphite diff --git a/contrib/tile_pcie_logd/LICENSE b/contrib/tile_pcie_logd/LICENSE deleted file mode 100644 index d511905c1647..000000000000 --- a/contrib/tile_pcie_logd/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/contrib/tile_pcie_logd/Makefile.am b/contrib/tile_pcie_logd/Makefile.am deleted file mode 100644 index 81a63fcb2b80..000000000000 --- a/contrib/tile_pcie_logd/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ - -EXTRA_DIST = LICENSE README - -if BUILD_PCIE_LOGGING -bin_PROGRAMS = tile_pcie_logd - -tile_pcie_logd_SOURCE = tile_pcie_logd.c - -AM_CFLAGS = -std=gnu99 -Wall -Werror -g -O2 -I$(TILERA_ROOT)/include \ - -DTILEPCI_HOST - -tile_pcie_logd_LDDADD = -pthread - -endif diff --git a/contrib/tile_pcie_logd/README b/contrib/tile_pcie_logd/README deleted file mode 100644 index 32ce7a31d01d..000000000000 --- a/contrib/tile_pcie_logd/README +++ /dev/null @@ -1,38 +0,0 @@ -Introduction ------------- - -This application allows writing files to an x86 host from a TILEncore-Gx -PCIe card. The file name and data are sent over PCIe using the Tilera -Packet Queue API from an aplication running on the Tilera processor. - -The original purpose is to write log files from Suricata (Intrusion -Dectection System) on the x86 host's file system. - -Running The Logger ------------------- - -To run the application, set the TILERA_ROOT environment variable to -point to a valide Tilera MDE, then do: - - make run - -The application should be started before the application on the Tile -side that will be generating the log data. - -By default, queue number 0 is used. The --queue_index=N command line -argument can be used to change the queue number. - -If more than one TILEncore-Gx PCIe card is installed, the --card=M -argument changes to listening to card M. - -Caveats -------- - -Due to the fact that the host driver allocates 4MB physically -contiguous memory for the packet queue ring buffer, it is possible -that this allocation could fail on a host whose memory has been -considerably fragmented. If the host program exits with the following -error, reboot the host and run the test again. - -Host: Failed to open '/dev/tilegxpci%d/packet_queue/t2h/0': Cannot -allocate memory diff --git a/contrib/tile_pcie_logd/tile_pcie_logd.c b/contrib/tile_pcie_logd/tile_pcie_logd.c deleted file mode 100644 index eb06f9e492e9..000000000000 --- a/contrib/tile_pcie_logd/tile_pcie_logd.c +++ /dev/null @@ -1,370 +0,0 @@ -/* Copyright (C) 2013-2014 Tilera Corporation. - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Ken Steele, Tilera Corporation - * \author Tom DeCanio - * - * Host side of PCIe alert logging from Suricata running on a - * TILEncore-Gx card. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define CHECK_SEQ_NUM 1 - -/* The "/dev/tilegxpci%d" device to be used. */ -unsigned int card_index = 0; - -unsigned int debug = 0; - -/* - * When set, drop all alerts rather than write to file. This is for - * testing performance on a file system that can't write files fast - * enough. - */ -unsigned int drop_alerts = 0; - -/* Packet queue index. */ -unsigned int queue_index; - -/* Prefix added to all file paths sent from PCIe card. */ -char * path_prefix = NULL; - -/* By default, the host ring buffer is 4MB in size and it consists of - * 1024 entries of 4KB buffers. Modify GXPCI_HOST_PQ_RING_ENTRIES in - * to change the size of each buffer. To increase - * the total ring buffer size, re-configure the host kernel using - * CONFIG_FORCE_MAX_ZONEORDER. - */ -#ifdef GXPCI_HOST_PQ_SEGMENT_ENTRIES -/* New definitions for MDE 4.1.5 */ -#define RING_BUF_ELEMS GXPCI_HOST_PQ_SEGMENT_ENTRIES -#define RING_BUF_ELEM_SIZE (HOST_PQ_SEGMENT_MAX_SIZE / GXPCI_HOST_PQ_SEGMENT_ENTRIES) -#else -/* Definitions prior to MDE 4.1.5 */ -#define RING_BUF_ELEMS GXPCI_HOST_PQ_RING_ENTRIES -#define RING_BUF_ELEM_SIZE (HOST_PQ_RING_BUF_MAX_SIZE / GXPCI_HOST_PQ_RING_ENTRIES) -#endif - -/*********************************************************************/ -/* Host-Side Packet Consumer */ -/*********************************************************************/ - -#define TAIL_UPDATE_LIMIT_ENABLE - -#define OP_OPEN 1 -#define OP_WRITE 2 -#define OP_CLOSE 3 - -typedef struct { - uint32_t magic; - uint32_t fileno; - uint32_t op; - uint32_t seq; - volatile uint32_t len; - uint32_t next_offset; - char buf[]; -} TrioMsg; - -typedef struct { - FILE *fd; -} FDesc; - -#define MAX_FDESC 1024 - -static FDesc *fdesc[MAX_FDESC]; - -void run_pcie_logging(void) -{ - char dev_name[40]; - int pq_fd; - unsigned int host_ring_buffer_size = RING_BUF_ELEMS * RING_BUF_ELEM_SIZE; - volatile TrioMsg *p; - - printf("Waiting for PCIe logging data from card %d on queue %d...\n", - card_index, queue_index); - - if (path_prefix) { - printf("PCIe logging into directory: '%s'\n", path_prefix); - fflush(stdout); - } - - /* Open the packet queue file. */ - snprintf(dev_name, sizeof(dev_name), "/dev/tilegxpci%d/packet_queue/t2h/%d", - card_index, queue_index); - do { - pq_fd = open(dev_name, O_RDWR); - if (pq_fd < 0) { - sleep(1); - } - } while (pq_fd < 0); - - /* mmap the register space. */ - struct gxpci_host_pq_regs_app* pq_regs = - (struct gxpci_host_pq_regs_app*) - mmap(0, sizeof(struct gxpci_host_pq_regs_app), - PROT_READ | PROT_WRITE, - MAP_SHARED, pq_fd, TILEPCI_PACKET_QUEUE_INDICES_MMAP_OFFSET); - if (pq_regs == MAP_FAILED) { - fprintf(stderr, "Failed to mmap PCIe control registers.\n"); - exit(EXIT_FAILURE); - } - - /* Configure and allocate the ring buffer for the receive queue. */ - tilepci_packet_queue_info_t buf_info; - - buf_info.buf_size = RING_BUF_ELEM_SIZE; - - int err = ioctl(pq_fd, TILEPCI_IOC_SET_PACKET_QUEUE_BUF, &buf_info); - if (err < 0) { - fprintf(stderr, "Failed TILEPCI_IOC_SET_PACKET_QUEUE_BUF: %s\n", - strerror(errno)); - abort(); - } - - /* On the host side, mmap the receive queue region. */ - void* buffer = - mmap(0, host_ring_buffer_size, PROT_READ | PROT_WRITE, - MAP_SHARED, pq_fd, TILEPCI_PACKET_QUEUE_BUF_MMAP_OFFSET); - assert(buffer != MAP_FAILED); - - /* On the host side, mmap the queue status. */ - struct tlr_pq_status *pq_status = - mmap(0, sizeof(struct tlr_pq_status), PROT_READ | PROT_WRITE, - MAP_SHARED, pq_fd, TILEPCI_PACKET_QUEUE_STS_MMAP_OFFSET); - assert(pq_status != MAP_FAILED); - - pq_regs->consumer_index = 0; - - uint64_t packet_count = 0; - volatile uint32_t write; - uint32_t read = 0; - -#ifdef CHECK_SEQ_NUM - uint32_t expect_seq = 1; -#endif - -#ifdef HOST_INTERRUPT_MODE - volatile uint32_t* producer_index = &(pq_status->drv_consumer_index); -#else - volatile uint32_t* producer_index = &(pq_regs->producer_index); -#endif - - volatile uint32_t* consumer_index = &(pq_regs->consumer_index); - volatile enum gxpci_chan_status_t* status = &(pq_status->status); - - while (1) { - if (*status == GXPCI_CHAN_RESET) { - printf("Tile to Host PCIe logging channel was reset.\n"); - fflush(stdout); - return; - } - - // Get packets off the ring buffer by accessing the receive queue at - // the new write index. - write = *producer_index; - - while (write != read) { - if (*status == GXPCI_CHAN_RESET) { - printf("Tile to Host PCIe logging channel was reset.\n"); - fflush(stdout); - return; - } - - packet_count++; - - p = (TrioMsg *)(buffer + ((read&(RING_BUF_ELEMS-1))*RING_BUF_ELEM_SIZE)); - - if (debug) { - fprintf(stdout, "got a message\n"); - fprintf(stdout, "p->magic: %d\n", p->magic); - fprintf(stdout, "p->fileno: %d\n", p->fileno); -#ifdef CHECK_SEQ_NUM - fprintf(stdout, "p->seq: %d\n", p->seq); -#endif - fprintf(stdout, "p->len: %d\n", p->len); - fprintf(stdout, "p->next_offset: %d\n", p->next_offset); - fprintf(stdout, "p->buf: "); - fwrite(&p->buf, sizeof(char), p->len - offsetof(TrioMsg, buf), stdout); - fprintf(stdout, "\n"); - fflush(stdout); - } - -#ifdef CHECK_SEQ_NUM - if (p->seq != expect_seq) { - /* Check for a reset before reporting a bad sequence - * number to prevent confusing users. */ - if (*status == GXPCI_CHAN_RESET) { - printf("Tile to Host PCIe logging channel was reset.\n"); - fflush(stdout); - return; - } - fprintf(stderr, "BAD sequence expected %d got %d\n", expect_seq, p->seq); - return; - } - expect_seq = p->seq + 1; -#endif - - switch (p->op) { - case OP_OPEN: - if (p->fileno < MAX_FDESC) { - fdesc[p->fileno] = malloc(sizeof(FDesc)); - if (fdesc[p->fileno]) { - char mode[2]; - mode[0] = p->buf[0]; - mode[1] = '\0'; - char *file_name = (char *)&p->buf[1]; - if (path_prefix) { - /* Added path_prefix to the start of the - * file name. Added space for '\0' and '\'. - * By default, no prefix is added. */ - int new_size = strlen(path_prefix) + strlen(file_name) + 1 + 1; - char *new_name = malloc(new_size); - if (!new_name) { - fprintf(stderr, "Failed to allocate memory for %s/%s\n", - path_prefix, file_name); - return; - } - snprintf(new_name, new_size, "%s/%s", - path_prefix, file_name); - file_name = new_name; - } - if ((fdesc[p->fileno]->fd = fopen(file_name, mode)) == NULL) { - fprintf(stderr, "Could not open %s: %s\n", - file_name, strerror(errno)); - } else { - printf("Opened '%s' for logging.\n", file_name); - fflush(stdout); - } - } - } else { - fprintf(stderr, "File number %d exceeds Max of %d\n", p->fileno, MAX_FDESC); - } - break; - case OP_WRITE: - if (drop_alerts) { - /* TODO: Report alert count periodically. */ - } else { - if (fdesc[p->fileno] && fdesc[p->fileno]->fd) { - fwrite(&p->buf, sizeof(char), - p->len - offsetof(TrioMsg, buf), - fdesc[p->fileno]->fd); - fflush(fdesc[p->fileno]->fd); - } - } - break; - case OP_CLOSE: - if (fdesc[p->fileno] && fdesc[p->fileno]->fd) { - fclose( fdesc[p->fileno]->fd); - free(fdesc[p->fileno]); - fdesc[p->fileno] = NULL; - } - break; - } - - read++; - /* Update the read index register to inform the tile side - * that the packet has been read. */ - -#ifdef TAIL_UPDATE_LIMIT_ENABLE - if ((packet_count & 0x3f) == 0) - *consumer_index = read; -#else - *consumer_index = read; -#endif - } - } - return; -} - -/* - * Match argument list option. - * Options ending in '=' take an additional value, which may be - * attached in the same argument or detached in the following - * argument. - * @param arglist Points to remaining argv, updated on match. - * @param option The option to match, ending in '=' if it takes a value. - * @return Value if option matches, NULL otherwise. - */ -char *shift_option(char ***arglist, const char* option) -{ - char** args = *arglist; - char* arg = args[0], **rest = &args[1]; - int optlen = strlen(option); - char* val = arg+optlen; - if (option[optlen - 1] != '=') { - if (strcmp(arg, option)) - return NULL; - } else { - if (strncmp(arg, option, optlen-1)) - return NULL; - if (arg[optlen- 1 ] == '\0') - val = *rest++; - else if (arg[optlen - 1] != '=') - return NULL; - } - *arglist = rest; - return val; -} - -int main(int argc, char** argv) -{ - char **args = &argv[1]; - - /* - * Scan command line options. - */ - while (*args) { - char* opt = NULL; - - if ((opt = shift_option(&args, "--queue_index="))) - queue_index = strtoul(opt, NULL, 0); - else if ((opt = shift_option(&args, "--card="))) - card_index = strtoul(opt, NULL, 0); - else if ((opt = shift_option(&args, "--debug"))) - debug = 1; - else if ((opt = shift_option(&args, "--drop"))) - drop_alerts = 1; - else if ((opt = shift_option(&args, "--prefix="))) - path_prefix = opt; - else { - fprintf(stderr, "Unknown option '%s'.\n", args[0]); - exit(EXIT_FAILURE); - } - } - - run_pcie_logging(); - - return 0; -} diff --git a/doc/userguide/partials/options.rst b/doc/userguide/partials/options.rst index dd4105755733..9a0863ab9724 100644 --- a/doc/userguide/partials/options.rst +++ b/doc/userguide/partials/options.rst @@ -223,10 +223,6 @@ Enable packet capture using the Napatech Streams API. -.. option:: --mpipe - - Enable packet capture using the TileGX mpipe interface. - .. option:: --erf-in= Run in offline mode reading the specific ERF file (Endace diff --git a/src/Makefile.am b/src/Makefile.am index 46ef3e604e01..a54f5f3cd586 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -348,7 +348,6 @@ runmode-pcap-file.c runmode-pcap-file.h \ runmode-pfring.c runmode-pfring.h \ runmode-unittests.c runmode-unittests.h \ runmode-unix-socket.c runmode-unix-socket.h \ -runmode-tile.c runmode-tile.h \ runmode-windivert.c runmode-windivert.h \ runmodes.c runmodes.h \ rust.h \ @@ -356,7 +355,6 @@ source-af-packet.c source-af-packet.h \ source-erf-dag.c source-erf-dag.h \ source-erf-file.c source-erf-file.h \ source-ipfw.c source-ipfw.h \ -source-mpipe.c source-mpipe.h \ source-napatech.c source-napatech.h \ source-netmap.c source-netmap.h \ source-nfq.c source-nfq.h \ @@ -375,7 +373,7 @@ stream-tcp-reassemble.c stream-tcp-reassemble.h \ stream-tcp-sack.c stream-tcp-sack.h \ stream-tcp-util.c stream-tcp-util.h \ suricata.c suricata.h \ -threads.c threads.h threads-arch-tile.h \ +threads.c threads.h \ threads-debug.h threads-profile.h \ tm-modules.c tm-modules.h \ tmqh-flow.c tmqh-flow.h \ @@ -429,7 +427,6 @@ util-ioctl.h util-ioctl.c \ util-ip.h util-ip.c \ util-ja3.h util-ja3.c \ util-logopenfile.h util-logopenfile.c \ -util-logopenfile-tile.h util-logopenfile-tile.c \ util-log-redis.h util-log-redis.c \ util-lua.c util-lua.h \ util-luajit.c util-luajit.h \ diff --git a/src/decode.h b/src/decode.h index d4d4595cc85e..bbad1bb4b80c 100644 --- a/src/decode.h +++ b/src/decode.h @@ -62,7 +62,6 @@ enum PktSrcEnum { #include "source-ipfw.h" #include "source-pcap.h" #include "source-af-packet.h" -#include "source-mpipe.h" #include "source-netmap.h" #include "source-windivert.h" #ifdef HAVE_PF_RING_FLOW_OFFLOAD @@ -463,10 +462,6 @@ typedef struct Packet_ #ifdef AF_PACKET AFPPacketVars afp_v; #endif -#ifdef HAVE_MPIPE - /* tilegx mpipe stuff */ - MpipePacketVars mpipe_v; -#endif #ifdef HAVE_NETMAP NetmapPacketVars netmap_v; #endif @@ -609,12 +604,7 @@ typedef struct Packet_ #ifdef HAVE_NAPATECH NapatechPacketVars ntpv; #endif -} -#ifdef HAVE_MPIPE - /* mPIPE requires packet buffers to be aligned to 128 byte boundaries. */ - __attribute__((aligned(128))) -#endif -Packet; +} Packet; /** highest mtu of the interfaces we monitor */ extern int g_default_mtu; diff --git a/src/detect-engine-mpm.c b/src/detect-engine-mpm.c index 59c85374108a..41c1c00e832e 100644 --- a/src/detect-engine-mpm.c +++ b/src/detect-engine-mpm.c @@ -506,11 +506,6 @@ uint16_t PatternMatchDefaultMatcher(void) } done: -#ifdef __tile__ - if (mpm_algo_val == MPM_AC) - mpm_algo_val = MPM_AC_KS; -#endif - return mpm_algo_val; } diff --git a/src/flow.h b/src/flow.h index 0262f74bed94..4d972fb6ae50 100644 --- a/src/flow.h +++ b/src/flow.h @@ -289,19 +289,9 @@ typedef struct FlowAddress_ { #define addr_data16 address.address_un_data16 #define addr_data8 address.address_un_data8 -#ifdef __tile__ -/* Atomic Ints performance better on Tile. */ -typedef unsigned int FlowRefCount; -#else typedef unsigned short FlowRefCount; -#endif -#ifdef __tile__ -/* Atomic Ints performance better on Tile. */ -typedef unsigned int FlowStateType; -#else typedef unsigned short FlowStateType; -#endif /** Local Thread ID */ typedef uint16_t FlowThreadId; diff --git a/src/runmode-tile.c b/src/runmode-tile.c deleted file mode 100644 index 4e94e24dab4e..000000000000 --- a/src/runmode-tile.c +++ /dev/null @@ -1,273 +0,0 @@ -/* Copyright (C) 2011-2013 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Tom DeCanio - * \author Ken Steele, Tilera Corporation - * - * Tilera TILE-Gx runmode support - */ - -#include "suricata-common.h" -#include "tm-threads.h" -#include "conf.h" -#include "runmodes.h" -#include "runmode-tile.h" -#include "output.h" -#include "source-mpipe.h" - -#include "detect-engine.h" - -#include "util-debug.h" -#include "util-time.h" -#include "util-cpu.h" -#include "util-affinity.h" -#include "util-device.h" - -#ifdef HAVE_MPIPE -/* Number of configured parallel pipelines. */ -int tile_num_pipelines; -#endif - -/* - * runmode support for tilegx - */ - -static const char *mpipe_default_mode = "workers"; - -const char *RunModeTileMpipeGetDefaultMode(void) -{ - return mpipe_default_mode; -} - -void RunModeTileMpipeRegister(void) -{ -#ifdef HAVE_MPIPE - RunModeRegisterNewRunMode(RUNMODE_TILERA_MPIPE, "workers", - "Workers tilegx mpipe mode, each thread does all" - " tasks from acquisition to logging", - RunModeTileMpipeWorkers); - mpipe_default_mode = "workers"; -#endif -} - -#ifdef HAVE_MPIPE - -void *ParseMpipeConfig(const char *iface) -{ - ConfNode *if_root; - ConfNode *mpipe_node; - MpipeIfaceConfig *aconf = SCMalloc(sizeof(*aconf)); - char *copymodestr; - char *out_iface = NULL; - - if (unlikely(aconf == NULL)) { - return NULL; - } - - if (iface == NULL) { - SCFree(aconf); - return NULL; - } - - strlcpy(aconf->iface, iface, sizeof(aconf->iface)); - - /* Find initial node */ - mpipe_node = ConfGetNode("mpipe.inputs"); - if (mpipe_node == NULL) { - SCLogInfo("Unable to find mpipe config using default value"); - return aconf; - } - - if_root = ConfNodeLookupKeyValue(mpipe_node, "interface", iface); - if (if_root == NULL) { - SCLogInfo("Unable to find mpipe config for " - "interface %s, using default value", - iface); - return aconf; - } - - if (ConfGetChildValue(if_root, "copy-iface", &out_iface) == 1) { - if (strlen(out_iface) > 0) { - aconf->out_iface = out_iface; - } - } - aconf->copy_mode = MPIPE_COPY_MODE_NONE; - if (ConfGetChildValue(if_root, "copy-mode", ©modestr) == 1) { - if (aconf->out_iface == NULL) { - SCLogInfo("Copy mode activated but no destination" - " iface. Disabling feature"); - } else if (strlen(copymodestr) <= 0) { - aconf->out_iface = NULL; - } else if (strcmp(copymodestr, "ips") == 0) { - SCLogInfo("MPIPE IPS mode activated %s->%s", - iface, - aconf->out_iface); - aconf->copy_mode = MPIPE_COPY_MODE_IPS; - } else if (strcmp(copymodestr, "tap") == 0) { - SCLogInfo("MPIPE TAP mode activated %s->%s", - iface, - aconf->out_iface); - aconf->copy_mode = MPIPE_COPY_MODE_TAP; - } else { - SCLogError(SC_ERR_RUNMODE, "Invalid mode (expected tap or ips)"); - exit(EXIT_FAILURE); - } - } - return aconf; -} - -/** - * \brief RunModeTileMpipeWorkers set up to process all modules in each thread. - * - * \param iface pointer to the name of the interface from which we will - * fetch the packets - * \retval 0 if all goes well. (If any problem is detected the engine will - * exit()) - */ -int RunModeTileMpipeWorkers(void) -{ - SCEnter(); - char tname[TM_THREAD_NAME_MAX]; - char *thread_name; - TmModule *tm_module; - int pipe; - - RunModeInitialize(); - - /* Available cpus */ - uint16_t ncpus = UtilCpuGetNumProcessorsOnline(); - - TimeModeSetLive(); - - unsigned int pipe_max = 1; - if (ncpus > 1) - pipe_max = ncpus - 1; - - intmax_t threads; - - if (ConfGetInt("mpipe.threads", &threads) == 1) { - tile_num_pipelines = threads; - } else { - tile_num_pipelines = pipe_max; - } - SCLogInfo("%d Tilera worker threads", tile_num_pipelines); - - ReceiveMpipeInit(); - - char *mpipe_dev = NULL; - int nlive = LiveGetDeviceCount(); - if (nlive > 0) { - SCLogInfo("Using %d live device(s).", nlive); - /*mpipe_dev = LiveGetDevice(0);*/ - } else { - /* - * Attempt to get interface from config file - * overrides -i from command line. - */ - if (ConfGet("mpipe.interface", &mpipe_dev) == 0) { - if (ConfGet("mpipe.single_mpipe_dev", &mpipe_dev) == 0) { - SCLogError(SC_ERR_RUNMODE, "Failed retrieving " - "mpipe.single_mpipe_dev from Conf"); - exit(EXIT_FAILURE); - } - } - } - - /* Get affinity for worker */ - cpu_set_t cpus; - //int result = tmc_cpus_get_my_affinity(&cpus); - int result = tmc_cpus_get_dataplane_cpus(&cpus); - if (result < 0) { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "tmc_cpus_get_my_affinity() returned=%d", result); - SCReturnInt(TM_ECODE_FAILED); - } - - for (pipe = 0; pipe < tile_num_pipelines; pipe++) { - char *mpipe_devc; - - if (nlive > 0) { - mpipe_devc = SCStrdup("multi"); - } else { - mpipe_devc = SCStrdup(mpipe_dev); - } - if (unlikely(mpipe_devc == NULL)) { - printf("ERROR: SCStrdup failed for ReceiveMpipe\n"); - exit(EXIT_FAILURE); - } - - snprintf(tname, sizeof(tname), "%s#%02d", thread_name_workers, pipe+1); - - /* create the threads */ - ThreadVars *tv_worker = - TmThreadCreatePacketHandler(tname, - "packetpool", "packetpool", - "packetpool", "packetpool", - "pktacqloop"); - if (tv_worker == NULL) { - printf("ERROR: TmThreadsCreate failed\n"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName("ReceiveMpipe"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName failed for ReceiveMpipe\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_worker, tm_module, (void *)mpipe_devc); - - /* Bind to a single cpu. */ - int pipe_cpu = tmc_cpus_find_nth_cpu(&cpus, pipe); - tv_worker->rank = pipe; - - TmThreadSetCPUAffinity(tv_worker, pipe_cpu); - - tm_module = TmModuleGetByName("DecodeMpipe"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName DecodeMpipe failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_worker, tm_module, NULL); - - tm_module = TmModuleGetByName("FlowWorker"); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName for FlowWorker failed"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_worker, tm_module, NULL); - - tm_module = TmModuleGetByName("RespondReject"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName for RespondReject failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_worker, tm_module, NULL); - - SetupOutputs(tv_worker); - - if (TmThreadSpawn(tv_worker) != TM_ECODE_OK) { - printf("ERROR: TmThreadSpawn failed\n"); - exit(EXIT_FAILURE); - } - } - - return 0; -} - -#endif diff --git a/src/runmode-tile.h b/src/runmode-tile.h deleted file mode 100644 index ec6c9e5042dd..000000000000 --- a/src/runmode-tile.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2011-2013 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Tom DeCanio - * \author Ken Steele, Tilera Corporation - * - * Tilera TILE-Gx runmode support - */ - -#ifndef __RUNMODE_TILE_H__ -#define __RUNMODE_TILE_H__ - -#include "suricata-common.h" - -const char *RunModeTileMpipeGetDefaultMode(void); -void RunModeTileMpipeRegister(void); - -extern int tile_num_pipelines; - -int RunModeTileMpipeWorkers(void); - -void *ParseMpipeConfig(const char *iface); - -#endif /* __RUNMODE_TILE_H__ */ diff --git a/src/runmodes.c b/src/runmodes.c index acb1b6c7d687..e9f0f53a8871 100644 --- a/src/runmodes.c +++ b/src/runmodes.c @@ -135,8 +135,6 @@ static const char *RunModeTranslateModeToName(int runmode) return "NAPATECH"; case RUNMODE_UNITTEST: return "UNITTEST"; - case RUNMODE_TILERA_MPIPE: - return "MPIPE"; case RUNMODE_AFP_DEV: return "AF_PACKET_DEV"; case RUNMODE_NETMAP: @@ -224,7 +222,6 @@ void RunModeRegisterRunModes(void) RunModeIdsAFPRegister(); RunModeIdsNetmapRegister(); RunModeIdsNflogRegister(); - RunModeTileMpipeRegister(); RunModeUnixSocketRegister(); RunModeIpsWinDivertRegister(); #ifdef UNITTESTS @@ -317,9 +314,6 @@ void RunModeDispatch(int runmode, const char *custom_mode) case RUNMODE_DAG: custom_mode = RunModeErfDagGetDefaultMode(); break; - case RUNMODE_TILERA_MPIPE: - custom_mode = RunModeTileMpipeGetDefaultMode(); - break; case RUNMODE_NAPATECH: custom_mode = RunModeNapatechGetDefaultMode(); break; diff --git a/src/runmodes.h b/src/runmodes.h index 3087ff9a0eba..67e96c1417ac 100644 --- a/src/runmodes.h +++ b/src/runmodes.h @@ -36,7 +36,6 @@ enum RunModes { RUNMODE_DAG, RUNMODE_AFP_DEV, RUNMODE_NETMAP, - RUNMODE_TILERA_MPIPE, RUNMODE_UNITTEST, RUNMODE_NAPATECH, RUNMODE_UNIX_SOCKET, @@ -97,7 +96,6 @@ int RunModeNeedsBypassManager(void); #include "runmode-pcap.h" #include "runmode-pcap-file.h" #include "runmode-pfring.h" -#include "runmode-tile.h" #include "runmode-nfq.h" #include "runmode-ipfw.h" #include "runmode-erf-file.h" diff --git a/src/source-mpipe.c b/src/source-mpipe.c deleted file mode 100644 index 0310115a0401..000000000000 --- a/src/source-mpipe.c +++ /dev/null @@ -1,1095 +0,0 @@ -/* Copyright (C) 2011-2014 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Tom DeCanio - * \author Ken Steele, Tilera Corporation - * - * Tilera TILE-Gx mpipe ingress packet support. - */ - -#include "suricata-common.h" -#include "suricata.h" -#include "host.h" -#include "decode.h" -#include "packet-queue.h" -#include "threads.h" -#include "threadvars.h" -#include "tm-queuehandlers.h" -#include "tm-threads.h" -#include "tm-threads-common.h" -#include "runmode-tile.h" -#include "source-mpipe.h" -#include "conf.h" -#include "util-debug.h" -#include "util-error.h" -#include "util-privs.h" -#include "util-device.h" -#include "util-mem.h" -#include "util-profiling.h" -#include "tmqh-packetpool.h" -#include "pkt-var.h" - -#ifdef HAVE_MPIPE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Align "p" mod "align", assuming "p" is a "void*". */ -#define ALIGN(p, align) do { (p) += -(long)(p) & ((align) - 1); } while(0) - -#define VERIFY(VAL, WHAT) \ - do { \ - int __val = (VAL); \ - if (__val < 0) { \ - SCLogError(SC_ERR_INVALID_ARGUMENT,(WHAT)); \ - SCReturnInt(TM_ECODE_FAILED); \ - } \ - } while (0) - -#define min(a,b) (((a) < (b)) ? (a) : (b)) - -/** storage for mpipe device names */ -typedef struct MpipeDevice_ { - char *dev; /**< the device (e.g. "xgbe1") */ - TAILQ_ENTRY(MpipeDevice_) next; -} MpipeDevice; - - -/** private device list */ -static TAILQ_HEAD(, MpipeDevice_) mpipe_devices = - TAILQ_HEAD_INITIALIZER(mpipe_devices); - -static int first_stack; -static uint32_t headroom = 2; - -/** - * \brief Structure to hold thread specific variables. - */ -typedef struct MpipeThreadVars_ -{ - ChecksumValidationMode checksum_mode; - - /* counters */ - uint32_t pkts; - uint64_t bytes; - uint32_t errs; - - ThreadVars *tv; - TmSlot *slot; - - Packet *in_p; - - /** stats/counters */ - uint16_t max_mpipe_depth; - uint16_t mpipe_drop; - uint16_t counter_no_buffers_0; - uint16_t counter_no_buffers_1; - uint16_t counter_no_buffers_2; - uint16_t counter_no_buffers_3; - uint16_t counter_no_buffers_4; - uint16_t counter_no_buffers_5; - uint16_t counter_no_buffers_6; - uint16_t counter_no_buffers_7; - -} MpipeThreadVars; - -TmEcode ReceiveMpipeLoop(ThreadVars *tv, void *data, void *slot); -TmEcode ReceiveMpipeThreadInit(ThreadVars *, void *, void **); -void ReceiveMpipeThreadExitStats(ThreadVars *, void *); - -TmEcode DecodeMpipeThreadInit(ThreadVars *, void *, void **); -TmEcode DecodeMpipeThreadDeinit(ThreadVars *tv, void *data); -TmEcode DecodeMpipe(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); -static int MpipeReceiveOpenIqueue(int rank); - -#define MAX_CHANNELS 32 /* can probably find this in the MDE */ - -/* - * mpipe configuration. - */ - -/* The mpipe context (shared by all workers) */ -static gxio_mpipe_context_t context_body; -static gxio_mpipe_context_t* context = &context_body; - -/* First allocated Notification ring for iQueues. */ -static int first_notif_ring; - -/* The ingress queue for this worker thread */ -static __thread gxio_mpipe_iqueue_t* thread_iqueue; - -/* The egress queues (one per port) */ -static gxio_mpipe_equeue_t equeue[MAX_CHANNELS]; - -/* the number of entries in an equeue ring */ -static const int equeue_entries = 8192; - -/* Array of mpipe links */ -static gxio_mpipe_link_t mpipe_link[MAX_CHANNELS]; - -/* Per interface configuration data */ -static MpipeIfaceConfig *mpipe_conf[MAX_CHANNELS]; - -/* Per interface TAP/IPS configuration */ - -/* egress equeue associated with each ingress channel */ -static MpipePeerVars channel_to_equeue[MAX_CHANNELS]; - -/** - * \brief Registration Function for ReceiveMpipe. - * \todo Unit tests are needed for this module. - */ -void TmModuleReceiveMpipeRegister (void) -{ - tmm_modules[TMM_RECEIVEMPIPE].name = "ReceiveMpipe"; - tmm_modules[TMM_RECEIVEMPIPE].ThreadInit = ReceiveMpipeThreadInit; - tmm_modules[TMM_RECEIVEMPIPE].Func = NULL; - tmm_modules[TMM_RECEIVEMPIPE].PktAcqLoop = ReceiveMpipeLoop; - tmm_modules[TMM_RECEIVEMPIPE].PktAcqBreakLoop = NULL; - tmm_modules[TMM_RECEIVEMPIPE].ThreadExitPrintStats = ReceiveMpipeThreadExitStats; - tmm_modules[TMM_RECEIVEMPIPE].ThreadDeinit = NULL; - tmm_modules[TMM_RECEIVEMPIPE].RegisterTests = NULL; - tmm_modules[TMM_RECEIVEMPIPE].cap_flags = SC_CAP_NET_RAW; - tmm_modules[TMM_RECEIVEMPIPE].flags = TM_FLAG_RECEIVE_TM; -} - -/** - * \brief Registraction Function for DecodeNetio. - * \todo Unit tests are needed for this module. - */ -void TmModuleDecodeMpipeRegister (void) -{ - tmm_modules[TMM_DECODEMPIPE].name = "DecodeMpipe"; - tmm_modules[TMM_DECODEMPIPE].ThreadInit = DecodeMpipeThreadInit; - tmm_modules[TMM_DECODEMPIPE].Func = DecodeMpipe; - tmm_modules[TMM_DECODEMPIPE].ThreadExitPrintStats = NULL; - tmm_modules[TMM_DECODEMPIPE].ThreadDeinit = DecodeMpipeThreadDeinit; - tmm_modules[TMM_DECODEMPIPE].RegisterTests = NULL; - tmm_modules[TMM_DECODEMPIPE].cap_flags = 0; - tmm_modules[TMM_DECODEMPIPE].flags = TM_FLAG_DECODE_TM; -} - -/* Release Packet without sending. */ -void MpipeReleasePacket(Packet *p) -{ - /* Use this thread's context to free the packet. */ - // TODO: Check for dual mPipes. - gxio_mpipe_iqueue_t* iqueue = thread_iqueue; - int bucket = p->mpipe_v.idesc.bucket_id; - gxio_mpipe_credit(iqueue->context, iqueue->ring, bucket, 1); - - gxio_mpipe_push_buffer(iqueue->context, - p->mpipe_v.idesc.stack_idx, - (void*)(intptr_t)p->mpipe_v.idesc.va); -} - -/* Unconditionally send packet, then release packet buffer. */ -void MpipeReleasePacketCopyTap(Packet *p) -{ - gxio_mpipe_iqueue_t* iqueue = thread_iqueue; - int bucket = p->mpipe_v.idesc.bucket_id; - gxio_mpipe_credit(iqueue->context, iqueue->ring, bucket, 1); - gxio_mpipe_edesc_t edesc; - edesc.words[0] = 0; - edesc.words[1] = 0; - edesc.bound = 1; - edesc.xfer_size = p->mpipe_v.idesc.l2_size; - edesc.va = p->mpipe_v.idesc.va; - edesc.stack_idx = p->mpipe_v.idesc.stack_idx; - edesc.hwb = 1; /* mPIPE will return packet buffer to proper stack. */ - edesc.size = p->mpipe_v.idesc.size; - int channel = p->mpipe_v.idesc.channel; - /* Tell mPIPE to egress the packet. */ - gxio_mpipe_equeue_put(channel_to_equeue[channel].peer_equeue, edesc); -} - -/* Release Packet and send copy if action is not DROP. */ -void MpipeReleasePacketCopyIPS(Packet *p) -{ - if (unlikely(PACKET_TEST_ACTION(p, ACTION_DROP))) { - /* Return packet buffer without sending the packet. */ - MpipeReleasePacket(p); - } else { - /* Send packet */ - MpipeReleasePacketCopyTap(p); - } -} - -/** - * \brief Mpipe Packet Process function. - * - * This function fills in our packet structure from mpipe. - * From here the packets are picked up by the DecodeMpipe thread. - * - * \param user pointer to MpipeThreadVars passed from pcap_dispatch - * \param h pointer to gxio packet header - * \param pkt pointer to current packet - */ -static inline -Packet *MpipeProcessPacket(MpipeThreadVars *ptv, gxio_mpipe_idesc_t *idesc) -{ - int caplen = idesc->l2_size; - u_char *pkt = gxio_mpipe_idesc_get_va(idesc); - Packet *p = (Packet *)(pkt - sizeof(Packet) - headroom/*2*/); - - PACKET_RECYCLE(p); - PKT_SET_SRC(p, PKT_SRC_WIRE); - - ptv->bytes += caplen; - ptv->pkts++; - - gettimeofday(&p->ts, NULL); - - p->datalink = LINKTYPE_ETHERNET; - /* No need to check return value, since the only error is pkt == NULL which can't happen here. */ - PacketSetData(p, pkt, caplen); - - /* copy only the fields we use later */ - p->mpipe_v.idesc.bucket_id = idesc->bucket_id; - p->mpipe_v.idesc.nr = idesc->nr; - p->mpipe_v.idesc.cs = idesc->cs; - p->mpipe_v.idesc.va = idesc->va; - p->mpipe_v.idesc.stack_idx = idesc->stack_idx; - MpipePeerVars *equeue_info = &channel_to_equeue[idesc->channel]; - if (equeue_info->copy_mode != MPIPE_COPY_MODE_NONE) { - p->mpipe_v.idesc.size = idesc->size; - p->mpipe_v.idesc.l2_size = idesc->l2_size; - p->mpipe_v.idesc.channel = idesc->channel; - p->ReleasePacket = equeue_info->ReleasePacket; - } else { - p->ReleasePacket = MpipeReleasePacket; - } - - if (ptv->checksum_mode == CHECKSUM_VALIDATION_DISABLE) - p->flags |= PKT_IGNORE_CHECKSUM; - - return p; -} - -static uint16_t XlateStack(MpipeThreadVars *ptv, int stack_idx) -{ - switch(stack_idx - first_stack) { - case 0: - return ptv->counter_no_buffers_0; - case 1: - return ptv->counter_no_buffers_1; - case 2: - return ptv->counter_no_buffers_2; - case 3: - return ptv->counter_no_buffers_3; - case 4: - return ptv->counter_no_buffers_4; - case 5: - return ptv->counter_no_buffers_5; - case 6: - return ptv->counter_no_buffers_6; - case 7: - return ptv->counter_no_buffers_7; - default: - return ptv->counter_no_buffers_7; - } -} - -static void SendNoOpPacket(ThreadVars *tv, TmSlot *slot) -{ - Packet *p = PacketPoolGetPacket(); - if (p == NULL) { - return; - } - - p->datalink = DLT_RAW; - p->proto = IPPROTO_TCP; - - /* So that DecodeMpipe ignores is. */ - p->flags |= PKT_PSEUDO_STREAM_END; - - p->flow = NULL; - - TmThreadsSlotProcessPkt(tv, slot, p); -} - -/** - * \brief Receives packets from an interface via gxio mpipe. - */ -TmEcode ReceiveMpipeLoop(ThreadVars *tv, void *data, void *slot) -{ - SCEnter(); - - MpipeThreadVars *ptv = (MpipeThreadVars *)data; - TmSlot *s = (TmSlot *)slot; - ptv->slot = s->slot_next; - Packet *p = NULL; - int rank = tv->rank; - int max_queued = 0; - char *ctype; - - ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; - if (ConfGet("mpipe.checksum-checks", &ctype) == 1) { - if (ConfValIsTrue(ctype)) { - ptv->checksum_mode = CHECKSUM_VALIDATION_ENABLE; - } else if (ConfValIsFalse(ctype)) { - ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; - } else { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "Invalid value for checksum-check for mpipe"); - } - } - - /* Open Ingress Queue for this worker thread. */ - MpipeReceiveOpenIqueue(rank); - gxio_mpipe_iqueue_t* iqueue = thread_iqueue; - int update_counter = 0; - uint64_t last_packet_time = get_cycle_count(); - - for (;;) { - - /* Check to see how many packets are available to process. */ - gxio_mpipe_idesc_t *idesc; - int n = gxio_mpipe_iqueue_try_peek(iqueue, &idesc); - if (likely(n > 0)) { - int i; - int m = min(n, 16); - - /* Prefetch the idescs (64 bytes each). */ - for (i = 0; i < m; i++) { - __insn_prefetch(&idesc[i]); - } - if (unlikely(n > max_queued)) { - StatsSetUI64(tv, ptv->max_mpipe_depth, - (uint64_t)n); - max_queued = n; - } - for (i = 0; i < m; i++, idesc++) { - if (likely(!gxio_mpipe_idesc_has_error(idesc))) { - p = MpipeProcessPacket(ptv, idesc); - p->mpipe_v.rank = rank; - if (TmThreadsSlotProcessPkt(ptv->tv, ptv->slot, p) != TM_ECODE_OK) { - TmqhOutputPacketpool(ptv->tv, p); - SCReturnInt(TM_ECODE_FAILED); - } - } else { - if (idesc->be) { - /* Buffer Error - No buffer available, so mPipe - * dropped the packet. */ - StatsIncr(tv, XlateStack(ptv, idesc->stack_idx)); - } else { - /* Bad packet. CRC error */ - StatsIncr(tv, ptv->mpipe_drop); - gxio_mpipe_iqueue_drop(iqueue, idesc); - } - gxio_mpipe_iqueue_release(iqueue, idesc); - } - } - /* Move forward M packets in ingress ring. */ - gxio_mpipe_iqueue_advance(iqueue, m); - - last_packet_time = get_cycle_count(); - } - if (update_counter-- <= 0) { - /* Only periodically update and check for termination. */ - StatsSyncCountersIfSignalled(tv); - update_counter = 10000; - - if (suricata_ctl_flags != 0) { - break; - } - - // If no packet has been received for some period of time, process a NOP packet - // just to make sure that pseudo packets from the Flow manager get processed. - uint64_t now = get_cycle_count(); - if (now - last_packet_time > 100000000) { - SendNoOpPacket(ptv->tv, ptv->slot); - last_packet_time = now; - } - } - } - SCReturnInt(TM_ECODE_OK); -} - -static void MpipeRegisterPerfCounters(MpipeThreadVars *ptv, ThreadVars *tv) -{ - /* register counters */ - ptv->max_mpipe_depth = StatsRegisterCounter("mpipe.max_mpipe_depth", tv); - ptv->mpipe_drop = StatsRegisterCounter("mpipe.drop", tv); - ptv->counter_no_buffers_0 = StatsRegisterCounter("mpipe.no_buf0", tv); - ptv->counter_no_buffers_1 = StatsRegisterCounter("mpipe.no_buf1", tv); - ptv->counter_no_buffers_2 = StatsRegisterCounter("mpipe.no_buf2", tv); - ptv->counter_no_buffers_3 = StatsRegisterCounter("mpipe.no_buf3", tv); - ptv->counter_no_buffers_4 = StatsRegisterCounter("mpipe.no_buf4", tv); - ptv->counter_no_buffers_5 = StatsRegisterCounter("mpipe.no_buf5", tv); - ptv->counter_no_buffers_6 = StatsRegisterCounter("mpipe.no_buf6", tv); - ptv->counter_no_buffers_7 = StatsRegisterCounter("mpipe.no_buf7", tv); -} - -static const gxio_mpipe_buffer_size_enum_t gxio_buffer_sizes[] = { - GXIO_MPIPE_BUFFER_SIZE_128, - GXIO_MPIPE_BUFFER_SIZE_256, - GXIO_MPIPE_BUFFER_SIZE_512, - GXIO_MPIPE_BUFFER_SIZE_1024, - GXIO_MPIPE_BUFFER_SIZE_1664, - GXIO_MPIPE_BUFFER_SIZE_4096, - GXIO_MPIPE_BUFFER_SIZE_10368, - GXIO_MPIPE_BUFFER_SIZE_16384 -}; - -static const int buffer_sizes[] = { - 128, - 256, - 512, - 1024, - 1664, - 4096, - 10368, - 16384 -}; - -static int NormalizeBufferWeights(float buffer_weights[], int num_weights) -{ - int stack_count = 0; - /* Count required buffer stacks and normalize weights to sum to 1.0. */ - float total_weight = 0; - for (int i = 0; i < num_weights; i++) { - if (buffer_weights[i] != 0) { - ++stack_count; - total_weight += buffer_weights[i]; - } - } - /* Convert each weight to a value between 0 and 1. inclusive. */ - for (int i = 0; i < num_weights; i++) { - if (buffer_weights[i] != 0) { - buffer_weights[i] /= total_weight; - } - } - - SCLogInfo("DEBUG: %u non-zero sized stacks", stack_count); - return stack_count; -} - -static TmEcode ReceiveMpipeAllocatePacketBuffers(void) -{ - SCEnter(); - int num_buffers; - int result; - int total_buffers = 0; - - /* Relative weighting for the number of buffers of each size. - */ - float buffer_weight[] = { - 0 , /* 128 */ - 4 , /* 256 */ - 0 , /* 512 */ - 0 , /* 1024 */ - 4 , /* 1664 */ - 0 , /* 4096 */ - 0 , /* 10386 */ - 0 /* 16384 */ - }; - - int num_weights = sizeof(buffer_weight)/sizeof(buffer_weight[0]); - if (ConfGetNode("mpipe.stack") != NULL) { - float weight; - for (int i = 0; i < num_weights; i++) - buffer_weight[i] = 0; - if (ConfGetFloat("mpipe.stack.size128", &weight)) - buffer_weight[0] = weight; - if (ConfGetFloat("mpipe.stack.size256", &weight)) - buffer_weight[1] = weight; - if (ConfGetFloat("mpipe.stack.size512", &weight)) - buffer_weight[2] = weight; - if (ConfGetFloat("mpipe.stack.size1024", &weight)) - buffer_weight[3] = weight; - if (ConfGetFloat("mpipe.stack.size1664", &weight)) - buffer_weight[4] = weight; - if (ConfGetFloat("mpipe.stack.size4096", &weight)) - buffer_weight[5] = weight; - if (ConfGetFloat("mpipe.stack.size10386", &weight)) - buffer_weight[6] = weight; - if (ConfGetFloat("mpipe.stack.size16384", &weight)) - buffer_weight[7] = weight; - } - - int stack_count = NormalizeBufferWeights(buffer_weight, num_weights); - - /* Allocate one of the largest pages to hold our buffer stack, - * notif ring, and packets. First get a bit map of the - * available page sizes. */ - unsigned long available_pagesizes = tmc_alloc_get_pagesizes(); - - void *packet_page = NULL; - size_t tile_vhuge_size = 64 * 1024; - - /* Try the largest available page size first to see if any - * pages of that size can be allocated. */ - for (int i = sizeof(available_pagesizes) * 8 - 1; i; i--) { - unsigned long size = 1UL<= 1) && (value <= 4096)) { - /* Must be a power of 2, so round up to next power of 2. */ - int ceiling_log2 = 64 - __builtin_clz((int64_t)value - 1); - *num_buckets = 1 << (ceiling_log2); - } else { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "Illegal mpipe.buckets value (%ld). must be between 1 and 4096.", value); - } - } - if (ConfGetInt("mpipe.min-buckets", &value) == 1) { - /* range check */ - if ((value >= 1) && (value <= 4096)) { - /* Must be a power of 2, so round up to next power of 2. */ - int ceiling_log2 = 64 - __builtin_clz((int64_t)value - 1); - min_buckets = 1 << (ceiling_log2); - } else { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "Illegal min-mpipe.buckets value (%ld). must be between 1 and 4096.", value); - } - } - - /* Allocate buckets. Keep trying half the number of requested buckets until min-bucket is reached. */ - while (1) { - *first_bucket = gxio_mpipe_alloc_buckets(context, *num_buckets, 0, 0); - if (*first_bucket != GXIO_MPIPE_ERR_NO_BUCKET) - break; - /* Failed to allocate the requested number of buckets. Keep - * trying less buckets until min-buckets is reached. - */ - if (*num_buckets <= min_buckets) { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "Could not allocate (%d) mpipe buckets. " - "Try a smaller mpipe.buckets value in suricata.yaml", *num_buckets); - SCReturnInt(TM_ECODE_FAILED); - } - /* Cut the number of requested buckets in half and try again. */ - *num_buckets /= 2; - } - - /* Init group and buckets, preserving packet order among flows. */ - gxio_mpipe_bucket_mode_t mode = GXIO_MPIPE_BUCKET_STATIC_FLOW_AFFINITY; - char *balance; - if (ConfGet("mpipe.load-balance", &balance) == 1) { - if (balance) { - if (strcmp(balance, "static") == 0) { - mode = GXIO_MPIPE_BUCKET_STATIC_FLOW_AFFINITY; - SCLogInfo("Using \"static\" flow affinity load balancing with %d buckets.", *num_buckets); - } else if (strcmp(balance, "dynamic") == 0) { - mode = GXIO_MPIPE_BUCKET_DYNAMIC_FLOW_AFFINITY; - SCLogInfo("Using \"dynamic\" flow affinity load balancing with %d buckets.", *num_buckets); - } else if (strcmp(balance, "sticky") == 0) { - mode = GXIO_MPIPE_BUCKET_STICKY_FLOW_LOCALITY; - SCLogInfo("Using \"sticky\" load balancing with %d buckets.", *num_buckets); - } else if (strcmp(balance, "round-robin") == 0) { - mode = GXIO_MPIPE_BUCKET_ROUND_ROBIN; - } else { - SCLogWarning(SC_ERR_INVALID_ARGUMENT, - "Illegal load balancing mode \"%s\"", balance); - balance = "static"; - } - } - } else { - balance = "static"; - } - SCLogInfo("Using \"%s\" load balancing with %d buckets.", balance, *num_buckets); - - result = gxio_mpipe_init_notif_group_and_buckets(context, group, - ring, num_workers, - *first_bucket, - *num_buckets, - mode); - VERIFY(result, "gxio_mpipe_init_notif_group_and_buckets()"); - - SCReturnInt(TM_ECODE_OK); -} - -/* \brief Register mPIPE classifier rules to start receiving packets. - * - * \param Index of the first classifier bucket - * \param Number of classifier buckets. - * - * \return result code where <0 is an error. - */ -static int ReceiveMpipeRegisterRules(int bucket, int num_buckets) -{ - /* Register for packets. */ - gxio_mpipe_rules_t rules; - gxio_mpipe_rules_init(&rules, context); - gxio_mpipe_rules_begin(&rules, bucket, num_buckets, NULL); - /* Give Suricata priority over Linux to receive packets. */ - gxio_mpipe_rules_set_priority(&rules, -100); - return gxio_mpipe_rules_commit(&rules); -} - -/* \brief Initialize mPIPE ingress ring - * - * \param name of interface to open - * \param Array of port configuations - * - * \return Output port channel number, or -1 on error - */ -static int MpipeReceiveOpenIqueue(int rank) -{ - /* Initialize the NotifRings. */ - size_t notif_ring_entries = 2048; - intmax_t value = 0; - if (ConfGetInt("mpipe.iqueue-packets", &value) == 1) { - /* range check */ - if (value == 128 || value == 512 || value == 2048 || value == (64 * 1024)) { - notif_ring_entries = value; - } else { - SCLogError(SC_ERR_INVALID_ARGUMENT, "Illegal mpipe.iqueue_packets value. must be 128, 512, 2048 or 65536."); - } - } - - size_t notif_ring_size = notif_ring_entries * sizeof(gxio_mpipe_idesc_t); - - tmc_alloc_t alloc = TMC_ALLOC_INIT; - /* Allocate the memory locally on this thread's CPU. */ - tmc_alloc_set_home(&alloc, TMC_ALLOC_HOME_TASK); - /* Allocate all the memory on one page. Which is required for the - notif ring, not the iqueue. */ - if (notif_ring_size > (size_t)getpagesize()) - tmc_alloc_set_huge(&alloc); - int needed = notif_ring_size + sizeof(gxio_mpipe_iqueue_t); - // TODO - Save the rest of the Huge Page for other allocations. - void *iqueue_mem = tmc_alloc_map(&alloc, needed); - if (iqueue_mem == NULL) { - SCLogError(SC_ERR_FATAL, "Failed to allocate memory for mPIPE iQueue"); - return TM_ECODE_FAILED; - } - - thread_iqueue = iqueue_mem + notif_ring_size; - int result = gxio_mpipe_iqueue_init(thread_iqueue, context, first_notif_ring + rank, - iqueue_mem, notif_ring_size, 0); - if (result < 0) { - VERIFY(result, "gxio_mpipe_iqueue_init()"); - } - - return TM_ECODE_OK; -} - -/* \brief Initialize on MPIPE egress port - * - * Initialize one mPIPE egress port for use in IPS mode. - * The port must be one of the input ports. - * - * \param name of interface to open - * \param Array of port configuations - * - * \return Output port channel number, or -1 on error - */ -static int MpipeReceiveOpenEgress(char *out_iface, int iface_idx, - int copy_mode, - MpipeIfaceConfig *mpipe_conf[]) -{ - int channel; - int nlive = LiveGetDeviceCount(); - int result; - - /* Initialize an equeue */ - result = gxio_mpipe_alloc_edma_rings(context, 1, 0, 0); - if (result < 0) { - SCLogError(SC_ERR_FATAL, "Failed to allocate mPIPE egress ring"); - return result; - } - uint32_t ering = result; - size_t edescs_size = equeue_entries * sizeof(gxio_mpipe_edesc_t); - tmc_alloc_t edescs_alloc = TMC_ALLOC_INIT; - tmc_alloc_set_pagesize(&edescs_alloc, edescs_size); - void *edescs = tmc_alloc_map(&edescs_alloc, edescs_size); - if (edescs == NULL) { - SCLogError(SC_ERR_FATAL, - "Failed to allocate egress descriptors"); - return -1; - } - /* retrieve channel of outbound interface */ - for (int j = 0; j < nlive; j++) { - if (strcmp(out_iface, mpipe_conf[j]->iface) == 0) { - channel = gxio_mpipe_link_channel(&mpipe_link[j]); - SCLogInfo("egress link: %s is channel: %d", - out_iface, channel); - result = gxio_mpipe_equeue_init(&equeue[iface_idx], - context, - ering, - channel, - edescs, - edescs_size, - 0); - if (result < 0) { - SCLogError(SC_ERR_FATAL, - "mPIPE Failed to initialize egress queue"); - return -1; - } - /* Record the mapping from ingress port to egress port. - * The egress information is stored indexed by ingress channel. - */ - channel = gxio_mpipe_link_channel(&mpipe_link[iface_idx]); - channel_to_equeue[channel].peer_equeue = &equeue[iface_idx]; - channel_to_equeue[channel].copy_mode = copy_mode; - if (copy_mode == MPIPE_COPY_MODE_IPS) - channel_to_equeue[channel].ReleasePacket = MpipeReleasePacketCopyIPS; - else - channel_to_equeue[channel].ReleasePacket = MpipeReleasePacketCopyTap; - - SCLogInfo("ingress link: %s is channel: %d copy_mode: %d", - out_iface, channel, copy_mode); - - return channel; - } - } - - /* Did not find matching interface name */ - SCLogError(SC_ERR_INVALID_ARGUMENT, "Could not find egress interface: %s", - out_iface); - return -1; -} - -TmEcode ReceiveMpipeThreadInit(ThreadVars *tv, void *initdata, void **data) -{ - SCEnter(); - int rank = tv->rank; - int num_buckets = 4096; - int num_workers = tile_num_pipelines; - - if (initdata == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENT, "initdata == NULL"); - SCReturnInt(TM_ECODE_FAILED); - } - - MpipeThreadVars *ptv = SCMalloc(sizeof(MpipeThreadVars)); - if (unlikely(ptv == NULL)) - SCReturnInt(TM_ECODE_FAILED); - - memset(ptv, 0, sizeof(MpipeThreadVars)); - - ptv->tv = tv; - - int result; - const char *link_name = (char *)initdata; - - MpipeRegisterPerfCounters(ptv, tv); - - *data = (void *)ptv; - - /* Only rank 0 does initialization of mpipe */ - if (rank != 0) - SCReturnInt(TM_ECODE_OK); - - /* Initialize and configure mPIPE, which is only done by one core. */ - - if (strcmp(link_name, "multi") == 0) { - int nlive = LiveGetDeviceCount(); - int instance = gxio_mpipe_link_instance(LiveGetDeviceName(0)); - for (int i = 1; i < nlive; i++) { - link_name = LiveGetDeviceName(i); - if (gxio_mpipe_link_instance(link_name) != instance) { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "All interfaces not on same mpipe instance"); - SCReturnInt(TM_ECODE_FAILED); - } - } - result = gxio_mpipe_init(context, instance); - VERIFY(result, "gxio_mpipe_init()"); - /* open ingress interfaces */ - for (int i = 0; i < nlive; i++) { - link_name = LiveGetDeviceName(i); - SCLogInfo("opening interface %s", link_name); - result = gxio_mpipe_link_open(&mpipe_link[i], context, - link_name, 0); - VERIFY(result, "gxio_mpipe_link_open()"); - mpipe_conf[i] = ParseMpipeConfig(link_name); - } - /* find and open egress interfaces for IPS modes */ - for (int i = 0; i < nlive; i++) { - MpipeIfaceConfig *aconf = mpipe_conf[i]; - if (aconf != NULL) { - if (aconf->copy_mode != MPIPE_COPY_MODE_NONE) { - int channel = MpipeReceiveOpenEgress(aconf->out_iface, - i, aconf->copy_mode, - mpipe_conf); - if (channel < 0) { - SCReturnInt(TM_ECODE_FAILED); - } - } - } - } - } else { - SCLogInfo("using single interface %s", (char *)initdata); - - /* Start the driver. */ - result = gxio_mpipe_init(context, gxio_mpipe_link_instance(link_name)); - VERIFY(result, "gxio_mpipe_init()"); - - gxio_mpipe_link_t link; - result = gxio_mpipe_link_open(&link, context, link_name, 0); - VERIFY(result, "gxio_mpipe_link_open()"); - } - /* Allocate some NotifRings. */ - result = gxio_mpipe_alloc_notif_rings(context, - num_workers, - 0, 0); - VERIFY(result, "gxio_mpipe_alloc_notif_rings()"); - first_notif_ring = result; - - int first_bucket = 0; - int rc; - rc = ReceiveMpipeCreateBuckets(first_notif_ring, num_workers, - &first_bucket, &num_buckets); - if (rc != TM_ECODE_OK) - SCReturnInt(rc); - - rc = ReceiveMpipeAllocatePacketBuffers(); - if (rc != TM_ECODE_OK) - SCReturnInt(rc); - - result = ReceiveMpipeRegisterRules(first_bucket, num_buckets); - if (result < 0) { - SCLogError(SC_ERR_INVALID_ARGUMENT, - "Registering mPIPE classifier rules, %s", - gxio_strerror(result)); - SCReturnInt(TM_ECODE_FAILED); - } - - SCReturnInt(TM_ECODE_OK); -} - -TmEcode ReceiveMpipeInit(void) -{ - SCEnter(); - - SCLogInfo("tile_num_pipelines: %d", tile_num_pipelines); - - SCReturnInt(TM_ECODE_OK); -} - -/** - * \brief This function prints stats to the screen at exit. - * \param tv pointer to ThreadVars - * \param data pointer that gets cast into NetiohreadVars for ptv - */ -void ReceiveMpipeThreadExitStats(ThreadVars *tv, void *data) -{ - SCEnter(); - SCReturn; -} - -TmEcode DecodeMpipeThreadInit(ThreadVars *tv, void *initdata, void **data) -{ - SCEnter(); - DecodeThreadVars *dtv = NULL; - - dtv = DecodeThreadVarsAlloc(tv); - - if (dtv == NULL) - SCReturnInt(TM_ECODE_FAILED); - - DecodeRegisterPerfCounters(dtv, tv); - - *data = (void *)dtv; - - SCReturnInt(TM_ECODE_OK); -} - -TmEcode DecodeMpipeThreadDeinit(ThreadVars *tv, void *data) -{ - if (data != NULL) - DecodeThreadVarsFree(tv, data); - SCReturnInt(TM_ECODE_OK); -} - -TmEcode DecodeMpipe(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq, - PacketQueue *postq) -{ - SCEnter(); - DecodeThreadVars *dtv = (DecodeThreadVars *)data; - - /* XXX HACK: flow timeout can call us for injected pseudo packets - * see bug: https://redmine.openinfosecfoundation.org/issues/1107 */ - if (p->flags & PKT_PSEUDO_STREAM_END) - return TM_ECODE_OK; - - /* update counters */ - DecodeUpdatePacketCounters(tv, dtv, p); - - /* call the decoder */ - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); - - PacketDecodeFinalize(tv, dtv, p); - - SCReturnInt(TM_ECODE_OK); -} - -/** - * \brief Add a mpipe device for monitoring - * - * \param dev string with the device name - * - * \retval 0 on success. - * \retval -1 on failure. - */ -int MpipeLiveRegisterDevice(char *dev) -{ - MpipeDevice *nd = SCMalloc(sizeof(MpipeDevice)); - if (unlikely(nd == NULL)) { - return -1; - } - - nd->dev = SCStrdup(dev); - if (unlikely(nd->dev == NULL)) { - SCFree(nd); - return -1; - } - TAILQ_INSERT_TAIL(&mpipe_devices, nd, next); - - SCLogDebug("Mpipe device \"%s\" registered.", dev); - return 0; -} - -/** - * \brief Get the number of registered devices - * - * \retval cnt the number of registered devices - */ -int MpipeLiveGetDeviceCount(void) -{ - int i = 0; - MpipeDevice *nd; - - TAILQ_FOREACH(nd, &mpipe_devices, next) { - i++; - } - - return i; -} - -#endif // HAVE_MPIPE diff --git a/src/source-mpipe.h b/src/source-mpipe.h deleted file mode 100644 index 2c335bffb1dc..000000000000 --- a/src/source-mpipe.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2011-2013 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Tom DeCanio - * \author Ken Steele, Tilera Corporation - */ - -#ifndef __SOURCE_MPIPE_H__ -#define __SOURCE_MPIPE_H__ - -#ifdef HAVE_MPIPE - -#include -#include - -#define MPIPE_FREE_PACKET(p) MpipeFreePacket((p)) - -#define MPIPE_COPY_MODE_NONE 0 -#define MPIPE_COPY_MODE_TAP 1 -#define MPIPE_COPY_MODE_IPS 2 - -#define MPIPE_IFACE_NAME_LENGTH 8 - -typedef struct MpipeIfaceConfig_ -{ - char iface[MPIPE_IFACE_NAME_LENGTH]; - int copy_mode; - char *out_iface; -} MpipeIfaceConfig; - -typedef struct MpipePeer_ -{ - int channel; - char iface[MPIPE_IFACE_NAME_LENGTH]; -} MpipePeer; - -/* per interface TAP/IPS configuration */ -typedef struct MpipePeerVars_ -{ - gxio_mpipe_equeue_t *peer_equeue; - void (*ReleasePacket)(struct Packet_ *); - int copy_mode; -} MpipePeerVars; - -/* per packet Mpipe vars */ -typedef struct MpipePacketVars_ -{ - /* TileGX mpipe stuff */ - struct { - uint_reg_t channel : 5; - uint_reg_t l2_size : 14; - uint_reg_t size : 3; - uint_reg_t bucket_id : 13; - uint_reg_t nr : 1; - uint_reg_t cs : 1; - uint_reg_t va : 42; - uint_reg_t stack_idx : 5; - } idesc; - - /* packetpool this was allocated from */ - uint8_t rank; - - gxio_mpipe_equeue_t *peer_equeue; -} MpipePacketVars; - -int MpipeLiveRegisterDevice(char *); -int MpipeLiveGetDeviceCount(void); -char *MpipeLiveGetDevice(int); -void MpipeFreePacket(void *arg); -void TmModuleReceiveMpipeRegister (void); -void TmModuleDecodeMpipeRegister (void); - -TmEcode ReceiveMpipeInit(void); - -#endif /* HAVE_MPIPE */ -#endif /* __SOURCE_MPIPE_H__ */ diff --git a/src/suricata.c b/src/suricata.c index b0d98b152831..a700fa10a924 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -93,7 +93,6 @@ #include "source-af-packet.h" #include "source-netmap.h" -#include "source-mpipe.h" #include "source-windivert.h" #include "source-windivert-prototypes.h" @@ -654,9 +653,6 @@ static void PrintUsage(const char *progname) #ifdef BUILD_UNIX_SOCKET printf("\t--unix-socket[=] : use unix socket to control suricata work\n"); #endif -#ifdef HAVE_MPIPE - printf("\t--mpipe : run with tilegx mpipe interface(s)\n"); -#endif #ifdef WINDIVERT printf("\t--windivert : run in inline WinDivert mode\n"); printf("\t--windivert-forward : run in inline WinDivert mode, as a gateway\n"); @@ -772,9 +768,6 @@ static void PrintBuildInfo(void) #endif #if defined(__SSE3__) strlcat(features, "SSE_3 ", sizeof(features)); -#endif -#if defined(__tile__) - strlcat(features, "Tilera ", sizeof(features)); #endif if (strlen(features) == 0) { strlcat(features, "none", sizeof(features)); @@ -887,11 +880,6 @@ void RegisterAllModules(void) /* pcap file */ TmModuleReceivePcapFileRegister(); TmModuleDecodePcapFileRegister(); -#ifdef HAVE_MPIPE - /* mpipe */ - TmModuleReceiveMpipeRegister(); - TmModuleDecodeMpipeRegister(); -#endif /* af-packet */ TmModuleReceiveAFPRegister(); TmModuleDecodeAFPRegister(); @@ -959,21 +947,6 @@ static TmEcode ParseInterfacesList(const int runmode, char *pcap_dev) SCReturnInt(TM_ECODE_FAILED); } } -#ifdef HAVE_MPIPE - } else if (runmode == RUNMODE_TILERA_MPIPE) { - if (strlen(pcap_dev)) { - if (ConfSetFinal("mpipe.single_mpipe_dev", pcap_dev) != 1) { - fprintf(stderr, "ERROR: Failed to set mpipe.single_mpipe_dev\n"); - SCReturnInt(TM_ECODE_FAILED); - } - } else { - int ret = LiveBuildDeviceList("mpipe.inputs"); - if (ret == 0) { - fprintf(stderr, "ERROR: No interface found in config for mpipe\n"); - SCReturnInt(TM_ECODE_FAILED); - } - } -#endif } else if (runmode == RUNMODE_PFRING) { /* FIXME add backward compat support */ /* iface has been set on command line */ @@ -1531,9 +1504,6 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) {"dag", required_argument, 0, 0}, {"napatech", 0, 0, 0}, {"build-info", 0, &build_info, 1}, -#ifdef HAVE_MPIPE - {"mpipe", optional_argument, 0, 0}, -#endif #ifdef WINDIVERT {"windivert", required_argument, 0, 0}, {"windivert-forward", required_argument, 0, 0}, @@ -1795,25 +1765,6 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) suri->run_mode = RUNMODE_PRINT_BUILDINFO; return TM_ECODE_OK; } -#ifdef HAVE_MPIPE - else if(strcmp((long_opts[option_index]).name , "mpipe") == 0) { - if (suri->run_mode == RUNMODE_UNKNOWN) { - suri->run_mode = RUNMODE_TILERA_MPIPE; - if (optarg != NULL) { - memset(suri->pcap_dev, 0, sizeof(suri->pcap_dev)); - strlcpy(suri->pcap_dev, optarg, - ((strlen(optarg) < sizeof(suri->pcap_dev)) ? - (strlen(optarg) + 1) : sizeof(suri->pcap_dev))); - LiveRegisterDeviceName(optarg); - } - } else { - SCLogError(SC_ERR_MULTIPLE_RUN_MODE, - "more than one run mode has been specified"); - PrintUsage(argv[0]); - exit(EXIT_FAILURE); - } - } -#endif else if(strcmp((long_opts[option_index]).name, "windivert-forward") == 0) { #ifdef WINDIVERT if (suri->run_mode == RUNMODE_UNKNOWN) { diff --git a/src/threads-arch-tile.h b/src/threads-arch-tile.h deleted file mode 100644 index d022d90e339f..000000000000 --- a/src/threads-arch-tile.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2011-2013 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Ken Steele, Tilera Corporation - */ - -#ifndef __THREADS_ARCH_TILE_H__ -#define __THREADS_ARCH_TILE_H__ - -#include -#include - -/* NOTE: On Tilera datapath threads use the TMC (Tilera Multicore - * Components) library spin mutexes while the control threads use - * pthread mutexes. So the pthread mutex types are split out so that - * their use can be differentiated. - */ - -/* ctrl mutex */ -#define SCCtrlMutex pthread_mutex_t -#define SCCtrlMutexAttr pthread_mutexattr_t -#define SCCtrlMutexInit(mut, mutattr ) pthread_mutex_init(mut, mutattr) -#define SCCtrlMutexLock(mut) pthread_mutex_lock(mut) -#define SCCtrlMutexTrylock(mut) pthread_mutex_trylock(mut) -#define SCCtrlMutexUnlock(mut) pthread_mutex_unlock(mut) -#define SCCtrlMutexDestroy pthread_mutex_destroy - -/* ctrl cond */ -#define SCCtrlCondT pthread_cond_t -#define SCCtrlCondInit pthread_cond_init -#define SCCtrlCondSignal pthread_cond_signal -#define SCCtrlCondTimedwait pthread_cond_timedwait -#define SCCtrlCondWait pthread_cond_wait -#define SCCtrlCondDestroy pthread_cond_destroy - -/* mutex */ - -#define SCMutex tmc_spin_queued_mutex_t -#define SCMutexAttr -#define SCMutexDestroy(x) ({ (void)(x); 0; }) -#define SCMUTEX_INITIALIZER TMC_SPIN_QUEUED_MUTEX_INIT -#define SCMutexInit(mut, mutattr) ({ \ - int ret = 0; \ - tmc_spin_queued_mutex_init(mut); \ - ret; \ -}) -#define SCMutexLock(mut) ({ \ - int ret = 0; \ - tmc_spin_queued_mutex_lock(mut); \ - ret; \ -}) -#define SCMutexTrylock(mut) ({ \ - int ret = (tmc_spin_queued_mutex_trylock(mut) == 0) ? 0 : EBUSY; \ - ret; \ -}) -#define SCMutexUnlock(mut) ({ \ - int ret = 0; \ - tmc_spin_queued_mutex_unlock(mut); \ - ret; \ -}) - -/* conditions */ - -/* Ignore signals when using spin locks */ -#define SCCondT uint8_t -#define SCCondInit(x,y) ({ 0; }) -#define SCCondSignal(x) ({ 0; }) -#define SCCondDestroy(x) ({ 0; }) - -static inline void cycle_sleep(int cycles) -{ - uint64_t end = get_cycle_count() + cycles; - while (get_cycle_count() < end) - ; -} -#define SCCondWait(x,y) cycle_sleep(300) - -/* spinlocks */ - -#define SCSpinlock tmc_spin_queued_mutex_t -#define SCSpinLock(spin) ({ tmc_spin_queued_mutex_lock(spin); 0; }) -#define SCSpinTrylock(spin) (tmc_spin_queued_mutex_trylock(spin) ? EBUSY : 0) -#define SCSpinUnlock(spin) ({ tmc_spin_queued_mutex_unlock(spin); 0; }) -#define SCSpinInit(spin, spin_attr) ({ tmc_spin_queued_mutex_init(spin); 0; }) -#define SCSpinDestroy(spin) ({ (void)(spin); 0; }) - -/* rwlocks */ - -#define SCRWLock tmc_spin_rwlock_t -#define SCRWLockDestroy(x) ({ (void)(x); 0; }) -#define SCRWLockInit(rwl, rwlattr ) ({ tmc_spin_rwlock_init(rwl); 0; }) -#define SCRWLockWRLock(rwl) ({ tmc_spin_rwlock_wrlock(rwl); 0; }) -#define SCRWLockRDLock(rwl) ({ tmc_spin_rwlock_rdlock(rwl); 0; }) -#define SCRWLockTryWRLock(rwl) (tmc_spin_rwlock_trywrlock(rwl) ? EBUSY : 0) -#define SCRWLockTryRDLock(rwl) (tmc_spin_rwlock_tryrdlock(rwl) ? EBUSY : 0) -#define SCRWLockUnlock(rwl) ({ tmc_spin_rwlock_unlock(rwl); 0; }) -#endif diff --git a/src/threads.h b/src/threads.h index 6a1329dea2b5..4e6f6113448b 100644 --- a/src/threads.h +++ b/src/threads.h @@ -101,9 +101,7 @@ enum { //#define DBG_THREADS -#ifdef __tile__ - #include "threads-arch-tile.h" -#elif defined DBG_THREADS +#if defined DBG_THREADS #ifdef PROFILE_LOCKING #error "Cannot mix DBG_THREADS and PROFILE_LOCKING" #endif @@ -173,7 +171,7 @@ enum { #define SCSpinDestroy(spin) pthread_spin_destroy(spin) #endif /* no spinlocks */ -#endif /* __tile__ */ +#endif #if (!defined SCMutex || !defined SCMutexAttr || !defined SCMutexInit || \ !defined SCMutexLock || !defined SCMutexTrylock || \ diff --git a/src/tm-modules.c b/src/tm-modules.c index 310e969240dc..d9478cc8d892 100644 --- a/src/tm-modules.c +++ b/src/tm-modules.c @@ -219,8 +219,6 @@ const char * TmModuleTmmIdToString(TmmId id) CASE_CODE (TMM_DECODEERFFILE); CASE_CODE (TMM_RECEIVEERFDAG); CASE_CODE (TMM_DECODEERFDAG); - CASE_CODE (TMM_RECEIVEMPIPE); - CASE_CODE (TMM_DECODEMPIPE); CASE_CODE (TMM_RECEIVENAPATECH); CASE_CODE (TMM_DECODENAPATECH); CASE_CODE (TMM_RECEIVEAFP); diff --git a/src/tm-threads-common.h b/src/tm-threads-common.h index 33a95f9214e4..665d52135c83 100644 --- a/src/tm-threads-common.h +++ b/src/tm-threads-common.h @@ -54,8 +54,6 @@ typedef enum { TMM_RECEIVENETMAP, TMM_DECODENETMAP, TMM_ALERTPCAPINFO, - TMM_RECEIVEMPIPE, - TMM_DECODEMPIPE, TMM_RECEIVENAPATECH, TMM_DECODENAPATECH, TMM_STATSLOGGER, diff --git a/src/util-atomic.h b/src/util-atomic.h index cbcfc8687356..c0b2125944c9 100644 --- a/src/util-atomic.h +++ b/src/util-atomic.h @@ -43,8 +43,7 @@ /* test if we have atomic operations support */ #if (!defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) || !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || \ - !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)) && \ - !defined(__tile__) + !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)) /* Do not have atomic operations support, so implement them with locks. */ diff --git a/src/util-cpu.c b/src/util-cpu.c index 8a4eb4c3b7ff..aa457028ef34 100644 --- a/src/util-cpu.c +++ b/src/util-cpu.c @@ -180,13 +180,6 @@ void UtilCpuPrintSummary(void) * \todo We'll have to deal with removig ticks from the extra cpuids inbetween * 2 calls. */ -#if defined(__tile__) -#include -uint64_t UtilCpuGetTicks(void) -{ - return get_cycle_count(); -} -#else uint64_t UtilCpuGetTicks(void) { uint64_t val; @@ -229,4 +222,3 @@ uint64_t UtilCpuGetTicks(void) #endif return val; } -#endif /* __tile__ */ diff --git a/src/util-logopenfile-tile.c b/src/util-logopenfile-tile.c deleted file mode 100644 index 82e9bbf3b4a2..000000000000 --- a/src/util-logopenfile-tile.c +++ /dev/null @@ -1,370 +0,0 @@ -/* Copyright (C) 2014 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Tom DeCanio - * \author Ken Steele, Tilera Corporation - * - * File-like output for logging on Tilera PCIe cards (TILEncore-Gx) - * add the option to send logs across PCIe and then write the output - * files on the host system. - * - */ -#include - -#include "suricata-common.h" /* errno.h, string.h, etc. */ -#include "tm-modules.h" /* LogFileCtx */ -#include "conf.h" /* ConfNode, etc. */ -#include "util-atomic.h" -#include "util-logopenfile-tile.h" - -#ifdef __tile__ -#include -#include - -#if MDE_VERSION_CODE >= MDE_VERSION(4,1,0) -#include -#else -#include -#endif - -/* - * Tilera trio (PCIe) configuration. - */ -static gxio_trio_context_t trio_context_body; -static gxio_trio_context_t* trio_context = &trio_context_body; -/* - * gxpci contexts used for log relay - */ -static gxpci_context_t gxpci_context_body; -static gxpci_context_t *gxpci_context = &gxpci_context_body; -/* The TRIO index. */ -static int trio_index = 0; - -/* The queue index of a packet queue. */ -static unsigned int queue_index = 0; - -/* The local PCIe MAC index. */ -static int loc_mac; - -/* - * Code for writing files over PCIe to host on Tilera TILEncore PCIe cards. - */ - -#define OP_OPEN 1 -#define OP_WRITE 2 -#define OP_CLOSE 3 - -/** Maximum number of commands in one PCIe function call */ -#define MAX_CMDS_BATCH 64 - -typedef struct { - uint32_t magic; - uint32_t fileno; - uint32_t op; - uint32_t seq; - uint32_t len; - uint32_t next_offset; - char buf[]; -} __attribute__((__packed__)) PcieMsg; - -static int gxpci_fileno = 0; -static int pcie_initialized = 0; -/* Allocate a Huge page of memory, registered with Trio, into which - data to be sent over PCIe is written. Each write starts at wc_pos. -*/ -static char *log_mem = NULL; -static uint64_t wr_pos; /* write position within log_mem */ - -static SCMutex raw_mutex __attribute__((aligned(64))); -static SCMutex pcie_mutex __attribute__((aligned(64))); -#define CHECK_SEQ_NUM 1 -#ifdef CHECK_SEQ_NUM -static uint32_t raw_seq = 0; -#endif -static uint32_t comps_rcvd = 0; -/* Block of memory registered with PCIe DMA engine as a source for - * PCIe data transfers. Must be <= Huge Page size (16 MB). - * Must be large enough that it can't wrap before first PCIe transfer - * has completed. - */ -#define PCIE_MEMORY_BLOCK_SIZE (4 * 1024 * 1024) - -/* Send a buffer over PCIe to Host memory. - * len must be smaller than one Packet Queue transfer block. - * TODO: Check errors - */ -static void TilePcieDMABuf(void *buf, uint32_t len) -{ - gxpci_comp_t comp[MAX_CMDS_BATCH]; - gxpci_cmd_t cmd; - int result; - int credits; - - SCMutexLock(&pcie_mutex); - -#ifdef CHECK_SEQ_NUM - ((PcieMsg *)buf)->seq = ++raw_seq; - __insn_mf(); -#endif - - /* Wait for credits to be available for more PCIe writes. */ - do { - result = gxpci_get_comps(gxpci_context, comp, 0, MAX_CMDS_BATCH); - if (result) { - if (unlikely(result == GXPCI_ERESET)) { - SCLogInfo("gxpci channel is reset"); - return; - } else { - __sync_fetch_and_add(&comps_rcvd, result); - } - } - - credits = gxpci_get_cmd_credits(gxpci_context); - if (unlikely(credits == GXPCI_ERESET)) { - SCLogInfo("gxpci channel is reset"); - return; - } - } while (credits == 0); - - cmd.buffer = buf; - /* Round transfer size up to next host cache-line. This will - * transfer more data, but is more efficient. - */ - cmd.size = (len + (CLS - 1)) & ~(CLS - 1); - - __insn_mf(); - - /* Loop until the command is sent. */ - do { - /* Send PCIe command to packet queue from tile to host. */ - result = gxpci_pq_t2h_cmd(gxpci_context, &cmd); - if (result == 0) - break; - if (result == GXPCI_ERESET) { - SCLogInfo("gxpci channel is reset"); - break; - } - /* Not enough credits to send command? */ - if (result == GXPCI_ECREDITS) - continue; - } while (1); - - SCMutexUnlock(&pcie_mutex); -} - -/* Allocate a buffer for data that can be sent over PCIe. Reserves - * space at the beginning for the Pcie msg. The buffer is allocated - * from a 4MB pool on one huge page. The allocation simply walks - * throught the buffer sequentially. This removes the need to free - * the buffers, as they simply age out. - */ -static PcieMsg *TilePcieAllocateBuffer(size_t size) -{ - size += sizeof(PcieMsg); - /* Round up to cache-line size */ - size = (size + (CLS - 1)) & ~(CLS - 1); - - PcieMsg *pmsg; - SCMutexLock(&raw_mutex); - pmsg = (PcieMsg *)&log_mem[wr_pos]; - wr_pos += size; - if (wr_pos > PCIE_MEMORY_BLOCK_SIZE) { - /* Don't have enough space at the end of the memory block, so - * wrap to the start. - */ - pmsg = (PcieMsg *)&log_mem[0]; - wr_pos = size; - - } - SCMutexUnlock(&raw_mutex); - - return pmsg; -} - -static void PcieWriteOpen(PcieFile *fp, const char *path, const char append) -{ - /* Need space for file name, file mode character and string termination */ - const int buffer_size = strlen(path) + 2; - - /* Allocate space in the PCIe output buffer */ - PcieMsg *p = TilePcieAllocateBuffer(buffer_size); - - p->magic = 5555; - p->fileno = fp->fileno; - p->op = OP_OPEN; - p->len = offsetof(PcieMsg, buf); - /* Format is one character Mode, followed by file path. */ - p->len += snprintf(p->buf, buffer_size, "%c%s", append, path); - - TilePcieDMABuf(p, p->len); -} - -static int TilePcieWrite(const char *buffer, int buffer_len, LogFileCtx *log_ctx) -{ - PcieFile *fp = log_ctx->pcie_fp; - /* Allocate space in the PCIe output buffer */ - PcieMsg *p = TilePcieAllocateBuffer(buffer_len); - - p->magic = 5555; - p->fileno = fp->fileno; - p->op = OP_WRITE; - p->len = offsetof(PcieMsg, buf); - p->len += buffer_len; - p->next_offset = 0; - - /* Can remove the need for this memcpy later. */ - memcpy(p->buf, buffer, buffer_len); - - TilePcieDMABuf(p, p->len); - - return buffer_len; -} - -static PcieFile *TileOpenPcieFpInternal(const char *path, const char append_char) -{ - int result; - PcieFile *fp; - - /* Only initialize once */ - if (SCAtomicCompareAndSwap(&pcie_initialized, 0, 1)) { - SCMutexInit(&raw_mutex, NULL); - SCMutexInit(&pcie_mutex, NULL); - - SCLogInfo("Initializing Tile-Gx PCIe index %d / %d, queue: %d", - trio_index, loc_mac, queue_index); - - result = gxio_trio_init(trio_context, trio_index); - if (result < 0) { - pcie_initialized = 0; - SCLogError(SC_ERR_PCIE_INIT_FAILED, - "gxio_trio_init() failed: %d: %s", - result, gxio_strerror(result)); - return NULL; - } - - result = gxpci_init(trio_context, gxpci_context, trio_index, loc_mac); - if (result < 0) { - pcie_initialized = 0; - SCLogError(SC_ERR_PCIE_INIT_FAILED, - "gxpci_init() failed: %d: %s", - result, gxpci_strerror(result)); - return NULL; - } - - /* - * This indicates that we need to allocate an ASID ourselves, - * instead of using one that is allocated somewhere else. - */ - int asid = GXIO_ASID_NULL; - - result = gxpci_open_queue(gxpci_context, asid, GXPCI_PQ_T2H, 0, - queue_index, 0, 0); - if (result < 0) { - pcie_initialized = 0; - SCLogError(SC_ERR_PCIE_INIT_FAILED, - "gxpci_open_queue() failed: %d: %s", - result, gxpci_strerror(result)); - return NULL; - } - - /* - * Allocate and register data buffer - */ - size_t hugepagesz = tmc_alloc_get_huge_pagesize(); - tmc_alloc_t alloc = TMC_ALLOC_INIT; - tmc_alloc_set_huge(&alloc); - tmc_alloc_set_home(&alloc, TMC_ALLOC_HOME_HASH); - tmc_alloc_set_pagesize_exact(&alloc, hugepagesz); - log_mem = tmc_alloc_map(&alloc, hugepagesz); - BUG_ON(PCIE_MEMORY_BLOCK_SIZE > hugepagesz); - - result = gxpci_iomem_register(gxpci_context, log_mem, hugepagesz); - if (result < 0) { - pcie_initialized = 0; - SCLogError(SC_ERR_PCIE_INIT_FAILED, - "gxpci_iomem_register() failed: %d: %s", - result, gxpci_strerror(result)); - return NULL; - } - } - fp = SCMalloc(sizeof(PcieFile)); - if (fp == NULL) { - SCLogError(SC_ERR_PCIE_INIT_FAILED, - "Failed to Allocate memory for PCIe file pointer"); - - return NULL; - } - - /* Sequentially allocate File descriptor numbers. Not currently ever freed */ - fp->fileno = SCAtomicFetchAndAdd(&gxpci_fileno, 1); - PcieWriteOpen(fp, path, append_char); - - return fp; -} - -/** \brief Close a PCIe file - * \param PCIe file desriptor - */ -static void TileClosePcieFp(LogFileCtx *log_ctx) -{ - SCLogInfo("Closing Tile-Gx PCIe: %s", log_ctx->filename); - - /* TODO: Need to count open files and close when reaches zero. */ - SCMutexLock(&pcie_mutex); - - if (gxpci_context) { - gxpci_destroy(gxpci_context); - gxpci_context = NULL; - } - - SCMutexUnlock(&pcie_mutex); - - free(log_ctx->pcie_fp); -} - -/** \brief open the indicated file remotely over PCIe to a host - * \param path filesystem path to open - * \param append_setting open file with O_APPEND: "yes" or "no" - * \retval FILE* on success - * \retval NULL on error - */ -PcieFile *TileOpenPcieFp(LogFileCtx *log_ctx, const char *path, - const char *append_setting) -{ - PcieFile *ret = NULL; - if (ConfValIsTrue(append_setting)) { - ret = TileOpenPcieFpInternal(path, 'a'); - } else { - ret = TileOpenPcieFpInternal(path, 'w'); - } - - /* Override the default Write and Close functions - * with PCIe Write and Close functions. - */ - log_ctx->Write = TilePcieWrite; - log_ctx->Close = TileClosePcieFp; - - if (ret == NULL) - SCLogError(SC_ERR_FOPEN, "Error opening PCIe file: \"%s\": %s", - path, strerror(errno)); - return ret; -} - -#endif /* __tilegx__ */ diff --git a/src/util-logopenfile-tile.h b/src/util-logopenfile-tile.h deleted file mode 100644 index 4d1ac6576e98..000000000000 --- a/src/util-logopenfile-tile.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2014 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Ken Steele, Tilera Corporation - */ - -#ifndef __UTIL_LOGOPENFILE_TILE_H__ -#define __UTIL_LOGOPENFILE_TILE_H__ - -#include "util-logopenfile.h" /* LogFileCtx */ - -PcieFile *TileOpenPcieFp(LogFileCtx *log_ctx, const char *path, - const char *append_setting); - -#endif /* __UTIL_LOGOPENFILE_TILE_H__ */ diff --git a/src/util-logopenfile.c b/src/util-logopenfile.c index a322399e3e22..2694aa11f763 100644 --- a/src/util-logopenfile.c +++ b/src/util-logopenfile.c @@ -31,7 +31,6 @@ #include "util-byte.h" #include "util-path.h" #include "util-logopenfile.h" -#include "util-logopenfile-tile.h" #if defined(HAVE_SYS_UN_H) && defined(HAVE_SYS_SOCKET_H) && defined(HAVE_SYS_TYPES_H) #define BUILD_WITH_UNIXSOCKET @@ -296,24 +295,6 @@ SCLogOpenFileFp(const char *path, const char *append_setting, uint32_t mode) return ret; } -/** \brief open the indicated file remotely over PCIe to a host - * \param path filesystem path to open - * \param append_setting open file with O_APPEND: "yes" or "no" - * \retval FILE* on success - * \retval NULL on error - */ -static PcieFile *SCLogOpenPcieFp(LogFileCtx *log_ctx, const char *path, - const char *append_setting) -{ -#ifndef __tile__ - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, - "PCIe logging only supported on Tile-Gx Architecture."); - return NULL; -#else - return TileOpenPcieFp(log_ctx, path, append_setting); -#endif -} - /** \brief open a generic output "log file", which may be a regular file or a socket * \param conf ConfNode structure for the output section in question * \param log_ctx Log file context allocated by caller @@ -463,10 +444,6 @@ SCConfLogOpenGeneric(ConfNode *conf, if (rotate) { OutputRegisterFileRotationFlag(&log_ctx->rotation_flag); } - } else if (strcasecmp(filetype, "pcie") == 0) { - log_ctx->pcie_fp = SCLogOpenPcieFp(log_ctx, log_path, append); - if (log_ctx->pcie_fp == NULL) - return -1; // Error already logged by Open...Fp routine #ifdef HAVE_LIBHIREDIS } else if (strcasecmp(filetype, "redis") == 0) { ConfNode *redis_node = ConfNodeLookupChild(conf, "redis"); diff --git a/src/util-mem.h b/src/util-mem.h index a9d7bb6230fe..3a49cec46d9b 100644 --- a/src/util-mem.h +++ b/src/util-mem.h @@ -47,14 +47,6 @@ #include "mm_malloc.h" #endif -#if defined(__tile__) -/* Need to define __mm_ function alternatives, since these are SSE only. - */ -#include -#define _mm_malloc(a,b) memalign((b),(a)) -#define _mm_free(a) free((a)) -#endif /* defined(__tile__) */ - SC_ATOMIC_EXTERN(unsigned int, engine_stage); /* Use this only if you want to debug memory allocation and free() diff --git a/src/util-memcmp.h b/src/util-memcmp.h index 9248f8422e83..f1e1fdd63b49 100644 --- a/src/util-memcmp.h +++ b/src/util-memcmp.h @@ -361,127 +361,6 @@ static inline int SCMemcmpLowercase(const void *s1, const void *s2, size_t len) return 0; } -#elif defined(__tile__) - -#include - -/* Compare to non-zero sequence of bytes. */ -static inline int SCMemcmpNZ(const void *s1, const void *s2, size_t len) -{ - uint64_t b1, w1, aligned1; - uint64_t b2, w2, aligned2; - - /* Load aligned words containing the beginning of each string. - * These loads don't trigger unaligned events. - */ - w1 = __insn_ldna(s1); - w2 = __insn_ldna(s2); - /* Can't just read next 8 bytes because it might go past the end - * of a page. */ - while (len > 8) { - /* Here, the buffer extends into the next word by at least one - * byte, so it is safe to read the next word. Do an aligned - * loads on the next word. Then use the two words to create - * an aligned word from each string. */ - b1 = __insn_ldna(s1 + 8); - b2 = __insn_ldna(s2 + 8); - aligned1 = __insn_dblalign(w1, b1, s1); - aligned2 = __insn_dblalign(w2, b2, s2); - if (aligned1 != aligned2) - return 1; - - /* Move forward one word (8 bytes) */ - w1 = b1; - w2 = b2; - len -= 8; - s1 += 8; - s2 += 8; - } - /* Process the last up-to 8 bytes. */ - do { - if (*(char*)s1 != *(char*)s2) - return 1; - s1++; - s2++; - len--; - } while (len); - - return 0; -} - -/* Compare two sequences of bytes. */ -static inline int SCMemcmp(const void *s1, const void *s2, size_t len) -{ - if (len == 0) - return 0; - return SCMemcmpNZ(s1, s2, len); -} -/** \brief Convert 8 characters to lower case using SIMD. - * \param Word containing the 8 bytes. - * \return Word containing 8-bytes each converted to lowercase. - */ -static inline uint64_t -vec_tolower(uint64_t cc) -{ - /* For Uppercases letters, add 32 to convert to lower case. */ - uint64_t less_than_eq_Z = __insn_v1cmpltui (cc, 'Z' + 1); - uint64_t less_than_A = __insn_v1cmpltui (cc, 'A'); - uint64_t is_upper = __insn_v1cmpne (less_than_eq_Z, less_than_A); - return __insn_v1add (cc,__insn_v1shli (is_upper, 5)); -} - -/** \brief compare two buffers in a case insensitive way - * \param s1 buffer already in lowercase - * \param s2 buffer with mixed upper and lowercase - */ -static inline int SCMemcmpLowercase(const void *s1, const void *s2, size_t len) -{ - uint64_t b1, w1, aligned1; - uint64_t b2, w2, aligned2; - - if (len == 0) - return 0; - - /* TODO Check for already aligned cases. To optimize. */ - - /* Load word containing the beginning of each string. - * These loads don't trigger unaligned events. - */ - w1 = __insn_ldna(s1); - w2 = __insn_ldna(s2); - /* Can't just read next 8 bytes because it might go past the end - * of a page. */ - while (len > 8) { - /* Here, the buffer extends into the next word by at least one - * byte, so it is safe to read the next word. Do aligned - * loads on next word. Then use the two words to create an - * aligned word from each string. */ - b1 = __insn_ldna(s1 + 8); - b2 = __insn_ldna(s2 + 8); - aligned1 = __insn_dblalign(w1, b1, s1); - aligned2 = vec_tolower(__insn_dblalign(w2, b2, s2)); - if (aligned1 != aligned2) - return 1; - - /* Move forward one word (8 bytes) */ - w1 = b1; - w2 = b2; - len -= 8; - s1 += 8; - s2 += 8; - } - - do { - if (*(char*)s1 != tolower(*(char*)s2)) - return 1; - s1++; - s2++; - len--; - } while (len); - - return 0; -} - #else /* No SIMD support, fall back to plain memcmp and a home grown lowercase one */ diff --git a/src/util-mpm-ac-tile-small.c b/src/util-mpm-ac-tile-small.c index 062e13c66b92..c47a4f134ef2 100644 --- a/src/util-mpm-ac-tile-small.c +++ b/src/util-mpm-ac-tile-small.c @@ -88,9 +88,7 @@ uint32_t FUNC_NAME(const SCACTileSearchCtx *ctx, MpmThreadCtx *mpm_thread_ctx, size_t index = 0 ; index = SINDEX(index, state); state = SLOAD(state_table + index + c); -#ifndef __tile__ if (likely(i+1 < buflen)) -#endif c = xlate[buf[i+1]]; if (unlikely(SCHECK(state))) { matches = CheckMatch(ctx, pmq, buf, buflen, state, i, matches, mpm_bitarray); diff --git a/src/util-mpm-ac-tile.c b/src/util-mpm-ac-tile.c index 22b8222b82e4..ec7ba00e1064 100644 --- a/src/util-mpm-ac-tile.c +++ b/src/util-mpm-ac-tile.c @@ -1160,19 +1160,11 @@ void SCACTileDestroyCtx(MpmCtx *mpm_ctx) #define SCHECK(x) ((x) > 0) #define BUF_TYPE int32_t // Extract byte N=0,1,2,3 from x -#ifdef __tile__ -#define BYTE0(x) __insn_bfextu(x, 0, 7) -#define BYTE1(x) __insn_bfextu(x, 8, 15) -#define BYTE2(x) __insn_bfextu(x, 16, 23) -#define BYTE3(x) __insn_bfextu(x, 24, 31) -#define EXTRA 0 -#else /* fallback */ #define BYTE0(x) (((x) & 0x000000ff) >> 0) #define BYTE1(x) (((x) & 0x0000ff00) >> 8) #define BYTE2(x) (((x) & 0x00ff0000) >> 16) #define BYTE3(x) (((x) & 0xff000000) >> 24) #define EXTRA 4 // need 4 extra bytes to avoid OOB reads -#endif static int CheckMatch(const SCACTileSearchCtx *ctx, PrefilterRuleStore *pmq, const uint8_t *buf, uint32_t buflen, @@ -1206,11 +1198,7 @@ static int CheckMatch(const SCACTileSearchCtx *ctx, PrefilterRuleStore *pmq, /* Double check case-sensitve match now. */ if (patterns[k] >> 31) { const uint16_t patlen = pat->patlen; -#ifdef __tile__ - if (SCMemcmpNZ(pat->cs, buf_offset - patlen, patlen) != 0) { -#else if (SCMemcmp(pat->cs, buf_offset - patlen, patlen) != 0) { -#endif /* Case-sensitive match failed. */ continue; } @@ -1282,22 +1270,12 @@ uint32_t SCACTileSearchLarge(const SCACTileSearchCtx *ctx, MpmThreadCtx *mpm_thr * Next state entry has MSB as "match" and 15 LSB bits as next-state index. */ // y = 1<