]> git.ipfire.org Git - people/stevee/network.git/blobdiff - src/functions/functions.vlan
vlan: Add support for 802.1ad (QinQ)
[people/stevee/network.git] / src / functions / functions.vlan
index ee2fb3400062a62c49f35b49a73f5a4b563f3e1b..fbaa34fe723df075ecbb20446fa39596812d9c86 100644 (file)
 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