{
  version,
  hash,
  updateScriptArgs ? "",
}:

{
  lib,
  stdenv,
  fetchurl,
  autoconf,
  automake,
  installShellFiles,
  iproute2,
  kernel ? null,
  libcap_ng,
  libtool,
  openssl,
  perl,
  pkg-config,
  procps,
  python3,
  tcpdump,
  sphinxHook,
  util-linux,
  which,
  writeScript,
  makeWrapper,
  withDPDK ? false,
  dpdk,
  numactl,
  libpcap,
}:

let
  _kernel = kernel;
in
stdenv.mkDerivation rec {
  pname = if withDPDK then "openvswitch-dpdk" else "openvswitch";
  inherit version;

  kernel = lib.optional (_kernel != null) _kernel.dev;

  src = fetchurl {
    url = "https://www.openvswitch.org/releases/openvswitch-${version}.tar.gz";
    inherit hash;
  };

  outputs = [
    "out"
    "man"
  ];

  patches = [
    # 8: vsctl-bashcomp - argument completion FAILED (completion.at:664)
    ./patches/disable-bash-arg-completion-test.patch

    # https://github.com/openvswitch/ovs/commit/9185793e75435d890f18d391eaaeab0ade6f1415
    ./patches/fix-python313.patch
  ];

  nativeBuildInputs = [
    autoconf
    automake
    installShellFiles
    libtool
    pkg-config
    sphinxHook
    makeWrapper
  ];

  sphinxBuilders = [ "man" ];

  sphinxRoot = "./Documentation";

  buildInputs =
    [
      libcap_ng
      openssl
      perl
      procps
      python3
      util-linux
      which
    ]
    ++ (lib.optionals withDPDK [
      dpdk
      numactl
      libpcap
    ]);

  preConfigure = "./boot.sh";

  configureFlags =
    [
      "--localstatedir=/var"
      "--sharedstatedir=/var"
      "--sbindir=$(out)/bin"
    ]
    ++ (lib.optionals (_kernel != null) [ "--with-linux" ])
    ++ (lib.optionals withDPDK [ "--with-dpdk=shared" ]);

  # Leave /var out of this!
  installFlags = [
    "LOGDIR=$(TMPDIR)/dummy"
    "RUNDIR=$(TMPDIR)/dummy"
    "PKIDIR=$(TMPDIR)/dummy"
  ];

  enableParallelBuilding = true;

  postInstall = ''
    installShellCompletion --bash utilities/ovs-appctl-bashcomp.bash
    installShellCompletion --bash utilities/ovs-vsctl-bashcomp.bash

    wrapProgram $out/bin/ovs-l3ping \
      --prefix PYTHONPATH : $out/share/openvswitch/python

    wrapProgram $out/bin/ovs-tcpdump \
      --prefix PATH : ${lib.makeBinPath [ tcpdump ]} \
      --prefix PYTHONPATH : $out/share/openvswitch/python
  '';

  doCheck = true;
  preCheck = ''
    export TESTSUITEFLAGS="-j$NIX_BUILD_CORES"
    export RECHECK=yes

    patchShebangs tests/
  '';

  nativeCheckInputs =
    [ iproute2 ]
    ++ (with python3.pkgs; [
      netaddr
      pyparsing
      pytest
      setuptools
    ]);

  passthru.updateScript = writeScript "ovs-update.nu" ''
    ${./update.nu} ${updateScriptArgs}
  '';

  meta = with lib; {
    changelog = "https://www.openvswitch.org/releases/NEWS-${version}.txt";
    description = "Multilayer virtual switch";
    longDescription = ''
      Open vSwitch is a production quality, multilayer virtual switch
      licensed under the open source Apache 2.0 license. It is
      designed to enable massive network automation through
      programmatic extension, while still supporting standard
      management interfaces and protocols (e.g. NetFlow, sFlow, SPAN,
      RSPAN, CLI, LACP, 802.1ag). In addition, it is designed to
      support distribution across multiple physical servers similar
      to VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V.
    '';
    homepage = "https://www.openvswitch.org/";
    license = licenses.asl20;
    maintainers = with maintainers; [
      adamcstephens
      kmcopper
      netixx
      xddxdd
    ];
    platforms = platforms.linux;
  };
}
