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