summaryrefslogtreecommitdiffstats
path: root/source/n/network-scripts/scripts
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/n/network-scripts/scripts/netconfig655
-rw-r--r--source/n/network-scripts/scripts/rc.inet1594
-rw-r--r--source/n/network-scripts/scripts/rc.inet1.conf145
3 files changed, 1031 insertions, 363 deletions
diff --git a/source/n/network-scripts/scripts/netconfig b/source/n/network-scripts/scripts/netconfig
index 5c5bf8a66..f3e9742fa 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<interface>.
-
-# 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 /<prefix> 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 /<prefix> 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 59f89eda7..f63f93ed7 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 <interface>' 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 551c4a70c..5081ee5bb 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<interface>.
-
-# 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 /<prefix> 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 /<prefix> 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"