64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								{ config, lib, pkgs, ... }:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								with lib;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let
							 | 
						||
| 
								 | 
							
								  cfg = config.networking.rxe;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  runRxeCmd = cmd: ifcs:
							 | 
						||
| 
								 | 
							
								    concatStrings ( map (x: "${pkgs.rdma-core}/bin/rxe_cfg -n ${cmd} ${x};") ifcs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  startScript = pkgs.writeShellScriptBin "rxe-start" ''
							 | 
						||
| 
								 | 
							
								    ${pkgs.rdma-core}/bin/rxe_cfg -n start
							 | 
						||
| 
								 | 
							
								    ${runRxeCmd "add" cfg.interfaces}
							 | 
						||
| 
								 | 
							
								    ${pkgs.rdma-core}/bin/rxe_cfg
							 | 
						||
| 
								 | 
							
								  '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  stopScript = pkgs.writeShellScriptBin "rxe-stop" ''
							 | 
						||
| 
								 | 
							
								    ${runRxeCmd "remove" cfg.interfaces }
							 | 
						||
| 
								 | 
							
								    ${pkgs.rdma-core}/bin/rxe_cfg -n stop
							 | 
						||
| 
								 | 
							
								  '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								in {
							 | 
						||
| 
								 | 
							
								  ###### interface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  options = {
							 | 
						||
| 
								 | 
							
								    networking.rxe = {
							 | 
						||
| 
								 | 
							
								      enable = mkEnableOption "RDMA over converged ethernet";
							 | 
						||
| 
								 | 
							
								      interfaces = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.listOf types.str;
							 | 
						||
| 
								 | 
							
								        default = [ ];
							 | 
						||
| 
								 | 
							
								        example = [ "eth0" ];
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Enable RDMA on the listed interfaces. The corresponding virtual
							 | 
						||
| 
								 | 
							
								          RDMA interfaces will be named rxe0 ... rxeN where the ordering
							 | 
						||
| 
								 | 
							
								          will be as they are named in the list. UDP port 4791 must be
							 | 
						||
| 
								 | 
							
								          open on the respective ethernet interfaces.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ###### implementation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  config = mkIf cfg.enable {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    systemd.services.rxe = {
							 | 
						||
| 
								 | 
							
								      path = with pkgs; [ kmod rdma-core ];
							 | 
						||
| 
								 | 
							
								      description = "RoCE interfaces";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      wantedBy = [ "multi-user.target" ];
							 | 
						||
| 
								 | 
							
								      after = [ "systemd-modules-load.service" "network-online.target" ];
							 | 
						||
| 
								 | 
							
								      wants = [ "network-pre.target" ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      serviceConfig = {
							 | 
						||
| 
								 | 
							
								        Type = "oneshot";
							 | 
						||
| 
								 | 
							
								        RemainAfterExit = true;
							 | 
						||
| 
								 | 
							
								        ExecStart = "${startScript}/bin/rxe-start";
							 | 
						||
| 
								 | 
							
								        ExecStop = "${stopScript}/bin/rxe-stop";
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |