diff options
Diffstat (limited to 'source/n')
-rw-r--r-- | source/n/network-scripts/manpages/rc.inet1.8 | 39 | ||||
-rw-r--r-- | source/n/network-scripts/manpages/rc.inet1.conf.5 | 377 | ||||
-rw-r--r-- | source/n/network-scripts/modprobe.d/bonding.conf | 9 | ||||
-rw-r--r-- | source/n/network-scripts/modprobe.d/ipv6.conf | 8 | ||||
-rwxr-xr-x | source/n/network-scripts/network-scripts.SlackBuild | 9 | ||||
-rw-r--r-- | source/n/network-scripts/scripts/netconfig | 655 | ||||
-rw-r--r-- | source/n/network-scripts/scripts/rc.inet1 | 594 | ||||
-rw-r--r-- | source/n/network-scripts/scripts/rc.inet1.conf | 145 |
8 files changed, 1331 insertions, 505 deletions
diff --git a/source/n/network-scripts/manpages/rc.inet1.8 b/source/n/network-scripts/manpages/rc.inet1.8 index ac8ce6a5..4102eec6 100644 --- a/source/n/network-scripts/manpages/rc.inet1.8 +++ b/source/n/network-scripts/manpages/rc.inet1.8 @@ -7,7 +7,7 @@ .ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP .el .TP "\\$1" .. -.TH RC.INET1 8 "12 Nov 2017" "Slackware Version 15.0" +.TH RC.INET1 8 "1 Oct 2018" "Slackware Version 15.0" .SH NAME rc.inet1 \- Slackware network configuration script. .SH DESCRIPTION @@ -15,24 +15,27 @@ rc.inet1 \- Slackware network configuration script. This script configures network interfaces. Wireless interfaces are configured just like any network device but accept many more configuration parameters. -.br -rc.inet1 reads its configuration parameters from a file `rc.inet1.conf'. -The `rc.inet1.conf' file contains a series of variable array definitions, +.LP +rc.inet1 reads its configuration parameters from a file +.IR /etc/rc.d/rc.inet1.conf . +The +.I rc.inet1.conf +file contains a series of variable array definitions, with each array index corresponding to a single network interface. .SH OPTIONS -The way to start your network (the configuration of your nics and +The way to start your network (configuring your nics and bringing the interfaces up, and creating a default route if required) is by running the command: .LP -.B /etc/rc.d/rc.inet1 +.B /etc/rc.d/rc.inet1 start .LP Restarting the whole network (all available network interfaces) is done in a similar fashion: .LP .B /etc/rc.d/rc.inet1 restart .LP -More generically speaking, you can start/stop/restart any network -interface yourself by running one of the commands: +More generally speaking, you can start/stop/restart any network +interface by running one of the commands: .LP .B /etc/rc.d/rc.inet1 INTERFACE_start .LP @@ -40,8 +43,8 @@ interface yourself by running one of the commands: .LP .B /etc/rc.d/rc.inet1 INTERFACE_restart .LP -where -.I `INTERFACE' +where +.B INTERFACE is the name of an existing network interface (eth0, wlan0, ...) .SH WIRELESS The script @@ -50,11 +53,11 @@ takes care of configuring the wireless parameters for a network interface. This script does not run independently. Instead, it is executed by the generic network configuration script .IR rc.inet1 . -.br +.LP If a wireless interface is detected, .I rc.wireless will use -.I iwconfig , +.IR iwconfig , .I iwpriv and possibly .I wpa_supplicant @@ -78,7 +81,7 @@ parameter definition file ( .SH DIAGNOSTICS If you remove the executable bit from the .I rc.wireless -script, it will never be executed. This can be beneficial if you have +script, it will never be executed. This can be beneficial if you have written your own wireless script and don't want Slackware to mess it up. .SH CAVEATS The network interface definitions are stored in variable @@ -93,18 +96,22 @@ rc.inet1.conf by default. .LP If you want to configure more than six network interfaces, you will have to edit the file -.I /etc/rc.d/rc.inet1 +.I /etc/rc.d/rc.inet1.conf and change the value `6' in the line: .br -.B \ \ MAXNICS=${MAXNICS:-6} +.B \ \ #MAXNICS="6" .br -to a value that is larger than the largest index value you use. +(at the very bottom of the file) to a value that is larger than the largest +index value you use, and uncomment the line. .LP The /etc/rc.d/rc.wireless script is not meant to be run on its own by the user! .SH AUTHORS Patrick J. Volkerding <volkerdi@slackware.com> +.br Eric Hameleers <alien@slackware.com> +.br Robby Workman <rworkman@slackware.com> +.br Darren 'Tadgy' Austin <darren@afterdark.org.uk> .SH "SEE ALSO" .BR rc.inet1.conf(5), diff --git a/source/n/network-scripts/manpages/rc.inet1.conf.5 b/source/n/network-scripts/manpages/rc.inet1.conf.5 index 28683177..e966eb7e 100644 --- a/source/n/network-scripts/manpages/rc.inet1.conf.5 +++ b/source/n/network-scripts/manpages/rc.inet1.conf.5 @@ -7,26 +7,27 @@ .ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP .el .TP "\\$1" .. -.TH RC.INET1.CONF 5 "12 Nov 2017" "Slackware Version 15.0" +.TH RC.INET1.CONF 5 "16 Nov 2019" "Slackware Version 15.0" .SH NAME rc.inet1.conf \- Slackware network configuration file. .SH DESCRIPTION -.B rc.inet1.conf -\. This file contains the configuration settings for network interfaces. -It consists basically of a series of variable array definitions. -Array elements with the same index number will all belong to the same -network interface. +This file contains the configuration settings for network interfaces. +It consists of a series of shell variable array definitions. The +convention in this man page is to refer to these shell variable array +definitions as "parameters". .LP -By default, index number `0' is used for the configuration of interface -.I eth0, +Parameters with the same index number will all belong to the same network +interface. By default, index number `0' is used for the configuration of +interface +.IR eth0 , index number `1' is used for .I eth1 -and so forth. The default interface name can be overruled by the use of -the variable +and so forth. The default interface name can be overruled by the use of +the parameter .B IFNAME. .LP -This is what a typical section of the file looks like for a card that is -configured to use DHCP, showing all array variables with the index number [0]: +This is what a typical section of the file looks like for an interface that is +configured to use DHCP, showing all parameters with the index number `0': .LP # Config information for eth0: .br @@ -37,206 +38,331 @@ NETMASK[0]="" IPALIASES[0]="" .br USE_DHCP[0]="yes" -.br -DHCP_HOSTNAME[0]="" -.br -DHCP_TIMEOUT[0]="" .LP -Alternatively, here is an example for a card that uses a static IP address and -has a non-default name ( -.I ath0 +Alternatively, here is an example for an interface that uses a static +IPv4 address, an autoconfigured IPv6 address, and a non-default name +.RI ( ath0 instead of -.I eth1 -), as well as an additional IP address configured on the interface. -The array index is [1] in this case. +.IR eth1 ), +as well as additional IPv4 alias addresses. +The parameter index is `1' in this case. .LP -# Config information for ath0 (using static IP address): +# Config information for ath0: .br IFNAME[1]="ath0" .br IPADDR[1]="192.168.3.11" .br -NETMASK[1]="255.255.255.0" +NETMASK[1]="24" .br IPALIASES[1]="192.168.3.100/24" .br USE_DHCP[1]="" .br -DHCP_HOSTNAME[1]="" -.br GATEWAY="192.168.3.1" .br +IP6ADDRS[1]="" +.br +USE_SLAAC[1]="yes" +.br +USE_DHCP6[1]="" +.br +GATEWAY6="" +.br .SH EXAMPLE VIRTUAL INTERFACE CREATION AND SETUP -Virtual interfaces are created before any address configuration or bridge +Virtual interfaces 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 as needed. .LP # Virtual tap interface example .br -#VIRTIFNAME[0]="tap0" +VIRTIFNAME[0]="tap0" +.br +VIRTIFTYPE[0]="tap" +.br +VIRTIFUSER[0]="root" .br -#VIRTIFTYPE[0]="tap" +VIRTIFGROUP[0]="root" .br -#VIRTIFUSER[0]="root" +.SH EXAMPLE BRIDGE INTERFACE CREATION +Link aggregation (bond) interfaces can be configured with the use of 3 new +parameters for use in rc.inet1.conf. The BONDNICS parameter should contain +the (space delimited) list of interfaces to include in the bond. The type +of bond is configured with the BONDMODE parameter, which can be any of the +supported mode types as found in the bonding kernel documentation found at +/usr/src/linux/Documentation/networking/bonding.txt. +.LP +The final parameter is a new generic IFOPTS parameter, which takes a list +of interface specific configuration options in a pipe (|) delimited list. +There are several module specific options which can be set with this +parameter, and they can be found in the kernel source documentation from +above. Note: it is +.B highly +recommended that you use at least the +.B miimon +option. Certain bonding modes will require other options to operate correctly. +.LP +Here is a complete configuration for a load balancing, fault tolerant +interface, with two ethernet devices: +.LP +IFNAME[0]="bond0" .br -#VIRTIFGROUP[0]="root" +BONDNICS[0]="eth0 eth1" +.br +BONDMODE[0]="balance-rr" +.br +IFOPTS[0]="xmit_hash_policy layer2+3 | miimon 100" +.br +IPADDR[0]="192.168.0.10" +.br +NETMASK[0]="24" +.LP +.SH EXAMPLE VLAN INTERFACE CREATION +VLAN interfaces can be configured in rc.inet1.conf, in the standard Slackware +way of defining an interface. The key to the configuration is to use the +correct IFNAME setting for the underlying ethernet (or bond) interface and the +tagged VLAN ID that should be exposed. +.LP +Here are the basic settings to expose a VLAN with ID 100 on the eth0 +interface, configured with a static IPv4 address: +.LP +IFNAME[0]="eth0.100" +.br +IFOPTS[0]="" +.br +IPADDR[0]="192.168.100.10" +.br +NETMASK[0]="24" +.LP +The IFNAME of the interface contains the underlying ethernet device name +(eth0), a period (.), and the VLAN ID to be exposed. +.LP +Note that the underlying ethernet (or bond) interface does not need to have an +IP address to be used with the VLAN, but it can have an IP address if you are +also using an untagged VLAN. +.LP +The new generic IFOPTS parameter takes a pipe (|) delimited list of interface +type specific options, but does not need any options in order for a VLAN +interface to be configured. However, there are several VLAN specific options +which can be configured if required - these are documented in the ip-link(8) +man page (search for "VLAN Type Support"). .br .SH EXAMPLE BRIDGE CREATION AND SETUP -Note the added "BRNICS" variable which contains a space-separated list +Note the added BRNICS parameter which contains a space-separated list of the physical or virtual network interfaces you want to add to the bridge. -Note that the array index can not be a duplicate of that defined for some +Note that the parameter index can not be a duplicate of that defined for some other interface (e.g. eth0 will be index 0 by default). .LP -IFNAME[0]="br0" -.br -BRNICS[0]="eth0 eth1 tun0" +IFNAME[5]="br0" .br -IPADDR[0]="192.168.0.1" +BRNICS[5]="eth0 eth1 tun0" .br -NETMASK[0]="255.255.255.0" +IFOPTS[5]="" .br -IPALIASES[0]="" -.br -USE_DHCP[0]="" +IPADDR[5]="192.168.0.10" .br -DHCP_HOSTNAME[0]="" +NETMASK[5]="24" +.LP +The new generic IFOPTS parameter takes a pipe (|) delimited list of interface +type specific options, but does not need any options in order for a bridge +interface to be configured. However, there are several bridge specific options +which can be configured if required - these are documented in the ip-link(8) +man page (search for "BRIDGE Type Support"). .br + .SH GENERAL PARAMETERS -This is a list of network parameters you can set for any card (wired as well -as wired). The example section is for `eth0' by default, i.e. -the array variables all have the array index [0]: +This is a list of parameters you can set for any interface. +The example section is for `eth0' by default, i.e. +the parameters all have the array index `0': .LP # Config information for eth0: .TP 25 IPADDR[0]="" -# Set this value to an actual IP address if you want static IP -address assignment +# Set this parameter to an actual IPv4 address if you want static IPv4 +address assignment. This is ignored if the USE_DHCP[0] parameter is set +to "yes". .TP NETMASK[0]="" -# With a static IP address, you are required to also set a netmask -(255.255.255.0 is common) +# The netmask for the IPv4 address set in IPADDR[0]. This should be in +CIDR format with an optional leading /, e.g. "24" or "/16" - though the +traditional dotted-quad format (e.g. "255.255.255.0") is still accepted. +If this parameter is unset or empty, a netmask of "24" will be assumed. .TP IPALIASES[0]="" -# Space separated list of additional IP addresses to bind to the -interface after initial configuration is complete. An optional -netmask may be specified after the IP in the form 1.2.3.4/24. If no -netmask is specified the default of /32 will be used. If USE_DHCP -is set to `yes' then additional addresses will only be added if the -dhcp client invocation is successful in obtaining a primary address. +# Space separated list of additional IPv4 addresses to bind to the +interface after initial configuration is complete. An optional +netmask may be specified after the address in the form "1.2.3.4/24". If no +netmask is specified the default of "/24" will be used. If USE_DHCP[0] +is set to `yes' then additional IPv4 addresses will only be added if the +DHCP client invocation is successful in obtaining a primary IPv4 address. .TP -USE_DHCP[0]="yes" -# If set to "yes", we will run a DHCP client and have the IP address -dynamically assigned +USE_DHCP[0]="" +# If set to "yes", we will run a DHCP client and have the IPv4 address +dynamically assigned. .TP -DHCP_HOSTNAME[0]="mybox" -# Tell the DHCP server what hostname to register +DHCP_HOSTNAME[0]="" +# Tell the DHCP server what hostname to register, e.g. "darkstar". .TP -DHCP_TIMEOUT[0]=15 +DHCP_TIMEOUT[0]="" # The default timeout for the DHCP client to wait for server response is -30 seconds, but you might want a shorter wait. +15 seconds, but you might want a shorter or longer wait. +.TP +IP6ADDRS[0]="" +# The static IPv6 addresses for the interface. This option takes a list of +IPv6 addresses and prefix lengths in CIDR notation, in a space delimited +list. For example: IP6ADDRS[0]="a:b:c:d::1/48 1:2:3:4::5/64". +If a prefix length is not given (separated from the IP address with a /), a +length of 64 will be assumed. This is ignored if either the USE_DHCP6[0] +or USE_SLAAC[0] parameters is set to "yes". +.TP +USE_SLAAC[0]="" +# With this parameter set to "yes", the interface's IPv6 address will be +configured via SLAAC (also known as autoconfig), even if RA indicates +DHCP6 is available on the network. If SLAAC is not available on the +network, no IPv6 address will be assigned. If this parameter is unset or +empty, the interface will not be autoconfigured -- note that this is +changed behaviour from Slackware 14.2 and earlier. +.TP +USE_DHCP6[0]="" +# When set to "yes", use DHCP6 to configure the interface. This will +bring up the interface using DHCP6 if RA indicates DHCP6 support is +available on the network, falling back to SLAAC (if available on the +network), or will leave the interface unconfigured after a timeout. When +this parameter is set to "yes", USE_SLAAC[0] is ignored. .TP -IFNAME[0]="usb0" +SLAAC_TIMEOUT[0]="" +# The default timeout for autoconfiguration to wait for the interface +to come up is 15 sec. Increase the timeout if a longer period is required +on your network. +.TP +USE_RA[0]="" +# If set to "yes", accept Router Advertisements even when SLAAC is disabled +on the interface. This parameter should almost never be required. +.TP +IFNAME[0]="" # Use this to define configuration blocks for interfaces with non-standard -names (this should be rare these days) +names. .TP -HWADDR[0]="00:01:23:45:67:89" -# Overrule the card's hardware MAC address +HWADDR[0]="" +# Overrule the hardware MAC address (if supported by the network card) by +setting a new value here, e.g. "00:01:23:45:67:89". .TP MTU[0]="" # The default MTU is 1500, but you might need 1360 when you use NAT'ed -IPSec traffic. IPv6 will likely require smaller MTUs as well +IPSec traffic. .TP -PROMISCUOUS[0]="yes" -# Set promiscuous mode on the interface. +PROMISCUOUS[0]="" +# If set to "yes", enable promiscuous mode on the interface. .TP -DHCP_KEEPRESOLV[0]="yes" +DHCP_KEEPRESOLV[0]="" # If you do .B not -want `/etc/resolv.conf' overwritten by the DHCP client +want +.I /etc/resolv.conf +overwritten by the DHCP client, set this parameter to "yes". .TP -DHCP_KEEPNTP[0]="yes" +DHCP_KEEPNTP[0]="" # If you do .B not -want `/etc/ntp.conf' overwritten by the DHCP client +want +.I /etc/ntp.conf +overwritten by the DHCP client, set this parameter to "yes". .TP -DHCP_KEEPGW[0]="yes" +DHCP_KEEPGW[0]="" # If you do .B not -want the DHCP client to change your default gateway +want the DHCP client to change your default gateway, set this parameter +to "yes". .TP -DHCP_DEBUG[0]="yes" -# Make dhcpcd show verbose diagnostics -.TP -DHCP_NOIPV4LL[0]="yes" -# Do not assign an -.I `ipv4ll' -address when a DHCP server is not found (ipv4 link-local addressing in the IP range 169.254.0.0/16 is also known as +DHCP_NOIPV4LL[0]="" +# When set to "yes", do +.B not +assign an IPv4 Link Local (IPv4LL) address when a DHCP server is not found. +IPv4LL addresses are in the range 169.254.0.0/16, and is also known as .I `zeroconf' -address assignment) +address assignment. .TP DHCP_IPADDR[0]="" -# Request a specific IP address from the DHCP server +# Request a specific IPv4 address from the DHCP server. Note that this is only +a request - the DHCP server may offer a completely different address. +.TP +DHCP_DEBUG[0]="yes" +# Make dhcpcd show verbose diagnostics. .SH WIRELESS PARAMETERS -For wireless cards, several additional parameter definitions are available. -All these parameters (or better, variables) start with the prefix +For wireless interfaces, several additional parameter definitions are available. +All these parameters start with the prefix .B WLAN_ . .LP .TP 25 -WLAN_ESSID[4]=DARKSTAR -# Your Wireless Access Point's name +WLAN_ESSID[4]="" +# Your Wireless Access Point's name, e.g. "darkstar". .TP -WLAN_MODE[4]=Managed -# "Managed" mode for use with Access Points. "Ad-Hoc" is for -peer-to-peer connections. +WLAN_MODE[4]="" +# Set to "Managed" for use with Access Points. For a peer-to-peer connection +set this parameter to "Ad-Hoc". .TP -WLAN_RATE[4]="54M auto" -# The transmission rates you want the driver to try ("auto" means -that bandwidth can be variable) +WLAN_RATE[4]="" +# The transmission rates you want the driver to try, e.g. "54M auto". +("auto" means that bandwidth can be variable). .TP -WLAN_CHANNEL[4]="auto" -# The channel to which the Access Point is tuned ("auto" to let the -driver find out the correct channel) +WLAN_CHANNEL[4]="" +# The channel to which the Access Point is tuned, or "auto" to let the +driver find the correct channel. .TP -WLAN_KEY[4]="D5A31F54ACF0487C2D0B1C10D2" -# Definition of a WEP key +WLAN_KEY[4]="" +# Definition of a WEP key, e.g. "D5A31F54ACF0487C2D0B1C10D2". .TP -WLAN_IWPRIV[4]="set AuthMode=WPAPSK | set EncrypType=TKIP | set WPAPSK=the_64_character_key" -# Some drivers require a private ioctl to be set through the iwpriv command. +WLAN_IWPRIV[4]="" +# Some drivers require a private ioctl to be set through the iwpriv command. e.g. +"set AuthMode=WPAPSK | set EncrypType=TKIP | set WPAPSK=the_64_character_key". If more than one is required, you can place them in the -.I IWPRIV -parameter (separated with the pipe (|) character, see the example). -.TP -WLAN_WPA[4]="wpa_supplicant" -# Run wpa_supplicant for WPA support +.I WLAN_IWPRIV +parameter separated with the pipe (|) character. Ssee the example. .TP -WLAN_WPADRIVER[4]="ndiswrapper" -# Tell wpa_supplicant to specifically use the ndiswrapper driver. -If you leave this empty the `wext' driver is used by default; most -modern wireless drivers use 'wext'. +WLAN_WPA[4]="" +# The name of the application that should be executed for WPA support. This +will usually be "wpa_supplicant". +.TP +WLAN_WPADRIVER[4]="" +# Tell wpa_supplicant to specifically use this driver, e.g. "ndiswrapper". +If you leave this empty the "wext" driver is used by default - most modern +wireless drivers use wext. .TP WLAN_WPAWAIT[4]=30 # In case it takes long for the WPA association to finish, you can -increase the wait time before rc.wireless decides that association -failed (defaults to 10 seconds) +use this parameter to increase the wait time before rc.wireless decides +that association failed. The default is 10 seconds. +.SH DEFAULT GATEWAY PARAMETERS +These parameters, to set an IPv4 and IPv6 default gateway, are not +interface-specific and must not have an index number. +.TP 25 +GATEWAY="" +# The IPv4 default gateway, e.g. "192.168.1.1". This parameter should be left +empty when interfaces are configured via DHCP. +.TP +GATEWAY6="" +# The IPv6 default gateway, e.g. "fe80::1". This parameter should be left +empty when interfaces are configured via DHCP6 or SLAAC. .SH FILES .TP 25 .I /etc/rc.d/rc.inet1 -network configuration script +network configuration script. .TP .I /etc/rc.d/rc.inet1.conf -configuration parameter file (is being read by rc.inet1 and rc.wireless) +configuration parameter file (read by rc.inet1 and rc.wireless). .TP .I /etc/rc.d/rc.wireless -wireless configuration script +wireless configuration script. .TP .I /etc/rc.d/rc.wireless.conf -configuration parameter file ( -.B deprecated -) +wireless configuration parameter file +.B (deprecated) +\. .SH CAVEATS -The network interface definitions are stored in variable -.I arrays. +The network interface definitions are stored in shell variable +.I arrays +\. The bash shell has no facilities to retrieve the largest array index used. Therefore, the .I rc.inet1 @@ -246,14 +372,17 @@ script makes the assumption that array indexes stay below the value of .LP If you want to configure more than six network interfaces, you will have to edit the file -.I /etc/rc.d/rc.inet1 -and change the value `6' in the line -.B MAXNICS=${MAXNICS:-6} -to the number of network interfaces you wish to use. +.I /etc/rc.d/rc.inet1.conf +and uncomment, and change the value `6' in the line +.B #MAXNICS="6" +(at the very bottom of the file) to the number of network interfaces you wish to use. .SH AUTHORS Patrick J. Volkerding <volkerdi@slackware.com> +.br Eric Hameleers <alien@slackware.com> +.br Robby Workman <rworkman@slackware.com> +.br Darren 'Tadgy' Austin <darren@afterdark.org.uk> .SH "SEE ALSO" .BR rc.inet1(8) diff --git a/source/n/network-scripts/modprobe.d/bonding.conf b/source/n/network-scripts/modprobe.d/bonding.conf new file mode 100644 index 00000000..c33faf65 --- /dev/null +++ b/source/n/network-scripts/modprobe.d/bonding.conf @@ -0,0 +1,9 @@ +############################################################################## +# Do not edit this file; instead, copy it to /etc/modprobe.d/ and edit that +############################################################################## +# +# Disable the automatic creation of a bond0 interface when module is loaded +# Otherwise, /etc/rc.d/rc.inet1 will not be able to configure it +# +options bonding max_bonds=0 +options rtnl-link-bond max_bonds=0 diff --git a/source/n/network-scripts/modprobe.d/ipv6.conf b/source/n/network-scripts/modprobe.d/ipv6.conf new file mode 100644 index 00000000..a0395a5a --- /dev/null +++ b/source/n/network-scripts/modprobe.d/ipv6.conf @@ -0,0 +1,8 @@ +############################################################################## +# Do not edit this file; instead, copy it to /etc/modprobe.d/ and edit that +############################################################################## +# +# Disable IPv6 auto configuration (SLAAC) by default +# +options ipv6 autoconf=0 +options net-pf-10 autoconf=0 diff --git a/source/n/network-scripts/network-scripts.SlackBuild b/source/n/network-scripts/network-scripts.SlackBuild index 5224bab5..dca8ce9c 100755 --- a/source/n/network-scripts/network-scripts.SlackBuild +++ b/source/n/network-scripts/network-scripts.SlackBuild @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2006, 2007, 2008, 2009, 2010, 2012, 2013, 2015, 2017, 2018 Patrick J. Volkerding, Sebeka, MN, USA +# Copyright 2006, 2007, 2008, 2009, 2010, 2012, 2013, 2015, 2017, 2018, 2021 Patrick J. Volkerding, Sebeka, MN, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -25,7 +25,7 @@ cd $(dirname $0) ; CWD=$(pwd) PKGNAM=network-scripts VERSION=${VERSION:-15.0} ARCH=noarch -BUILD=${BUILD:-11} +BUILD=${BUILD:-12} # If the variable PRINT_PACKAGE_NAME is set, then this script will report what # the name of the created package would be, and then exit. This information @@ -69,6 +69,11 @@ mkdir -p $PKG/usr/man/man{5,8} cat $CWD/manpages/rc.inet1.conf.5 | gzip -9c > $PKG/usr/man/man5/rc.inet1.conf.5.gz cat $CWD/manpages/rc.inet1.8 | gzip -9c > $PKG/usr/man/man8/rc.inet1.8.gz +# Add default module configs for bonding and ipv6 +mkdir -p $PKG/lib/modprobe.d/ +cat $CWD/modprobe.d/bonding.conf > $PKG/lib/modprobe.d/bonding.conf +cat $CWD/modprobe.d/ipv6.conf > $PKG/lib/modprobe.d/ipv6.conf + mkdir -p $PKG/install zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh cat $CWD/slack-desc > $PKG/install/slack-desc 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<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 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 <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 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<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" |