F-Stack / f-stack

F-Stack is an user space network development kit with high performance based on DPDK, FreeBSD TCP/IP stack and coroutine API.
http://www.f-stack.org
Other
3.83k stars 895 forks source link

How to add SIFTR module #193

Closed linhopa closed 6 years ago

linhopa commented 6 years ago

I'm trying to compile siftr with kern_alq and I'm having problem to get it compiled successfully. what I added is the siftr.c under NETINET_SRCS, vfs_vnops.c and kern_alq.c under KERN_SRCS, vnode_pager.c under VM_SRCS. When I compile, I got this (this is just part of it): In file included from /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:79:0: /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.h:44:43: error: unknown type name ‘vop_getpages_iodone_t’ int count, int rbehind, int rahead, vop_getpages_iodone_t iodone, ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.h:49:39: error: ‘struct vop_getpages_args’ declared inside parameter list [-Werror] int vnode_pager_local_getpages(struct vop_getpages_args ap); ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.h:49:39: error: its scope is only this definition or declaration, which is probably not what you want [-Werror] /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.h:50:45: error: ‘struct vop_getpages_async_args’ declared inside parameter list [-Werror] int vnode_pager_local_getpages_async(struct vop_getpages_async_args ap); ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:89:12: error: unknown type name ‘vop_getpages_iodone_t’ int , vop_getpages_iodone_t, void ); ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:101:24: error: ‘vnode_pager_getpages_async’ undeclared here (not in a function) .pgo_getpages_async = vnode_pager_getpages_async, ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:111:1: error: no previous prototype for ‘vnode_create_vobject’ [-Werror=missing-prototypes] vnode_create_vobject(struct vnode vp, off_t isize, struct thread td) ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c: In function ‘vnode_create_vobject’: /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:117:2: error: implicit declaration of function ‘vn_isdisk’ [-Werror=implicit-function-declaration] if (!vn_isdisk(vp, NULL) && vn_canvmio(vp) == FALSE) ^ /home/developer/f-stack/lib/../freebsd/vm/vnode_pager.c:117:2: error: nested extern declaration of ‘vn_isdisk’ [-Werror=nested-externs]

This is my lib/Makefile:

# 
# Copyright (c) 2013 Patrick Kelsey. All rights reserved.
# Copyright (C) 2017 THL A29 Limited, a Tencent company.
# All rights reserved.
#
# Derived in part from libuinet's Makefile.
#
# Derived from FreeBSD auto-generated kernel Makefile and
# machine-specific Makefile templates
#

TOPDIR?=${CURDIR}/..
S=${TOPDIR}/freebsd
MACHINE_INCLUDES_ROOT:=${CURDIR}/machine_include
OVERRIDE_INCLUDES_ROOT:=${CURDIR}/include
X86_INCLUDES=0

HOST_OS:=$(shell uname -s)
#DEBUG=-O0 -gdwarf-2 -g3
#FF_NETGRAPH=1
#FF_IPFW=1

ifeq ($(FF_DPDK),)
    FF_DPDK=${TOPDIR}/dpdk/x86_64-native-linuxapp-gcc
endif

DPDK_CFLAGS= -Wall -Werror -include ${FF_DPDK}/include/rte_config.h
DPDK_CFLAGS+= -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
DPDK_CFLAGS+= -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
DPDK_CFLAGS+= -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2
DPDK_CFLAGS+= -I${FF_DPDK}/include

include ${TOPDIR}/mk/kern.pre.mk

KERNPREINCLUDES:= ${INCLUDES}
INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES}
INCLUDES+= -I./machine_include
INCLUDES+= -I./opt

# Include search path for files that only include host OS headers
HOST_INCLUDES= -I.
ifndef DEBUG
HOST_CFLAGS = -O2 -frename-registers  -funswitch-loops -fweb
else
HOST_CFLAGS = ${DEBUG} 
endif

HOST_CFLAGS+= ${DPDK_CFLAGS}
HOST_CFLAGS+= ${CONF_CFLAGS}

ifdef FF_NETGRAPH
HOST_CFLAGS+= -DFF_NETGRAPH
endif

ifdef FF_IPFW
HOST_CFLAGS+= -DFF_IPFW
endif

HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $<

ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),)
X86_INCLUDES=1
endif

#
# Distilled from FreeBSD src/sys/conf/Makefile.amd64
#
ifeq (${MACHINE_CPUARCH},amd64)
endif

#
# Distilled from FreeBSD src/sys/conf/Makefile.arm
#
ifeq (${MACHINE_CPUARCH},arm)

ifneq (${COMPILER_TYPE},clang)
CFLAGS += -mno-thumb-interwork
endif

endif

#
# Distilled from FreeBSD src/sys/conf/Makefile.i386
#
ifeq (${MACHINE_CPUARCH},i386)
MACHINE=i386
endif

#
# Distilled from FreeBSD src/sys/conf/Makefile.mips
#
ifeq (${MACHINE_CPUARCH},mips)

# We default to the MIPS32 ISA, if none specified in the
# kernel configuration file.
ARCH_FLAGS?=-march=mips32

HACK_EXTRA_FLAGS=-shared

CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
endif

CFLAGS+= -DFSTACK

# add for LVS tcp option toa, disabled by default
# CFLAGS+= -DLVS_TCPOPT_TOA

VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}
VPATH+= $S/kern
VPATH+= $S/crypto
VPATH+= $S/crypto/aesni
VPATH+= $S/crypto/blowfish
VPATH+= $S/crypto/camellia
VPATH+= $S/crypto/des
VPATH+= $S/crypto/rijndael
VPATH+= $S/crypto/sha2
VPATH+= $S/crypto/siphash
VPATH+= $S/net
ifdef FF_NETGRAPH
VPATH+= $S/netgraph
endif
VPATH+= $S/netinet
VPATH+= $S/netinet/libalias
VPATH+= $S/netinet/cc
VPATH+= $S/netipsec
ifdef FF_IPFW
VPATH+= $S/netpfil/ipfw
endif
VPATH+= $S/opencrypto
VPATH+= $S/vm
VPATH+= $S/libkern

FF_SRCS+=                     \
    ff_compat.c           \
    ff_glue.c             \
    ff_freebsd_init.c     \
    ff_init_main.c        \
    ff_kern_condvar.c     \
    ff_kern_environment.c \
    ff_kern_intr.c        \
    ff_kern_subr.c        \
    ff_kern_synch.c       \
    ff_kern_timeout.c     \
    ff_lock.c             \
    ff_syscall_wrapper.c  \
    ff_subr_prf.c         \
    ff_vfs_ops.c          \
    ff_veth.c             \
    ff_route.c

ifdef FF_NETGRAPH
FF_SRCS+=                   \
        ff_ng_base.c        \
        ff_ngctl.c
endif

FF_HOST_SRCS+=              \
    ff_host_interface.c \
    ff_config.c         \
    ff_ini_parser.c     \
    ff_dpdk_if.c        \
    ff_dpdk_kni.c       \
    ff_dpdk_pcap.c      \
    ff_epoll.c          \
    ff_init.c

ifdef FF_IPSEC
CRYPTO_ASM_SRCS+=                       \
    aesencdec_${MACHINE_CPUARCH}.S  \
    aeskeys_${MACHINE_CPUARCH}.S

CRYPTO_SRCS+=               \
    aesni.c             \
    aesni_wrap.c        \
    bf_ecb.c            \
    bf_enc.c            \
    bf_skey.c           \
    camellia.c          \
    camellia-api.c      \
    des_ecb.c           \
    des_enc.c           \
    des_setkey.c        \
    rijndael-alg-fst.c  \
    rijndael-api.c      \
    sha1.c              \
    sha256c.c           \
    sha512c.c           \
    siphash.c
else
CRYPTO_SRCS+=               \
    sha1.c              \
    siphash.c
endif

KERN_SRCS+=                 \
    vfs_vnops.c     \
    kern_alq.c      \
    kern_descrip.c      \
    kern_event.c        \
    kern_fail.c         \
    kern_khelp.c        \
    kern_hhook.c        \
    kern_linker.c       \
    kern_mbuf.c         \
    kern_module.c       \
    kern_mtxpool.c      \
    kern_ntptime.c      \
    kern_osd.c          \
    kern_sysctl.c       \
    kern_tc.c           \
    kern_uuid.c         \
    link_elf.c          \
    md5c.c              \
    subr_capability.c   \
    subr_counter.c      \
    subr_eventhandler.c \
    subr_kobj.c         \
    subr_lock.c         \
    subr_module.c       \
    subr_param.c        \
    subr_pcpu.c         \
    subr_sbuf.c         \
    subr_taskqueue.c    \
    subr_unit.c         \
    sys_capability.c    \
    sys_generic.c       \
    sys_socket.c        \
    uipc_accf.c         \
    uipc_mbuf.c         \
    uipc_mbuf2.c        \
    uipc_domain.c       \
    uipc_sockbuf.c      \
    uipc_socket.c       \
    uipc_syscalls.c

KERN_MHEADERS+=     \
    bus_if.m    \
    device_if.m \
    linker_if.m

KERN_MSRCS+=        \
    linker_if.m

LIBKERN_SRCS+=       \
    bcd.c        \
    crc32.c          \
    inet_ntoa.c  \
    jenkins_hash.c   \
    strlcpy.c    \
    strnlen.c        \
    zlib.c

MACHINE_SRCS+=       \
    in_cksum.c

NET_SRCS+=       \
    bpf.c        \
    bridgestp.c      \
    if.c         \
    if_bridge.c      \
    if_clone.c   \
    if_dead.c    \
    if_ethersubr.c   \
    if_loop.c    \
    if_llatbl.c  \
    if_media.c       \
    if_spppfr.c      \
    if_spppsubr.c    \
    if_vlan.c        \
    if_vxlan.c       \
    in_fib.c     \
    in_gif.c         \
    ip_reass.c   \
    netisr.c     \
    pfil.c       \
    radix.c      \
    raw_cb.c     \
    raw_usrreq.c     \
    route.c      \
    rtsock.c         \
    slcompress.c

ifdef FF_NETGRAPH
NETGRAPH_SRCS +=         \
    ng_async.c       \
    ng_atmllc.c      \
    ng_bridge.c      \
    ng_car.c         \
    ng_cisco.c       \
    ng_deflate.c     \
    ng_echo.c        \
    ng_eiface.c      \
    ng_etf.c         \
    ng_ether.c       \
    ng_ether_echo.c  \
    ng_frame_relay.c \
    ng_gif.c         \
    ng_gif_demux.c   \
    ng_hole.c        \
    ng_hub.c         \
    ng_iface.c       \
    ng_ip_input.c    \
    ng_ipfw.c        \
    ng_ksocket.c     \
    ng_l2tp.c        \
    ng_lmi.c         \
    ng_nat.c         \
    ng_one2many.c    \
    ng_parse.c       \
    ng_patch.c       \
    ng_pipe.c        \
    ng_ppp.c         \
    ng_pppoe.c       \
    ng_pptpgre.c     \
    ng_pred1.c       \
    ng_rfc1490.c     \
    ng_sample.c      \
    ng_socket.c      \
    ng_source.c      \
    ng_split.c       \
    ng_sppp.c        \
    ng_tag.c         \
    ng_tcpmss.c      \
    ng_tee.c         \
    ng_UI.c          \
    ng_vjc.c         \
    ng_vlan.c
endif

NETINET_SRCS+=      \
    if_ether.c  \
    if_gif.c        \
    igmp.c      \
    in.c        \
    in_mcast.c  \
    in_pcb.c    \
    in_proto.c  \
    in_rmx.c    \
    ip_carp.c   \
    ip_divert.c     \
    ip_ecn.c        \
    ip_encap.c  \
    ip_fastfwd.c    \
    ip_icmp.c   \
    ip_id.c     \
    ip_input.c  \
    ip_mroute.c     \
    ip_options.c    \
    ip_output.c \
    raw_ip.c    \
    siftr.c     \
    tcp_debug.c \
    tcp_fastopen.c  \
    tcp_hostcache.c \
    tcp_input.c \
    tcp_lro.c   \
    tcp_offload.c   \
    tcp_output.c    \
    tcp_reass.c \
    tcp_sack.c  \
    tcp_subr.c  \
    tcp_syncache.c  \
    tcp_timer.c \
    tcp_timewait.c  \
    tcp_usrreq.c    \
    udp_usrreq.c    \
    cc.c        \
    cc_newreno.c    \
    cc_htcp.c       \
    cc_cubic.c      \
    alias.c         \
    alias_db.c      \
    alias_mod.c     \
    alias_proxy.c   \
    alias_sctp.c    \
    alias_util.c

ifdef FF_IPFW
NETIPFW_SRCS+=             \
    ip_fw_dynamic.c \
    ip_fw_eaction.c \
    ip_fw_iface.c   \
    ip_fw_log.c     \
    ip_fw_nat.c     \
    ip_fw_pfil.c    \
    ip_fw_sockopt.c \
    ip_fw_table.c   \
    ip_fw_table_algo.c  \
    ip_fw_table_value.c \
    ip_fw2.c
endif

ifdef FF_IPSEC
NETINET_SRCS+=      \
    ip_ipsec.c
endif

ifdef FF_IPSEC
NETIPSEC_SRCS+=     \
    ipsec.c     \
    ipsec_input.c   \
    ipsec_mbuf.c    \
    ipsec_output.c  \
    key.c       \
    key_debug.c \
    keysock.c   \
    xform_ah.c  \
    xform_esp.c \
    xform_ipcomp.c
endif

# only if TCP_SIGNTAURE is defined
#xform_tcp.c

NETINET6_SRCS+=

ifdef FF_IPSEC
OPENCRYPTO_SRCS+=   \
    cast.c      \
    criov.c     \
    crypto.c    \
    cryptosoft.c    \
    deflate.c   \
    rmd160.c    \
    skipjack.c  \
    xform.c
endif

#   cryptodev.c

OPENCRYPTO_MHEADERS= cryptodev_if.m
OPENCRYPTO_MSRCS= cryptodev_if.m

VM_SRCS+=       \
    uma_core.c  \
    vnode_pager.c

MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS})
MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS})

MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS})
MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS})

ASM_SRCS = ${CRYPTO_ASM_SRCS}

SRCS=  ${FF_SRCS} ${CRYPTO_SRCS} ${VM_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS}
SRCS+= ${MSRCS} ${NET_SRCS} ${NETGRAPH_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS}
SRCS+= ${NETIPSEC_SRCS} ${NETIPFW_SRCS} ${OPENCRYPTO_SRCS}

# If witness is enabled.
# SRCS+= ${KERN_WITNESS_SRCS}

# Extra FreeBSD kernel module srcs.
SRCS+= ${KMOD_SRCS}

HOST_SRCS = ${FF_HOST_SRCS}

ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS})
OBJS+= $(patsubst %.c,%.o,${SRCS})
HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS})

all: libfstack.a

#
# The library is built by first incrementally linking all the object
# to resolve internal references.  Then, all symbols are made local.
# Then, only the symbols that are part of the  API are made
# externally available.
#
libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS}
    ${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS}
    nm $*.ro  | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp
    objcopy --localize-symbols=$*_localize_list.tmp $*.ro 
    rm $*_localize_list.tmp
    objcopy --globalize-symbols=ff_api.symlist $*.ro
    rm -f $@
    ar -cqs $@ $*.ro ${HOST_OBJS}
    rm -f $*.ro

${HOST_OBJS}: %.o: %.c
    ${HOST_C}

${ASM_OBJS}: %.o: %.S ${IMACROS_FILE}
    ${NORMAL_S}

${OBJS}: %.o: %.c ${IMACROS_FILE}
    ${NORMAL_C}

.SUFFIXES: .m

.m.c:
    ${AWK} -f $S/tools/makeobjops.awk $< -c

.m.h:
    ${AWK} -f $S/tools/makeobjops.awk $< -h

.PHONY: clean
clean:
    rm -f libfstack.a
    rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE}
    rm -rf ${MACHINE_INCLUDES_ROOT}

.PHONY: machine_includes
machine_includes:
    @rm -rf ${MACHINE_INCLUDES_ROOT}
    @mkdir -p ${MACHINE_INCLUDES_ROOT}/machine
    @cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine
    @if [ "${X86_INCLUDES}" != "0" ]; then              \
        mkdir -p ${MACHINE_INCLUDES_ROOT}/x86;          \
        cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86;    \
    fi

#
# Distilled from FreeBSD src/sys/conf/kern.post.mk
#
vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \
    $S/kern/vnode_if.src
vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
    ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
vnode_if_newproto.h:
    ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
vnode_if_typedef.h:
    ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q

include ${TOPDIR}/mk/kern.mk
whl739 commented 6 years ago

The module siftr couldn't be added simply, it needs the alq(asynchronous logging queues) and vnode. And we havn't implemented the two modules. A simpler way to implement alq is that just use host's open/read/write/close interface to log file. I will give you a patch next few days.

linhopa commented 6 years ago

Thanks. I'll be looking forward to the patch.

whl739 commented 6 years ago

Here is the patch, you can apply it and do some tests.

Add-module-siftr.patch.txt

linhopa commented 6 years ago

Thanks a lot. I'll test it.

daneshzg commented 3 years ago

Dears, I tried the patch, and configured F-Stack to report into a file. The file is being created, but it's always empty. I tried the hello world as well, it prints that it's going to report SIFTR, again the file is empty. Do you have any updates in this regard or any other solution to collect the TCP stats like ss_thresh, window size,...? Your help is really appreciated. Many thanks.

image