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