#!/bin/sh ######################################################################## # Begin $NETWORK_DEVICES/services/vlan # # Description : VLAN Script # # Authors : Michael Tremer - michael.tremer@ipfire.org # # Version : 00.00 # # Notes : This script adds vlan support. # ######################################################################## . /lib/network/hook-header HOOK_NAME=vlan HOOK_TYPE=port function port_name() { echo "${zone}v${ID}" } case "${action}" in help) ;; info) echo "HOOK_NAME=${HOOK_NAME}" echo "HOOK_TYPE=${HOOK_TYPE}" ;; pre-up) # Load the kernel module grep -q ^8021q /proc/modules || modprobe 8021q if ! port_is_up $(port_name); then MESSAGE="Adding VLAN ${ID} to port ${MAC}..." if ! device_is_up $(devicify ${MAC}); then ip link set $(devicify ${MAC}) up fi vconfig add $(devicify ${MAC}) ${ID} >/dev/null evaluate_retval device_rename $(get_device_by_mac_and_vid ${MAC} ${ID}) $(port_name) ip link set $(port_name) up ebtables -t broute -A BROUTING -p 802_1Q --vlan-id=${ID} -j DROP fi ;; post-up) if ! zone_has_device_attached ${zone} $(port_name); then zone_add_port ${zone} $(get_device ${MAC} ${ID}) fi ;; pre-down) if zone_has_device_attached ${zone} $(port_name); then zone_del_port ${zone} $(get_device_by_mac_and_vid ${MAC} ${ID}) fi ;; post-down) if port_is_up $(port_name); then MESSAGE="Removing VLAN ${ID} from port ${MAC}..." vconfig rem $(get_device_by_mac_and_vid ${MAC} ${ID}) >/dev/null evaluate_retval ebtables -t broute -D BROUTING -p 802_1Q --vlan-id=${ID} -j DROP fi ;; add) MAC=$(macify ${1}) ID=${2} # Must be integer between 1 and 4096 UUID=$(uuid) cat < ${CONFIG_UUIDS}/${UUID} HOOK="${HOOK_NAME}" ID="${ID}" MAC="${MAC}" EOF ln -sf ${CONFIG_UUIDS}/${UUID} \ ${CONFIG_ZONES}/${zone}/${HOOK_NAME}-${UUID} log_success_msg "Configuration successfully saved!" echo " Device : $(devicify ${MAC})" echo " MAC address : ${MAC}" echo " VLAN tag : ${ID}" ;; rem) # XXX to be done ;; status) echo -e "# ${CLR_BOLD_CYN}VLAN port $(port_name)${NORMAL}" echo -n "# State: " if device_is_up $(port_name); then echo -e "${CLR_BOLD_GRN}up${NORMAL}" RET=${EXIT_OK} else echo -e "${CLR_BOLD_RED}down${NORMAL}" RET=${EXIT_ERROR} fi echo "# ID : ${ID}" echo "#" exit ${RET} ;; *) echo "Usage: ${0} [interface] {up|down|add|remove|attach|detach|status}" exit 1 ;; esac # End $NETWORK_DEVICES/services/vlan