forked from DGNum/liminix
make a module for vlan
Acked-by: Daniel Barlow <<dan@telent.net>>
This commit is contained in:
parent
efa1919e04
commit
333327be75
5 changed files with 90 additions and 51 deletions
|
@ -115,6 +115,7 @@
|
||||||
NET_RALINK_MDIO = "y";
|
NET_RALINK_MDIO = "y";
|
||||||
NET_RALINK_MDIO_MT7620 = "y";
|
NET_RALINK_MDIO_MT7620 = "y";
|
||||||
NET_RALINK_MT7620 = "y";
|
NET_RALINK_MT7620 = "y";
|
||||||
|
SWPHY = "y";
|
||||||
|
|
||||||
SPI = "y";
|
SPI = "y";
|
||||||
MTD_SPI_NOR = "y";
|
MTD_SPI_NOR = "y";
|
||||||
|
@ -123,14 +124,6 @@
|
||||||
SPI_MASTER= "y";
|
SPI_MASTER= "y";
|
||||||
SPI_MEM= "y";
|
SPI_MEM= "y";
|
||||||
|
|
||||||
# both the ethernet ports on this device (lan and wan)
|
|
||||||
# are behind a switch, so we need VLANs to do anything
|
|
||||||
# useful with them
|
|
||||||
|
|
||||||
VLAN_8021Q = "y";
|
|
||||||
SWCONFIG = "y";
|
|
||||||
SWPHY = "y";
|
|
||||||
|
|
||||||
MTD = "y";
|
MTD = "y";
|
||||||
MTD_CMDLINE_PARTS = "y";
|
MTD_CMDLINE_PARTS = "y";
|
||||||
MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs
|
MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs
|
||||||
|
|
|
@ -52,44 +52,40 @@
|
||||||
"${openwrt.src}/target/linux/ramips/dts"
|
"${openwrt.src}/target/linux/ramips/dts"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
networkInterfaces = rec {
|
networkInterfaces =
|
||||||
# lan and wan ports are both behind a switch on eth0
|
let
|
||||||
eth =
|
inherit (config.system.service.network) link;
|
||||||
let swconfig = oneshot {
|
inherit (config.system.service) vlan;
|
||||||
name = "swconfig";
|
swconfig = oneshot {
|
||||||
up = ''
|
name = "swconfig";
|
||||||
PATH=${pkgs.swconfig}/bin:$PATH
|
up = ''
|
||||||
swconfig dev switch0 set reset
|
PATH=${pkgs.swconfig}/bin:$PATH
|
||||||
swconfig dev switch0 set enable_vlan 1
|
swconfig dev switch0 set reset
|
||||||
swconfig dev switch0 vlan 1 set ports '1 2 3 4 6t'
|
swconfig dev switch0 set enable_vlan 1
|
||||||
swconfig dev switch0 vlan 2 set ports '0 6t'
|
swconfig dev switch0 vlan 1 set ports '1 2 3 4 6t'
|
||||||
swconfig dev switch0 set apply
|
swconfig dev switch0 vlan 2 set ports '0 6t'
|
||||||
'';
|
swconfig dev switch0 set apply
|
||||||
down = "swconfig dev switch0 set reset";
|
'';
|
||||||
};
|
down = "swconfig dev switch0 set reset";
|
||||||
in interface {
|
};
|
||||||
device = "eth0";
|
in rec {
|
||||||
dependencies = [swconfig];
|
eth = link.build { ifname = "eth0"; dependencies = [swconfig]; };
|
||||||
|
# lan and wan ports are both behind a switch on eth0
|
||||||
|
lan = vlan.build {
|
||||||
|
ifname = "eth0.1";
|
||||||
|
primary = eth;
|
||||||
|
vid = "1";
|
||||||
|
};
|
||||||
|
wan = vlan.build {
|
||||||
|
ifname = "eth0.2";
|
||||||
|
primary = eth;
|
||||||
|
vid = "2";
|
||||||
|
};
|
||||||
|
wlan = link.build {
|
||||||
|
ifname = "wlan0";
|
||||||
|
dependencies = [ mac80211 ];
|
||||||
};
|
};
|
||||||
lan = interface {
|
|
||||||
type = "vlan";
|
|
||||||
device = "eth0.1";
|
|
||||||
link = "eth0";
|
|
||||||
id = "1";
|
|
||||||
dependencies = [eth];
|
|
||||||
};
|
};
|
||||||
wan = interface {
|
|
||||||
type = "vlan";
|
|
||||||
device = "eth0.2";
|
|
||||||
id = "2";
|
|
||||||
link = "eth0";
|
|
||||||
dependencies = [eth];
|
|
||||||
};
|
|
||||||
wlan = interface {
|
|
||||||
device = "wlan0";
|
|
||||||
dependencies = [ mac80211 ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
boot.tftp = {
|
boot.tftp = {
|
||||||
# 20MB seems to give enough room to uncompress the kernel
|
# 20MB seems to give enough room to uncompress the kernel
|
||||||
|
@ -148,13 +144,6 @@
|
||||||
NET_VENDOR_RALINK = "y";
|
NET_VENDOR_RALINK = "y";
|
||||||
NET_RALINK_RT3050 = "y";
|
NET_RALINK_RT3050 = "y";
|
||||||
NET_RALINK_SOC="y";
|
NET_RALINK_SOC="y";
|
||||||
|
|
||||||
# both the ethernet ports on this device (lan and wan)
|
|
||||||
# are behind a switch, so we need VLANs to do anything
|
|
||||||
# useful with them
|
|
||||||
|
|
||||||
VLAN_8021Q = "y";
|
|
||||||
SWCONFIG = "y";
|
|
||||||
SWPHY = "y";
|
SWPHY = "y";
|
||||||
|
|
||||||
WATCHDOG = "y";
|
WATCHDOG = "y";
|
||||||
|
|
|
@ -31,6 +31,7 @@ in rec {
|
||||||
../modules/standard.nix
|
../modules/standard.nix
|
||||||
../modules/wlan.nix
|
../modules/wlan.nix
|
||||||
../modules/network
|
../modules/network
|
||||||
|
../modules/vlan
|
||||||
];
|
];
|
||||||
|
|
||||||
hostname = "arhcive";
|
hostname = "arhcive";
|
||||||
|
|
41
modules/vlan/default.nix
Normal file
41
modules/vlan/default.nix
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
## VLAN
|
||||||
|
## ====
|
||||||
|
##
|
||||||
|
## Virtual LANs give you the ability to sub-divide a LAN. Linux can
|
||||||
|
## accept VLAN tagged traffic and presents each VLAN ID as a
|
||||||
|
## different network interface (eg: eth0.100 for VLAN ID 100)
|
||||||
|
##
|
||||||
|
## Some Liminix devices with multiple ethernet ports are implemented
|
||||||
|
## using a network switch connecting the physical ports to the CPU,
|
||||||
|
## and require using VLAN in order to send different traffic to
|
||||||
|
## different ports (e.g. LAN vs WAN)
|
||||||
|
|
||||||
|
{ lib, pkgs, config, ...}:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
inherit (pkgs.liminix.services) oneshot;
|
||||||
|
inherit (pkgs) liminix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
system.service.vlan = mkOption { type = liminix.lib.types.serviceDefn; };
|
||||||
|
};
|
||||||
|
config.system.service.vlan = liminix.callService ./service.nix {
|
||||||
|
ifname = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "interface name to create";
|
||||||
|
};
|
||||||
|
primary = mkOption {
|
||||||
|
description = "existing physical interface";
|
||||||
|
type = liminix.lib.types.interface;
|
||||||
|
};
|
||||||
|
vid = mkOption {
|
||||||
|
description = "VLAN identifier (VID) in range 1-4094";
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.kernel.config = {
|
||||||
|
VLAN_8021Q = "y";
|
||||||
|
SWCONFIG = "y"; # not always appropriate, some devices will use DSA
|
||||||
|
};
|
||||||
|
}
|
15
modules/vlan/service.nix
Normal file
15
modules/vlan/service.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
liminix
|
||||||
|
, lib
|
||||||
|
}:
|
||||||
|
{ ifname, primary, vid } :
|
||||||
|
let
|
||||||
|
inherit (liminix.services) oneshot;
|
||||||
|
in oneshot rec {
|
||||||
|
name = "${ifname}.link";
|
||||||
|
up = ''
|
||||||
|
ip link add link $(output ${primary} ifname) name ${ifname} type vlan id ${vid}
|
||||||
|
${liminix.networking.ifup name ifname}
|
||||||
|
'';
|
||||||
|
down = "ip link set down dev ${ifname}";
|
||||||
|
}
|
Loading…
Reference in a new issue