From fa458b65d9d4c5e933622574d999915ecda37a25 Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Sat, 27 Feb 2021 19:26:22 +0000 Subject: Sat Feb 27 19:26:22 UTC 2021 a/kernel-generic-5.10.19-x86_64-1.txz: Upgraded. a/kernel-huge-5.10.19-x86_64-1.txz: Upgraded. a/kernel-modules-5.10.19-x86_64-1.txz: Upgraded. d/kernel-headers-5.10.19-x86-1.txz: Upgraded. d/poke-1.0-x86_64-1.txz: Added. This looks useful enough to add upon the initial upstream release. d/python-setuptools-53.1.0-x86_64-1.txz: Upgraded. k/kernel-source-5.10.19-noarch-1.txz: Upgraded. l/babl-0.1.86-x86_64-1.txz: Upgraded. l/gtk+3-3.24.26-x86_64-1.txz: Upgraded. n/network-scripts-15.0-noarch-12.txz: Rebuilt. This has been rewritten to add support for IPv6, VLANs and link aggregation (bonding). Thanks very much to tadgy! x/xorgproto-2021.3-x86_64-1.txz: Upgraded. xfce/xfce4-panel-4.16.2-x86_64-1.txz: Upgraded. isolinux/initrd.img: Rebuilt. kernels/*: Upgraded. testing/packages/linux-5.11.x/kernel-generic-5.11.2-x86_64-1.txz: Upgraded. testing/packages/linux-5.11.x/kernel-headers-5.11.2-x86-1.txz: Upgraded. testing/packages/linux-5.11.x/kernel-huge-5.11.2-x86_64-1.txz: Upgraded. testing/packages/linux-5.11.x/kernel-modules-5.11.2-x86_64-1.txz: Upgraded. testing/packages/linux-5.11.x/kernel-source-5.11.2-noarch-1.txz: Upgraded. usb-and-pxe-installers/usbboot.img: Rebuilt. --- source/n/network-scripts/scripts/netconfig | 655 ++++++++++++++++++------- source/n/network-scripts/scripts/rc.inet1 | 594 ++++++++++++++++------ source/n/network-scripts/scripts/rc.inet1.conf | 145 +++++- 3 files changed, 1031 insertions(+), 363 deletions(-) (limited to 'source/n/network-scripts/scripts') diff --git a/source/n/network-scripts/scripts/netconfig b/source/n/network-scripts/scripts/netconfig index 5c5bf8a6..f3e9742f 100644 --- a/source/n/network-scripts/scripts/netconfig +++ b/source/n/network-scripts/scripts/netconfig @@ -15,96 +15,187 @@ write_config_files() { # we use the IP in other places, we need to make a copy for here. RCIPCOPY=$IPADDR RCMASKCOPY=$NETMASK +RCIP6COPY=$IPADDR6 +RCPREFIXCOPY=$PREFIX6 if [ "$RCIPCOPY" = "127.0.0.1" ]; then RCIPCOPY="" RCMASKCOPY="" fi +if [ "$RCIP6COPY" = "::1" ]; then + RCIP6COPY="" + RCPREFIXCOPY="" +fi # echo "Creating /$RC..." /bin/cat << ENDFILE > $RC # /etc/rc.d/rc.inet1.conf # # This file contains the configuration settings for network interfaces. +# # If USE_DHCP[interface] is set to "yes", this overrides any other settings. # If you don't have an interface, leave the settings null (""). - +# # You can configure network interfaces other than eth0,eth1... by setting # IFNAME[interface] to the interface's name. If IFNAME[interface] is unset # or empty, it is assumed you're configuring eth. - -# Several other parameters are available, the end of this file contains a +# +# Several other parameters are available; the end of this file contains a # comprehensive set of examples. +# +# Important note for IPv6 stateless auto configuration (SLAAC) users: +# From Slackware 15.0 onwards, you need to set USE_SLAAC[0]="yes" below. # ============================================================================= -# Config information for eth0: +# IPv4 config information for eth0: +ENDFILE + +if [ -n "$VLAN" ]; then + echo "IFNAME[0]=\"eth0$VLAN\"" >>$RC +fi + +/bin/cat << ENDFILE >> $RC IPADDR[0]="$RCIPCOPY" NETMASK[0]="$RCMASKCOPY" IPALIASES[0]="" USE_DHCP[0]="$USE_DHCP" DHCP_HOSTNAME[0]="$DHCP_HOSTNAME" +# IPv6 config information for eth0: +IP6ADDRS[0]="`if [ ! \"$RCIP6COPY\" = \"\" ]; then echo \"$RCIP6COPY/$RCPREFIXCOPY\"; fi`" +USE_SLAAC[0]="$USE_SLAAC" +USE_DHCP6[0]="$USE_DHCP6" -# Config information for eth1: +# IPv4 config information for eth1: IPADDR[1]="" NETMASK[1]="" IPALIASES[1]="" USE_DHCP[1]="" DHCP_HOSTNAME[1]="" +# IPv6 config information for eth1: +IP6ADDRS[1]="" +USE_SLAAC[1]="" +USE_DHCP6[1]="" -# Config information for eth2: +# IPv4 config information for eth2: IPADDR[2]="" NETMASK[2]="" IPALIASES[2]="" USE_DHCP[2]="" DHCP_HOSTNAME[2]="" +# IPv6 config information for eth2: +IP6ADDRS[2]="" +USE_SLAAC[2]="" +USE_DHCP6[2]="" -# Config information for eth3: +# IPv4 config information for eth3: IPADDR[3]="" NETMASK[3]="" IPALIASES[3]="" USE_DHCP[3]="" DHCP_HOSTNAME[3]="" +# IPv6 config information for eth3: +IP6ADDRS[3]="" +USE_SLAAC[3]="" +USE_DHCP6[3]="" -# Default gateway IP address: +# IPv4 default gateway IP address: GATEWAY="$GATEWAY" +# IPv6 default gateway IP address: +GATEWAY6="$GATEWAY6" -# Change this to "yes" for debugging output to stdout. Unfortunately, -# /sbin/hotplug seems to disable stdout so you'll only see debugging output -# when rc.inet1 is called directly. -DEBUG_ETH_UP="no" +# ============================================================================= + +# Example of how to configure a bond (link aggrigation) interface. +# Note the addition of the BONDNICS and BONDMODE parameters. +# BONDNICS is a space delimited list of interfaces to add to this bond. The +# BONDNICS interfaces will be brought up and configured while bringing up the +# bond interface, so do not need to be previously defined in rc.inet1.conf. +# BONDMODE sets the bonding mode for this interface. If not specified when +# BONDNICS has been used, the default is 'balance-rr'. +# IFOPTS is a pipe (|) delimited list of bonding module specific settings to be +# applied to the interface, and should always include the 'miimon' option when +# configuring bonding - not using this option will result in network +# degradation. In 'active-backup' mode, the 'primary' option should also be +# supplied. When using '802.3ad' mode, set "lacp_rate fast" for faster +# recovery from an interface failure. In other modes, the 'xmit_hash_policy' +# should be set. See the /usr/src/linux/Documentation/networking/bonding.txt +# file (search for "Bonding Driver Options") for the full set of options. +#IFNAME[0]="bond0" +#BONDNICS[0]="eth0 eth1" +#BONDMODE[0]="balance-rr" +#IFOPTS[0]="xmit_hash_policy layer2+3 | miimon 100" +#IPADDR[0]="192.168.0.1" +#NETMASK[0]="24" +#IPALIASES[0]="" +#USE_DHCP[0]="" +#DHCP_HOSTNAME[0]="" +#IP6ADDRS[0]="" +#USE_SLAAC[0]="" +#USE_DHCP6[0]="" + +# ============================================================================= + +# Example of how to configure a VLAN interface: +# The VLAN ID is taken from the full interface name, which is comprised of the +# underlying interface name, a period (.) and then the VLAN ID. +# IFOPTS is a pipe (|) delimited list of VLAN module specific settings to be +# applied to the interface. See the ip-link(8) man page (search for "VLAN Type +# Support") for details of the options available. This option is not required +# for a standard VLAN to be configured. +#IFNAME[0]="eth0.10" +#IFOPTS[0]="" +#IPADDR[0]="192.168.10.1" +#NETMASK[0]="24" +#IPALIASES[0]="" +#USE_DHCP[0]="" +#DHCP_HOSTNAME[0]="" +#IP6ADDRS[0]="" +#USE_SLAAC[0]="" +#USE_DHCP6[0]="" + +# ============================================================================= # Example of how to configure a bridge: # Note the added "BRNICS" variable which contains a space-separated list # of the physical or virtual network interfaces you want to add to the bridge. +# IFOPTS is a pipe (|) delimited list of bridge module specific settings to be +# applied to the interface. See the ip-link(8) man page (search for "BRIDGE +# Type Support") for details of the options available. This option is not +# required for a standard bridge to be configured. #IFNAME[0]="br0" #BRNICS[0]="eth0" +#IFOPTS[0]="" #IPADDR[0]="192.168.0.1" -#NETMASK[0]="255.255.255.0" +#NETMASK[0]="24" #IPALIASES[0]="" #USE_DHCP[0]="" #DHCP_HOSTNAME[0]="" +# ============================================================================= + # Virtual interfaces to create - these are created before any address # configuration or bridge setup is done, so you may use these interfaces # as IFNAME or BRNICS values. These can be tun or tap interfaces: # adjust VIRTIFNAME and VIRTIFTYPE accordingly. # Starting with VIRTIFNAME[0] is mandatory, and each next one must be # incremented by one, so VIRTIFNAME[1], VIRTIFNAME[2], and so on. -# # Virtual tap interface example #VIRTIFNAME[0]="tap0" #VIRTIFTYPE[0]="tap" #VIRTIFUSER[0]="root" #VIRTIFGROUP[0]="root" -# + # Virtual tun interface example #VIRTIFNAME[1]="tun0" #VIRTIFTYPE[1]="tun" #VIRTIFUSER[1]="someuser" #VIRTIFGROUP[1]="somegroup" -## Example config information for wlan0. Uncomment the lines you need and fill -## in your data. (You may not need all of these for your wireless network) +# ============================================================================= + +# Example config information for wlan0: +# Uncomment the lines you need and fill in your data. You may not need all of +# these for your wireless network. #IFNAME[4]="wlan0" #IPADDR[4]="" #NETMASK[4]="" @@ -124,13 +215,16 @@ DEBUG_ETH_UP="no" #WLAN_WPADRIVER[4]="wext" #WLAN_WPAWAIT[4]=30 -## Some examples of additional network parameters that you can use. -## Config information for wlan0: + +# ============================================================================= + +# Some examples of additional network parameters that you can use. #IFNAME[4]="wlan0" # Use a different interface name instead of # the default 'eth4' -#IPALIASES[4]="192.168.5.10/24" # Set up an IP alias. A netmask may be given - # with a / after the IP address - if - # not supplied, /32 will be used as default. +#IPALIASES[4]="192.168.5.10/24" # A space delimited list of CIDR formatted IP + # aliases to assign to the interface after it + # has come up. If no / is given after + # the IP address, /24 will be used as default. #HWADDR[4]="00:01:23:45:67:89" # Overrule the card's hardware MAC address #MTU[4]="" # The default MTU is 1500, but you might need # 1360 when you use NAT'ed IPSec traffic. @@ -149,6 +243,11 @@ DEBUG_ETH_UP="no" # server is not found (ipv4ll link-local # adresses in the IP range 169.254.0.0/16 are # also known as "zeroconf" addresses) +#SLAAC_TIMEOUT[4]="15" # The default timeout for auto configuration to + # wait for the interface to come up is 15 sec. + # Increase the timeout if required. +#USE_RA[4]="yes" # Accept router advertisements even when SLAAC + # is disabled on the interface. #WLAN_ESSID[4]=DARKSTAR # An example of how you can override _any_ # parameter defined in rc.wireless.conf, by # prepending 'WLAN_' to the parameter's name. @@ -166,6 +265,16 @@ DEBUG_ETH_UP="no" #WLAN_WPAWAIT[4]=30 # In case it takes long for the WPA association # to finish, you can increase the wait time # (defaults to 10 seconds) + +# ============================================================================= + +# Change this to "yes" for debugging output to stdout. +DEBUG_ETH_UP="no" + +# MAXNICS is the maximum number of interfaces that will be configured. +# You may need to increase the MAXNICS value if you have many interfaces, or +# you use multiple VLANs and/or bridges. The default is 6. +# MAXNICS="6" ENDFILE # ############################################################################ @@ -208,11 +317,10 @@ chmod 644 $ETCNETWORKS # For loopbacking. 127.0.0.1 localhost -$IPADDR $HOSTNM.$DOMAIN $HOSTNM - -# End of hosts. - +::1 localhost EOF +[ -n "$IPADDR" ] && echo -e "$IPADDR\t\t$HOSTNM.$DOMAIN $HOSTNM" >>$HOSTS +[ -n "$IPADDR6" ] && echo -e "$IPADDR6\t\t$HOSTNM.$DOMAIN $HOSTNM" >>$HOSTS chmod 644 $HOSTS # ############################################################################ @@ -259,7 +367,7 @@ fi # example: syntax_check 123.22.43.1 4 # returns: 0=found correct 1=too many fields 2=non numeric field found syntax_check_color() { - RET_CODE=0 + RET_CODE=0 SCRATCH=$1 SCRATCH=`echo $SCRATCH | tr "." "/"` INDEX=$2 @@ -279,16 +387,11 @@ syntax_check_color() { fi if [ "$3" = "WARN" -a ! "$RET_CODE" = "0" ]; then cat << EOF > $TMP/tempmsg - -The address you have entered seems to be non-standard. We were expecting -$2 groups of numbers seperated by dots, like: 127.0.0.1 -Are you absolutely sure you want to use the address $1? - +The value you have entered seems to be non-standard. We were +expecting $2 groups of numbers seperated by dots, like: 127.0.0.1 +Please enter a valid value. EOF - dialog --title "WARNING" --yesno "`cat $TMP/tempmsg`" 9 72 - if [ $? = 0 ]; then - RET_CODE = 0; - fi + dialog --title "INVALID VALUE" --defaultno --msgbox "`cat $TMP/tempmsg`" 7 72 rm -r $TMP/tempmsg else if [ "$3" = "ECHO" ]; then @@ -309,14 +412,16 @@ RC=etc/rc.d/rc.inet1.conf # Where rc.inet1.conf file is. RESOLV=etc/resolv.conf # Where resolv.conf file is. HOSTS=etc/hosts # Where hosts file is. ETCNETWORKS=etc/networks # Where networks file is. -USE_DHCP="" # Use DHCP? "" == no. -DHCP_HOSTNAME="" # This is our DHCP hostname. # # defaults: +USE_DHCP="" # Use DHCP? "" == no. +USE_DHCP6="" +DHCP_HOSTNAME="" # This is our DHCP hostname. NETWORK=127.0.0.0 IPADDR=127.0.0.1 -NETMASK=255.255.255.0 - +NETMASK=24 # Use CIDR now. +IPADDR6=::1 +PREFIX6=64 # Main loop: while [ 0 ]; do @@ -365,11 +470,29 @@ done # Write the hostname with domain to /etc/HOSTNAME: echo $HOSTNM.$DOMAIN > etc/HOSTNAME -## OBSOLETE with recent NetworkManager: -## Also make sure the hostname is written to /etc/NetworkManager/NetworkManager.conf: -#if [ -w etc/NetworkManager/NetworkManager.conf ]; then -# sed -i "s/^hostname=.*$/hostname=$HOSTNM/g" etc/NetworkManager/NetworkManager.conf -#fi + +dialog --title "CONNECT VIA VLAN" --defaultno --yesno \ +"Some advanced networking set ups require a VLAN ID in order to \ +connect to the network. Do you wish to configure a VLAN now? \n\n\ +Unless you are sure you require a VLAN, select 'No'." 8 68 +if [ $? = 0 ]; then + while true; do + dialog --title "VLAN ID" --cancel-label "Skip" --inputbox \ + "Enter the VLAN ID used on this network." 8 45 2>$TMP/reply + if [ $? = 0 ]; then + if ! (($(cat $TMP/reply))) 2>/dev/null; then + dialog --title "VLAN ID" --ok-button "Back" --msgbox \ + "That doesn't appear to be a valid VLAN ID." 5 46 + continue + else + VLAN=".`cat $TMP/reply`" + break + fi + else + break + fi + done +fi dialog --title "CONFIGURATION TYPE FOR '$HOSTNM.$DOMAIN'" \ --default-item NetworkManager \ @@ -378,15 +501,18 @@ dialog --title "CONFIGURATION TYPE FOR '$HOSTNM.$DOMAIN'" \ If you have an internal network card and an assigned IP address, gateway, \ and DNS, use the 'static IP' choice to enter these values. If your IP \ address is assigned by a DHCP server (commonly used by cable modem and DSL \ -services), select 'DHCP'. If you do not have a network card, select \ -the 'loopback' choice. You may also select 'NetworkManager' if you would \ -like to have the NetworkManager daemon automatically handle your wired and \ +services), select 'DHCP'. Select 'NetworkManager' if you would like to \ +have the NetworkManager daemon automatically handle your wired and \ wireless network interfaces (this is simple and usually works). \ -Which type of network setup would you like?" 20 70 4 \ -"static IP" "Use a static IP address to configure ethernet" \ -"DHCP" "Use a DHCP server to configure ethernet" \ -"loopback" "Set up a loopback connection (modem or no net)" \ -"NetworkManager" "Autoconfigure network using NetworkManager" 2> $TMP/reply +IPv6 networks may also use SLAAC (Stateless Address Autoconfiguration) to \ +assign an address based on Router Advertisments. If you do not have a \ +network card, select the 'loopback' choice. \n\ +Which type of network setup would you like?" 22 77 5 \ +"static IP" "Use a static IPv4 or IPv6 address to configure ethernet" \ +"DHCP" "Use a DHCP (IPv4 or IPv6) server to configure ethernet" \ +"NetworkManager" "Autoconfigure network using NetworkManager" \ +"SLAAC" "Use SLAAC to configure ethernet (IPv6 only)" \ +"loopback" "Set up a loopback connection (modem or no net)" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply exit @@ -395,7 +521,27 @@ REPLY=`cat $TMP/reply` rm -f $TMP/reply if [ "$REPLY" = "DHCP" ]; then - USE_DHCP="yes" + dialog --title "SELECT DHCP TYPE" --default-item "DHCPv4" --menu \ +"Please select the type of DHCP to use to configure your networking. +Select 'DHCPv4' to configure for an IPv4 network (this is the most +common type of network, and the safe choice). Select 'DHCPv6' for a +pure IPv6 network, or 'Both' to try and set up both types of network." 13 73 3 \ +"DHCPv4" "An IPv4 based network, with no IPv6 configuration" \ +"DHCPv6" "An IPv6 based network, with no IPv4 configuration" \ +"Both" "A combination of IPv4 and IPv6 networks" 2>$TMP/reply + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/reply + exit + fi + TYPE=`cat $TMP/reply` + if [ "$TYPE" = "DHCPv4" ]; then + USE_DHCP="yes" + elif [ "$TYPE" = "DHCPv6" ]; then + USE_DHCP6="yes" + else + USE_DHCP="yes" + USE_DHCP6="yes" + fi dialog --title "SET DHCP HOSTNAME" --inputbox "Some network providers require \ that the DHCP hostname be set in order to connect. If so, they'll have assigned \ a hostname to your machine, which may look something like CC-NUMBER-A (this \ @@ -411,136 +557,252 @@ elif [ "$REPLY" = "loopback" ]; then elif [ "$REPLY" = "NetworkManager" ]; then LOOPBACK="yes" NETWORKMANAGER="yes" +elif [ "$REPLY" = "SLAAC" ]; then + LOOPBACK="no" + USE_SLAAC="yes" else LOOPBACK="no" fi -if [ "$LOOPBACK" = "no" -a ! "$USE_DHCP" = "yes" ]; then - - while [ 0 ]; do - if [ -r $TMP/SeTIP ]; then - IPADDR=`cat $TMP/SeTIP` - fi - cat << EOF > $TMP/tempmsg -Enter your IP address for the local machine. Example: -111.112.113.114 -Enter IP address for $HOSTNM (aaa.bbb.ccc.ddd): -EOF - dialog --title "ENTER IP ADDRESS FOR '$HOSTNM.$DOMAIN'" --inputbox \ -"`cat $TMP/tempmsg`" \ -10 68 $IPADDR 2> $TMP/SeTlip - if [ $? = 1 -o $? = 255 ]; then - rm -f $TMP/SeTlip $TMP/tempmsg - exit - fi - IPADDR="`cat $TMP/SeTlip`" - rm -f $TMP/SeTlip $TMP/tempmsg - if [ "$IPADDR" = "" ]; then - continue; - fi - syntax_check_color $IPADDR 4 WARN - if [ $? = 0 ]; then - echo $IPADDR > $TMP/SeTIP - break; - fi - done +if [ "$LOOPBACK" = "no" -a ! "$USE_DHCP" = "yes" -a ! "$USE_SLAAC" = "yes" ]; then + while [ 0 ]; do + while [ 0 ]; do + if [ -r $TMP/SeTIP ]; then + IPADDR=`cat $TMP/SeTIP` + fi + dialog --title "ENTER IPv4 ADDRESS FOR '$HOSTNM.$DOMAIN'" --inputbox \ +"Enter the IPv4 address for the local machine. Example: 111.112.113.114 +If you do not want to configure a static IPv4 address, just hit ENTER. " \ + 9 75 $IPADDR 2> $TMP/SeTlip + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTlip + exit + fi + IPADDR="`cat $TMP/SeTlip`" + rm -f $TMP/SeTlip + if [ "$IPADDR" = "" ]; then + break + fi + syntax_check_color $IPADDR 4 WARN + if [ $? = 0 ]; then + echo $IPADDR > $TMP/SeTIP + break + fi + done + + if [ ! "$IPADDR" = "" ]; then + while [ 0 ]; do + if [ -r $TMP/SeTnetmask ]; then + NETMASK=`cat $TMP/SeTnetmask` + fi + dialog --title "ENTER NETMASK FOR IPv4 NETWORK" --inputbox \ +"Enter the netmask for your IPv4 network. +This will generally be a single number (eg, 24) +or look something like this: 255.255.255.0." 10 55 $NETMASK 2> $TMP/SeTnmask + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTnmask + exit + fi + NETMASK="`cat $TMP/SeTnmask`" + rm -f $TMP/SeTnmask + if [ "$NETMASK" = "" ]; then + dialog --title "NETMASK REQUIRED" --msgbox \ +"You have configured this host with a v4 +IP address - a netmask is required." 6 43 + continue + fi + if (($NETMASK == 0)) 2>/dev/null || (($NETMASK > 32)) 2>/dev/null; then + dialog --title "NETMASK INVALID" --msgbox \ +"The netmask you entered is not valid. +Valid netmasks will be in the range 1-32." 6 45 + continue + elif (($NETMASK)) 2>/dev/null; then + echo $NETMASK > $TMP/SeTnetmask + break + else + syntax_check_color $NETMASK 4 WARN + if [ $? = 0 ]; then + echo $NETMASK > $TMP/SeTnetmask + break + fi + fi + done + while [ 0 ]; do + if [ -r $TMP/SeTgateway ]; then + GATEWAY=`cat $TMP/SeTgateway` + fi + dialog --title "ENTER IPv4 GATEWAY ADDRESS" --inputbox \ +"Enter the address for the IPv4 gateway on your network, such as: + `echo $IPADDR | cut -f 1-3 -d .`.1 + +If you don't have an IPv4 gateway on your network just hit ENTER +without entering a gateway IP address. - while [ 0 ]; do - if [ -r $TMP/SeTnetmask ]; then - NETMASK=`cat $TMP/SeTnetmask` - fi - cat << EOF > $TMP/tempmsg -Enter your netmask. This will generally look something -like this: 255.255.255.0 -Enter netmask (aaa.bbb.ccc.ddd): -EOF - dialog --title "ENTER NETMASK FOR LOCAL NETWORK" --inputbox \ -"`cat $TMP/tempmsg`" \ -10 65 $NETMASK 2> $TMP/SeTnmask - if [ $? = 1 -o $? = 255 ]; then - rm -f $TMP/SeTnmask $TMP/tempmsg - exit - fi - NETMASK="`cat $TMP/SeTnmask`" - rm -f $TMP/SeTnmask $TMP/tempmsg - if [ "$NETMASK" = "" ]; then - continue; - fi - syntax_check_color $NETMASK 4 WARN - if [ $? = 0 ]; then - echo $NETMASK > $TMP/SeTnetmask - break; - fi - done - - # Set broadcast/network addresses automatically: - BROADCAST=`ipmask $NETMASK $IPADDR | cut -f 1 -d ' '` - NETWORK=`ipmask $NETMASK $IPADDR | cut -f 2 -d ' '` - - while [ 0 ]; do - if [ -r $TMP/SeTgateway ]; then - GATEWAY=`cat $TMP/SeTgateway` - fi - cat << EOF > $TMP/tempmsg -Enter the address for the gateway on your network, such as: -`echo $IPADDR | cut -f 1-3 -d .`.1 +Enter IPv4 gateway address (aaa.bbb.ccc.ddd):" 14 68 $GATEWAY 2> $TMP/SeTgate + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTgate + exit + fi + GATEWAY="`cat $TMP/SeTgate`" + rm -f $TMP/SeTgate + if [ "$GATEWAY" = "" ]; then + echo > $TMP/SeTgateway + break + fi + syntax_check_color $GATEWAY 4 WARN + if [ $? = 0 ]; then + echo $GATEWAY > $TMP/SeTgateway + break + fi + done + fi -If you don't have a gateway on your network just hit ENTER + while [ 0 ]; do + if [ -r $TMP/SeTIP6 ]; then + IPADDR6=`cat $TMP/SeTIP6` + fi + dialog --title "ENTER IPv6 ADDRESS FOR '$HOSTNM.$DOMAIN'" --inputbox \ +"Enter the IPv6 address for the local machine. +Example: fe80:426c:ffff::365a +If you do not want to configure a static IPv6 address, just hit ENTER." \ + 10 74 $IPADDR6 2> $TMP/SeTlip6 + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTlip6 + exit + fi + IPADDR6="`cat $TMP/SeTlip6`" + rm -f $TMP/SeTlip6 + if [ "$IPADDR6" = "" ]; then + if [ "$IPADDR" = "" ]; then + dialog --title "NO IP ADDRESSES" --yesno \ +"You have not configured any IP addresses for your system. +Are you sure you want to proceed with no IPs?" 6 61 + if [ $? = 0 ]; then + break 2 + else + continue 2 + fi + fi + else + # We can only do a basic validation of the entered address + # as regexes for IPv6 addresses are very complex. + if echo "$IPADDR6" | grep -E "^[0-9a-fA-F:]+$" >/dev/null; then + echo $IPADDR6 > $TMP/SeTIP6 + break + else + dialog --title "INVALID IP ADDRESS" --msgbox \ +"The IP address you entered is not valid. +Please enter a valid IPv6 address." 6 44 + continue + fi + fi + done + + if [ ! "$IPADDR6" = "" ]; then + while [ 0 ]; do + if [ -r $TMP/SeTprefix6 ]; then + PREFIX6=`cat $TMP/SeTprefix6` + fi + dialog --title "ENTER IPv6 PREFIX FOR LOCAL NETWORK" --inputbox \ +"Enter your IPv6 prefix length. +This will be a single number (eg, 64)" 9 55 $PREFIX6 2> $TMP/SeTprefix6 + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTprefix6 + exit + fi + PREFIX6="`cat $TMP/SeTprefix6`" + if [ "$PREFIX6" = "" ]; then + dialog --title "PREFIX REQUIRED" --msgbox \ +"You have configured this host with a v6 +IP address - a prefix is required." 6 43 + continue + elif (($PREFIX6 == 0)) 2>/dev/null || (($PREFIX6 > 128)) 2>/dev/null || \ + ! (($PREFIX6)) 2>/dev/null; then + dialog --title "PREFIX INVALID" --msgbox \ +"The prefix you entered is not valid. +Valid prefixes will be in the range 1-128." \ +6 46 + continue + else + echo $PREFIX6 >$TMP/SeTprefix6 + break + fi + done + + while [ 0 ]; do + if [ -r $TMP/SeTgateway6 ]; then + GATEWAY6=`cat $TMP/SeTgateway6` + fi + dialog --title "ENTER IPv6 GATEWAY ADDRESS" --inputbox \ +"Enter the address for the IPv6 gateway on your network, such as: + fe80:426c:ffff::1 + +If you don't have an IPv6 gateway on your network just hit ENTER without entering a gateway IP address. -Enter gateway address (aaa.bbb.ccc.ddd): -EOF - dialog --title "ENTER GATEWAY ADDRESS" --inputbox "`cat $TMP/tempmsg`" \ - 14 64 $GATEWAY 2> $TMP/SeTgate - if [ $? = 1 -o $? = 255 ]; then - rm -f $TMP/SeTgate $TMP/tempmsg - exit - fi - GATEWAY="`cat $TMP/SeTgate`" - rm -f $TMP/SeTgate $TMP/tempmsg - if [ "$GATEWAY" = "" ]; then - echo > $TMP/SeTgateway - break; - fi - syntax_check_color $GATEWAY 4 WARN - if [ $? = 0 ]; then - echo $GATEWAY > $TMP/SeTgateway - break; - fi - done +Enter IPv6 gateway address:" 14 68 $GATEWAY6 2> $TMP/SeTgate6 + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/SeTgate6 + exit + fi + GATEWAY6="`cat $TMP/SeTgate6`" + rm -f $TMP/6SeTgate6 + if [ "$GATEWAY6" = "" ]; then + echo > $TMP/SeTgateway6 + break 2 + fi + # We can only do a basic validation of the entered address + # as regexes for IPv6 addresses are very complex. + if echo "$GATEWAY6" | grep -E "^[0-9a-fA-F:]+$" >/dev/null; then + echo $GATEWAY6 > $TMP/SeTgateway6 + break 2 + else + dialog --title "INVALID IP ADDRESS" --msgbox \ +"The IP address you entered is not valid. +Please enter a valid IPv6 address." 6 44 + continue + fi + echo $GATEWAY6 > $TMP/SeTgateway6 + done + fi + done fi if [ "$LOOPBACK" = "no" ]; then - dialog --title "USE A NAMESERVER?" --yesno "Will you be accessing a \ -nameserver?" 5 42 + dialog --title "USE A NAMESERVER?" --yesno "Do you wish to configure \ +a nameserver?" 5 42 if [ $? = 0 ]; then - if [ ! "`cat $TMP/SeTns 2> /dev/null`" = "" ]; then - DNSSAMPLE="`cat $TMP/SeTns 2> /dev/null`" - elif [ "$GATEWAY" = "" ]; then - DNSSAMPLE=`echo $IPADDR | cut -f 1-3 -d .` - else - DNSSAMPLE=$GATEWAY + if [ ! "$IPADDR" = "" ]; then + if [ ! "$GATEWAY" = "" ]; then + DNSSAMPLE="$GATEWAY" + DNSDEFAULT="$GATEWAY" + else + DNSSAMPLE="`echo $IPADDR | cut -f 1-3 -d .`.1" + fi + fi + if [ ! "$IPADDR6" = "" ]; then + if [ ! "$GATEWAY6" = "" ]; then + DNSSAMPLE="$DNSSAMPLE or $GATEWAY6" + # Keep the v4 nameserver the default, for now. + # DNSDEFAULT="$GATEWAY6" + else + DNSSAMPLE="or fe80:426c:ffff::1" + fi fi while [ "$NAMESERVER" = "" ]; do - cat << EOF > $TMP/tempmsg -Here is your current IP address, full hostname, and base hostname: -$IPADDR $HOSTNM.$DOMAIN $HOSTNM - -Please give the IP address of the name server to use, -such as $DNSSAMPLE. + dialog --title "ENTER NAMESERVER IP ADDRESS" --inputbox \ +"Please give the IP address of the name server to use, such as + $DNSSAMPLE +You can add more Domain Name Servers later by editing + /$RESOLV. -You can add more Domain Name Servers later by editing /$RESOLV. - -Primary name server to use (aaa.bbb.ccc.ddd): -EOF - dialog --title "SELECT NAMESERVER" --inputbox \ -"`cat $TMP/tempmsg`" 17 72 $DNSSAMPLE 2> $TMP/SeTns +Primary name server to use:" 13 65 $DNSDEFAULT 2> $TMP/SeTns if [ $? = 1 -o $? = 255 ]; then - rm -f $TMP/tempmsg $TMP/SeTns + rm -f $TMP/SeTns break fi NAMESERVER="`cat $TMP/SeTns`" - rm -f $TMP/tempmsg $TMP/SeTns + rm -f $TMP/SeTns done fi fi @@ -624,7 +886,7 @@ system is now configured to use loopback: IP address: 127.0.0.1 Netmask: 255.255.255.0 -Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 0 0 +Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 10 70 RETVAL=$? elif [ "$LOOPBACK" = "yes" -a "$NETWORKMANAGER" = "yes" ]; then dialog --title "NETWORK SETUP COMPLETE" --yesno "Your networking \ @@ -633,24 +895,29 @@ wired and wireless network management. To set up wireless networks and view status, add the Network Management control panel widget to your KDE desktop. -Is this correct? Press 'Yes' to confirm, or 'No' to reconfigure." 0 0 +Is this correct? Press 'Yes' to confirm, or 'No' to reconfigure." 10 71 RETVAL=$? -elif [ "$USE_DHCP" = "" ]; then +elif [ "$USE_SLAAC" = "yes" ]; then + dialog --title "NETWORK SETUP COMPLETE" --yesno \ +"Your system is now set up to autoconfigure an IPv6 IP address. +If this is correct, hit 'Yes' to confirm, or 'No' to cancel." 6 66 +RETVAL=$? +elif [ "$USE_DHCP" = "" -a "$USE_DHCP6" = "" ]; then while [ 0 ]; do dialog --title "CONFIRM NETWORK SETUP" \ ---ok-label Accept \ ---extra-label Edit \ ---cancel-label Restart \ ---inputmenu \ +--ok-label Accept --extra-label Edit --cancel-label Restart --inputmenu \ "These are the settings you have entered. To accept them and complete \ -the networking setup, press enter. If you need to make any changes, you \ -can do that now (or reconfigure later using 'netconfig')." \ -22 60 12 \ +the networking setup, press ENTER. If you need to make any changes, you \ +can do that now using 'Edit' (or reconfigure later using 'netconfig')." \ +24 75 15 \ "Hostname:" "$HOSTNM" \ -"Domain name:" "$DOMAIN" \ -"IP address:" "$IPADDR" \ -"Netmask:" "$NETMASK" \ -"Gateway:" "$GATEWAY" \ +"Domain Name:" "$DOMAIN" \ +"IPv4 Address:" "$IPADDR" \ +"IPv4 Netmask:" "$NETMASK" \ +"IPv4 Gateway:" "$GATEWAY" \ +"IPv6 Address:" "$IPADDR6" \ +"IPv6 Prefix:" "$PREFIX6" \ +"IPv6 Gateway:" "$GATEWAY6" \ "Nameserver:" "$NAMESERVER" 2> $TMP/tempmsg RETVAL=$? if [ "$RETVAL" = "3" ]; then @@ -658,14 +925,20 @@ can do that now (or reconfigure later using 'netconfig')." \ NEWVAL=`cat $TMP/tempmsg | cut -f 2 -d : | cut -f 2- -d ' '` if [ "$FIELD" = "Hostname" ]; then HOSTNM=$NEWVAL - elif [ "$FIELD" = "Domain name" ]; then + elif [ "$FIELD" = "Domain Name" ]; then DOMAIN=$NEWVAL - elif [ "$FIELD" = "IP address" ]; then + elif [ "$FIELD" = "IPv4 Address" ]; then IPADDR=$NEWVAL - elif [ "$FIELD" = "Netmask" ]; then + elif [ "$FIELD" = "IPv4 Netmask" ]; then NETMASK=$NEWVAL - elif [ "$FIELD" = "Gateway" ]; then + elif [ "$FIELD" = "IPv4 Gateway" ]; then GATEWAY=$NEWVAL + elif [ "$FIELD" = "IPv6 Address" ]; then + IPADDR6=$NEWVAL + elif [ "$FIELD" = "IPv6 Prefix" ]; then + PREFIX6=$NEWVAL + elif [ "$FIELD" = "IPv6 Gateway" ]; then + GATEWAY6=$NEWVAL elif [ "$FIELD" = "Nameserver" ]; then NAMESERVER=$NEWVAL fi @@ -674,17 +947,18 @@ can do that now (or reconfigure later using 'netconfig')." \ fi done else # DHCP was used - dialog --title "CONFIRM SETUP COMPLETE" \ + dialog --title "CONFIRM NETWORK SETUP" \ --yesno "Your networking system is now configured to use DHCP: - Hostname: $HOSTNM + Hostname: $HOSTNM Domain name: $DOMAIN - IP address: (use DHCP server) - Netmask: (use DHCP server) - Gateway: (use DHCP server) - Nameserver: (use DHCP server) + DHCP hostname: $DHCP_HOSTNAME + IP addresses: (use DHCP server) + Netmask & Prefix: (use DHCP server) + Gateways: (use DHCP server) + Nameserver: (use DHCP server) -Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 0 0 +Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 15 76 RETVAL=$? fi @@ -709,4 +983,3 @@ else fi exit $RETVAL - diff --git a/source/n/network-scripts/scripts/rc.inet1 b/source/n/network-scripts/scripts/rc.inet1 index 59f89eda..f63f93ed 100644 --- a/source/n/network-scripts/scripts/rc.inet1 +++ b/source/n/network-scripts/scripts/rc.inet1 @@ -15,17 +15,20 @@ # LOGGING # ########### -# If possible, log events in /var/log/messages: -if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then - LOGGER=/usr/bin/logger -else # output to stdout/stderr: - LOGGER=/bin/cat -fi +# Message logging. +info_log() { + # If possible, log events in /var/log/messages: + if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then + /usr/bin/logger -t "rc.inet1" --id="$$" "$*" + else + printf "%s: %s\\n" "rc.inet1" "$*" + fi +} -# Handy wrapper for verbose logging: +# Verbose logging. debug_log() { if [ "$DEBUG_ETH_UP" = "yes" ]; then - echo "/etc/rc.d/rc.inet1: $*" | $LOGGER + info_log "$*" fi } @@ -46,22 +49,56 @@ do IFNAME[$i]=${IFNAME[$i]:=eth${i}} i=$(($i+1)) done -debug_log "List of interfaces: '${IFNAME[*]}'" +debug_log "List of interfaces: ${IFNAME[*]}" + +#################### +# PRE-LOAD MODULES # +#################### + +for i in "${IFNAME[@]}"; do + # If the interface isn't in the kernel yet (but there's an alias for it in modules.conf), + # then it should be loaded first: + if [ ! -e /sys/class/net/${i%%[:.]*} ]; then # no interface yet + if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${i%%[:.]*}" | grep -vw "alias ${i%%[:.]*} off" >/dev/null; then + debug_log "/sbin/modprobe ${i%%[:.]*}" + /sbin/modprobe ${i%%[:.]*} + _DID_MODPROBE=1 + fi + fi +done +# Normally the ipv6 module would be automatically loaded when the first IP is assigned to an +# interface (assuming ipv6 has not been disabled entirely), but autoconf/accept_ra need to be +# set to 0 before that happens, so try to pre-load ipv6 here. +if [ ! -e /proc/sys/net/ipv6 ]; then + debug_log "/sbin/modprobe ipv6" + /sbin/modprobe -q ipv6 + _DID_MODPROBE=1 +fi +# If we did any module loading in the blocks above, sleep for a couple of +# seconds to give time for everything to "take" +[ -n "${_DID_MODPROBE}" ] && sleep 2 +unset _DID_MODPROBE ###################### # LOOPBACK FUNCTIONS # ###################### -# Function to bring up the loopback interface. If loopback is +# Function to bring up the loopback interface. If loopback is # already up, do nothing. lo_up() { if [ -e /sys/class/net/lo ]; then if ! /sbin/ip link show dev lo | grep -wq -e "state UP" -e "state UNKNOWN" ; then - echo "/etc/rc.d/rc.inet1: /sbin/ip address add 127.0.0.1/8 dev lo" | $LOGGER - /sbin/ip address add 127.0.0.1/8 dev lo + info_log "lo: configuring interface" + debug_log "/sbin/ip -4 address add 127.0.0.1/8 dev lo" + /sbin/ip -4 address add 127.0.0.1/8 dev lo + if [ -e /proc/sys/net/ipv6 ]; then + debug_log "/sbin/ip -6 address add ::1/128 dev lo" + /sbin/ip -6 address add ::1/128 dev lo + fi + debug_log "/sbin/ip link set dev lo up" /sbin/ip link set dev lo up - echo "/etc/rc.d/rc.inet1: /sbin/ip route add 127.0.0.0/8 dev lo" | $LOGGER - /sbin/ip route add 127.0.0.0/8 dev lo + debug_log "/sbin/ip route add 127.0.0.0/8 dev lo" + /sbin/ip route add 127.0.0.0/8 dev lo fi fi } @@ -69,7 +106,10 @@ lo_up() { # Function to take down the loopback interface: lo_down() { if [ -e /sys/class/net/lo ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev lo down" | $LOGGER + info_log "lo: de-configuring interface" + debug_log "/sbin/ip address flush dev lo" + /sbin/ip address flush dev lo + debug_log "/sbin/ip link set dev lo down" /sbin/ip link set dev lo down fi } @@ -78,20 +118,24 @@ lo_down() { # INTERFACE FUNCTIONS # ####################### -# Function to create virtual interfaces. +# Function to create virtual interfaces virtif_create() { # argument is 'i' - the position of this interface in the VIRTIFNAME array. # this loop goes from i=0 to i=number_of_configured_virtual_interfaces_minus_one # which means it doesn't do anything if there are none. for i in $(seq 0 $((${#VIRTIFNAME[@]} - 1))); do + info_log "${VIRTIFNAME[$i]}: creating virtual interface" + debug_log "/sbin/ip tuntap add dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} user ${VIRTIFUSER[$i]} group ${VIRTIFGROUP[$i]}" /sbin/ip tuntap add dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} user ${VIRTIFUSER[$i]} group ${VIRTIFGROUP[$i]} done } -# Function to destroy virtual interfaces. +# Function to destory virtual interfaces virtif_destroy() { # argument is 'i' - the position of this interface in the VIRTIFNAME array. for i in $(seq 0 $((${#VIRTIFNAME[@]} - 1))); do + info_log "${VIRTIFNAME[$i]}: destroying virtual interface" + debug_log "/sbin/ip tuntap del dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]}" /sbin/ip tuntap del dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} done } @@ -99,30 +143,91 @@ virtif_destroy() { # Function to assemble a bridge interface. br_open() { # argument is 'i' - the position of this interface in the IFNAME array. + info_log "${IFNAME[$1]}: creating bridge" + debug_log "/sbin/ip link add name ${IFNAME[$1]} type bridge" /sbin/ip link add name ${IFNAME[$1]} type bridge for BRIF in ${BRNICS[$1]}; do - /sbin/ip link set dev $BRIF down - /sbin/ip address add 0.0.0.0 dev $BRIF + debug_log "/sbin/ip address flush dev $BRIF" + /sbin/ip address flush dev $BRIF + debug_log "/sbin/ip link set dev $BRIF master ${IFNAME[$1]}" /sbin/ip link set dev $BRIF master ${IFNAME[$1]} + debug_log "/sbin/ip link set dev $BRIF up" /sbin/ip link set dev $BRIF up done + while read -r -d \| IFOPT; do + if [ -n "$IFOPT" ]; then + debug_log "/sbin/ip link set dev ${IFNAME[$1]} type bridge $IFOPT" + /sbin/ip link set dev ${IFNAME[$1]} type bridge $IFOPT + fi + done <<<"${IFOPTS[$i]}|" # The | on the end is required. + debug_log "/sbin/ip link set dev ${IFNAME[$1]} up" /sbin/ip link set dev ${IFNAME[$1]} up } # Function to disassemble a bridge interface. br_close() { - /sbin/ip link set dev ${IFNAME[$1]} down # argument is 'i' - the position of this interface in the IFNAME array. - #for BRIF in ${BRNICS[$1]}; do + info_log "${IFNAME[$1]}: destroying bridge" + debug_log "/sbin/ip link set dev ${IFNAME[$1]} down" + /sbin/ip link set dev ${IFNAME[$1]} down for BRIF in $(ls --indicator-style=none /sys/class/net/${IFNAME[$1]}/brif/) do + debug_log "/sbin/ip link set dev $BRIF nomaster" /sbin/ip link set dev $BRIF nomaster done - /sbin/ip link set dev ${IFNAME[$1]} down + for BRIF in ${BRNICS[$1]}; do + debug_log "/sbin/ip link set dev $BRIF down" + /sbin/ip link set dev $BRIF down + done + debug_log "/sbin/ip link del ${IFNAME[$1]}" /sbin/ip link del ${IFNAME[$1]} } -# Function to bring up a network interface. If the interface is +# Function to create a bond. +bond_create() { + # Argument is 'i' - the position of this interface in the IFNAME array. + info_log "${IFNAME[$1]}: creating bond" + debug_log "/sbin/ip link add name ${IFNAME[$1]} type bond" + /sbin/ip link add name ${IFNAME[$1]} type bond + debug_log "/sbin/ip link set dev ${IFNAME[$1]} type bond mode ${BONDMODE[$1]:-balance-rr}" + /sbin/ip link set dev ${IFNAME[$1]} type bond mode ${BONDMODE[$1]:-balance-rr} + for BONDIF in ${BONDNICS[$1]}; do + debug_log "/sbin/ip address flush dev $BONDIF" + /sbin/ip address flush dev $BONDIF + debug_log "/sbin/ip link set $BONDIF master ${IFNAME[$1]}" + /sbin/ip link set $BONDIF master ${IFNAME[$1]} + debug_log "/sbin/ip link set dev $BONDIF up" + /sbin/ip link set dev $BONDIF up + done + # This has to be done *after* the interface is brought up because the + # 'primary ' option has to occur after the interface is active. + while read -r -d \| IFOPT; do + if [ -n "$IFOPT" ]; then + debug_log "/sbin/ip link set dev ${IFNAME[$1]} type bond $IFOPT" + /sbin/ip link set dev ${IFNAME[$1]} type bond $IFOPT + fi + done <<<"${IFOPTS[$1]}|" # The | on the end is required. +} + +# Function to destroy a bond. +bond_destroy() { + # Argument is 'i' - the position of this interface in the IFNAME array. + info_log "${IFNAME[$1]}: destroying bond" + debug_log "/sbin/ip link set dev ${IFNAME[$1]} down" + /sbin/ip link set dev ${IFNAME[$1]} down + debug_log "/sbin/ip address flush dev ${IFNAME[$1]}" + /sbin/ip address flush dev ${IFNAME[$1]} + for BONDIF in ${BONDNICS[$1]}; do + debug_log "/sbin/ip link set $BONDIF nomaster" + /sbin/ip link set $BONDIF nomaster + debug_log "/sbin/ip link set dev $BONDIF down" + /sbin/ip link set dev $BONDIF down + done + debug_log "/sbin/ip link del name ${IFNAME[$1]} type bond" + /sbin/ip link del name ${IFNAME[$1]} type bond +} + +# Function to bring up a network interface. If the interface is # already up or does not yet exist (perhaps because the kernel driver # is not loaded yet), do nothing. if_up() { @@ -133,126 +238,265 @@ if_up() { i=$(($i+1)) done # If "i" is greater or equal to "MAXNICS" at this point, it means we didn't - # find an entry in IFNAME array corresponding to "$1", which likely means + # find an entry in IFNAME array corresponding to "${1}", which likely means # there are more interfaces configured than MAXNICS. Let's err on the # side of caution and do nothing instead of possibly doing the wrong thing. if [ $i -ge $MAXNICS ]; then - echo "/etc/rc.d/rc.inet1: skipping ${1}, you might need to increase MAXNICS" | $LOGGER + info_log "${1}: skipping - you might need to increase MAXNICS" return fi - # If the interface is a bridge, then create it first: + info_log "${1}: configuring interface" + # If you need to set hardware addresses for the underlying interfaces in a + # bond or bridge, configure the interfaces with IPs of 0.0.0.0 and set the + # MAC address with HWADDR. Then, finally, define the bond or bridge. + # If the interface is a bond, create it. + [ -n "${BONDNICS[$i]}" ] && bond_create $i + # If the interface is a bridge, create it. [ -n "${BRNICS[$i]}" ] && br_open $i - # If the interface isn't in the kernel yet (but there's an alias for it in - # modules.conf), then it should be loaded first: - if [ -z "${IPADDR[$i]}" ] && [ "${USE_DHCP[$i]}" != "yes" ]; then # skip unconfigured interfaces - debug_log "skipping ${1} early, interface is not configured in /etc/rc.d/rc.inet1.conf" - return 0 - fi - if [ ! -e /sys/class/net/${1%%:*} ]; then # no interface yet - if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${1}" | grep -vw "alias ${1} off" > /dev/null ; then - echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${1}" | $LOGGER - /sbin/modprobe ${1} - fi - fi - if [ -e /sys/class/net/${1%%:*} ]; then # interface exists - if ! /sbin/ip address show dev ${1} 2>/dev/null | grep -wq inet || \ - ! /sbin/ip link show dev ${1} | grep -wq "state UP" ; then # interface not up or not configured - if [ -n "${HWADDR[$i]}" ]; then # Set hardware address _before_ the interface goes up: - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} address ${HWADDR[$i]}" | $LOGGER - /sbin/ip link set dev ${1} address ${HWADDR[$i]} + if [ -e /sys/class/net/${1%%[:.]*} ]; then # interface exists + if ! /sbin/ip address show scope global dev ${1} 2>/dev/null | grep -Ewq '(inet|inet6)' || \ + ! /sbin/ip link show dev ${1} | grep -wq "state UP"; then # interface not up or not configured + local IF_UP=0 + # Initialize any wireless parameters: + if [ -x /etc/rc.d/rc.wireless ]; then + . /etc/rc.d/rc.wireless ${1} start fi - if [ -n "${MTU[$i]}" ]; then # Set MTU to something else than 1500 - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} mtu ${MTU[$i]}" | $LOGGER - /sbin/ip link set dev ${1} mtu ${MTU[$i]} + # Handle VLAN interfaces before trying to configure IP addresses. + if echo "${1}" | grep -Fq .; then + IFACE="${1%.*}" + VLAN="${1##*.}" + # Check if the underlying interface is already up. + if ! /sbin/ip link show dev $IFACE 2>/dev/null| grep -wq "state UP"; then + # Bring up the underlying interface. + debug_log "/sbin/ip link set dev $IFACE up" + if ! /sbin/ip link set dev $IFACE up; then + info_log "${1}: failed to bring up interface $IFACE" + return + fi + IF_UP=1 + fi + # Configure the VLAN interface. + info_log "${1}: creating VLAN interface" + debug_log "/sbin/ip link add link $IFACE name ${1} type vlan id $VLAN" + if ! /sbin/ip link add link $IFACE name ${1} type vlan id $VLAN; then + info_log "${1}: failed to create VLAN interface" + ((IF_UP == 1)) && /sbin/ip link set dev $IFACE down + return + fi + while read -r -d \| IFOPT; do + if [ -n "$IFOPT" ]; then + debug_log "/sbin/ip link set dev ${1} type vlan $IFOPT" + /sbin/ip link set dev ${1} type vlan $IFOPT + fi + done <<<"${IFOPTS[$i]}|" # The | on the end is required. + elif [ -z "${BONDNICS[$i]}" ] && [ -z "${BRNICS[$i]}" ]; then + # Only apply IFOPTS for a physical interface if it's not been handled + # by a higher level interface. + while read -r -d \| IFOPT; do + if [ -n "$IFOPT" ]; then + debug_log "/sbin/ip link set dev ${1} $IFOPT" + /sbin/ip link set dev ${1} $IFOPT + fi + done <<<"${IFOPTS[$i]}|" # The | on the end is required. fi - if /sbin/ip link show dev ${1} | grep -wq "state DOWN" ; then - /sbin/ip link set dev ${1} up # Bring up interface + # Set hardware address: + if [ -n "${HWADDR[$i]}" ]; then + debug_log "/sbin/ip link set dev ${1} address ${HWADDR[$i]}" + if ! /sbin/ip link set dev ${1} address ${HWADDR[$i]} 2>/dev/null; then + info_log "${1}: failed to set hardware address" + fi fi - if [ -x /etc/rc.d/rc.wireless ]; then - . /etc/rc.d/rc.wireless ${1} start # Initialize any wireless parameters + if [ -e /proc/sys/net/ipv6 ]; then # ipv6 networking is available + # Disable v6 IP auto configuration before trying to bring up the interface: + debug_log "${1}: disabling IPv6 autoconf" + echo "0" >/proc/sys/net/ipv6/conf/${1}/autoconf + if [ "${USE_RA[$i]}" = "yes" ]; then + # Unconditionally accept router advertisements on this interface: + debug_log "${1}: accepting IPv6 RA" + echo "1" >/proc/sys/net/ipv6/conf/${1}/accept_ra + else + # Disable router advertisments on this interface until SLAAC is enabled: + debug_log "${1}: ignoring IPv6 RA" + echo "0" >/proc/sys/net/ipv6/conf/${1}/accept_ra + fi fi - if [ "${USE_DHCP[$i]}" = "yes" ]; then # use DHCP to bring interface up - # Clear DHCP_OPTIONS before adding new options to it: - unset DHCP_OPTIONS + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + IF_UP=0 + # Slackware historically favours dynamic configuration over fixed IP to configure interfaces, so keep that tradition: + if [ "${USE_DHCP[$i]}" = "yes" ] || { [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" = "yes" ]; }; then # use dhcpcd + info_log "${1}: starting dhcpcd" + # Declare DHCP_OPTIONS array before adding new options to it: + local -a DHCP_OPTIONS=() # Set DHCP_OPTIONS for this interface: - [ -n "${DHCP_HOSTNAME[$i]}" ] && DHCP_OPTIONS="-h ${DHCP_HOSTNAME[$i]}" - [ "${DHCP_KEEPRESOLV[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf" - [ "${DHCP_KEEPNTP[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C ntp.conf" - [ "${DHCP_KEEPGW[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -G" - [ "${DHCP_DEBUG[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -d" - [ "${DHCP_NOIPV4LL[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -L" - [ -n "${DHCP_IPADDR[$i]}" ] && DHCP_OPTIONS="$DHCP_OPTIONS -r ${DHCP_IPADDR[$i]}" - echo "Polling for DHCP server on interface ${1}:" - # If you set a timeout, you get one, even if the kernel doesn't think that - # your device is connected, in case /sys isn't right (which it usually isn't - # except right after the device is loaded, when it usually is): - #### (start commented out) - # This is deactivated for now since the kernel has been returning incorrect - # results concerning whether the interface carrier is detected. - #if [ -z "${DHCP_TIMEOUT[$i]}" ]; then - # /sbin/ip link set dev ${1} up && sleep 1 - # CONNSTATUS="$(cat /sys/class/net/${1}/carrier 2> /dev/null)" - # /sbin/ip link set dev ${1} down - # if [ "$CONNSTATUS" = "0" ]; then - # # The kernel has just told us the cable isn't even plugged in, but we will - # # give any DHCP server a short chance to reply anyway: - # echo "No carrier detected on ${1}. Reducing DHCP timeout to 15 seconds." - # DHCP_TIMEOUT[$i]=15 - # fi - #fi - #### (end commented out) - # 15 seconds should be a reasonable default DHCP timeout. 30 was too much. - echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -L -t ${DHCP_TIMEOUT[$i]:-15} ${DHCP_OPTIONS} ${1}" | $LOGGER - /sbin/dhcpcd -L -t ${DHCP_TIMEOUT[$i]:-15} ${DHCP_OPTIONS} ${1} - if [ "$?" == "0" ]; then # the dhcp call has succeeded - if [ -n "${IPALIASES[$i]}" ]; then - # Add extra IP addresses, if defined, to interface - num=0 - for ipalias in ${IPALIASES[$i]}; do - ip="${ipalias%/*}" - nm="${ipalias#*/}" - [ -z "$nm" ] || [ "$ip" == "$nm" ] && nm="32" - /sbin/ip address add ${ip}/${nm} dev ${1} label ${1}:${num} - num=$(($num + 1)) - done + if [ -e /proc/sys/net/ipv6 ]; then + if [ "${USE_DHCP[$i]}" = "yes" ] && [ "${USE_DHCP6[$i]}" != "yes" ]; then # only try v4 dhcp + DHCP_OPTIONS+=("-4") + elif [ "${USE_DHCP[$i]}" != "yes" ] && [ "${USE_DHCP6[$i]}" = "yes" ]; then # only try v6 dhcp + DHCP_OPTIONS+=("-6") fi - if [ "${PROMISCUOUS[$i]}" = "yes" ]; then - # Set promiscuous mode on the interface - /sbin/ip link set dev ${1} promisc on + else + DHCP_OPTIONS+=("-4") + fi + [ -n "${DHCP_HOSTNAME[$i]}" ] && DHCP_OPTIONS+=("-h" "${DHCP_HOSTNAME[$i]}") + [ "${DHCP_KEEPRESOLV[$i]}" = "yes" ] && DHCP_OPTIONS+=("-C" "resolv.conf") + [ "${DHCP_KEEPNTP[$i]}" = "yes" ] && DHCP_OPTIONS+=("-C" "ntp.conf") + [ "${DHCP_KEEPGW[$i]}" = "yes" ] && DHCP_OPTIONS+=("-G") + [ "${DHCP_DEBUG[$i]}" = "yes" ] && DHCP_OPTIONS+=("-d") + # The -L option used to be hard coded into the dhcpcd command line in -current. It was added to assist ARM users + # get networking up and running. Previous versions of Slackware did not have -L hard coded - the code here keeps + # the 14.2 behaviour, but can be altered to make the use of -L default as in -current. To change the behaviour, + # alter the test below to be: [ "${DHCP_NOIPV4LL[$i]}" != "no" ]. + # Note: ARM users should make use of the DHCP_NOIPV4LL[x]="yes" parameter in rc.inet1.conf - this is the correct + # way to get the behaviour they seek. + [ "${DHCP_NOIPV4LL[$i]}" = "yes" ] && DHCP_OPTIONS+=("-L") + [ -n "${DHCP_IPADDR[$i]}" ] && DHCP_OPTIONS+=("-r" "${DHCP_IPADDR[$i]}") + echo "${1}: polling for DHCP server" + # 15 seconds should be a reasonable default DHCP timeout. 30 was too much. + debug_log "/sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-15} ${DHCP_OPTIONS[*]} ${1}" + if /sbin/dhcpcd -t "${DHCP_TIMEOUT[$i]:-15}" "${DHCP_OPTIONS[@]}" ${1}; then + # Enable accepting of RA packets if explicitly told to: + if [ -e /proc/sys/net/ipv6 ] && [ "${USE_RA[$i]}" = "yes" ]; then + debug_log "${1}: unconditionally accepting IPv6 RA" + echo "1" >/proc/sys/net/ipv6/conf/${1}/accept_ra fi + IF_UP=1 + else + info_log "${1}: failed to obtain DHCP lease" + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down + fi + fi + if [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" != "yes" ] && [ "${USE_SLAAC[$i]}" = "yes" ]; then # configure via SLAAC + info_log "${1}: enabling SLAAC" + # Enable accepting of RA packets, unless explicitly configured not to: + if [ "${USE_RA[$i]}" = "no" ]; then + debug_log "${1}: ignoring IPv6 RA" + echo "0" >/proc/sys/net/ipv6/conf/${1}/accept_ra + else + debug_log "${1}: accepting IPv6 RA" + echo "1" >/proc/sys/net/ipv6/conf/${1}/accept_ra + fi + # Enable auto configuration of interfaces: + echo "1" >/proc/sys/net/ipv6/conf/${1}/autoconf + # Bring the interface up: + debug_log "/sbin/ip link set dev ${1} up" + /sbin/ip link set dev ${1} up + echo "${1}: waiting for router announcement" + for ((j = ${SLAAC_TIMEOUT[$i]:=15} * 2; j--;)); do # by default, wait a max of 15 seconds for the interface to configure + /sbin/ip -6 address show dynamic dev ${1} 2>/dev/null | grep -Ewq 'inet6' && { IF_UP=1; break; } + sleep 0.5 + done + if (($IF_UP != 1)); then + echo "${1}: timed out" + info_log "${1}: failed to auto configure after ${SLAAC_TIMEOUT[$i]} seconds" + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down fi - else # bring up interface using a static IP address - if [ -n "${IPADDR[$i]}" ]; then # skip unconfigured interfaces - # Set up the network card: - echo "/etc/rc.d/rc.inet1: /sbin/ip address add ${IPADDR[$i]}/${NETMASK[$i]} broadcast + dev ${1}" | $LOGGER - /sbin/ip address add ${IPADDR[$i]}/${NETMASK[$i]} broadcast + dev ${1} - if /sbin/ip link show dev ${1} | grep -wq "state DOWN" ; then - /sbin/ip link set dev ${1} up # Bring up interface + fi + if [ "${USE_DHCP[$i]}" != "yes" ] && [ -n "${IPADDR[$i]}" ]; then # add a fixed v4 IP to the interface + info_log "${1}: setting fixed IPv4 address" + if [ -z "${NETMASK[$i]}" ]; then + info_log "${1}: no NETMASK set for primary IP ${IPADDR[$i]} - assuming 24 (aka, 255.255.255.0)" + NETMASK[$i]="24" + fi + debug_log "/sbin/ip -4 address add ${IPADDR[$i]}/${NETMASK[$i]#/} broadcast + dev ${1}" + if /sbin/ip -4 address add ${IPADDR[$i]}/${NETMASK[$i]#/} broadcast + dev ${1} && \ + /sbin/ip link set dev ${1} up; then + IF_UP=1 + else + info_log "${1}: failed to set IP ${IPADDR[$i]}" + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down + fi + fi + if [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" != "yes" ] && [ "${USE_SLAAC[$i]}" != "yes" ] && \ + [ -n "${IP6ADDRS[$i]}" ]; then # add fixed v6 IPs + info_log "${1}: setting fixed IPv6 addresses" + # IPv6's Duplicate Address Detection (DAD) causes a race condition when bringing up interfaces, as + # described here: https://www.agwa.name/blog/post/beware_the_ipv6_dad_race_condition + # Disable DAD while bringing up the interface - but note that this means the loss of detection of a + # duplicate address. It's a trade off, unfortunately. + debug_log "${1}: disabling IPv6 DAD" + echo "0" >/proc/sys/net/ipv6/conf/${1}/accept_dad + for V6IP in ${IP6ADDRS[$i]}; do + IP="${V6IP%/*}" + PREFIX="${V6IP#*/}" + if [ -z "$PREFIX" ] || [ "$IP" == "$PREFIX" ]; then + info_log "${1}: no prefix length set for IP $IP - assuming 64" + PREFIX="64" fi - # Add extra IP addresses, if defined, to interface - if [ -n "${IPALIASES[$i]}" ]; then - num=0 - for ipalias in ${IPALIASES[$i]}; do - ip="${ipalias%/*}" - nm="${ipalias#*/}" - [ -z "$nm" ] || [ "$ip" == "$nm" ] && nm="32" - /sbin/ip address add ${ip}/${nm} dev ${1} label ${1}:${num} - num=$(($num + 1)) - done + debug_log "/sbin/ip -6 address add $IP/$PREFIX dev ${1}" + if /sbin/ip -6 address add $IP/$PREFIX dev ${1} && \ + /sbin/ip link set dev ${1} up; then + # Enable accepting of RA packets if explicitly told to. + if [ "${USE_RA[$i]}" = "yes" ]; then + debug_log "${1}: unconditionally accepting IPv6 RA" + echo "1" >/proc/sys/net/ipv6/conf/${1}/accept_ra + fi + IF_UP=1 + else + info_log "${1}: failed to set IP $IP" + if (($IF_UP != 1)); then # a v4 address was configured, don't flush it + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down + fi fi - if [ "${PROMISCUOUS[$i]}" = "yes" ]; then - # Set promiscuous mode on the interface - /sbin/ip link set dev ${1} promisc on + done + # Reset accept_dad back to default now all the IPs are configured: + debug_log "${1}: resetting IPv6 DAD to default" + cat /proc/sys/net/ipv6/conf/default/accept_dad >/proc/sys/net/ipv6/conf/${1}/accept_dad + fi + if (($IF_UP == 1)); then # only do further config if the interface came up + info_log "${1}: setting fixed IPv4 alias addresses" + # Add extra IPv4 addresses to the interface: + if [ -n "${IPALIASES[$i]}" ]; then + NUM=0 + for IPALIAS in ${IPALIASES[$i]}; do + IP="${IPALIAS%/*}" + NM="${IPALIAS#*/}" + if [ -z "$NM" ] || [ "$IP" == "$NM" ]; then + info_log "${1}: no netmask set for alias IP $IP - assuming 24 (aka, 255.255.255.0)" + NM="24" + fi + debug_log "/sbin/ip -4 address add $IP/$NM broadcast + dev ${1} label ${1}:$NUM" + if /sbin/ip -4 address add $IP/$NM broadcast + dev ${1} label ${1}:$NUM; then + NUM=$(($NUM + 1)) + else + info_log "${1}: failed to add alias IP $IP" + fi + done + fi + # Force an MTU (possibly over-riding that set by DHCP or RA): + if [ -n "${MTU[$i]}" ]; then + info_log "${1}: setting custom MTU" + debug_log "/sbin/ip link set dev ${1} mtu ${MTU[$i]}" + if ! /sbin/ip link set dev ${1} mtu ${MTU[$i]}; then + info_log "${1}: failed to set MTU" + fi + fi + # Set promiscuous mode on the interface: + if [ "${PROMISCUOUS[$i]}" = "yes" ]; then + info_log "${1}: setting promiscuous mode" + debug_log "/sbin/ip link set dev ${1} promisc on" + if ! /sbin/ip link set dev ${1} promisc on; then + info_log "${1}: failed to set promiscuous mode" fi - else - debug_log "${1} interface is not configured in /etc/rc.d/rc.inet1.conf" fi fi else - debug_log "${1} is already up, skipping" - fi + debug_log "${1}: skipping configuration - already up" + fi else - debug_log "${1} interface does not exist (yet)" + debug_log "${1}: skipping configuration - does not exist (yet)" fi } @@ -265,27 +509,61 @@ if_down() { i=$(($i+1)) done if [ $i -ge $MAXNICS ]; then - echo "/etc/rc.d/rc.inet1: skipping ${1}, you might need to increase MAXNICS" | $LOGGER + info_log "${1}: skipping - you might need to increase MAXNICS" return fi - if [ -e /sys/class/net/${1%%:*} ]; then - if [ "${USE_DHCP[$i]}" = "yes" ]; then - echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER - /sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ip link set dev ${1} down - sleep 1 - else - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} down" | $LOGGER - /sbin/ip link set dev ${1} down + info_log "${1}: de-configuring interface" + if [ -e /sys/class/net/${1} ]; then + if [ "${USE_DHCP[$i]}" = "yes" ] || [ "${USE_DHCP6[$i]}" = "yes" ]; then # take down dhcpcd + info_log "${1}: stopping dhcpcd" + # When using -k, dhcpcd requires some command line options to match those used to invoke it: + if [ "${USE_DHCP[$i]}" = "yes" ] && [ "${USE_DHCP6[$i]}" != "yes" ]; then # only v4 dhcp + DHCP_OPTIONS="-4" + elif [ "${USE_DHCP[$i]}" != "yes" ] && [ "${USE_DHCP6[$i]}" = "yes" ]; then # only v6 dhcp + DHCP_OPTIONS="-6" + fi + debug_log "/sbin/dhcpcd $DHCP_OPTIONS -k -d ${1}" + /sbin/dhcpcd $DHCP_OPTIONS -k -d ${1} 2>/dev/null || info_log "${1}: failed to stop dhcpcd" fi - if [ -x /etc/rc.d/rc.wireless ]; then - . /etc/rc.d/rc.wireless ${1} stop # Kill wireless daemons if any. + # Disable v6 IP auto configuration and RA before trying to clear the IP from the interface: + if [ -e /proc/sys/net/ipv6 ]; then + debug_log "${1}: disabling IPv6 autoconf and RA" + echo "0" >/proc/sys/net/ipv6/conf/${1}/autoconf + echo "0" >/proc/sys/net/ipv6/conf/${1}/accept_ra + fi + sleep 0.5 # allow time for DHCP/RA to unconfigure the interface + # Flush any remaining IPs: + debug_log "/sbin/ip address flush dev ${1}" + /sbin/ip address flush dev ${1} + # Bring the interface down: + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down + # Reset autoconf and accept_ra back to defaults: + if [ -e /proc/sys/net/ipv6 ]; then + debug_log "${1}: resetting IPv6 autoconf and RA to defaults" + cat /proc/sys/net/ipv6/conf/default/autoconf >/proc/sys/net/ipv6/conf/${1}/autoconf + cat /proc/sys/net/ipv6/conf/default/accept_ra >/proc/sys/net/ipv6/conf/${1}/accept_ra fi # If the interface is a bridge, then destroy it now: - if [ -n "${BRNICS[$i]}" ]; then - br_close $i + [ -n "${BRNICS[$i]}" ] && br_close $i + # If the interface is a bond, then destroy it now. + [ -n "${BONDNICS[$i]}" ] && bond_destroy $i + # Take down VLAN interface, if configured. + if echo "${1}" | grep -Fq .; then + info_log "${1}: destroying VLAN interface" + debug_log "/sbin/ip link set dev ${1} down" + /sbin/ip link set dev ${1} down + debug_log "/sbin/ip link delete ${1}" + /sbin/ip link delete ${1} + if ! /sbin/ip address show scope global dev ${1%.*} 2>/dev/null | grep -Ewq '(inet|inet6)'; then + debug_log "/sbin/ip link set dev ${1%.*} down" + /sbin/ip link set dev ${1%.*} down + fi + fi + # Kill wireless daemons if any: + if [ -x /etc/rc.d/rc.wireless ]; then + . /etc/rc.d/rc.wireless ${1} stop fi - # Flush the address from the interface: - ip address flush dev ${1} fi } @@ -295,24 +573,39 @@ if_down() { # Function to bring up the gateway if there is not yet a default route: gateway_up() { - if ! /sbin/ip route show | grep -wq default ; then - if [ -n "$GATEWAY" ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip route add default via ${GATEWAY}" | $LOGGER - /sbin/ip route add default via ${GATEWAY} | $LOGGER + info_log "Configuring gateways" + # Bring up the IPv4 gateway: + if [ -n "$GATEWAY" ]; then + if ! /sbin/ip -4 route show | grep -wq default; then + debug_log "/sbin/ip -4 route add default via ${GATEWAY}" + /sbin/ip -4 route add default via ${GATEWAY} + fi + fi + # Bring up the IPv6 gateway: + if [ -n "$GATEWAY6" ]; then + if ! /sbin/ip -6 route show | grep -wq default; then + debug_log "/sbin/ip -6 route add default via ${GATEWAY6}" + /sbin/ip -6 route add default via ${GATEWAY6} fi fi } # Function to take down an existing default gateway: gateway_down() { - if /sbin/ip route show | grep -wq default ; then - echo "/etc/rc.d/rc.inet1: /sbin/ip route del default" | $LOGGER - /sbin/ip route del default + info_log "De-configuring gateways" + if /sbin/ip -4 route show | grep -wq default ; then + debug_log "/sbin/ip -4 route del default" + /sbin/ip -4 route del default + fi + if /sbin/ip -6 route show | grep -wq default ; then + debug_log "/sbin/ip -6 route del default" + /sbin/ip -6 route del default fi } # Function to start the network: start() { + echo "Starting the network interfaces..." lo_up virtif_create for i in "${IFNAME[@]}" ; do @@ -323,9 +616,10 @@ start() { # Function to stop the network: stop() { + echo "Stopping the network interfaces..." gateway_down - for i in "${IFNAME[@]}" ; do - if_down $i + for (( i = $MAXNICS - 1; i >= 0; i-- )); do + if_down ${IFNAME[$i]} done virtif_destroy lo_down @@ -336,7 +630,7 @@ stop() { ### MAIN ### ############ -case "$1" in +case "${1}" in start|up) # "start" (or "up") brings up all configured interfaces: start ;; @@ -354,16 +648,16 @@ lo_stop|lo_down) # Stop the loopback interface: lo_down ;; *_start|*_up) # Example: "eth1_start" (or "eth1_up") will start the specified interface 'eth1' - INTERFACE=$(echo $1 | /bin/cut -d '_' -f 1) + INTERFACE=$(echo ${1} | /bin/cut -d '_' -f 1) if_up $INTERFACE gateway_up ;; *_stop|*_down) # Example: "eth0_stop" (or "eth0_down") will stop the specified interface 'eth0' - INTERFACE=$(echo $1 | /bin/cut -d '_' -f 1) + INTERFACE=$(echo ${1} | /bin/cut -d '_' -f 1) if_down $INTERFACE ;; *_restart) # Example: "wlan0_restart" will take 'wlan0' down and up again - INTERFACE=$(echo $1 | /bin/cut -d '_' -f 1) + INTERFACE=$(echo ${1} | /bin/cut -d '_' -f 1) if_down $INTERFACE sleep 1 if_up $INTERFACE diff --git a/source/n/network-scripts/scripts/rc.inet1.conf b/source/n/network-scripts/scripts/rc.inet1.conf index 551c4a70..5081ee5b 100644 --- a/source/n/network-scripts/scripts/rc.inet1.conf +++ b/source/n/network-scripts/scripts/rc.inet1.conf @@ -1,86 +1,164 @@ # /etc/rc.d/rc.inet1.conf # # This file contains the configuration settings for network interfaces. +# # If USE_DHCP[interface] is set to "yes", this overrides any other settings. # If you don't have an interface, leave the settings null (""). - +# # You can configure network interfaces other than eth0,eth1... by setting # IFNAME[interface] to the interface's name. If IFNAME[interface] is unset # or empty, it is assumed you're configuring eth. - -# Several other parameters are available, the end of this file contains a +# +# Several other parameters are available; the end of this file contains a # comprehensive set of examples. +# +# Important note for IPv6 stateless auto configuration (SLAAC) users: +# From Slackware 15.0 onwards, you need to set USE_SLAAC[0]="yes" below. # ============================================================================= -# Config information for eth0: +# IPv4 config information for eth0: IPADDR[0]="" NETMASK[0]="" IPALIASES[0]="" USE_DHCP[0]="" DHCP_HOSTNAME[0]="" +# IPv6 config information for eth0: +IP6ADDRS[0]="" +USE_SLAAC[0]="" +USE_DHCP6[0]="" -# Config information for eth1: +# IPv4 config information for eth1: IPADDR[1]="" NETMASK[1]="" IPALIASES[1]="" USE_DHCP[1]="" DHCP_HOSTNAME[1]="" +# IPv6 config information for eth1: +IP6ADDRS[1]="" +USE_SLAAC[1]="" +USE_DHCP6[1]="" -# Config information for eth2: +# IPv4 config information for eth2: IPADDR[2]="" NETMASK[2]="" IPALIASES[2]="" USE_DHCP[2]="" DHCP_HOSTNAME[2]="" +# IPv6 config information for eth2: +IP6ADDRS[2]="" +USE_SLAAC[2]="" +USE_DHCP6[2]="" -# Config information for eth3: +# IPv4 config information for eth3: IPADDR[3]="" NETMASK[3]="" IPALIASES[3]="" USE_DHCP[3]="" DHCP_HOSTNAME[3]="" +# IPv6 config information for eth3: +IP6ADDRS[3]="" +USE_SLAAC[3]="" +USE_DHCP6[3]="" -# Default gateway IP address: +# IPv4 default gateway IP address: GATEWAY="" +# IPv6 default gateway IP address: +GATEWAY6="" -# Change this to "yes" for debugging output to stdout. Unfortunately, -# /sbin/hotplug seems to disable stdout so you'll only see debugging output -# when rc.inet1 is called directly. -DEBUG_ETH_UP="no" +# ============================================================================= + +# Example of how to configure a bond (link aggrigation) interface. +# Note the addition of the BONDNICS and BONDMODE parameters. +# BONDNICS is a space delimited list of interfaces to add to this bond. The +# BONDNICS interfaces will be brought up and configured while bringing up the +# bond interface, so do not need to be previously defined in rc.inet1.conf. +# BONDMODE sets the bonding mode for this interface. If not specified when +# BONDNICS has been used, the default is 'balance-rr'. +# IFOPTS is a pipe (|) delimited list of bonding module specific settings to be +# applied to the interface, and should always include the 'miimon' option when +# configuring bonding - not using this option will result in network +# degradation. In 'active-backup' mode, the 'primary' option should also be +# supplied. When using '802.3ad' mode, set "lacp_rate fast" for faster +# recovery from an interface failure. In other modes, the 'xmit_hash_policy' +# should be set. See the /usr/src/linux/Documentation/networking/bonding.txt +# file (search for "Bonding Driver Options") for the full set of options. +#IFNAME[0]="bond0" +#BONDNICS[0]="eth0 eth1" +#BONDMODE[0]="balance-rr" +#IFOPTS[0]="xmit_hash_policy layer2+3 | miimon 100" +#IPADDR[0]="192.168.0.1" +#NETMASK[0]="24" +#IPALIASES[0]="" +#USE_DHCP[0]="" +#DHCP_HOSTNAME[0]="" +#IP6ADDRS[0]="" +#USE_SLAAC[0]="" +#USE_DHCP6[0]="" + +# ============================================================================= + +# Example of how to configure a VLAN interface: +# The VLAN ID is taken from the full interface name, which is comprised of the +# underlying interface name, a period (.) and then the VLAN ID. +# IFOPTS is a pipe (|) delimited list of VLAN module specific settings to be +# applied to the interface. See the ip-link(8) man page (search for "VLAN Type +# Support") for details of the options available. This option is not required +# for a standard VLAN to be configured. +#IFNAME[0]="eth0.10" +#IFOPTS[0]="" +#IPADDR[0]="192.168.10.1" +#NETMASK[0]="24" +#IPALIASES[0]="" +#USE_DHCP[0]="" +#DHCP_HOSTNAME[0]="" +#IP6ADDRS[0]="" +#USE_SLAAC[0]="" +#USE_DHCP6[0]="" + +# ============================================================================= # Example of how to configure a bridge: # Note the added "BRNICS" variable which contains a space-separated list # of the physical or virtual network interfaces you want to add to the bridge. +# IFOPTS is a pipe (|) delimited list of bridge module specific settings to be +# applied to the interface. See the ip-link(8) man page (search for "BRIDGE +# Type Support") for details of the options available. This option is not +# required for a standard bridge to be configured. #IFNAME[0]="br0" #BRNICS[0]="eth0" +#IFOPTS[0]="" #IPADDR[0]="192.168.0.1" -#NETMASK[0]="255.255.255.0" +#NETMASK[0]="24" #IPALIASES[0]="" #USE_DHCP[0]="" #DHCP_HOSTNAME[0]="" +# ============================================================================= + # Virtual interfaces to create - these are created before any address # configuration or bridge setup is done, so you may use these interfaces # as IFNAME or BRNICS values. These can be tun or tap interfaces: # adjust VIRTIFNAME and VIRTIFTYPE accordingly. # Starting with VIRTIFNAME[0] is mandatory, and each next one must be # incremented by one, so VIRTIFNAME[1], VIRTIFNAME[2], and so on. -# # Virtual tap interface example #VIRTIFNAME[0]="tap0" #VIRTIFTYPE[0]="tap" #VIRTIFUSER[0]="root" #VIRTIFGROUP[0]="root" -# + # Virtual tun interface example #VIRTIFNAME[1]="tun0" #VIRTIFTYPE[1]="tun" #VIRTIFUSER[1]="someuser" #VIRTIFGROUP[1]="somegroup" -## Example config information for wlan0. Uncomment the lines you need and fill -## in your data. (You may not need all of these for your wireless network) +# ============================================================================= + +# Example config information for wlan0: +# Uncomment the lines you need and fill in your data. You may not need all of +# these for your wireless network. #IFNAME[4]="wlan0" #IPADDR[4]="" #NETMASK[4]="" @@ -100,13 +178,20 @@ DEBUG_ETH_UP="no" #WLAN_WPADRIVER[4]="wext" #WLAN_WPAWAIT[4]=30 -## Some examples of additional network parameters that you can use. -## Config information for wlan0: +# ============================================================================= + +# Some examples of additional network parameters that you can use. #IFNAME[4]="wlan0" # Use a different interface name instead of # the default 'eth4' -#IPALIASES[4]="192.168.5.10/24" # Set up an IP alias. A netmask may be given - # with a / after the IP address - if - # not supplied, /32 will be used as default. +#IFOPTS[4]="" # A pipe (|) delimited list of interface type + # specific options to apply. These options + # can be found in the ip-link(8) man page in + # the approprite section for the interface + # type being configured. +#IPALIASES[4]="192.168.5.10/24" # A space delimited list of CIDR formatted IP + # aliases to assign to the interface after it + # has come up. If no / is given after + # the IP address, /24 will be used as default. #HWADDR[4]="00:01:23:45:67:89" # Overrule the card's hardware MAC address #MTU[4]="" # The default MTU is 1500, but you might need # 1360 when you use NAT'ed IPSec traffic. @@ -125,6 +210,11 @@ DEBUG_ETH_UP="no" # server is not found (ipv4ll link-local # adresses in the IP range 169.254.0.0/16 are # also known as "zeroconf" addresses) +#SLAAC_TIMEOUT[4]="15" # The default timeout for auto configuration to + # wait for the interface to come up is 15 sec. + # Increase the timeout if required. +#USE_RA[4]="yes" # Accept router advertisements even when SLAAC + # is disabled on the interface. #WLAN_ESSID[4]=DARKSTAR # An example of how you can override _any_ # parameter defined in rc.wireless.conf, by # prepending 'WLAN_' to the parameter's name. @@ -142,3 +232,14 @@ DEBUG_ETH_UP="no" #WLAN_WPAWAIT[4]=30 # In case it takes long for the WPA association # to finish, you can increase the wait time # (defaults to 10 seconds) + +# ============================================================================= + +# Change this to "yes" for debugging output to syslog (if available, stdout if +# not). +DEBUG_ETH_UP="no" + +# MAXNICS is the maximum number of interfaces that will be configured. +# You may need to increase the MAXNICS value if you have many interfaces, or +# you use multiple VLANs and/or bridges. The default is 6. +#MAXNICS="6" -- cgit v1.2.3