From: Michael Tremer Date: Sun, 23 Sep 2012 12:30:14 +0000 (+0000) Subject: Add macvlan port hook. X-Git-Tag: 005~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab5a37b4e0f1efe4c0cabfaf73f287054aeeb33a;p=network.git Add macvlan port hook. --- diff --git a/functions.macvlan b/functions.macvlan new file mode 100644 index 00000000..de611c21 --- /dev/null +++ b/functions.macvlan @@ -0,0 +1,81 @@ +#!/bin/bash +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2012 IPFire Network Development Team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +MACVLAN_PORT_INTERFIX="mv" + +function macvlan_create() { + local device=${1} + assert isset device + + local parent=${2} + assert isset parent + + local address=${3} + assert ismac address + + # Check if the parent device exists. + if ! device_exists ${parent}; then + log ERROR "macvlan: parent device '${parent}' does not exist" + return ${EXIT_ERROR} + fi + + # Check if the device we want to create does not already exist. + if device_exists ${device}; then + log ERROR "macvlan: device '${device}' already exists" + return ${EXIT_ERROR} + fi + + # The macvlan device cannot be created, when the parent device + # is attached to a bridge. So we detach the parent device and + # reattach it again. + local bridge + if device_is_bridge_attached ${parent}; then + bridge=$(device_get_bridge ${parent}) + + # Detach the parent device. + bridge_detach_device ${bridge} ${parent} + fi + + # Actually create the device. + cmd_quiet ip link add link ${parent} name ${device} address ${address} \ + type macvlan + local ret=$? + + if [ ${ret} -eq ${EXIT_OK} ]; then + log DEBUG "macvlan device '${device}' has been created" + else + log ERROR "Could not create macvlan device '${device}': ${ret}" + fi + + # Re-attach device. + if isset bridge; then + bridge_attach_device ${bridge} ${parent} + fi + + return ${ret} +} + +function macvlan_remove() { + local device=${1} + assert isset device + + device_delete ${device} +} diff --git a/hooks/ports/macvlan b/hooks/ports/macvlan new file mode 100755 index 00000000..5770e9db --- /dev/null +++ b/hooks/ports/macvlan @@ -0,0 +1,113 @@ +#!/bin/bash +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2010 Michael Tremer & Christian Schmidt # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### +# +# XXX This hook is rather unusable because the parent device cannot be used +# anymore in a bridge. +# + +. /usr/lib/network/header-port + +HOOK_SETTINGS="HOOK ADDRESS PARENT" + +function _check() { + assert isset PARENT + assert ismac ADDRESS +} + +function _create() { + while [ $# -gt 0 ]; do + case "${1}" in + --parent-device=*) + PARENT=$(cli_get_val ${1}) + ;; + --address=*) + ADDRESS=$(cli_get_val ${1}) + ;; + *) + warning "Unknown argument '${1}'" + ;; + esac + shift + done + + local port=$(port_find_free "${PARENT}${MACVLAN_PORT_INTERFIX}N") + assert isset port + + if config_write $(port_file ${port}) ${HOOK_SETTINGS}; then + log INFO "New macvlan port '${port}' has been created." + fi + + exit ${EXIT_OK} +} + +function _edit() { + local port=${1} + assert isset port + shift + + config_read $(port_file ${port}) + + while [ $# -gt 0 ]; do + case "${1}" in + --address=*) + ADDRESS=$(cli_get_val ${1}) + ;; + *) + warning "Unknown argument '${1}'" + ;; + esac + shift + done + + config_write $(port_file ${port}) ${HOOK_SETTINGS} + + exit ${EXIT_OK} +} + +function _up() { + local port=${1} + assert isset port + + config_read $(port_file ${port}) + + # Create device if not already exists. + if ! device_exists ${port}; then + macvlan_create "${port}" "${PARENT}" "${ADDRESS}" + fi + + exit ${EXIT_OK} +} + +function _down() { + local port=${1} + + assert isset port + + config_read $(port_file ${port}) + + if ! device_exists ${port}; then + exit ${EXIT_OK} + fi + + macvlan_remove ${port} + + exit ${EXIT_OK} +} diff --git a/hooks/zones/bridge.ports/macvlan b/hooks/zones/bridge.ports/macvlan new file mode 120000 index 00000000..3857774a --- /dev/null +++ b/hooks/zones/bridge.ports/macvlan @@ -0,0 +1 @@ +ethernet \ No newline at end of file