1# 2# Copyright (c) 2013 Patrick Kelsey. All rights reserved. 3# Copyright (C) 2017 THL A29 Limited, a Tencent company. 4# All rights reserved. 5# 6# Derived in part from libuinet's Makefile. 7# 8# Derived from FreeBSD auto-generated kernel Makefile and 9# machine-specific Makefile templates 10# 11 12TOPDIR?=${CURDIR}/.. 13S=${TOPDIR}/freebsd 14MACHINE_INCLUDES_ROOT:=${CURDIR}/machine_include 15OVERRIDE_INCLUDES_ROOT:=${CURDIR}/include 16X86_INCLUDES=0 17PREFIX=/usr/local 18PREFIX_LIB=${PREFIX}/lib 19PREFIX_INCLUDE=/usr/local/include 20PREFIX_BIN=/usr/local/bin 21F-STACK_CONF=/etc/f-stack.conf 22F-STACK_VERSION=1.22 23 24HOST_OS:=$(shell uname -s) 25 26#DEBUG=-O0 -gdwarf-2 -g3 -Wno-format-truncation 27 28FF_KNI=1 29#FF_FLOW_ISOLATE=1 30#FF_NETGRAPH=1 31#FF_IPFW=1 32#FF_USE_PAGE_ARRAY=1 33FF_INET6=1 34 35 36include ${TOPDIR}/mk/kern.pre.mk 37 38ifneq ($(shell pkg-config --exists libdpdk && echo 0),0) 39$(error "no installation of DPDK found, maybe you shuld export environment variable `PKG_CONFIG_PATH`") 40endif 41 42PKGCONF ?= pkg-config 43 44DPDK_CFLAGS= -Wall -Wno-deprecated-declarations -Werror $(shell $(PKGCONF) --cflags libdpdk) 45 46KERNPREINCLUDES:= ${INCLUDES} 47INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES} 48INCLUDES+= -I./machine_include 49INCLUDES+= -I./opt 50 51# Include search path for files that only include host OS headers 52HOST_INCLUDES= -I. 53ifndef DEBUG 54HOST_CFLAGS = -O2 -frename-registers -funswitch-loops -fweb -Wno-format-truncation 55else 56HOST_CFLAGS = ${DEBUG} 57endif 58 59ifdef FF_KNI 60HOST_CFLAGS+= -DFF_KNI 61endif 62 63HOST_CFLAGS+= ${DPDK_CFLAGS} 64HOST_CFLAGS+= ${CONF_CFLAGS} 65 66ifdef FF_FLOW_ISOLATE 67HOST_CFLAGS+= -DFF_FLOW_ISOLATE 68endif 69 70ifdef FF_NETGRAPH 71HOST_CFLAGS+= -DFF_NETGRAPH 72endif 73 74ifdef FF_IPFW 75HOST_CFLAGS+= -DFF_IPFW 76endif 77 78ifdef FF_USE_PAGE_ARRAY 79HOST_CFLAGS+= -DFF_USE_PAGE_ARRAY 80endif 81 82ifdef FF_INET6 83HOST_CFLAGS+= -DINET6 84CFLAGS+= -DINET6 85endif 86 87HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $< 88 89 90ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),) 91X86_INCLUDES=1 92endif 93 94 95# 96# Distilled from FreeBSD src/sys/conf/Makefile.amd64 97# 98ifeq (${MACHINE_CPUARCH},amd64) 99endif 100 101# 102# Distilled from FreeBSD src/sys/conf/Makefile.arm 103# 104ifeq (${MACHINE_CPUARCH},arm) 105 106ifneq (${COMPILER_TYPE},clang) 107CFLAGS += -mno-thumb-interwork 108endif 109 110endif 111 112# 113# fix the MACHINE_CPUARCH to match the FreeBSD directory name 114# 115ifeq (${MACHINE_CPUARCH},aarch64) 116MACHINE_CPUARCH=arm64 117endif 118 119 120# 121# Distilled from FreeBSD src/sys/conf/Makefile.i386 122# 123ifeq (${MACHINE_CPUARCH},i386) 124MACHINE=i386 125endif 126 127 128# 129# Distilled from FreeBSD src/sys/conf/Makefile.mips 130# 131ifeq (${MACHINE_CPUARCH},mips) 132 133# We default to the MIPS32 ISA, if none specified in the 134# kernel configuration file. 135ARCH_FLAGS?=-march=mips32 136 137HACK_EXTRA_FLAGS=-shared 138 139CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) 140HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) 141endif 142 143CFLAGS+= -DFSTACK 144 145# add for LVS tcp option toa, disabled by default 146# CFLAGS+= -DLVS_TCPOPT_TOA 147 148VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH} 149VPATH+= $S/kern 150VPATH+= $S/crypto 151VPATH+= $S/crypto/aesni 152VPATH+= $S/crypto/blowfish 153VPATH+= $S/crypto/camellia 154VPATH+= $S/crypto/des 155VPATH+= $S/crypto/rijndael 156VPATH+= $S/crypto/sha2 157VPATH+= $S/crypto/siphash 158VPATH+= $S/net 159ifdef FF_NETGRAPH 160VPATH+= $S/netgraph 161endif 162VPATH+= $S/netinet 163VPATH+= $S/netinet/libalias 164VPATH+= $S/netinet/cc 165ifdef FF_INET6 166VPATH+= $S/netinet6 167endif 168VPATH+= $S/netipsec 169ifdef FF_IPFW 170VPATH+= $S/netpfil/ipfw 171endif 172VPATH+= $S/opencrypto 173VPATH+= $S/vm 174VPATH+= $S/libkern 175 176 177FF_SRCS+= \ 178 ff_compat.c \ 179 ff_glue.c \ 180 ff_freebsd_init.c \ 181 ff_init_main.c \ 182 ff_kern_condvar.c \ 183 ff_kern_environment.c \ 184 ff_kern_intr.c \ 185 ff_kern_subr.c \ 186 ff_kern_synch.c \ 187 ff_kern_timeout.c \ 188 ff_lock.c \ 189 ff_syscall_wrapper.c \ 190 ff_subr_prf.c \ 191 ff_vfs_ops.c \ 192 ff_veth.c \ 193 ff_route.c 194 195ifdef FF_NETGRAPH 196FF_SRCS+= \ 197 ff_ng_base.c \ 198 ff_ngctl.c 199endif 200 201FF_HOST_SRCS+= \ 202 ff_host_interface.c \ 203 ff_config.c \ 204 ff_ini_parser.c \ 205 ff_dpdk_if.c \ 206 ff_dpdk_pcap.c \ 207 ff_epoll.c \ 208 ff_init.c 209 210ifdef FF_KNI 211FF_HOST_SRCS+= \ 212 ff_dpdk_kni.c 213endif 214 215ifdef FF_USE_PAGE_ARRAY 216FF_HOST_SRCS+= \ 217 ff_memory.c 218endif 219 220ifdef FF_IPSEC 221CRYPTO_ASM_SRCS+= \ 222 aesencdec_${MACHINE_CPUARCH}.S \ 223 aeskeys_${MACHINE_CPUARCH}.S 224 225CRYPTO_SRCS+= \ 226 aesni.c \ 227 aesni_wrap.c \ 228 bf_ecb.c \ 229 bf_enc.c \ 230 bf_skey.c \ 231 camellia.c \ 232 camellia-api.c \ 233 des_ecb.c \ 234 des_enc.c \ 235 des_setkey.c \ 236 rijndael-alg-fst.c \ 237 rijndael-api.c \ 238 sha1.c \ 239 sha256c.c \ 240 sha512c.c \ 241 siphash.c 242else 243CRYPTO_SRCS+= \ 244 sha1.c \ 245 siphash.c 246endif 247 248KERN_SRCS+= \ 249 kern_descrip.c \ 250 kern_event.c \ 251 kern_fail.c \ 252 kern_khelp.c \ 253 kern_hhook.c \ 254 kern_linker.c \ 255 kern_mbuf.c \ 256 kern_module.c \ 257 kern_mtxpool.c \ 258 kern_ntptime.c \ 259 kern_osd.c \ 260 kern_sysctl.c \ 261 kern_tc.c \ 262 kern_uuid.c \ 263 link_elf.c \ 264 md5c.c \ 265 subr_capability.c \ 266 subr_counter.c \ 267 subr_eventhandler.c \ 268 subr_kobj.c \ 269 subr_lock.c \ 270 subr_module.c \ 271 subr_param.c \ 272 subr_pcpu.c \ 273 subr_sbuf.c \ 274 subr_taskqueue.c \ 275 subr_unit.c \ 276 sys_capability.c \ 277 sys_generic.c \ 278 sys_socket.c \ 279 uipc_accf.c \ 280 uipc_mbuf.c \ 281 uipc_mbuf2.c \ 282 uipc_domain.c \ 283 uipc_sockbuf.c \ 284 uipc_socket.c \ 285 uipc_syscalls.c 286 287 288KERN_MHEADERS+= \ 289 bus_if.m \ 290 device_if.m \ 291 linker_if.m 292 293 294KERN_MSRCS+= \ 295 linker_if.m 296 297ifeq (${MACHINE_CPUARCH},arm64) 298LIBKERN_SRCS+= \ 299 bcd.c \ 300 crc32.c \ 301 inet_ntoa.c \ 302 jenkins_hash.c \ 303 strlcpy.c \ 304 strnlen.c \ 305 zlib.c \ 306 fls.c \ 307 flsl.c 308else 309LIBKERN_SRCS+= \ 310 bcd.c \ 311 crc32.c \ 312 inet_ntoa.c \ 313 jenkins_hash.c \ 314 strlcpy.c \ 315 strnlen.c \ 316 zlib.c 317endif 318 319 320MACHINE_SRCS+= \ 321 in_cksum.c 322 323 324NET_SRCS+= \ 325 bpf.c \ 326 bridgestp.c \ 327 if.c \ 328 if_bridge.c \ 329 if_clone.c \ 330 if_dead.c \ 331 if_ethersubr.c \ 332 if_loop.c \ 333 if_llatbl.c \ 334 if_media.c \ 335 if_spppfr.c \ 336 if_spppsubr.c \ 337 if_vlan.c \ 338 if_vxlan.c \ 339 in_fib.c \ 340 in_gif.c \ 341 ip_reass.c \ 342 netisr.c \ 343 pfil.c \ 344 radix.c \ 345 raw_cb.c \ 346 raw_usrreq.c \ 347 route.c \ 348 rtsock.c \ 349 slcompress.c 350 351ifdef FF_NETGRAPH 352NETGRAPH_SRCS += \ 353 ng_async.c \ 354 ng_atmllc.c \ 355 ng_bridge.c \ 356 ng_car.c \ 357 ng_cisco.c \ 358 ng_deflate.c \ 359 ng_echo.c \ 360 ng_eiface.c \ 361 ng_etf.c \ 362 ng_ether.c \ 363 ng_ether_echo.c \ 364 ng_frame_relay.c \ 365 ng_gif.c \ 366 ng_gif_demux.c \ 367 ng_hole.c \ 368 ng_hub.c \ 369 ng_iface.c \ 370 ng_ip_input.c \ 371 ng_ipfw.c \ 372 ng_ksocket.c \ 373 ng_l2tp.c \ 374 ng_lmi.c \ 375 ng_nat.c \ 376 ng_one2many.c \ 377 ng_parse.c \ 378 ng_patch.c \ 379 ng_pipe.c \ 380 ng_ppp.c \ 381 ng_pppoe.c \ 382 ng_pptpgre.c \ 383 ng_pred1.c \ 384 ng_rfc1490.c \ 385 ng_sample.c \ 386 ng_socket.c \ 387 ng_source.c \ 388 ng_split.c \ 389 ng_sppp.c \ 390 ng_tag.c \ 391 ng_tcpmss.c \ 392 ng_tee.c \ 393 ng_UI.c \ 394 ng_vjc.c \ 395 ng_vlan.c 396endif 397 398NETINET_SRCS+= \ 399 if_ether.c \ 400 if_gif.c \ 401 igmp.c \ 402 in.c \ 403 in_mcast.c \ 404 in_pcb.c \ 405 in_proto.c \ 406 in_rmx.c \ 407 ip_carp.c \ 408 ip_divert.c \ 409 ip_ecn.c \ 410 ip_encap.c \ 411 ip_fastfwd.c \ 412 ip_icmp.c \ 413 ip_id.c \ 414 ip_input.c \ 415 ip_mroute.c \ 416 ip_options.c \ 417 ip_output.c \ 418 raw_ip.c \ 419 tcp_debug.c \ 420 tcp_fastopen.c \ 421 tcp_hostcache.c \ 422 tcp_input.c \ 423 tcp_lro.c \ 424 tcp_offload.c \ 425 tcp_output.c \ 426 tcp_reass.c \ 427 tcp_sack.c \ 428 tcp_subr.c \ 429 tcp_syncache.c \ 430 tcp_timer.c \ 431 tcp_timewait.c \ 432 tcp_usrreq.c \ 433 udp_usrreq.c \ 434 cc.c \ 435 cc_newreno.c \ 436 cc_htcp.c \ 437 cc_cubic.c \ 438 alias.c \ 439 alias_db.c \ 440 alias_mod.c \ 441 alias_proxy.c \ 442 alias_sctp.c \ 443 alias_util.c 444 445ifdef FF_INET6 446NETINET6_SRCS+= \ 447 dest6.c \ 448 frag6.c \ 449 icmp6.c \ 450 in6.c \ 451 in6_ifattach.c \ 452 in6_mcast.c \ 453 in6_pcb.c \ 454 in6_pcbgroup.c \ 455 in6_proto.c \ 456 in6_rmx.c \ 457 in6_src.c \ 458 ip6_forward.c \ 459 ip6_id.c \ 460 ip6_input.c \ 461 ip6_fastfwd.c \ 462 ip6_mroute.c \ 463 ip6_output.c \ 464 mld6.c \ 465 nd6.c \ 466 nd6_nbr.c \ 467 nd6_rtr.c \ 468 raw_ip6.c \ 469 route6.c \ 470 scope6.c \ 471 send.c \ 472 udp6_usrreq.c \ 473 in6_cksum.c \ 474 in6_fib.c \ 475 in6_gif.c 476 #ip6_gre.c 477 #ip6_ipsec.c 478 #sctp6_usrreq.c 479 #in6_rss.c 480ifndef FF_KNI 481FF_HOST_SRCS+= \ 482 ff_dpdk_kni.c 483endif 484endif 485 486ifdef FF_IPFW 487NETIPFW_SRCS+= \ 488 ip_fw_dynamic.c \ 489 ip_fw_eaction.c \ 490 ip_fw_iface.c \ 491 ip_fw_log.c \ 492 ip_fw_nat.c \ 493 ip_fw_pfil.c \ 494 ip_fw_sockopt.c \ 495 ip_fw_table.c \ 496 ip_fw_table_algo.c \ 497 ip_fw_table_value.c \ 498 ip_fw2.c 499endif 500 501ifdef FF_IPSEC 502NETINET_SRCS+= \ 503 ip_ipsec.c 504ifdef FF_INET6 505NETINET6_SRCS+= \ 506 ip6_ipsec.c 507endif 508endif 509 510 511ifdef FF_IPSEC 512NETIPSEC_SRCS+= \ 513 ipsec.c \ 514 ipsec_input.c \ 515 ipsec_mbuf.c \ 516 ipsec_output.c \ 517 key.c \ 518 key_debug.c \ 519 keysock.c \ 520 xform_ah.c \ 521 xform_esp.c \ 522 xform_ipcomp.c 523endif 524 525# only if TCP_SIGNTAURE is defined 526#xform_tcp.c 527 528ifdef FF_IPSEC 529OPENCRYPTO_SRCS+= \ 530 cast.c \ 531 criov.c \ 532 crypto.c \ 533 cryptosoft.c \ 534 deflate.c \ 535 rmd160.c \ 536 skipjack.c \ 537 xform.c 538endif 539 540# cryptodev.c 541 542OPENCRYPTO_MHEADERS= cryptodev_if.m 543OPENCRYPTO_MSRCS= cryptodev_if.m 544 545VM_SRCS+= \ 546 uma_core.c 547 548 549MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS}) 550MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h 551MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS}) 552 553MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS}) 554MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS}) 555 556ASM_SRCS = ${CRYPTO_ASM_SRCS} 557 558SRCS= ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS} 559SRCS+= ${MSRCS} ${NET_SRCS} ${NETGRAPH_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS} 560SRCS+= ${NETIPSEC_SRCS} ${NETIPFW_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS} 561 562# If witness is enabled. 563# SRCS+= ${KERN_WITNESS_SRCS} 564 565# Extra FreeBSD kernel module srcs. 566SRCS+= ${KMOD_SRCS} 567 568HOST_SRCS = ${FF_HOST_SRCS} 569 570ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS}) 571OBJS+= $(patsubst %.c,%.o,${SRCS}) 572HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS}) 573 574all: libfstack.a 575 576# 577# The library is built by first incrementally linking all the object 578# to resolve internal references. Then, all symbols are made local. 579# Then, only the symbols that are part of the API are made 580# externally available. 581# 582libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} 583 ${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS} 584 nm $*.ro | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp 585 objcopy --localize-symbols=$*_localize_list.tmp $*.ro 586 rm $*_localize_list.tmp 587 objcopy --globalize-symbols=ff_api.symlist $*.ro 588 rm -f $@ 589 ar -cqs $@ $*.ro ${HOST_OBJS} 590 rm -f $*.ro 591 592${HOST_OBJS}: %.o: %.c 593 ${HOST_C} 594 595${ASM_OBJS}: %.o: %.S ${IMACROS_FILE} 596 ${NORMAL_S} 597 598${OBJS}: %.o: %.c ${IMACROS_FILE} 599 ${NORMAL_C} 600 601 602.SUFFIXES: .m 603 604.m.c: 605 ${AWK} -f $S/tools/makeobjops.awk $< -c 606 607.m.h: 608 ${AWK} -f $S/tools/makeobjops.awk $< -h 609 610.PHONY: clean 611clean: 612 rm -f libfstack.a 613 rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE} 614 rm -rf ${MACHINE_INCLUDES_ROOT} 615 616 617.PHONY: machine_includes 618machine_includes: 619 @rm -rf ${MACHINE_INCLUDES_ROOT} 620 @mkdir -p ${MACHINE_INCLUDES_ROOT}/machine 621 @cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine 622 @if [ "${X86_INCLUDES}" != "0" ]; then \ 623 mkdir -p ${MACHINE_INCLUDES_ROOT}/x86; \ 624 cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86; \ 625 fi 626 627# 628# Distilled from FreeBSD src/sys/conf/kern.post.mk 629# 630vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \ 631 $S/kern/vnode_if.src 632vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h 633 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h 634vnode_if_newproto.h: 635 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p 636vnode_if_typedef.h: 637 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q 638 639include ${TOPDIR}/mk/kern.mk 640 641install: 642 rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} 643 rm -rf ${PREFIX_LIB}/libfstack.a 644 rm -rf ${PREFIX_INCLUDE}/ff_config.h 645 rm -rf ${PREFIX_INCLUDE}/ff_api.h 646 rm -rf ${PREFIX_INCLUDE}/ff_event.h 647 rm -rf ${PREFIX_INCLUDE}/ff_errno.h 648 rm -rf ${PREFIX_INCLUDE}/ff_epoll.h 649 rm -rf ${PREFIX_BIN}/ff_start 650 651 cp -f libfstack.a ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} 652 ln -sf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} ${PREFIX_LIB}/libfstack.a 653 cp -f ff_config.h ${PREFIX_INCLUDE}/ff_config.h 654 cp -f ff_api.h ${PREFIX_INCLUDE}/ff_api.h 655 cp -f ff_event.h ${PREFIX_INCLUDE}/ff_event.h 656 cp -f ff_errno.h ${PREFIX_INCLUDE}/ff_errno.h 657 cp -f ff_epoll.h ${PREFIX_INCLUDE}/ff_epoll.h 658 cp -f ${TOPDIR}/start.sh ${PREFIX_BIN}/ff_start 659 test -f '${F-STACK_CONF}' || cp -f ${TOPDIR}/config.ini ${F-STACK_CONF} 660 661uninstall: 662 rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} 663 rm -rf ${PREFIX_LIB}/libfstack.a 664 rm -rf ${PREFIX_INCLUDE}/ff_config.h 665 rm -rf ${PREFIX_INCLUDE}/ff_api.h 666 rm -rf ${PREFIX_INCLUDE}/ff_event.h 667 rm -rf ${PREFIX_INCLUDE}/ff_errno.h 668 rm -rf ${PREFIX_INCLUDE}/ff_epoll.h 669 rm -rf ${PREFIX_BIN}/ff_start 670 rm -rf ${F-STACK_CONF} 671 672