diff --git a/.gitignore b/.gitignore index c3051f3928..dfe056acac 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,8 @@ obj /src/programs.inc .images /lib/luajit/usr + +# common cmake building path +/build +/release +/debug \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..3a2fdd9d86 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required (VERSION 2.8.11) +project (snabb) + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +set(MAKE make) +set(LUAJIT_CFLAGS ${CMAKE_SOURCE_DIR}/gcc-preinclude.h) + +add_custom_target( + luajit + COMMAND $(MAKE) PREFIX=`pwd`/usr/local CFLAGS="$(LUAJIT_CFLAGS)" && $(MAKE) DESTDIR=`pwd` install + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/luajit +) + +ADD_CUSTOM_TARGET( + make_ln_luajit + echo "make a ln -s to luajit" + COMMAND ln -fs luajit-2.1.0-beta1 luajit + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/luajit/usr/local/bin + DEPENDS luajit) + +# copy file +file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/src/syscall/linux) + +add_custom_target(copy_ljsyscall) + +add_custom_command(TARGET copy_ljsyscall PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/lib/ljsyscall/syscall.lua ${CMAKE_SOURCE_DIR}/src/ ) +add_custom_command(TARGET copy_ljsyscall PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/lib/ljsyscall/syscall/*.lua ${CMAKE_SOURCE_DIR}/src/syscall/ ) +add_custom_command(TARGET copy_ljsyscall PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/lib/ljsyscall/syscall/linux/*.lua ${CMAKE_SOURCE_DIR}/src/syscall/linux/ ) +add_custom_command(TARGET copy_ljsyscall PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/lib/ljsyscall/syscall/linux/x64/*.lua ${CMAKE_SOURCE_DIR}/src/syscall/linux/ ) +add_custom_command(TARGET copy_ljsyscall PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/lib/ljsyscall/syscall/shared/*.lua ${CMAKE_SOURCE_DIR}/src/syscall/ ) + +# do copy file task here +add_subdirectory (src) diff --git a/cmake/CMakeDetermineLUACompiler.cmake b/cmake/CMakeDetermineLUACompiler.cmake new file mode 100644 index 0000000000..247712f971 --- /dev/null +++ b/cmake/CMakeDetermineLUACompiler.cmake @@ -0,0 +1,11 @@ +include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake) + + +set(CMAKE_LUA_COMPILER ${CMAKE_SOURCE_DIR}/lib/luajit/usr/local/bin/luajit CACHE FILEPATH "The LuaJIT compiler") +set(CMAKE_LUA_COMPILER_ENV_VAR "") + +mark_as_advanced(CMAKE_LUA_COMPILER) + +# configure variables set in this file for fast reload later on +configure_file(${CMAKE_SOURCE_DIR}/cmake/CMakeLUACompiler.cmake.in + ${CMAKE_PLATFORM_INFO_DIR}/CMakeLUACompiler.cmake @ONLY) \ No newline at end of file diff --git a/cmake/CMakeLUACompiler.cmake.in b/cmake/CMakeLUACompiler.cmake.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cmake/CMakeLUAInformation.cmake b/cmake/CMakeLUAInformation.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cmake/CMakeTestLUACompiler.cmake b/cmake/CMakeTestLUACompiler.cmake new file mode 100644 index 0000000000..9329c94d3b --- /dev/null +++ b/cmake/CMakeTestLUACompiler.cmake @@ -0,0 +1 @@ +SET(CMAKE_LUA_COMPILER_WORKS 1 CACHE INTERNAL "") \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..2b0715d43c --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,103 @@ +set(CMAKE_LUA_OUTPUT_EXTENSION ".o") +set(CMAKE_LUA_OUTPUT_EXTENSION_REPLACE 1) + +set(CMAKE_LUA_FLAGS " -bg") +set(CMAKE_LUA_COMPILER ${CMAKE_SOURCE_DIR}/lib/luajit/usr/local/bin/luajit CACHE FILEPATH "The LuaJIT compiler") + +set(CMAKE_LUA_COMPILE_OBJECT " ") +set(CMAKE_LUA_SOURCE_FILE_EXTENSIONS lua;luah) + +# message("CMAKE_LUA_COMPILE_OBJECT is ${CMAKE_LUA_COMPILE_OBJECT}") + + +enable_language(LUA OPTIONAL) + +include_directories( + ${CMAKE_SOURCE_DIR}/lib/luajit/src/ + ${CMAKE_SOURCE_DIR}/src/ + ) + +# $(Q) $(CC) $(DEBUG) -Wl,--no-as-needed -Wl,-E -Werror -Wall -o $@ $^ \ +# ../lib/luajit/src/libluajit.a \ +# +set(CMAKE_C_FLAGS "-Wl,--no-as-needed -Wl,-E -Werror -Wall ${CMAKE_C_FLAGS}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt -lc -ldl -lm -lpthread ") + +# Lua C FFI Header + +set(LUA_HEADERS + core/lib.h + core/link.h + core/clib.h + lib/ipc/shmem/shmem.h + ) + +set(LUA_LUA_HEADERS_SRCS ) + +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/core) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib/io) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib/ipc) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib/ipc/shmem) + +foreach(lua_head ${LUA_HEADERS}) + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_BINARY_DIR}/src/${lua_head}.luah + COMMAND echo 'module\(...,package.seeall\); require\(\"ffi\"\).cdef[=============[' > '${CMAKE_BINARY_DIR}/src/${lua_head}.luah' + COMMAND cat ${CMAKE_SOURCE_DIR}/src/${lua_head} >> ${CMAKE_BINARY_DIR}/src/${lua_head}.luah + COMMAND echo ']=============]'>>${CMAKE_BINARY_DIR}/src/${lua_head}.luah + DEPENDS ${CMAKE_SOURCE_DIR}/src/${lua_head} + ) + list(APPEND LUA_LUA_HEADERS_SRCS ${CMAKE_BINARY_DIR}/src/${lua_head}.luah) + + # update + STRING(REPLACE "." "_" lua_source_module_name ${lua_head}) + STRING(REPLACE "/" "." lua_source_module_name ${lua_source_module_name}) + STRING(REGEX REPLACE "\\.luah$" "" lua_source_module_name ${lua_source_module_name}) + set_source_files_properties(${CMAKE_BINARY_DIR}/src/${lua_head}.luah + PROPERTIES COMPILE_FLAGS "-n ${lua_source_module_name}") +endforeach() + +message(${LUA_LUA_HEADERS_SRCS}) + +# Lua Module +set(LUA_SRCS + core/startup.lua + core/main.lua + core/shm.lua + lib/ipc/shmem/shmem.lua + ) + +foreach(lua_source ${LUA_SRCS}) + STRING(REPLACE "/" "." lua_source_module_name ${lua_source}) + STRING(REGEX REPLACE "\\.lua$" "" lua_source_module_name ${lua_source_module_name}) + # MESSAGE( STATUS "Including dir " ${lua_source} ${lua_source_module_name} ) + set_source_files_properties(${lua_source} + PROPERTIES COMPILE_FLAGS "-n ${lua_source_module_name}") +endforeach() + +# C code +set(C_SRCS + arch/avx2.c + arch/sse2.c + core/lib.c + core/memory.c + lib/checksum.c + lib/ipc/shmem/shmem.c + ) + +set_source_files_properties(arch/avx2.c + PROPERTIES COMPILE_FLAGS " -O2 -mavx2 ") +set_source_files_properties(arch/sse2.c + PROPERTIES COMPILE_FLAGS " -O2 -msse2 ") + +add_executable (snabb core/snabbswitch.c ${C_SRCS} ${LUA_LUA_HEADERS_SRCS} ${LUA_SRCS}) + +# Link the executable to the Hello library. Since the Hello library has +# public include directories we will use those link directories when building +# helloDemo + +add_dependencies(snabb luajit copy_ljsyscall) +target_link_libraries(snabb ${CMAKE_SOURCE_DIR}/lib/luajit/src/libluajit.a) + +# target_link_libraries (snabb LINK_PUBLIC luajit) \ No newline at end of file diff --git a/src/Makefile b/src/Makefile index 467b88e9eb..a8d2cc29c5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -116,6 +116,7 @@ $(OBJDIR) bin testlog $(OBJDIR/doc): $(LUAOBJ): obj/%_lua.o: %.lua Makefile | $(OBJDIR) $(E) "LUA $@" + $(E) "luajit -bg -n $(subst /,.,$*) $< $@" $(Q) luajit -bg -n $(subst /,.,$*) $< $@ $(PFLUAOBJ): obj/%_lua.o: ../lib/pflua/src/%.lua Makefile @@ -144,6 +145,8 @@ $(HOBJ): obj/%_h.o: %.h Makefile | $(OBJDIR) $(ASMOBJ): obj/%_dasl.o: %.dasl $(CHDR) Makefile | $(OBJDIR) $(E) "ASM $@" +# $(E) "luajit dynasm.lua -o $@.gen $<" +# $(E) "luajit -bg -n $(subst /,.,$*) $@.gen $@" $(Q) luajit dynasm.lua -o $@.gen $< $(Q) luajit -bg -n $(subst /,.,$*) $@.gen $@ diff --git a/src/core/snabbswitch.c b/src/core/snabbswitch.c index caf514d8a7..7c38923a2f 100644 --- a/src/core/snabbswitch.c +++ b/src/core/snabbswitch.c @@ -17,11 +17,16 @@ char** argv; int main(int snabb_argc, char **snabb_argv) { + int n = 0; /* Store for use by LuaJIT code via FFI. */ argc = snabb_argc; argv = snabb_argv; lua_State* L = luaL_newstate(); luaL_openlibs(L); - return luaL_dostring(L, "require \"core.startup\""); + n = luaL_dostring(L, "require \"core.startup\""); + if(n) { + printf("%s\n", lua_tostring(L, -1)); + } + return n; } diff --git a/src/program/zweig/README.inc b/src/program/zweig/README.inc new file mode 100644 index 0000000000..71b300cfae --- /dev/null +++ b/src/program/zweig/README.inc @@ -0,0 +1,11 @@ +Usage: + snabb wall + snabb wall --help + +Available subcommands: + + spy Analyze traffic and report statistics + +Use --help for per-command usage. Example: + + snabb wall spy --help diff --git a/src/program/zweig/zweig.lua b/src/program/zweig/zweig.lua new file mode 100755 index 0000000000..8fa38eb27f --- /dev/null +++ b/src/program/zweig/zweig.lua @@ -0,0 +1,39 @@ +-- Use of this source code is governed by the Apache 2.0 license; see COPYING. + +module(..., package.seeall) + +local pcap = require("apps.pcap.pcap") +local raw = require("apps.socket.raw") +local pcap_filter = require("apps.packet_filter.pcap_filter") + + + +function run (parameters) + if not (#parameters == 1) then + -- dump + print("Usage: zweig ") + main.exit(1) + end + -- local pcap_file = parameters[1] + local interface = parameters[1] + local c = config.new() + + config.app(c, "capture", raw.RawSocket, interface) + local v4_rules = + [[ + (udp and (dst port 5005)) + ]] + config.app(c,"pcap_filter", pcap_filter.PcapFilter, + {filter=v4_rules}) + + config.app(c, "dump", pcap.StdOutput, {}) + -- config.app(c, "dump", pcap.PcapWriter, {'1.pcap'}) + + config.link(c, "capture.tx -> pcap_filter.input") + config.link(c, "pcap_filter.output -> dump.input") + -- config.link(c, "capture.tx -> dump.input") + + engine.configure(c) + engine.main({report = {showlinks=true}}) + +end