From: Michael Tremer Date: Mon, 3 Jun 2019 11:17:06 +0000 (+0200) Subject: vlan: Add support for 802.1ad (QinQ) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2eb7011cb5447f9568c8136940f59a047e1b8dae;p=network.git vlan: Add support for 802.1ad (QinQ) Signed-off-by: Michael Tremer --- diff --git a/src/functions/functions.vlan b/src/functions/functions.vlan index ee2fb340..fbaa34fe 100644 --- a/src/functions/functions.vlan +++ b/src/functions/functions.vlan @@ -22,6 +22,11 @@ PROC_NET_VLAN="/proc/net/vlan" PROC_NET_VLAN_CONFIG="${PROC_NET_VLAN}/config" +VLAN_SUPPORTED_PROTOCOLS=( + "802.1Q" # default + "802.1ad" +) + VLAN_PORT_INTERFIX="v" vlan_valid_id() { @@ -41,6 +46,13 @@ vlan_valid_id() { return ${EXIT_FALSE} } +vlan_supported_protocol() { + local proto="${1}" + assert isset proto + + list_match "${proto}" "${VLAN_SUPPORTED_PROTOCOLS[@]}" +} + vlan_create() { local device="${1}" shift @@ -50,6 +62,7 @@ vlan_create() { local address local id=1 local parent + local protocol="${VLAN_SUPPORTED_PROTOCOLS[0]}" # Parse command line arguments while [ $# -gt 0 ]; do @@ -63,6 +76,9 @@ vlan_create() { --parent=*) parent=$(cli_get_val "${1}") ;; + --protocol=*) + protocol=$(cli_get_val "${1}") + ;; *) error "Unrecognized argument: ${1}" return ${EXIT_ERROR} @@ -82,6 +98,12 @@ vlan_create() { return ${EXIT_ERROR} fi + # Check protocol + if ! vlan_supported_protocol "${protocol}"; then + log ERROR "Invalid protocol: ${protocol}" + return ${EXIT_ERROR} + fi + # Check VLAN ID if ! vlan_valid_id "${id}"; then log ERROR "Invalid VLAN ID: ${id}" @@ -103,7 +125,7 @@ vlan_create() { # Make the command local command=( ip link add link "${parent}" name "${device}" - address "${address}" type vlan id "${id}" + address "${address}" type vlan proto "${protocol}" id "${id}" ) # Run the command diff --git a/src/hooks/ports/vlan b/src/hooks/ports/vlan index 7f99dbcd..af563eed 100644 --- a/src/hooks/ports/vlan +++ b/src/hooks/ports/vlan @@ -25,14 +25,21 @@ HOOK_SETTINGS=( "ADDRESS" "ID" "PARENT_PORT" + "PROTOCOL" ) +# Set the default to 802.1Q +DEFAULT_PROTOCOL="${VLAN_SUPPORTED_PROTOCOLS[0]}" + PORT_PARENTS_VAR="PARENT_PORT" hook_check_settings() { assert ismac ADDRESS assert isset PARENT_PORT + assert isset PROTOCOL + assert vlan_supported_protocol "${PROTOCOL}" + assert isinteger ID assert vlan_valid_id "${ID}" } @@ -74,6 +81,16 @@ hook_parse_cmdline() { return ${EXIT_CONF_ERROR} fi ;; + --protocol=*) + PROTOCOL="$(cli_get_val "${1}")" + + # Check if PROTOCOL is supported + if ! vlan_supported_protocol "${PROTOCOL}"; then + error "Protocol '${PROTOCOL}' is not supported" + error "Choose one of ${VLAN_SUPPORTED_PROTOCOLS[*]}" + return ${EXIT_CONF_ERROR} + fi + ;; *) error "Unknown argument '${1}'" return ${EXIT_CONF_ERROR} @@ -114,8 +131,9 @@ hook_create() { # Create the VLAN device if ! vlan_create "${port}" \ --address="${ADDRESS}" \ - --id="${id}" \ - --parent="${PARENT_PORT}"; then + --id="${ID}" \ + --parent="${PARENT_PORT}" \ + --protocol="${PROTOCOL}"; then error "Could not create port: ${port}" return ${EXIT_ERROR} fi