/network/if-down.d/ifupdown-scripts-zg2-95vlan

http://github.com/brinkman83/bashrc · Shell · 134 lines · 86 code · 18 blank · 30 comment · 34 complexity · 7ea9d68ebb87e26a30ca23ce0dd43dcf MD5 · raw file

  1. #! /bin/sh
  2. # $Header$
  3. # Environment:
  4. # IFACE = Logical interface name
  5. # MODE = { start | stop }
  6. # METHOD = manual, otherwise exit
  7. # ADDRFAM = inet, otherwise exit
  8. # IF_DEVICE = physical interface name (defaults to logical)
  9. # IF_MASTER = master interface (optional)
  10. # IF_MAC = mac of the master interface
  11. # IF_VLAN_ID = VLAN id
  12. . /etc/network/ifupdown-scripts-zg2.d/common-functions
  13. # remove state if interface is being stopped
  14. if [ "$MODE" = 'stop' ]; then
  15. DEV=$(state_entry vlan-dev)
  16. if [ -n "$DEV" ]; then
  17. # we have a vlanned interface
  18. if ! has_ip_address $DEV; then
  19. exec_down "vlan" "vconfig"
  20. IF_MASTER_DEV=$(state_entry vlan-master)
  21. if ! is_active_vlan_master "$IF_MASTER_DEV" && ! has_ip_address "$IF_MASTER_DEV"; then
  22. ip link set dev $IF_MASTER_DEV down
  23. fi
  24. fi
  25. fi
  26. exec_down "vlan" ""
  27. exec_down "vlan-mac" ""
  28. exec_down "vlan-master" ""
  29. exec_down "vlan-id" ""
  30. exec_down "vlan-dev" ""
  31. exit 0
  32. fi
  33. [ "$MODE" = 'start' ] || exit 0
  34. # check if vlan needs to be configured
  35. [ "$IF_VLAN_ID" -ne 0 ] || exit 0
  36. # check if vlans are supported
  37. if [ "$VLAN_SUPPORT" != 'yes' ]; then
  38. abort "No VLAN support in kernel"
  39. fi
  40. # check if encapsulation is correct
  41. verbose "encapsulation $IF_ENCAPSULATION"
  42. if [ "$IF_ENCAPSULATION" != "dot1q" ]; then
  43. abort "invalid encapsulation $IF_ENCAPSULATION"
  44. fi
  45. # find master interface
  46. if [ -z "${IF_MASTER:-}" -a -z "${IF_MAC:-}" ]; then
  47. abort "no master configured for VLAN interface $IFACE"
  48. fi
  49. if [ -n "$IF_MASTER" ]; then
  50. # master by name
  51. # resolve master to a physical device
  52. IF_MASTER_DEV=$(dev_state_entry "$IF_MASTER" dev)
  53. [ -z "${IF_MASTER_DEV:-}" ] && IF_MASTER_DEV="$IF_MASTER"
  54. if ! if_exists "$IF_MASTER_DEV"; then
  55. abort "master $IF_MASTER for VLAN interface $IFACE does not exist"
  56. fi
  57. IF_MAC=$(get_if_mac "$IF_MASTER_DEV")
  58. if [ -z "${IF_MAC:-}" ]; then
  59. abort "master $IF_MASTER for $IFACE is no ethernet device"
  60. fi
  61. IF_MASTER="$IF_MASTER_DEV"
  62. else
  63. # master by mac
  64. for iface in $(list_ifaces); do
  65. if [ "$(get_if_mac "$iface")" = "$IF_MAC" ]; then
  66. IF_MASTER="$iface"
  67. break
  68. fi
  69. done
  70. if [ -z "${IF_MASTER:-}" ]; then
  71. abort "no master with MAC $IF_MAC found for $IFACE"
  72. fi
  73. fi
  74. # IF_MASTER and IF_MAC are set and valid now
  75. # ensure that master is up
  76. if ! is_if_up "$IF_MASTER"; then
  77. verbose "ip link set dev \"$IF_MASTER\" up"
  78. ip link set dev "$IF_MASTER" up
  79. fi
  80. # check if VLAN already exists
  81. vlan=$(find_vlan "$IF_MASTER" $IF_VLAN_ID)
  82. verbose "find_vlan $IF_MASTER $IF_VLAN_ID = $vlan"
  83. if [ -n "$vlan" ]; then
  84. # VLAN exists, check if it's the one we want
  85. for iface in $(list_if_by_state dev "^$vlan[ \t]*\$"); do
  86. verbose "test $iface"
  87. if [ "$iface" != "$IFACE" -a "$vlan" != "$IF_DEVICE" ]; then
  88. abort "device $IF_MASTER VLAN $IF_VLAN_ID already up as $vlan for $iface"
  89. fi
  90. done
  91. # it's the one we want
  92. newif="$vlan"
  93. else
  94. # create new vlan
  95. verbose "vconfig add \"$IF_MASTER\" $IF_VLAN_ID"
  96. vconfig add "$IF_MASTER" $IF_VLAN_ID >/dev/null
  97. newif=$(find_vlan "$IF_MASTER" $IF_VLAN_ID)
  98. if [ -z "${newif:-}" ]; then
  99. abort "could not add VLAN $IF_VLAN_ID on $IF_MASTER for $IFACE"
  100. fi
  101. fi
  102. # newif is set to the VLAN interface
  103. # rename the interface if necessary
  104. if [ "$newif" != "$IF_DEVICE" ]; then
  105. verbose "ip link set dev \"$newif\" down"
  106. ip link set dev "$newif" down
  107. verbose "ip link set dev \"$newif\" name \"$IF_DEVICE\""
  108. ip link set dev "$newif" name "$IF_DEVICE"
  109. fi
  110. add_down "vlan-id" "$IF_VLAN_ID"
  111. add_down "vlan-master" "$IF_MASTER"
  112. add_down "vlan-mac" "$IF_MAC"
  113. add_down "vlan-dev" "$IF_DEVICE"
  114. add_down "vlan" "rem \"$IF_DEVICE\" >/dev/null"
  115. # vi:sw=4
  116. # end of file