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