about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/frr
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/frr')
-rw-r--r--nixpkgs/pkgs/servers/frr/clippy-helper.nix59
-rw-r--r--nixpkgs/pkgs/servers/frr/default.nix246
2 files changed, 305 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/frr/clippy-helper.nix b/nixpkgs/pkgs/servers/frr/clippy-helper.nix
new file mode 100644
index 000000000000..bb5887bda0f3
--- /dev/null
+++ b/nixpkgs/pkgs/servers/frr/clippy-helper.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, frrSource
+, frrVersion
+
+  # build time
+, autoreconfHook
+, flex
+, bison
+, pkg-config
+, libelf
+, perl
+, python3
+
+}:
+
+stdenv.mkDerivation rec {
+  pname = "frr-clippy-helper";
+  version = frrVersion;
+
+  src = frrSource;
+
+  nativeBuildInputs = [
+    autoreconfHook
+    bison
+    flex
+    perl
+    pkg-config
+  ];
+
+  buildInputs = [
+    libelf
+    python3
+  ];
+
+  configureFlags = [
+    "--enable-clippy-only"
+  ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp lib/clippy $out/bin
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://frrouting.org/";
+    description = "FRR routing daemon suite: CLI helper tool clippy";
+    longDescription = ''
+      This small tool is used to support generating CLI code for FRR. It is split out here,
+      to support cross-compiling, because it needs to be compiled with the build system toolchain
+      and not the target host one.
+    '';
+    license = with licenses; [ gpl2Plus lgpl21Plus ];
+    maintainers = with maintainers; [ thillux ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/frr/default.nix b/nixpkgs/pkgs/servers/frr/default.nix
new file mode 100644
index 000000000000..d588fee00483
--- /dev/null
+++ b/nixpkgs/pkgs/servers/frr/default.nix
@@ -0,0 +1,246 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+
+# build time
+, autoreconfHook
+, flex
+, bison
+, perl
+, pkg-config
+, texinfo
+, buildPackages
+
+# runtime
+, c-ares
+, json_c
+, libcap
+, libelf
+, libunwind
+, libyang
+, net-snmp
+, openssl
+, pam
+, pcre2
+, python3
+, readline
+, rtrlib
+, protobufc
+
+# tests
+, nettools
+, nixosTests
+
+# FRR's configure.ac gets SNMP options by executing net-snmp-config on the build host
+# This leads to compilation errors when cross compiling.
+# E.g. net-snmp-config for x86_64 does not return the ARM64 paths.
+#
+#   SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
+#   SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
+, snmpSupport ? stdenv.buildPlatform.canExecute stdenv.hostPlatform
+
+# other general options besides snmp support
+, rpkiSupport ? true
+, numMultipath ? 64
+, watchfrrSupport ? true
+, cumulusSupport ? false
+, datacenterSupport ? true
+, rtadvSupport ? true
+, irdpSupport ? true
+, routeReplacementSupport ? true
+, mgmtdSupport ? true
+
+# routing daemon options
+, bgpdSupport ? true
+, ripdSupport ? true
+, ripngdSupport ? true
+, ospfdSupport ? true
+, ospf6dSupport ? true
+, ldpdSupport ? true
+, nhrpdSupport ? true
+, eigrpdSupport ? true
+, babeldSupport ? true
+, isisdSupport ? true
+, pimdSupport ? true
+, pim6dSupport ? true
+, sharpdSupport ? true
+, fabricdSupport ? true
+, vrrpdSupport ? true
+, pathdSupport ? true
+, bfddSupport ? true
+, pbrdSupport ? true
+, staticdSupport ? true
+
+# BGP options
+, bgpAnnounce ? true
+, bgpBmp ? true
+, bgpVnc ? true
+
+# OSPF options
+, ospfApi ? true
+}:
+
+lib.warnIf (!(stdenv.buildPlatform.canExecute stdenv.hostPlatform))
+  "cannot enable SNMP support due to cross-compilation issues with net-snmp-config"
+
+stdenv.mkDerivation rec {
+  pname = "frr";
+  version = "9.1";
+
+  src = fetchFromGitHub {
+    owner = "FRRouting";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-oDPr51vI+tlT1IiUPufmZh/UE0TNKWrn4RqpnGoGxNo=";
+  };
+
+  patches = [
+    # fixes crash in OSPF TE parsing
+    (fetchpatch {
+      name = "CVE-2024-27913.patch";
+      url = "https://github.com/FRRouting/frr/commit/541503eecd302d2cc8456167d130014cd2cf1134.patch";
+      hash = "sha256-7NxPlQK/6lbLs/NqNi4OZ2uBWfXw99SiXDR6okNvJlg=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    bison
+    flex
+    perl
+    pkg-config
+    python3.pkgs.sphinx
+    texinfo
+    protobufc
+  ];
+
+  buildInputs = [
+    c-ares
+    json_c
+    libelf
+    libunwind
+    libyang
+    openssl
+    pam
+    pcre2
+    python3
+    readline
+    rtrlib
+    protobufc
+  ] ++ lib.optionals stdenv.isLinux [
+    libcap
+  ] ++ lib.optionals snmpSupport [
+    net-snmp
+  ];
+
+  # otherwise in cross-compilation: "configure: error: no working python version found"
+  depsBuildBuild = [
+    buildPackages.python3
+  ];
+
+  # cross-compiling: clippy is compiled with the build host toolchain, split it out to ease
+  # navigation in dependency hell
+  clippy-helper = buildPackages.callPackage ./clippy-helper.nix { frrVersion = version; frrSource = src; };
+
+  configureFlags = [
+    "--disable-silent-rules"
+    "--disable-exampledir"
+    "--enable-configfile-mask=0640"
+    "--enable-group=frr"
+    "--enable-logfile-mask=0640"
+    "--enable-multipath=${toString numMultipath}"
+    "--enable-user=frr"
+    "--enable-vty-group=frrvty"
+    "--localstatedir=/run/frr"
+    "--sbindir=$(out)/libexec/frr"
+    "--sysconfdir=/etc/frr"
+    "--with-clippy=${clippy-helper}/bin/clippy"
+    # general options
+    (lib.strings.enableFeature snmpSupport "snmp")
+    (lib.strings.enableFeature rpkiSupport "rpki")
+    (lib.strings.enableFeature watchfrrSupport "watchfrr")
+    (lib.strings.enableFeature rtadvSupport "rtadv")
+    (lib.strings.enableFeature irdpSupport "irdp")
+    (lib.strings.enableFeature routeReplacementSupport "rr-semantics")
+    (lib.strings.enableFeature mgmtdSupport "mgmtd")
+
+    # routing protocols
+    (lib.strings.enableFeature bgpdSupport "bgpd")
+    (lib.strings.enableFeature ripdSupport "ripd")
+    (lib.strings.enableFeature ripngdSupport "ripngd")
+    (lib.strings.enableFeature ospfdSupport "ospfd")
+    (lib.strings.enableFeature ospf6dSupport "ospf6d")
+    (lib.strings.enableFeature ldpdSupport "ldpd")
+    (lib.strings.enableFeature nhrpdSupport "nhrpd")
+    (lib.strings.enableFeature eigrpdSupport "eigrpd")
+    (lib.strings.enableFeature babeldSupport "babeld")
+    (lib.strings.enableFeature isisdSupport "isisd")
+    (lib.strings.enableFeature pimdSupport "pimd")
+    (lib.strings.enableFeature pim6dSupport "pim6d")
+    (lib.strings.enableFeature sharpdSupport "sharpd")
+    (lib.strings.enableFeature fabricdSupport "fabricd")
+    (lib.strings.enableFeature vrrpdSupport "vrrpd")
+    (lib.strings.enableFeature pathdSupport "pathd")
+    (lib.strings.enableFeature bfddSupport "bfdd")
+    (lib.strings.enableFeature pbrdSupport "pbrd")
+    (lib.strings.enableFeature staticdSupport "staticd")
+    # BGP options
+    (lib.strings.enableFeature bgpAnnounce "bgp-announce")
+    (lib.strings.enableFeature bgpBmp "bgp-bmp")
+    (lib.strings.enableFeature bgpVnc "bgp-vnc")
+    # OSPF options
+    (lib.strings.enableFeature ospfApi "ospfapi")
+    # Cumulus options
+    (lib.strings.enableFeature cumulusSupport "cumulus")
+    # Datacenter options
+    (lib.strings.enableFeature datacenterSupport "datacenter")
+  ];
+
+  postPatch = ''
+    substituteInPlace tools/frr-reload \
+      --replace /usr/lib/frr/ $out/libexec/frr/
+  '';
+
+  doCheck = true;
+
+  nativeCheckInputs = [
+    nettools
+    python3.pkgs.pytest
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://frrouting.org/";
+    description = "FRR BGP/OSPF/ISIS/RIP/RIPNG routing daemon suite";
+    longDescription = ''
+      FRRouting (FRR) is a free and open source Internet routing protocol suite
+      for Linux and Unix platforms. It implements BGP, OSPF, RIP, IS-IS, PIM,
+      LDP, BFD, Babel, PBR, OpenFabric and VRRP, with alpha support for EIGRP
+      and NHRP.
+
+      FRR’s seamless integration with native Linux/Unix IP networking stacks
+      makes it a general purpose routing stack applicable to a wide variety of
+      use cases including connecting hosts/VMs/containers to the network,
+      advertising network services, LAN switching and routing, Internet access
+      routers, and Internet peering.
+
+      FRR has its roots in the Quagga project. In fact, it was started by many
+      long-time Quagga developers who combined their efforts to improve on
+      Quagga’s well-established foundation in order to create the best routing
+      protocol stack available. We invite you to participate in the FRRouting
+      community and help shape the future of networking.
+
+      Join the ranks of network architects using FRR for ISPs, SaaS
+      infrastructure, web 2.0 businesses, hyperscale services, and Fortune 500
+      private clouds.
+    '';
+    license = with licenses; [ gpl2Plus lgpl21Plus ];
+    maintainers = with maintainers; [ woffs thillux ];
+    # adapt to platforms stated in http://docs.frrouting.org/en/latest/overview.html#supported-platforms
+    platforms = (platforms.linux ++ platforms.freebsd ++ platforms.netbsd ++ platforms.openbsd);
+  };
+
+  passthru.tests = { inherit (nixosTests) frr; };
+}