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