svn commit: r345354 - in projects/fuse2: . contrib/blacklist/bin contrib/googletest/googletest/test contrib/llvm/tools/clang/lib/Basic contrib/llvm/tools/lld/ELF contrib/llvm/tools/lld/docs contrib...
Alan Somers
asomers at FreeBSD.org
Wed Mar 20 23:32:44 UTC 2019
Author: asomers
Date: Wed Mar 20 23:32:37 2019
New Revision: 345354
URL: https://svnweb.freebsd.org/changeset/base/345354
Log:
MFHead @345353
Added:
projects/fuse2/sys/modules/fusefs/
- copied from r345353, head/sys/modules/fusefs/
Replaced:
projects/fuse2/contrib/googletest/googletest/test/gtest_skip_test.cc
- copied unchanged from r345353, head/contrib/googletest/googletest/test/gtest_skip_test.cc
Deleted:
projects/fuse2/sys/modules/fuse/
Modified:
projects/fuse2/Makefile.inc1
projects/fuse2/UPDATING
projects/fuse2/contrib/blacklist/bin/blacklistd.c
projects/fuse2/contrib/llvm/tools/clang/lib/Basic/Version.cpp
projects/fuse2/contrib/llvm/tools/lld/ELF/Config.h
projects/fuse2/contrib/llvm/tools/lld/ELF/Driver.cpp
projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.cpp
projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.h
projects/fuse2/contrib/llvm/tools/lld/ELF/Options.td
projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.h
projects/fuse2/contrib/llvm/tools/lld/ELF/Writer.cpp
projects/fuse2/contrib/llvm/tools/lld/docs/ld.lld.1
projects/fuse2/contrib/openmp/runtime/src/kmp.h
projects/fuse2/contrib/openmp/runtime/src/kmp_runtime.cpp
projects/fuse2/lib/Makefile
projects/fuse2/lib/clang/include/clang/Basic/Version.inc
projects/fuse2/lib/clang/include/lld/Common/Version.inc
projects/fuse2/lib/clang/include/llvm/Support/VCSRevision.h
projects/fuse2/lib/libjail/jail.c
projects/fuse2/lib/libomp/Makefile
projects/fuse2/release/Makefile.ec2
projects/fuse2/release/tools/ec2.conf
projects/fuse2/sbin/bectl/bectl_jail.c
projects/fuse2/sbin/ipfw/ipfw.8
projects/fuse2/sbin/ipfw/ipfw2.h
projects/fuse2/sbin/ipfw/nat64lsn.c
projects/fuse2/sbin/mount_fusefs/mount_fusefs.c
projects/fuse2/share/man/man9/sysctl.9
projects/fuse2/share/mk/src.opts.mk
projects/fuse2/stand/common/interp_forth.c
projects/fuse2/stand/common/load_elf.c
projects/fuse2/sys/amd64/sgx/sgx.c
projects/fuse2/sys/arm/include/platformvar.h
projects/fuse2/sys/conf/NOTES
projects/fuse2/sys/conf/files
projects/fuse2/sys/conf/kern.post.mk
projects/fuse2/sys/conf/kmod.mk
projects/fuse2/sys/conf/options
projects/fuse2/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_ani.c
projects/fuse2/sys/dev/ahci/ahci_pci.c
projects/fuse2/sys/dev/cpufreq/cpufreq_dt.c
projects/fuse2/sys/dev/cxgbe/adapter.h
projects/fuse2/sys/dev/cxgbe/common/common.h
projects/fuse2/sys/dev/cxgbe/common/t4_hw.c
projects/fuse2/sys/dev/cxgbe/firmware/t4fw_interface.h
projects/fuse2/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
projects/fuse2/sys/dev/cxgbe/t4_main.c
projects/fuse2/sys/dev/cxgbe/t4_sched.c
projects/fuse2/sys/dev/cxgbe/t4_sge.c
projects/fuse2/sys/dev/cxgbe/tom/t4_cpl_io.c
projects/fuse2/sys/dev/cxgbe/tom/t4_listen.c
projects/fuse2/sys/dev/cxgbe/tom/t4_tom.c
projects/fuse2/sys/dev/e1000/if_em.c
projects/fuse2/sys/dev/extres/phy/phy.c
projects/fuse2/sys/dev/extres/regulator/regulator.c
projects/fuse2/sys/dev/extres/syscon/syscon.c
projects/fuse2/sys/dev/ichsmb/ichsmb_pci.c
projects/fuse2/sys/dev/ixgbe/if_ix.c
projects/fuse2/sys/dev/ixgbe/if_ixv.c
projects/fuse2/sys/dev/ixl/if_iavf.c
projects/fuse2/sys/dev/ixl/ixl_pf_main.c
projects/fuse2/sys/dev/pci/pcivar.h
projects/fuse2/sys/dev/psci/psci.c
projects/fuse2/sys/dev/psci/psci.h
projects/fuse2/sys/dev/sound/pci/hda/hdac.c
projects/fuse2/sys/dev/sound/pci/hda/hdacc.c
projects/fuse2/sys/fs/fuse/fuse.h
projects/fuse2/sys/fs/fuse/fuse_file.c
projects/fuse2/sys/fs/fuse/fuse_ipc.c
projects/fuse2/sys/fs/fuse/fuse_main.c
projects/fuse2/sys/fs/fuse/fuse_node.c
projects/fuse2/sys/fs/fuse/fuse_vfsops.c
projects/fuse2/sys/fs/fuse/fuse_vnops.c
projects/fuse2/sys/modules/Makefile
projects/fuse2/sys/modules/ipfw_nat64/Makefile
projects/fuse2/sys/net/bpf.c
projects/fuse2/sys/net/iflib.c
projects/fuse2/sys/net/iflib.h
projects/fuse2/sys/netinet6/ip_fw_nat64.h
projects/fuse2/sys/netpfil/ipfw/nat64/nat64lsn.c
projects/fuse2/sys/netpfil/ipfw/nat64/nat64lsn.h
projects/fuse2/sys/netpfil/ipfw/nat64/nat64lsn_control.c
projects/fuse2/sys/sys/param.h
projects/fuse2/sys/sys/stat.h
projects/fuse2/sys/sys/sysctl.h
projects/fuse2/sys/ufs/ffs/ffs_softdep.c
projects/fuse2/sys/vm/vm_fault.c
projects/fuse2/tests/sys/netmap/ctrl-api-test.c
projects/fuse2/usr.bin/lockf/lockf.c
projects/fuse2/usr.sbin/makefs/mtree.c
projects/fuse2/usr.sbin/makefs/tests/makefs_tests_common.sh
Directory Properties:
projects/fuse2/ (props changed)
projects/fuse2/contrib/blacklist/ (props changed)
projects/fuse2/contrib/compiler-rt/ (props changed)
projects/fuse2/contrib/libc++/ (props changed)
projects/fuse2/contrib/libunwind/ (props changed)
projects/fuse2/contrib/llvm/ (props changed)
projects/fuse2/contrib/llvm/tools/clang/ (props changed)
projects/fuse2/contrib/llvm/tools/lld/ (props changed)
projects/fuse2/contrib/llvm/tools/lldb/ (props changed)
projects/fuse2/contrib/openmp/ (props changed)
Modified: projects/fuse2/Makefile.inc1
==============================================================================
--- projects/fuse2/Makefile.inc1 Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/Makefile.inc1 Wed Mar 20 23:32:37 2019 (r345354)
@@ -1162,7 +1162,7 @@ buildworld_epilogue: .PHONY
@echo "--------------------------------------------------------------"
@echo ">>> World build completed on `LC_ALL=C date`"
@seconds=$$(($$(date '+%s') - ${_BUILDWORLD_START})); \
- echo -n ">>> World build in $$seconds seconds, "; \
+ echo -n ">>> World built in $$seconds seconds, "; \
echo "ncpu: $$(sysctl -n hw.ncpu)${.MAKE.JOBS:S/^/, make -j/}"
@echo "--------------------------------------------------------------"
@@ -1648,7 +1648,7 @@ buildkernel: .MAKE .PHONY
.endfor
@seconds=$$(($$(date '+%s') - ${_BUILDKERNEL_START})); \
- echo -n ">>> Kernel(s) build for${BUILDKERNELS} in $$seconds seconds, "; \
+ echo -n ">>> Kernel(s) ${BUILDKERNELS} built in $$seconds seconds, "; \
echo "ncpu: $$(sysctl -n hw.ncpu)${.MAKE.JOBS:S/^/, make -j/}"
@echo "--------------------------------------------------------------"
Modified: projects/fuse2/UPDATING
==============================================================================
--- projects/fuse2/UPDATING Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/UPDATING Wed Mar 20 23:32:37 2019 (r345354)
@@ -31,6 +31,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20190320:
+ The fuse(4) module has been renamed to fusefs(4) for consistency with
+ other filesystems. You should update any kld_load="fuse" entries in
+ /etc/rc.conf, fuse_load="YES" entries in /boot/loader.conf, and
+ "options FUSE" enties in kernel config files.
+
20190304:
Clang, llvm, lld, lldb, compiler-rt and libc++ have been upgraded to
8.0.0. Please see the 20141231 entry below for information about
Modified: projects/fuse2/contrib/blacklist/bin/blacklistd.c
==============================================================================
--- projects/fuse2/contrib/blacklist/bin/blacklistd.c Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/blacklist/bin/blacklistd.c Wed Mar 20 23:32:37 2019 (r345354)
@@ -328,7 +328,7 @@ again:
if (dbi.id[0]) {
run_change("rem", &c, dbi.id, 0);
sockaddr_snprintf(buf, sizeof(buf), "%a", ss);
- syslog(LOG_INFO, "released %s/%d:%d after %d seconds",
+ (*lfun)(LOG_INFO, "released %s/%d:%d after %d seconds",
buf, c.c_lmask, c.c_port, c.c_duration);
}
state_del(state, &c);
Copied: projects/fuse2/contrib/googletest/googletest/test/gtest_skip_test.cc (from r345353, head/contrib/googletest/googletest/test/gtest_skip_test.cc)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/fuse2/contrib/googletest/googletest/test/gtest_skip_test.cc Wed Mar 20 23:32:37 2019 (r345354, copy of r345353, head/contrib/googletest/googletest/test/gtest_skip_test.cc)
@@ -0,0 +1,55 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: arseny.aprelev at gmail.com (Arseny Aprelev)
+//
+
+#include "gtest/gtest.h"
+
+using ::testing::Test;
+
+TEST(SkipTest, DoesSkip) {
+ GTEST_SKIP();
+ EXPECT_EQ(0, 1);
+}
+
+class Fixture : public Test {
+ protected:
+ void SetUp() override {
+ GTEST_SKIP() << "skipping all tests for this fixture";
+ }
+};
+
+TEST_F(Fixture, SkipsOneTest) {
+ EXPECT_EQ(5, 7);
+}
+
+TEST_F(Fixture, SkipsAnotherTest) {
+ EXPECT_EQ(99, 100);
+}
Modified: projects/fuse2/contrib/llvm/tools/clang/lib/Basic/Version.cpp
==============================================================================
--- projects/fuse2/contrib/llvm/tools/clang/lib/Basic/Version.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/clang/lib/Basic/Version.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -36,7 +36,7 @@ std::string getClangRepositoryPath() {
// If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us
// pick up a tag in an SVN export, for example.
- StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/branches/release_80/lib/Basic/Version.cpp $");
+ StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_800/final/lib/Basic/Version.cpp $");
if (URL.empty()) {
URL = SVNRepository.slice(SVNRepository.find(':'),
SVNRepository.find("/lib/Basic"));
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/Config.h
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/Config.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/Config.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -122,6 +122,7 @@ struct Configuration {
uint64_t>
CallGraphProfile;
bool AllowMultipleDefinition;
+ bool AllowShlibUndefined;
bool AndroidPackDynRelocs;
bool ARMHasBlx = false;
bool ARMHasMovtMovw = false;
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/Driver.cpp
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/Driver.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/Driver.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -758,6 +758,9 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args
Args.hasFlag(OPT_allow_multiple_definition,
OPT_no_allow_multiple_definition, false) ||
hasZOption(Args, "muldefs");
+ Config->AllowShlibUndefined =
+ Args.hasFlag(OPT_allow_shlib_undefined, OPT_no_allow_shlib_undefined,
+ Args.hasArg(OPT_shared));
Config->AuxiliaryList = args::getStrings(Args, OPT_auxiliary);
Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic);
Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions);
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.cpp
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -865,7 +865,7 @@ SharedFile<ELFT>::SharedFile(MemoryBufferRef M, String
// Partially parse the shared object file so that we can call
// getSoName on this object.
-template <class ELFT> void SharedFile<ELFT>::parseSoName() {
+template <class ELFT> void SharedFile<ELFT>::parseDynamic() {
const Elf_Shdr *DynamicSec = nullptr;
const ELFFile<ELFT> Obj = this->getObj();
ArrayRef<Elf_Shdr> Sections = CHECK(Obj.sections(), this);
@@ -902,12 +902,16 @@ template <class ELFT> void SharedFile<ELFT>::parseSoNa
ArrayRef<Elf_Dyn> Arr =
CHECK(Obj.template getSectionContentsAsArray<Elf_Dyn>(DynamicSec), this);
for (const Elf_Dyn &Dyn : Arr) {
- if (Dyn.d_tag == DT_SONAME) {
+ if (Dyn.d_tag == DT_NEEDED) {
uint64_t Val = Dyn.getVal();
if (Val >= this->StringTable.size())
+ fatal(toString(this) + ": invalid DT_NEEDED entry");
+ DtNeeded.push_back(this->StringTable.data() + Val);
+ } else if (Dyn.d_tag == DT_SONAME) {
+ uint64_t Val = Dyn.getVal();
+ if (Val >= this->StringTable.size())
fatal(toString(this) + ": invalid DT_SONAME entry");
SoName = this->StringTable.data() + Val;
- return;
}
}
}
@@ -975,7 +979,7 @@ uint32_t SharedFile<ELFT>::getAlignment(ArrayRef<Elf_S
return (Ret > UINT32_MAX) ? 0 : Ret;
}
-// Fully parse the shared object file. This must be called after parseSoName().
+// Fully parse the shared object file. This must be called after parseDynamic().
//
// This function parses symbol versions. If a DSO has version information,
// the file has a ".gnu.version_d" section which contains symbol version
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.h
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/InputFiles.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -323,6 +323,7 @@ template <class ELFT> class SharedFile : public ELFFil
public:
std::vector<const Elf_Verdef *> Verdefs;
+ std::vector<StringRef> DtNeeded;
std::string SoName;
static bool classof(const InputFile *F) {
@@ -331,7 +332,7 @@ template <class ELFT> class SharedFile : public ELFFil
SharedFile(MemoryBufferRef M, StringRef DefaultSoName);
- void parseSoName();
+ void parseDynamic();
void parseRest();
uint32_t getAlignment(ArrayRef<Elf_Shdr> Sections, const Elf_Sym &Sym);
std::vector<const Elf_Verdef *> parseVerdefs();
@@ -348,6 +349,9 @@ template <class ELFT> class SharedFile : public ELFFil
// Mapping from Elf_Verdef data structures to information about Elf_Vernaux
// data structures in the output file.
std::map<const Elf_Verdef *, NeededVer> VerdefMap;
+
+ // Used for --no-allow-shlib-undefined.
+ bool AllNeededIsKnown;
// Used for --as-needed
bool IsNeeded;
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/Options.td
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/Options.td Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/Options.td Wed Mar 20 23:32:37 2019 (r345354)
@@ -63,6 +63,10 @@ defm allow_multiple_definition: B<"allow-multiple-defi
"Allow multiple definitions",
"Do not allow multiple definitions (default)">;
+defm allow_shlib_undefined: B<"allow-shlib-undefined",
+ "Allow unresolved references in shared libraries (default when linking a shared library)",
+ "Do not allow unresolved references in shared libraries (default when linking an executable)">;
+
defm apply_dynamic_relocs: B<"apply-dynamic-relocs",
"Apply link-time values for dynamic relocations",
"Do not apply link-time values for dynamic relocations (default)">;
@@ -492,12 +496,10 @@ def plugin_opt_thinlto: J<"plugin-opt=thinlto">;
def plugin_opt_slash: J<"plugin-opt=/">;
// Options listed below are silently ignored for now for compatibility.
-def: F<"allow-shlib-undefined">;
def: F<"detect-odr-violations">;
def: Flag<["-"], "g">;
def: F<"long-plt">;
def: F<"no-add-needed">;
-def: F<"no-allow-shlib-undefined">;
def: F<"no-copy-dt-needed-entries">;
def: F<"no-ctors-in-init-array">;
def: F<"no-keep-memory">;
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -93,7 +93,7 @@ template <class ELFT> void SymbolTable::addFile(InputF
// .so file
if (auto *F = dyn_cast<SharedFile<ELFT>>(File)) {
// DSOs are uniquified not by filename but by soname.
- F->parseSoName();
+ F->parseDynamic();
if (errorCount())
return;
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.h
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/SymbolTable.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -80,6 +80,9 @@ class SymbolTable { (public)
void handleDynamicList();
+ // Set of .so files to not link the same shared object file more than once.
+ llvm::DenseMap<StringRef, InputFile *> SoNames;
+
private:
std::pair<Symbol *, bool> insertName(StringRef Name);
@@ -106,9 +109,6 @@ class SymbolTable { (public)
// same name, only one of them is linked, and the other is ignored. This set
// is used to uniquify them.
llvm::DenseSet<llvm::CachedHashStringRef> ComdatGroups;
-
- // Set of .so files to not link the same shared object file more than once.
- llvm::DenseMap<StringRef, InputFile *> SoNames;
// A map from demangled symbol names to their symbol objects.
// This mapping is 1:N because two symbols with different versions
Modified: projects/fuse2/contrib/llvm/tools/lld/ELF/Writer.cpp
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/ELF/Writer.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/ELF/Writer.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -1668,6 +1668,27 @@ template <class ELFT> void Writer<ELFT>::finalizeSecti
if (In.Iplt && !In.Iplt->empty())
In.Iplt->addSymbols();
+ if (!Config->AllowShlibUndefined) {
+ // Error on undefined symbols in a shared object, if all of its DT_NEEDED
+ // entires are seen. These cases would otherwise lead to runtime errors
+ // reported by the dynamic linker.
+ //
+ // ld.bfd traces all DT_NEEDED to emulate the logic of the dynamic linker to
+ // catch more cases. That is too much for us. Our approach resembles the one
+ // used in ld.gold, achieves a good balance to be useful but not too smart.
+ for (InputFile *File : SharedFiles) {
+ SharedFile<ELFT> *F = cast<SharedFile<ELFT>>(File);
+ F->AllNeededIsKnown = llvm::all_of(F->DtNeeded, [&](StringRef Needed) {
+ return Symtab->SoNames.count(Needed);
+ });
+ }
+ for (Symbol *Sym : Symtab->getSymbols())
+ if (Sym->isUndefined() && !Sym->isWeak())
+ if (auto *F = dyn_cast_or_null<SharedFile<ELFT>>(Sym->File))
+ if (F->AllNeededIsKnown)
+ error(toString(F) + ": undefined reference to " + toString(*Sym));
+ }
+
// Now that we have defined all possible global symbols including linker-
// synthesized ones. Visit all symbols to give the finishing touches.
for (Symbol *Sym : Symtab->getSymbols()) {
Modified: projects/fuse2/contrib/llvm/tools/lld/docs/ld.lld.1
==============================================================================
--- projects/fuse2/contrib/llvm/tools/lld/docs/ld.lld.1 Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/llvm/tools/lld/docs/ld.lld.1 Wed Mar 20 23:32:37 2019 (r345354)
@@ -56,6 +56,9 @@ option.
.It Fl -allow-multiple-definition
Do not error if a symbol is defined multiple times.
The first definition will be used.
+.It Fl -allow-shlib-undefined
+Allow unresolved references in shared libraries.
+This option is enabled by default when linking a shared library.
.It Fl -apply-dynamic-relocs
Apply link-time values for dynamic relocations.
.It Fl -as-needed
@@ -252,6 +255,9 @@ Set target emulation.
.It Fl -Map Ns = Ns Ar file , Fl M Ar file
Print a link map to
.Ar file .
+.It Fl -no-allow-shlib-undefined
+Do not allow unresolved references in shared libraries.
+This option is enabled by default when linking an executable.
.It Fl -no-as-needed
Always set
.Dv DT_NEEDED
Modified: projects/fuse2/contrib/openmp/runtime/src/kmp.h
==============================================================================
--- projects/fuse2/contrib/openmp/runtime/src/kmp.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/openmp/runtime/src/kmp.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -3666,8 +3666,13 @@ extern int __kmp_read_from_file(char const *path, char
extern void __kmp_query_cpuid(kmp_cpuinfo_t *p);
-#define __kmp_load_mxcsr(p) _mm_setcsr(*(p))
+#if __SSE__
+static inline void __kmp_load_mxcsr(const kmp_uint32 *p) { _mm_setcsr(*(p)); }
static inline void __kmp_store_mxcsr(kmp_uint32 *p) { *p = _mm_getcsr(); }
+#else
+static inline void __kmp_load_mxcsr(const kmp_uint32 *) {}
+static inline void __kmp_store_mxcsr(kmp_uint32 *) {}
+#endif
extern void __kmp_load_x87_fpu_control_word(kmp_int16 *p);
extern void __kmp_store_x87_fpu_control_word(kmp_int16 *p);
Modified: projects/fuse2/contrib/openmp/runtime/src/kmp_runtime.cpp
==============================================================================
--- projects/fuse2/contrib/openmp/runtime/src/kmp_runtime.cpp Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/contrib/openmp/runtime/src/kmp_runtime.cpp Wed Mar 20 23:32:37 2019 (r345354)
@@ -8104,7 +8104,7 @@ __kmp_determine_reduction_method(
#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS
-#if KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_HURD
+#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_HURD
// basic tuning
Modified: projects/fuse2/lib/Makefile
==============================================================================
--- projects/fuse2/lib/Makefile Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/Makefile Wed Mar 20 23:32:37 2019 (r345354)
@@ -196,9 +196,7 @@ _libproc= libproc
_librtld_db= librtld_db
.endif
-.if !defined(COMPAT_32BIT)
SUBDIR.${MK_OPENMP}+= libomp
-.endif
SUBDIR.${MK_OPENSSL}+= libmp
SUBDIR.${MK_PMC}+= libpmc libpmcstat
SUBDIR.${MK_RADIUS_SUPPORT}+= libradius
Modified: projects/fuse2/lib/clang/include/clang/Basic/Version.inc
==============================================================================
--- projects/fuse2/lib/clang/include/clang/Basic/Version.inc Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/clang/include/clang/Basic/Version.inc Wed Mar 20 23:32:37 2019 (r345354)
@@ -8,4 +8,4 @@
#define CLANG_VENDOR "FreeBSD "
-#define SVN_REVISION "356034"
+#define SVN_REVISION "356365"
Modified: projects/fuse2/lib/clang/include/lld/Common/Version.inc
==============================================================================
--- projects/fuse2/lib/clang/include/lld/Common/Version.inc Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/clang/include/lld/Common/Version.inc Wed Mar 20 23:32:37 2019 (r345354)
@@ -7,4 +7,4 @@
#define LLD_REPOSITORY_STRING "FreeBSD"
// <Upstream revision at import>-<Local identifier in __FreeBSD_version style>
-#define LLD_REVISION_STRING "356034-1300002"
+#define LLD_REVISION_STRING "356365-1300003"
Modified: projects/fuse2/lib/clang/include/llvm/Support/VCSRevision.h
==============================================================================
--- projects/fuse2/lib/clang/include/llvm/Support/VCSRevision.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/clang/include/llvm/Support/VCSRevision.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -1,2 +1,2 @@
/* $FreeBSD$ */
-#define LLVM_REVISION "svn-r356034"
+#define LLVM_REVISION "svn-r356365"
Modified: projects/fuse2/lib/libjail/jail.c
==============================================================================
--- projects/fuse2/lib/libjail/jail.c Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/libjail/jail.c Wed Mar 20 23:32:37 2019 (r345354)
@@ -1050,14 +1050,8 @@ kldload_param(const char *name)
kl = kldload(name);
else if (strncmp(name, "allow.mount.", 12) == 0) {
/* Load the matching filesystem */
- const char *modname;
+ const char *modname = name + 12;
- if (strcmp("fusefs", name + 12) == 0 ||
- strcmp("nofusefs", name + 12) == 0) {
- modname = "fuse";
- } else {
- modname = name + 12;
- }
kl = kldload(modname);
if (kl < 0 && errno == ENOENT &&
strncmp(modname, "no", 2) == 0)
Modified: projects/fuse2/lib/libomp/Makefile
==============================================================================
--- projects/fuse2/lib/libomp/Makefile Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/lib/libomp/Makefile Wed Mar 20 23:32:37 2019 (r345354)
@@ -58,7 +58,6 @@ CXXFLAGS+= -fno-exceptions
CXXFLAGS+= -fno-rtti
LDFLAGS+= -Wl,--warn-shared-textrel
-LDFLAGS+= -Wl,--as-needed
LDFLAGS+= -Wl,--gc-sections
LDFLAGS+= -Wl,-z,noexecstack
LDFLAGS+= -Wl,-fini=__kmp_internal_end_fini
@@ -67,5 +66,6 @@ LDFLAGS+= -Wl,-soname,libomp.so
VERSION_MAP= ${OMPSRC}/exports_so.txt
LIBADD+= pthread
+LIBADD+= m
.include <bsd.lib.mk>
Modified: projects/fuse2/release/Makefile.ec2
==============================================================================
--- projects/fuse2/release/Makefile.ec2 Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/release/Makefile.ec2 Wed Mar 20 23:32:37 2019 (r345354)
@@ -42,6 +42,9 @@ PUBLICSNAP= --publicsnap
EC2SNSREL= ${REVISION}-${BRANCH}
EC2SNSVERS= ${EC2_SVNBRANCH}@${EC2_SVNREV}
.endif
+.if ${TARGET_ARCH} != "amd64"
+EC2ARCH= --${TARGET_ARCH:S/aarch64/arm64/}
+.endif
CLEANFILES+= ec2ami
@@ -82,7 +85,8 @@ ec2ami: cw-ec2 ${CW_EC2_PORTINSTALL}
@echo "--------------------------------------------------------------"
@false
.endif
- /usr/local/bin/bsdec2-image-upload ${PUBLISH} ${PUBLICSNAP} --sriov --ena \
+ /usr/local/bin/bsdec2-image-upload ${PUBLISH} ${PUBLICSNAP} \
+ ${EC2ARCH} --sriov --ena \
${.OBJDIR}/ec2.raw \
"${TYPE} ${REVISION}-${BRANCH}-${TARGET}${AMINAMESUFFIX}" \
"${TYPE}/${TARGET} ${EC2_SVNBRANCH}@${EC2_SVNREV}" \
Modified: projects/fuse2/release/tools/ec2.conf
==============================================================================
--- projects/fuse2/release/tools/ec2.conf Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/release/tools/ec2.conf Wed Mar 20 23:32:37 2019 (r345354)
@@ -6,7 +6,15 @@
# Packages to install into the image we're creating. This is a deliberately
# minimalist set, providing only the packages necessary to bootstrap further
# package installation as specified via EC2 user-data.
-export VM_EXTRA_PACKAGES="ec2-scripts firstboot-freebsd-update firstboot-pkgs dual-dhclient amazon-ssm-agent"
+export VM_EXTRA_PACKAGES="ec2-scripts firstboot-freebsd-update firstboot-pkgs dual-dhclient"
+
+# Include the amazon-ssm-agent package in amd64 images, since some users want
+# to be able to use it on systems which are not connected to the Internet.
+# (It is not enabled by default, however.) This package does not exist for
+# aarch64, so we have to be selective about when we install it.
+if [ "${TARGET_ARCH}" = "amd64" ]; then
+ export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} amazon-ssm-agent"
+fi
# Set to a list of third-party software to enable in rc.conf(5).
export VM_RC_LIST="ec2_configinit ec2_fetchkey ec2_loghostkey firstboot_freebsd_update firstboot_pkgs ntpd"
Modified: projects/fuse2/sbin/bectl/bectl_jail.c
==============================================================================
--- projects/fuse2/sbin/bectl/bectl_jail.c Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/sbin/bectl/bectl_jail.c Wed Mar 20 23:32:37 2019 (r345354)
@@ -40,10 +40,10 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <be.h>
-
#include "bectl.h"
-static void jailparam_grow(void);
+#define MNTTYPE_ZFS 222
+
static void jailparam_add(const char *name, const char *val);
static int jailparam_del(const char *name);
static bool jailparam_addarg(char *arg);
@@ -51,84 +51,28 @@ static int jailparam_delarg(char *arg);
static int bectl_search_jail_paths(const char *mnt);
static int bectl_locate_jail(const char *ident);
+static int bectl_jail_cleanup(char *mountpoint, int jid);
-/* We'll start with 8 parameters initially and grow as needed. */
-#define INIT_PARAMCOUNT 8
-
-static struct jailparam *jp;
-static int jpcnt;
-static int jpused;
static char mnt_loc[BE_MAXPATHLEN];
+static nvlist_t *jailparams;
-static void
-jailparam_grow(void)
-{
+static const char *disabled_params[] = {
+ "command", "exec.start", "nopersist", "persist", NULL
+};
- jpcnt *= 2;
- jp = realloc(jp, jpcnt * sizeof(*jp));
- if (jp == NULL)
- err(2, "realloc");
-}
static void
jailparam_add(const char *name, const char *val)
{
- int i;
- for (i = 0; i < jpused; ++i) {
- if (strcmp(name, jp[i].jp_name) == 0)
- break;
- }
-
- if (i < jpused)
- jailparam_free(&jp[i], 1);
- else if (jpused == jpcnt)
- /* The next slot isn't allocated yet */
- jailparam_grow();
-
- if (jailparam_init(&jp[i], name) != 0)
- return;
- if (jailparam_import(&jp[i], val) != 0)
- return;
- ++jpused;
+ nvlist_add_string(jailparams, name, val);
}
static int
jailparam_del(const char *name)
{
- int i;
- char *val;
- for (i = 0; i < jpused; ++i) {
- if (strcmp(name, jp[i].jp_name) == 0)
- break;
- }
-
- if (i == jpused)
- return (ENOENT);
-
- for (; i < jpused - 1; ++i) {
- val = jailparam_export(&jp[i + 1]);
-
- jailparam_free(&jp[i], 1);
- /*
- * Given the context, the following will really only fail if
- * they can't allocate the copy of the name or value.
- */
- if (jailparam_init(&jp[i], jp[i + 1].jp_name) != 0) {
- free(val);
- return (ENOMEM);
- }
- if (jailparam_import(&jp[i], val) != 0) {
- jailparam_free(&jp[i], 1);
- free(val);
- return (ENOMEM);
- }
- free(val);
- }
-
- jailparam_free(&jp[i], 1);
- --jpused;
+ nvlist_remove_all(jailparams, name);
return (0);
}
@@ -136,6 +80,7 @@ static bool
jailparam_addarg(char *arg)
{
char *name, *val;
+ size_t i, len;
if (arg == NULL)
return (false);
@@ -156,6 +101,15 @@ jailparam_addarg(char *arg)
}
strlcpy(mnt_loc, val, sizeof(mnt_loc));
}
+
+ for (i = 0; disabled_params[i] != NULL; i++) {
+ len = strlen(disabled_params[i]);
+ if (strncmp(disabled_params[i], name, len) == 0) {
+ fprintf(stderr, "invalid jail parameter: %s\n", name);
+ return (false);
+ }
+ }
+
jailparam_add(name, val);
return (true);
}
@@ -176,22 +130,128 @@ jailparam_delarg(char *arg)
return (jailparam_del(name));
}
+static int
+build_jailcmd(char ***argvp, bool interactive, int argc, char *argv[])
+{
+ char *cmd, **jargv, *name, *val;
+ nvpair_t *nvp;
+ size_t i, iarg, nargv;
+
+ cmd = NULL;
+ nvp = NULL;
+ iarg = i = 0;
+ if (nvlist_size(jailparams, &nargv, NV_ENCODE_NATIVE) != 0)
+ return (1);
+
+ /*
+ * Number of args + "/usr/sbin/jail", "-c", and ending NULL.
+ * If interactive also include command.
+ */
+ nargv += 3;
+ if (interactive) {
+ if (argc == 0)
+ nargv++;
+ else
+ nargv += argc;
+ }
+
+ jargv = *argvp = calloc(nargv, sizeof(jargv));
+ if (jargv == NULL)
+ err(2, "calloc");
+
+ jargv[iarg++] = strdup("/usr/sbin/jail");
+ jargv[iarg++] = strdup("-c");
+ while ((nvp = nvlist_next_nvpair(jailparams, nvp)) != NULL) {
+ name = nvpair_name(nvp);
+ if (nvpair_value_string(nvp, &val) != 0)
+ continue;
+
+ if (asprintf(&jargv[iarg++], "%s=%s", name, val) < 0)
+ goto error;
+ }
+ if (interactive) {
+ if (argc < 1)
+ cmd = strdup("/bin/sh");
+ else {
+ cmd = argv[0];
+ argc--;
+ argv++;
+ }
+
+ if (asprintf(&jargv[iarg++], "command=%s", cmd) < 0) {
+ goto error;
+ }
+ if (argc < 1) {
+ free(cmd);
+ cmd = NULL;
+ }
+
+ for (; argc > 0; argc--) {
+ if (asprintf(&jargv[iarg++], "%s", argv[0]) < 0)
+ goto error;
+ argv++;
+ }
+ }
+
+ return (0);
+
+error:
+ if (interactive && argc < 1)
+ free(cmd);
+ for (; i < iarg - 1; i++) {
+ free(jargv[i]);
+ }
+ free(jargv);
+ return (1);
+}
+
+/* Remove jail and cleanup any non zfs mounts. */
+static int
+bectl_jail_cleanup(char *mountpoint, int jid)
+{
+ struct statfs *mntbuf;
+ size_t i, searchlen, mntsize;
+
+ if (jid >= 0 && jail_remove(jid) != 0) {
+ fprintf(stderr, "unable to remove jail");
+ return (1);
+ }
+
+ searchlen = strnlen(mountpoint, MAXPATHLEN);
+ mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
+ for (i = 0; i < mntsize; i++) {
+ if (strncmp(mountpoint, mntbuf[i].f_mntonname, searchlen) == 0 &&
+ mntbuf[i].f_type != MNTTYPE_ZFS) {
+
+ if (unmount(mntbuf[i].f_mntonname, 0) != 0) {
+ fprintf(stderr, "bectl jail: unable to unmount filesystem %s",
+ mntbuf[i].f_mntonname);
+ return (1);
+ }
+ }
+ }
+
+ return (0);
+}
+
int
bectl_cmd_jail(int argc, char *argv[])
{
- char *bootenv, *mountpoint;
- int jid, mntflags, opt, ret;
+ char *bootenv, **jargv, *mountpoint;
+ int i, jid, mntflags, opt, ret;
bool default_hostname, interactive, unjail;
pid_t pid;
+
/* XXX TODO: Allow shallow */
mntflags = BE_MNT_DEEP;
default_hostname = interactive = unjail = true;
- jpcnt = INIT_PARAMCOUNT;
- jp = malloc(jpcnt * sizeof(*jp));
- if (jp == NULL)
- err(2, "malloc");
+ if ((nvlist_alloc(&jailparams, NV_UNIQUE_NAME, 0)) != 0) {
+ fprintf(stderr, "nvlist_alloc() failed\n");
+ return (1);
+ }
+
jailparam_add("persist", "true");
jailparam_add("allow.mount", "true");
jailparam_add("allow.mount.devfs", "true");
@@ -210,6 +270,8 @@ bectl_cmd_jail(int argc, char *argv[])
*/
if (strcmp(optarg, "host.hostname") == 0)
default_hostname = false;
+ } else {
+ return (1);
}
break;
case 'U':
@@ -236,13 +298,14 @@ bectl_cmd_jail(int argc, char *argv[])
argc -= optind;
argv += optind;
- /* struct jail be_jail = { 0 }; */
if (argc < 1) {
fprintf(stderr, "bectl jail: missing boot environment name\n");
return (usage(false));
}
bootenv = argv[0];
+ argc--;
+ argv++;
/*
* XXX TODO: if its already mounted, perhaps there should be a flag to
@@ -264,45 +327,46 @@ bectl_cmd_jail(int argc, char *argv[])
* This is our indicator that path was not set by the user, so we'll use
* the path that libbe generated for us.
*/
- if (mountpoint == NULL)
+ if (mountpoint == NULL) {
jailparam_add("path", mnt_loc);
- /* Create the jail for now, attach later as-needed */
- jid = jailparam_set(jp, jpused, JAIL_CREATE);
- if (jid == -1) {
- fprintf(stderr, "unable to create jail. error: %d\n", errno);
+ mountpoint = mnt_loc;
+ }
+
+ if ((build_jailcmd(&jargv, interactive, argc, argv)) != 0) {
+ fprintf(stderr, "unable to build argument list for jail command\n");
return (1);
}
- jailparam_free(jp, jpused);
- free(jp);
-
- /* We're not interactive, nothing more to do here. */
- if (!interactive)
- return (0);
-
pid = fork();
- switch(pid) {
+
+ switch (pid) {
case -1:
perror("fork");
return (1);
case 0:
- jail_attach(jid);
- /* We're attached within the jail... good bye! */
- chdir("/");
- if (argc > 1)
- execve(argv[1], &argv[1], NULL);
- else
- execl("/bin/sh", "/bin/sh", NULL);
- fprintf(stderr, "bectl jail: failed to execute %s\n",
- (argc > 1 ? argv[1] : "/bin/sh"));
- _exit(1);
+ execv("/usr/sbin/jail", jargv);
+ fprintf(stderr, "bectl jail: failed to execute\n");
default:
- /* Wait for the child to get back, see if we need to unjail */
waitpid(pid, NULL, 0);
}
+ for (i = 0; jargv[i] != NULL; i++) {
+ free(jargv[i]);
+ }
+ free(jargv);
+
+ if (!interactive)
+ return (0);
+
if (unjail) {
- jail_remove(jid);
+ /*
+ * We're not checking the jail id result here because in the
+ * case of invalid param, or last command in jail was an error
+ * the jail will not exist upon exit. bectl_jail_cleanup will
+ * only jail_remove if the jid is >= 0.
+ */
+ jid = bectl_locate_jail(bootenv);
+ bectl_jail_cleanup(mountpoint, jid);
be_unmount(be, bootenv, 0);
}
@@ -319,7 +383,6 @@ bectl_search_jail_paths(const char *mnt)
/* jail_getv expects name/value strings */
snprintf(lastjid, sizeof(lastjid), "%d", 0);
- jid = 0;
while ((jid = jail_getv(0, "lastjid", lastjid, "path", &jailpath,
NULL)) != -1) {
@@ -416,7 +479,7 @@ bectl_cmd_unjail(int argc, char *argv[])
return (1);
}
- jail_remove(jid);
+ bectl_jail_cleanup(path, jid);
be_unmount(be, target, 0);
return (0);
Modified: projects/fuse2/sbin/ipfw/ipfw.8
==============================================================================
--- projects/fuse2/sbin/ipfw/ipfw.8 Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/sbin/ipfw/ipfw.8 Wed Mar 20 23:32:37 2019 (r345354)
@@ -1,7 +1,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 18, 2019
+.Dd March 19, 2019
.Dt IPFW 8
.Os
.Sh NAME
@@ -3300,6 +3300,7 @@ See
.Sx SYSCTL VARIABLES
for more info.
.Sh IPv6/IPv4 NETWORK ADDRESS AND PROTOCOL TRANSLATION
+.Ss Stateful translation
.Nm
supports in-kernel IPv6/IPv4 network address and protocol translation.
Stateful NAT64 translation allows IPv6-only clients to contact IPv4 servers
@@ -3317,7 +3318,8 @@ to be able use stateful NAT64 translator.
Stateful NAT64 uses a bunch of memory for several types of objects.
When IPv6 client initiates connection, NAT64 translator creates a host entry
in the states table.
-Each host entry has a number of ports group entries allocated on demand.
+Each host entry uses preallocated IPv4 alias entry.
+Each alias entry has a number of ports group entries allocated on demand.
Ports group entries contains connection state entries.
There are several options to control limits and lifetime for these objects.
.Pp
@@ -3337,6 +3339,11 @@ First time an original packet is handled and consumed
and then it is handled again as translated packet.
This behavior can be changed by sysctl variable
.Va net.inet.ip.fw.nat64_direct_output .
+Also translated packet can be tagged using
+.Cm tag
+rule action, and then matched by
+.Cm tagged
+opcode to avoid loops and extra overhead.
.Pp
The stateful NAT64 configuration command is the following:
.Bd -ragged -offset indent
@@ -3364,15 +3371,16 @@ to represent IPv4 addresses. This IPv6 prefix should b
The translator implementation follows RFC6052, that restricts the length of
prefixes to one of following: 32, 40, 48, 56, 64, or 96.
The Well-Known IPv6 Prefix 64:ff9b:: must be 96 bits long.
-.It Cm max_ports Ar number
-Maximum number of ports reserved for upper level protocols to one IPv6 client.
-All reserved ports are divided into chunks between supported protocols.
-The number of connections from one IPv6 client is limited by this option.
-Note that closed TCP connections still remain in the list of connections until
-.Cm tcp_close_age
-interval will not expire.
-Default value is
-.Ar 2048 .
+The special
+.Ar ::/length
+prefix can be used to handle several IPv6 prefixes with one NAT64 instance.
+The NAT64 instance will determine a destination IPv4 address from prefix
+.Ar length .
+.It Cm states_chunks Ar number
+The number of states chunks in single ports group.
+Each ports group by default can keep 64 state entries in single chunk.
+The above value affects the maximum number of states that can be associated with single IPv4 alias address and port.
+The value must be power of 2, and up to 128.
.It Cm host_del_age Ar seconds
The number of seconds until the host entry for a IPv6 client will be deleted
and all its resources will be released due to inactivity.
Modified: projects/fuse2/sbin/ipfw/ipfw2.h
==============================================================================
--- projects/fuse2/sbin/ipfw/ipfw2.h Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/sbin/ipfw/ipfw2.h Wed Mar 20 23:32:37 2019 (r345354)
@@ -278,6 +278,7 @@ enum tokens {
TOK_AGG_LEN,
TOK_AGG_COUNT,
TOK_MAX_PORTS,
+ TOK_STATES_CHUNKS,
TOK_JMAXLEN,
TOK_PORT_RANGE,
TOK_HOST_DEL_AGE,
Modified: projects/fuse2/sbin/ipfw/nat64lsn.c
==============================================================================
--- projects/fuse2/sbin/ipfw/nat64lsn.c Wed Mar 20 23:15:58 2019 (r345353)
+++ projects/fuse2/sbin/ipfw/nat64lsn.c Wed Mar 20 23:32:37 2019 (r345354)
@@ -87,68 +87,70 @@ nat64lsn_print_states(void *buf)
char sflags[4], *sf, *proto;
ipfw_obj_header *oh;
ipfw_obj_data *od;
- ipfw_nat64lsn_stg *stg;
- ipfw_nat64lsn_state *ste;
+ ipfw_nat64lsn_stg_v1 *stg;
+ ipfw_nat64lsn_state_v1 *ste;
uint64_t next_idx;
int i, sz;
oh = (ipfw_obj_header *)buf;
od = (ipfw_obj_data *)(oh + 1);
- stg = (ipfw_nat64lsn_stg *)(od + 1);
+ stg = (ipfw_nat64lsn_stg_v1 *)(od + 1);
sz = od->head.length - sizeof(*od);
next_idx = 0;
while (sz > 0 && next_idx != 0xFF) {
- next_idx = stg->next_idx;
+ next_idx = stg->next.index;
sz -= sizeof(*stg);
if (stg->count == 0) {
stg++;
continue;
}
- switch (stg->proto) {
- case IPPROTO_TCP:
- proto = "TCP";
- break;
- case IPPROTO_UDP:
- proto = "UDP";
- break;
- case IPPROTO_ICMPV6:
- proto = "ICMPv6";
- break;
- }
- inet_ntop(AF_INET6, &stg->host6, s, sizeof(s));
+ /*
+ * NOTE: addresses are in network byte order,
+ * ports are in host byte order.
+ */
inet_ntop(AF_INET, &stg->alias4, a, sizeof(a));
- ste = (ipfw_nat64lsn_state *)(stg + 1);
+ ste = (ipfw_nat64lsn_state_v1 *)(stg + 1);
for (i = 0; i < stg->count && sz > 0; i++) {
sf = sflags;
+ inet_ntop(AF_INET6, &ste->host6, s, sizeof(s));
inet_ntop(AF_INET, &ste->daddr, f, sizeof(f));
- if (stg->proto == IPPROTO_TCP) {
+ switch (ste->proto) {
+ case IPPROTO_TCP:
+ proto = "TCP";
if (ste->flags & 0x02)
*sf++ = 'S';
if (ste->flags & 0x04)
*sf++ = 'E';
if (ste->flags & 0x01)
*sf++ = 'F';
+ break;
+ case IPPROTO_UDP:
+ proto = "UDP";
+ break;
+ case IPPROTO_ICMP:
+ proto = "ICMPv6";
+ break;
}
*sf = '\0';
- switch (stg->proto) {
+ switch (ste->proto) {
case IPPROTO_TCP:
case IPPROTO_UDP:
printf("%s:%d\t%s:%d\t%s\t%s\t%d\t%s:%d\n",
s, ste->sport, a, ste->aport, proto,
sflags, ste->idle, f, ste->dport);
break;
- case IPPROTO_ICMPV6:
+ case IPPROTO_ICMP:
printf("%s\t%s\t%s\t\t%d\t%s\n",
s, a, proto, ste->idle, f);
break;
default:
printf("%s\t%s\t%d\t\t%d\t%s\n",
- s, a, stg->proto, ste->idle, f);
+ s, a, ste->proto, ste->idle, f);
}
ste++;
sz -= sizeof(*ste);
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list