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