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